From 682804f7035efb05cef14cdd1240183c5dec0f48 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 1 Jun 2025 15:00:44 +0200 Subject: [PATCH 01/96] Bump main branch to 2.8 Alpha 0 --- novelwriter/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/novelwriter/__init__.py b/novelwriter/__init__.py index 7e526b72..4905f4b3 100644 --- a/novelwriter/__init__.py +++ b/novelwriter/__init__.py @@ -49,8 +49,8 @@ __license__ = "GPLv3" __author__ = "Veronica Berglyd Olsen" __maintainer__ = "Veronica Berglyd Olsen" __email__ = "code@vkbo.net" -__version__ = "2.7" -__hexversion__ = "0x020700f0" +__version__ = "2.8 Alpha 0" +__hexversion__ = "0x020800a0" __date__ = "2025-06-01" __status__ = "Stable" __domain__ = "novelwriter.io" From d12113b94c2248d5c83baea780d21996a5ed65e6 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 1 Jun 2025 18:41:13 +0200 Subject: [PATCH 02/96] Limit main GUI size to available screen size of the current screen (#2354) --- novelwriter/guimain.py | 13 +++++++++++-- novelwriter/shared.py | 9 +++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index a12383fe..8a895bfe 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -38,7 +38,7 @@ from PyQt6.QtWidgets import ( ) from novelwriter import CONFIG, SHARED, __hexversion__, __version__ -from novelwriter.common import formatFileFilter, formatVersion, hexToInt +from novelwriter.common import formatFileFilter, formatVersion, hexToInt, minmax from novelwriter.constants import nwConst from novelwriter.dialogs.about import GuiAbout from novelwriter.dialogs.preferences import GuiPreferences @@ -103,7 +103,7 @@ class GuiMain(QMainWindow): SHARED.initSharedData(self) # Prepare Main Window - self.resize(*CONFIG.mainWinSize) + self._setWindowSize(CONFIG.mainWinSize) self._updateWindowTitle() nwIcon = CONFIG.assetPath("icons") / "novelwriter.svg" @@ -1326,6 +1326,15 @@ class GuiMain(QMainWindow): # Internal Functions ## + def _setWindowSize(self, size: list[int]) -> None: + """Set the main window size.""" + if len(size) == 2 and (screen := SHARED.mainScreen): + availSize = screen.availableSize() + width = minmax(size[0], 900, availSize.width()) + height = minmax(size[1], 500, availSize.height()) + self.resize(width, height) + return + def _updateWindowTitle(self, projName: str | None = None) -> None: """Set the window title and add the project's name.""" self.setWindowTitle(" - ".join(filter(None, [projName, CONFIG.appName]))) diff --git a/novelwriter/shared.py b/novelwriter/shared.py index 04add94c..228b9678 100644 --- a/novelwriter/shared.py +++ b/novelwriter/shared.py @@ -32,8 +32,8 @@ from time import time from typing import TYPE_CHECKING, TypeVar from PyQt6.QtCore import QObject, QRunnable, QThreadPool, QTimer, QUrl, pyqtSignal, pyqtSlot -from PyQt6.QtGui import QDesktopServices, QFont -from PyQt6.QtWidgets import QFileDialog, QFontDialog, QMessageBox, QWidget +from PyQt6.QtGui import QDesktopServices, QFont, QScreen +from PyQt6.QtWidgets import QApplication, QFileDialog, QFontDialog, QMessageBox, QWidget from novelwriter.common import formatFileFilter from novelwriter.constants import nwFiles @@ -150,6 +150,11 @@ class SharedData(QObject): """Return the last alert message.""" return self._lastAlert + @property + def mainScreen(self) -> QScreen | None: + """Return the screen of the main window.""" + return QApplication.screenAt(self.mainGui.rect().center()) + ## # Setters ## From 1fafa0dae7c8154efcb41154bfe0772f81913799 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 2 Jun 2025 16:28:06 +0200 Subject: [PATCH 03/96] Remove syntax theme parsing and add light and dark theme user settings --- novelwriter/common.py | 11 ++ novelwriter/config.py | 52 ++++---- novelwriter/dialogs/preferences.py | 52 ++++---- novelwriter/enum.py | 7 ++ novelwriter/gui/theme.py | 188 ++++++++++++----------------- novelwriter/guimain.py | 1 - 6 files changed, 148 insertions(+), 163 deletions(-) diff --git a/novelwriter/common.py b/novelwriter/common.py index a4e37f62..6d1e8519 100644 --- a/novelwriter/common.py +++ b/novelwriter/common.py @@ -31,6 +31,7 @@ import xml.etree.ElementTree as ET from configparser import ConfigParser from datetime import datetime +from enum import Enum from pathlib import Path from typing import TYPE_CHECKING, Any, Literal, TypeGuard, TypeVar from urllib.parse import urljoin @@ -676,6 +677,9 @@ def openExternalPath(path: Path) -> bool: # Classes ## +_T_Enum = TypeVar("_T_Enum", bound=Enum) + + class NWConfigParser(ConfigParser): """Common: Adapted Config Parser @@ -736,3 +740,10 @@ class NWConfigParser(ConfigParser): for i in range(min(len(data), len(result))): result[i] = checkInt(data[i].strip(), result[i]) return result + + def rdEnum(self, section: str, option: str, default: _T_Enum) -> _T_Enum: + """Read enum value.""" + if self.has_option(section, option): + data = self.get(section, option, fallback="") + return type(default).__members__.get(data.upper(), default) + return default diff --git a/novelwriter/config.py b/novelwriter/config.py index ac403fdb..9b8752fc 100644 --- a/novelwriter/config.py +++ b/novelwriter/config.py @@ -45,6 +45,7 @@ from novelwriter.common import ( formatTimeStamp, processDialogSymbols, simplified ) from novelwriter.constants import nwFiles, nwHtmlUnicode, nwQuotes, nwUnicode +from novelwriter.enum import nwTheme from novelwriter.error import formatException, logException if TYPE_CHECKING: @@ -55,8 +56,8 @@ if TYPE_CHECKING: logger = logging.getLogger(__name__) -DEF_GUI = "default" -DEF_SYNTAX = "default_light" +DEF_GUI_DARK = "default_dark" +DEF_GUI_LIGHT = "default_light" DEF_ICONS = "material_rounded_normal" DEF_TREECOL = "theme" @@ -69,22 +70,22 @@ class Config: "_manuals", "_nwLangPath", "_qLocale", "_qtLangPath", "_qtTrans", "_recentPaths", "_recentProjects", "_splash", "allowOpenDial", "altDialogClose", "altDialogOpen", "appHandle", "appName", "askBeforeBackup", "askBeforeExit", "autoSaveDoc", "autoSaveProj", - "autoScroll", "autoScrollPos", "autoSelect", "backupOnClose", "cursorWidth", "dialogLine", - "dialogStyle", "doJustify", "doReplace", "doReplaceDQuote", "doReplaceDash", + "autoScroll", "autoScrollPos", "autoSelect", "backupOnClose", "cursorWidth", "darkTheme", + "dialogLine", "dialogStyle", "doJustify", "doReplace", "doReplaceDQuote", "doReplaceDash", "doReplaceDots", "doReplaceSQuote", "emphLabels", "fmtApostrophe", "fmtDQuoteClose", "fmtDQuoteOpen", "fmtPadAfter", "fmtPadBefore", "fmtPadThin", "fmtSQuoteClose", - "fmtSQuoteOpen", "focusWidth", "guiFont", "guiLocale", "guiSyntax", "guiTheme", - "hasEnchant", "hideFocusFooter", "hideHScroll", "hideVScroll", "highlightEmph", "hostName", - "iconColDocs", "iconColTree", "iconTheme", "incNotesWCount", "isDebug", "kernelVer", - "lastNotes", "mainPanePos", "mainWinSize", "memInfo", "narratorBreak", "narratorDialog", - "nativeFont", "osDarwin", "osLinux", "osType", "osUnknown", "osWindows", "outlinePanePos", + "fmtSQuoteOpen", "focusWidth", "guiFont", "guiLocale", "hasEnchant", "hideFocusFooter", + "hideHScroll", "hideVScroll", "highlightEmph", "hostName", "iconColDocs", "iconColTree", + "iconTheme", "incNotesWCount", "isDebug", "kernelVer", "lastNotes", "lightTheme", + "mainPanePos", "mainWinSize", "memInfo", "narratorBreak", "narratorDialog", "nativeFont", + "osDarwin", "osLinux", "osType", "osUnknown", "osWindows", "outlinePanePos", "prefsWinSize", "scrollPastEnd", "searchCase", "searchLoop", "searchMatchCap", "searchNextFile", "searchProjCase", "searchProjRegEx", "searchProjWord", "searchRegEx", "searchWord", "showEditToolBar", "showFullPath", "showLineEndings", "showMultiSpaces", "showSessionTime", "showTabsNSpaces", "showViewerPanel", "spellLanguage", "stopWhenIdle", - "tabWidth", "textFont", "textMargin", "textWidth", "useCharCount", "userIdleTime", - "verPyQtString", "verPyQtValue", "verPyString", "verQtString", "verQtValue", - "viewComments", "viewPanePos", "viewSynopsis", "welcomeWinSize", + "tabWidth", "textFont", "textMargin", "textWidth", "themeMode", "useCharCount", + "userIdleTime", "verPyQtString", "verPyQtValue", "verPyString", "verQtString", + "verQtValue", "viewComments", "viewPanePos", "viewSynopsis", "welcomeWinSize", ) LANG_NW = 1 @@ -153,14 +154,15 @@ class Config: # General GUI Settings self.guiLocale = self._qLocale.name() - self.guiTheme = DEF_GUI # GUI theme - self.guiSyntax = DEF_SYNTAX # Syntax theme - self.guiFont = QFont() # Main GUI font - self.hideVScroll = False # Hide vertical scroll bars on main widgets - self.hideHScroll = False # Hide horizontal scroll bars on main widgets - self.lastNotes = "0x0" # The latest release notes that have been shown - self.nativeFont = True # Use native font dialog - self.useCharCount = False # Use character count as primary count + self.lightTheme = DEF_GUI_LIGHT # Light GUI theme + self.darkTheme = DEF_GUI_DARK # Dark GUI theme + self.themeMode = nwTheme.AUTO # Colour theme mode + self.guiFont = QFont() # Main GUI font + self.hideVScroll = False # Hide vertical scroll bars on main widgets + self.hideHScroll = False # Hide horizontal scroll bars on main widgets + self.lastNotes = "0x0" # The latest release notes that have been shown + self.nativeFont = True # Use native font dialog + self.useCharCount = False # Use character count as primary count # Icons self.iconTheme = DEF_ICONS # Icons theme @@ -626,8 +628,9 @@ class Config: # Main sec = "Main" self.setGuiFont(conf.rdStr(sec, "font", "")) - self.guiTheme = conf.rdStr(sec, "theme", self.guiTheme) - self.guiSyntax = conf.rdStr(sec, "syntax", self.guiSyntax) + self.lightTheme = conf.rdStr(sec, "lighttheme", self.lightTheme) + self.darkTheme = conf.rdStr(sec, "darktheme", self.darkTheme) + self.themeMode = conf.rdEnum(sec, "thememode", self.themeMode) self.iconTheme = conf.rdStr(sec, "icons", self.iconTheme) self.iconColTree = conf.rdStr(sec, "iconcoltree", self.iconColTree) self.iconColDocs = conf.rdBool(sec, "iconcoldocs", self.iconColDocs) @@ -751,8 +754,9 @@ class Config: conf["Main"] = { "font": self.guiFont.toString(), - "theme": str(self.guiTheme), - "syntax": str(self.guiSyntax), + "lighttheme": str(self.lightTheme), + "darktheme": str(self.darkTheme), + "thememode": self.themeMode.name, "icons": str(self.iconTheme), "iconcoltree": str(self.iconColTree), "iconcoldocs": str(self.iconColDocs), diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index 281487b3..9587db6a 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -35,7 +35,7 @@ from PyQt6.QtWidgets import ( from novelwriter import CONFIG, SHARED from novelwriter.common import compact, describeFont, processDialogSymbols, uniqueCompact -from novelwriter.config import DEF_GUI, DEF_ICONS, DEF_SYNTAX, DEF_TREECOL +from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT, DEF_ICONS, DEF_TREECOL from novelwriter.constants import nwLabels, nwQuotes, nwUnicode, trConst from novelwriter.dialogs.quotes import GuiQuoteSelect from novelwriter.extensions.configlayout import NColorLabel, NScrollableForm @@ -165,14 +165,24 @@ class GuiPreferences(NDialog): ) # Colour Theme - self.guiTheme = NComboBox(self) - self.guiTheme.setMinimumWidth(200) - for theme, name in SHARED.theme.listThemes(): - self.guiTheme.addItem(name, theme) - self.guiTheme.setCurrentData(CONFIG.guiTheme, DEF_GUI) + self.lightTheme = NComboBox(self) + self.lightTheme.setMinimumWidth(200) + self.darkTheme = NComboBox(self) + self.darkTheme.setMinimumWidth(200) + for theme, name, dark in SHARED.theme.listThemes(): + if dark: + self.darkTheme.addItem(name, theme) + else: + self.lightTheme.addItem(name, theme) + self.lightTheme.setCurrentData(CONFIG.lightTheme, DEF_GUI_LIGHT) + self.darkTheme.setCurrentData(CONFIG.darkTheme, DEF_GUI_DARK) self.mainForm.addRow( - self.tr("Colour theme"), self.guiTheme, + self.tr("Light colour theme"), self.lightTheme, + self.tr("User interface colour theme."), stretch=(3, 2) + ) + self.mainForm.addRow( + self.tr("Dark colour theme"), self.darkTheme, self.tr("User interface colour theme."), stretch=(3, 2) ) @@ -242,18 +252,6 @@ class GuiPreferences(NDialog): self.sidebar.addButton(title, section) self.mainForm.addGroupLabel(title, section) - # Document Colour Theme - self.guiSyntax = NComboBox(self) - self.guiSyntax.setMinimumWidth(200) - for syntax, name in SHARED.theme.listSyntax(): - self.guiSyntax.addItem(name, syntax) - self.guiSyntax.setCurrentData(CONFIG.guiSyntax, DEF_SYNTAX) - - self.mainForm.addRow( - self.tr("Document colour theme"), self.guiSyntax, - self.tr("Colour theme for the editor and viewer."), stretch=(3, 2) - ) - # Document Font Family self.textFont = QLineEdit(self) self.textFont.setReadOnly(True) @@ -966,18 +964,23 @@ class GuiPreferences(NDialog): # Appearance guiLocale = self.guiLocale.currentData() - guiTheme = self.guiTheme.currentData() + lightTheme = self.lightTheme.currentData() + darkTheme = self.darkTheme.currentData() iconTheme = self.iconTheme.currentData() useCharCount = self.useCharCount.isChecked() - updateTheme |= CONFIG.guiTheme != guiTheme + updateTheme |= CONFIG.lightTheme != lightTheme + updateTheme |= CONFIG.darkTheme != darkTheme updateTheme |= CONFIG.iconTheme != iconTheme needsRestart |= CONFIG.guiLocale != guiLocale needsRestart |= CONFIG.guiFont != self._guiFont refreshTree |= CONFIG.useCharCount != useCharCount + updateSyntax |= CONFIG.lightTheme != lightTheme + updateSyntax |= CONFIG.darkTheme != darkTheme CONFIG.guiLocale = guiLocale - CONFIG.guiTheme = guiTheme + CONFIG.lightTheme = lightTheme + CONFIG.darkTheme = darkTheme CONFIG.iconTheme = iconTheme CONFIG.hideVScroll = self.hideVScroll.isChecked() CONFIG.hideHScroll = self.hideHScroll.isChecked() @@ -986,11 +989,6 @@ class GuiPreferences(NDialog): CONFIG.setGuiFont(self._guiFont) # Document Style - guiSyntax = self.guiSyntax.currentData() - - updateSyntax |= CONFIG.guiSyntax != guiSyntax - - CONFIG.guiSyntax = guiSyntax CONFIG.showFullPath = self.showFullPath.isChecked() CONFIG.incNotesWCount = self.incNotesWCount.isChecked() CONFIG.setTextFont(self._textFont) diff --git a/novelwriter/enum.py b/novelwriter/enum.py index a837d824..18899295 100644 --- a/novelwriter/enum.py +++ b/novelwriter/enum.py @@ -156,6 +156,13 @@ class nwFocus(Enum): OUTLINE = 3 +class nwTheme(Enum): + + AUTO = 0 + LIGHT = 1 + DARK = 2 + + class nwOutline(Enum): TITLE = 0 diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 1eb2e487..1118f7d5 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -31,16 +31,16 @@ from typing import TYPE_CHECKING, Final from PyQt6.QtCore import QSize, Qt from PyQt6.QtGui import ( - QColor, QFont, QFontDatabase, QFontMetrics, QIcon, QPainter, QPainterPath, - QPalette, QPixmap + QColor, QFont, QFontDatabase, QFontMetrics, QGuiApplication, QIcon, + QPainter, QPainterPath, QPalette, QPixmap ) from PyQt6.QtWidgets import QApplication from novelwriter import CONFIG from novelwriter.common import NWConfigParser, minmax -from novelwriter.config import DEF_GUI, DEF_ICONS, DEF_SYNTAX +from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT, DEF_ICONS from novelwriter.constants import nwLabels -from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType +from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType, nwTheme from novelwriter.error import logException from novelwriter.types import QtBlack, QtHexArgb, QtPaintAntiAlias, QtTransparent @@ -49,6 +49,8 @@ if TYPE_CHECKING: logger = logging.getLogger(__name__) +T_ThemeEntry = tuple[str, str, bool] + STYLES_FLAT_TABS = "flatTabWidget" STYLES_MIN_TOOLBUTTON = "minimalToolButton" STYLES_BIG_TOOLBUTTON = "bigToolButton" @@ -57,6 +59,7 @@ STYLES_BIG_TOOLBUTTON = "bigToolButton" class ThemeMeta: name: str = "" + mode: str = "" description: str = "" author: str = "" credit: str = "" @@ -96,13 +99,13 @@ class GuiTheme: """ __slots__ = ( - "_availSyntax", "_availThemes", "_guiPalette", "_styleSheets", "_syntaxList", "_themeList", - "baseButtonHeight", "baseIconHeight", "baseIconSize", "buttonIconSize", "errorText", - "fadedText", "fontPixelSize", "fontPointSize", "getDecoration", "getHeaderDecoration", - "getHeaderDecorationNarrow", "getIcon", "getIconColor", "getItemIcon", "getPixmap", - "getToggleIcon", "guiFont", "guiFontB", "guiFontBU", "guiFontFixed", "guiFontSmall", - "helpText", "iconCache", "isDarkTheme", "syntaxMeta", "syntaxTheme", "textNHeight", - "textNWidth", "themeMeta", + "_availSyntax", "_availThemes", "_darkThemes", "_guiPalette", "_lightThemes", + "_styleSheets", "_syntaxList", "_themeList", "baseButtonHeight", "baseIconHeight", + "baseIconSize", "buttonIconSize", "errorText", "fadedText", "fontPixelSize", + "fontPointSize", "getDecoration", "getHeaderDecoration", "getHeaderDecorationNarrow", + "getIcon", "getIconColor", "getItemIcon", "getPixmap", "getToggleIcon", "guiFont", + "guiFontB", "guiFontBU", "guiFontFixed", "guiFontSmall", "helpText", "iconCache", + "isDarkTheme", "syntaxMeta", "syntaxTheme", "textNHeight", "textNWidth", "themeMeta", ) def __init__(self) -> None: @@ -124,8 +127,7 @@ class GuiTheme: # Load Themes self._guiPalette = QPalette() - self._themeList: list[tuple[str, str]] = [] - self._syntaxList: list[tuple[str, str]] = [] + self._themeList: list[T_ThemeEntry] = [] self._availThemes: dict[str, Path] = {} self._availSyntax: dict[str, Path] = {} self._styleSheets: dict[str, str] = {} @@ -179,13 +181,10 @@ class GuiTheme: logger.debug("Text 'N' Width: %d", self.textNWidth) # Process Themes - _listConf(self._availSyntax, CONFIG.assetPath("syntax"), ".conf") _listConf(self._availThemes, CONFIG.assetPath("themes"), ".conf") - _listConf(self._availSyntax, CONFIG.dataPath("syntax"), ".conf") _listConf(self._availThemes, CONFIG.dataPath("themes"), ".conf") self.loadTheme() - self.loadSyntax() return @@ -207,13 +206,35 @@ class GuiTheme: # Theme Methods ## + def isDesktopDarkMode(self) -> bool: + """Check if the desktop is in dark mode.""" + if CONFIG.verQtValue >= 0x060500 and (hint := QGuiApplication.styleHints()): + return hint.colorScheme() == Qt.ColorScheme.Dark + + palette = QPalette() + text = palette.color(QPalette.ColorRole.WindowText) + window = palette.color(QPalette.ColorRole.Window) + return text.lightnessF() > window.lightnessF() + def loadTheme(self) -> bool: """Load the currently specified GUI theme.""" - theme = CONFIG.guiTheme + match CONFIG.themeMode: + case nwTheme.LIGHT: + darkMode = False + case nwTheme.DARK: + darkMode = True + case _: + darkMode = self.isDesktopDarkMode() + + theme = CONFIG.darkTheme if darkMode else CONFIG.lightTheme if theme not in self._availThemes: logger.error("Could not find GUI theme '%s'", theme) - theme = DEF_GUI - CONFIG.guiTheme = theme + if darkMode: + theme = DEF_GUI_DARK + CONFIG.darkTheme = DEF_GUI_DARK + else: + theme = DEF_GUI_LIGHT + CONFIG.lightTheme = DEF_GUI_LIGHT if not (file := self._availThemes.get(theme)): logger.error("Could not load GUI theme") @@ -238,6 +259,7 @@ class GuiTheme: meta = ThemeMeta() if parser.has_section(sec): meta.name = parser.rdStr(sec, "name", "") + meta.mode = parser.rdStr(sec, "mode", "light") meta.description = parser.rdStr(sec, "description", "N/A") meta.author = parser.rdStr(sec, "author", "N/A") meta.credit = parser.rdStr(sec, "credit", "N/A") @@ -296,6 +318,31 @@ class GuiTheme: self.fadedText = self._parseColor(parser, sec, "fadedtext") self.errorText = self._parseColor(parser, sec, "errortext") + # Syntax + sec = "Syntax" + self.syntaxTheme = SyntaxColors() + if parser.has_section(sec): + self.syntaxTheme.back = self._parseColor(parser, sec, "background") + self.syntaxTheme.text = self._parseColor(parser, sec, "text") + self.syntaxTheme.link = self._parseColor(parser, sec, "link") + self.syntaxTheme.head = self._parseColor(parser, sec, "headertext") + self.syntaxTheme.headH = self._parseColor(parser, sec, "headertag") + self.syntaxTheme.emph = self._parseColor(parser, sec, "emphasis") + self.syntaxTheme.dialN = self._parseColor(parser, sec, "dialog") + self.syntaxTheme.dialA = self._parseColor(parser, sec, "altdialog") + self.syntaxTheme.hidden = self._parseColor(parser, sec, "hidden") + self.syntaxTheme.note = self._parseColor(parser, sec, "note") + self.syntaxTheme.code = self._parseColor(parser, sec, "shortcode") + self.syntaxTheme.key = self._parseColor(parser, sec, "keyword") + self.syntaxTheme.tag = self._parseColor(parser, sec, "tag") + self.syntaxTheme.val = self._parseColor(parser, sec, "value") + self.syntaxTheme.opt = self._parseColor(parser, sec, "optional") + self.syntaxTheme.spell = self._parseColor(parser, sec, "spellcheckline") + self.syntaxTheme.error = self._parseColor(parser, sec, "errorline") + self.syntaxTheme.repTag = self._parseColor(parser, sec, "replacetag") + self.syntaxTheme.mod = self._parseColor(parser, sec, "modifier") + self.syntaxTheme.mark = self._parseColor(parser, sec, "texthighlight") + # Update Dependant Colours # Based on: https://github.com/qt/qtbase/blob/dev/src/gui/kernel/qplatformtheme.cpp text = self._guiPalette.text().color() @@ -363,105 +410,22 @@ class GuiTheme: return True - def loadSyntax(self) -> bool: - """Load the currently specified syntax highlighter theme.""" - theme = CONFIG.guiSyntax - if theme not in self._availSyntax: - logger.error("Could not find syntax theme '%s'", theme) - theme = DEF_SYNTAX - CONFIG.guiSyntax = theme - - if not (file := self._availSyntax.get(theme)): - logger.error("Could not load syntax theme") - return False - - CONFIG.splashMessage("Loading syntax theme ...") - logger.info("Loading syntax theme '%s'", theme) - parser = NWConfigParser() - try: - with open(file, mode="r", encoding="utf-8") as fo: - parser.read_file(fo) - except Exception: - logger.error("Could not read file: %s", file) - logException() - return False - - # Main - sec = "Main" - meta = ThemeMeta() - if parser.has_section(sec): - meta.name = parser.rdStr(sec, "name", "") - meta.description = parser.rdStr(sec, "description", "N/A") - meta.author = parser.rdStr(sec, "author", "N/A") - meta.credit = parser.rdStr(sec, "credit", "N/A") - meta.url = parser.rdStr(sec, "url", "") - meta.license = parser.rdStr(sec, "license", "N/A") - meta.licenseUrl = parser.rdStr(sec, "licenseurl", "") - - # Syntax - sec = "Syntax" - syntax = SyntaxColors() - if parser.has_section(sec): - syntax.back = self._parseColor(parser, sec, "background") - syntax.text = self._parseColor(parser, sec, "text") - syntax.link = self._parseColor(parser, sec, "link") - syntax.head = self._parseColor(parser, sec, "headertext") - syntax.headH = self._parseColor(parser, sec, "headertag") - syntax.emph = self._parseColor(parser, sec, "emphasis") - syntax.dialN = self._parseColor(parser, sec, "dialog") - syntax.dialA = self._parseColor(parser, sec, "altdialog") - syntax.hidden = self._parseColor(parser, sec, "hidden") - syntax.note = self._parseColor(parser, sec, "note") - syntax.code = self._parseColor(parser, sec, "shortcode") - syntax.key = self._parseColor(parser, sec, "keyword") - syntax.tag = self._parseColor(parser, sec, "tag") - syntax.val = self._parseColor(parser, sec, "value") - syntax.opt = self._parseColor(parser, sec, "optional") - syntax.spell = self._parseColor(parser, sec, "spellcheckline") - syntax.error = self._parseColor(parser, sec, "errorline") - syntax.repTag = self._parseColor(parser, sec, "replacetag") - syntax.mod = self._parseColor(parser, sec, "modifier") - syntax.mark = self._parseColor(parser, sec, "texthighlight") - - CONFIG.splashMessage(f"Loaded syntax theme: {meta.name}") - - self.syntaxMeta = meta - self.syntaxTheme = syntax - - return True - - def listThemes(self) -> list[tuple[str, str]]: + def listThemes(self) -> list[T_ThemeEntry]: """Scan the GUI themes folder and list all themes.""" if self._themeList: return self._themeList - themes = [] + themes: list[T_ThemeEntry] = [] parser = NWConfigParser() for key, path in self._availThemes.items(): logger.debug("Checking theme config '%s'", key) - if name := _loadInternalName(parser, path): - themes.append((key, name)) + if meta := _loadInternalName(parser, path): + themes.append((key, meta[0], meta[1])) self._themeList = sorted(themes, key=_sortTheme) return self._themeList - def listSyntax(self) -> list[tuple[str, str]]: - """Scan the syntax themes folder and list all themes.""" - if self._syntaxList: - return self._syntaxList - - themes = [] - parser = NWConfigParser() - for key, path in self._availSyntax.items(): - logger.debug("Checking theme syntax '%s'", key) - if name := _loadInternalName(parser, path): - themes.append((key, name)) - - self._syntaxList = sorted(themes, key=_sortTheme) - - return self._syntaxList - def getStyleSheet(self, name: str) -> str: """Load a standard style sheet.""" return self._styleSheets.get(name, "") @@ -889,22 +853,24 @@ def _listConf(target: dict, path: Path, extension: str) -> None: return -def _sortTheme(data: tuple[str, str]) -> str: +def _sortTheme(data: tuple) -> str: """Key function for theme sorting.""" - key, name = data + key, name = data[:2] return f"*{name}" if key.startswith("default_") else name -def _loadInternalName(parser: NWConfigParser, path: str | Path) -> str: +def _loadInternalName(parser: NWConfigParser, path: str | Path) -> tuple[str, bool]: """Open a conf file and read the 'name' setting.""" try: with open(path, mode="r", encoding="utf-8") as inFile: parser.read_file(inFile) - return parser.rdStr("Main", "name", "") + name = parser.rdStr("Main", "name", "") + dark = parser.rdStr("Main", "mode", "light").lower() == "dark" + return name, dark except Exception: logger.error("Could not read file: %s", path) logException() - return "" + return "", False def _loadIconName(path: Path) -> str: diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index 8a895bfe..601540f0 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -1069,7 +1069,6 @@ class GuiMain(QMainWindow): SHARED.project.tree.refreshAllItems() if syntax: - SHARED.theme.loadSyntax() self.docEditor.updateSyntaxColors() self.docEditor.initEditor() From 857327e9ef7a2c168075d7395ef21d31f56f47d4 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 2 Jun 2025 17:06:28 +0200 Subject: [PATCH 04/96] Update theme colour processing and fix current tests --- novelwriter/assets/themes/default_dark.conf | 1 + novelwriter/assets/themes/default_light.conf | 1 + novelwriter/gui/statusbar.py | 6 +- novelwriter/gui/theme.py | 278 +++++++++++-------- tests/reference/baseConfig_novelwriter.conf | 7 +- tests/test_base/test_base_config.py | 8 +- tests/test_dialogs/test_dlg_preferences.py | 34 +-- tests/test_gui/test_gui_guimain.py | 9 +- tests/test_gui/test_gui_theme.py | 150 ++++++---- 9 files changed, 285 insertions(+), 209 deletions(-) diff --git a/novelwriter/assets/themes/default_dark.conf b/novelwriter/assets/themes/default_dark.conf index 76916604..6ccf6ede 100644 --- a/novelwriter/assets/themes/default_dark.conf +++ b/novelwriter/assets/themes/default_dark.conf @@ -1,5 +1,6 @@ [Main] name = Default Dark Theme +mode = dark description = The novelWriter standard dark theme author = Veronica Berglyd Olsen credit = Veronica Berglyd Olsen diff --git a/novelwriter/assets/themes/default_light.conf b/novelwriter/assets/themes/default_light.conf index 29b4b98a..f236f404 100644 --- a/novelwriter/assets/themes/default_light.conf +++ b/novelwriter/assets/themes/default_light.conf @@ -1,5 +1,6 @@ [Main] name = Default Light Theme +mode = light description = The novelWriter standard light theme author = Veronica Berglyd Olsen credit = Veronica Berglyd Olsen diff --git a/novelwriter/gui/statusbar.py b/novelwriter/gui/statusbar.py index 3239fd4a..315633da 100644 --- a/novelwriter/gui/statusbar.py +++ b/novelwriter/gui/statusbar.py @@ -143,9 +143,9 @@ class GuiMainStatus(QStatusBar): self.idlePixmap = SHARED.theme.getPixmap("timer_off", (iPx, iPx)) self.timeIcon.setPixmap(self.timePixmap) - colNone = SHARED.theme.getIconColor("default").darker(150) - colSaved = SHARED.theme.getIconColor("green").darker(150) - colUnsaved = SHARED.theme.getIconColor("red").darker(150) + colNone = SHARED.theme.getBaseColor("default").darker(150) + colSaved = SHARED.theme.getBaseColor("green").darker(150) + colUnsaved = SHARED.theme.getBaseColor("red").darker(150) self.docIcon.setColors(colNone, colSaved, colUnsaved) self.projIcon.setColors(colNone, colSaved, colUnsaved) diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 1118f7d5..437531a3 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -26,6 +26,7 @@ from __future__ import annotations import logging +from configparser import ConfigParser from math import ceil from typing import TYPE_CHECKING, Final @@ -37,7 +38,7 @@ from PyQt6.QtGui import ( from PyQt6.QtWidgets import QApplication from novelwriter import CONFIG -from novelwriter.common import NWConfigParser, minmax +from novelwriter.common import checkInt, minmax from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT, DEF_ICONS from novelwriter.constants import nwLabels from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType, nwTheme @@ -99,13 +100,14 @@ class GuiTheme: """ __slots__ = ( - "_availSyntax", "_availThemes", "_darkThemes", "_guiPalette", "_lightThemes", - "_styleSheets", "_syntaxList", "_themeList", "baseButtonHeight", "baseIconHeight", - "baseIconSize", "buttonIconSize", "errorText", "fadedText", "fontPixelSize", - "fontPointSize", "getDecoration", "getHeaderDecoration", "getHeaderDecorationNarrow", - "getIcon", "getIconColor", "getItemIcon", "getPixmap", "getToggleIcon", "guiFont", - "guiFontB", "guiFontBU", "guiFontFixed", "guiFontSmall", "helpText", "iconCache", - "isDarkTheme", "syntaxMeta", "syntaxTheme", "textNHeight", "textNWidth", "themeMeta", + "_availSyntax", "_availThemes", "_darkThemes", "_guiPalette", "_lightThemes", "_qColors", + "_styleSheets", "_svgColors", "_syntaxList", "_themeList", "baseButtonHeight", + "baseIconHeight", "baseIconSize", "buttonIconSize", "errorText", "fadedText", + "fontPixelSize", "fontPointSize", "getDecoration", "getHeaderDecoration", + "getHeaderDecorationNarrow", "getIcon", "getItemIcon", "getPixmap", "getToggleIcon", + "guiFont", "guiFontB", "guiFontBU", "guiFontFixed", "guiFontSmall", "helpText", + "iconCache", "isDarkTheme", "syntaxMeta", "syntaxTheme", "textNHeight", "textNWidth", + "themeMeta", ) def __init__(self) -> None: @@ -131,12 +133,13 @@ class GuiTheme: self._availThemes: dict[str, Path] = {} self._availSyntax: dict[str, Path] = {} self._styleSheets: dict[str, str] = {} + self._svgColors: dict[str, bytes] = {} + self._qColors: dict[str, QColor] = {} # Icon Functions self.getIcon = self.iconCache.getIcon self.getPixmap = self.iconCache.getPixmap self.getItemIcon = self.iconCache.getItemIcon - self.getIconColor = self.iconCache.getIconColor self.getToggleIcon = self.iconCache.getToggleIcon self.getDecoration = self.iconCache.getDecoration self.getHeaderDecoration = self.iconCache.getHeaderDecoration @@ -202,6 +205,14 @@ class GuiTheme: qMetrics = QFontMetrics(self.guiFont) return ceil(qMetrics.boundingRect(text).width()) + def getBaseColor(self, name: str) -> QColor: + """Return a base color.""" + return QColor(self._qColors.get(name) or QtBlack) + + def getRawBaseColor(self, name: str) -> bytes: + """Return a base color.""" + return self._svgColors.get(name, self._svgColors.get("default", b"#000000")) + ## # Theme Methods ## @@ -216,6 +227,34 @@ class GuiTheme: window = palette.color(QPalette.ColorRole.Window) return text.lightnessF() > window.lightnessF() + def parseColor(self, value: str, default: QColor = QtBlack) -> QColor: + """Parse a string as a colour value.""" + if value in self._qColors: + # Named colour + return self._qColors[value] + elif value.startswith("#"): + if len(value) >= 9: + # Convert from #RRGGBBAA to #AARRGGBB + return QColor.fromString(f"#{value[7:9]}{value[1:7]}") + else: + # Assume #RRGGBB + return QColor.fromString(value[:7]) + elif "," in value: + data = value.split(",") + entries = len(data) + if entries == 2: + # Assume name, alpha + color = self._qColors.get(data[0].strip(), default) + color.setAlpha(checkInt(data[1], 255)) + return color + else: + # Assume red, green, blue, alpha + result = [0, 0, 0, 255] + for i in range(min(entries, 4)): + result[i] = checkInt(data[i].strip(), result[i]) + return QColor(*result) + return default + def loadTheme(self) -> bool: """Load the currently specified GUI theme.""" match CONFIG.themeMode: @@ -242,7 +281,7 @@ class GuiTheme: CONFIG.splashMessage("Loading GUI theme ...") logger.info("Loading GUI theme '%s'", theme) - parser = NWConfigParser() + parser = ConfigParser() try: with open(file, mode="r", encoding="utf-8") as fo: parser.read_file(fo) @@ -258,40 +297,40 @@ class GuiTheme: sec = "Main" meta = ThemeMeta() if parser.has_section(sec): - meta.name = parser.rdStr(sec, "name", "") - meta.mode = parser.rdStr(sec, "mode", "light") - meta.description = parser.rdStr(sec, "description", "N/A") - meta.author = parser.rdStr(sec, "author", "N/A") - meta.credit = parser.rdStr(sec, "credit", "N/A") - meta.url = parser.rdStr(sec, "url", "") - meta.license = parser.rdStr(sec, "license", "N/A") - meta.licenseUrl = parser.rdStr(sec, "licenseurl", "") + meta.name = parser.get(sec, "name", fallback="") + meta.mode = parser.get(sec, "mode", fallback="light") + meta.description = parser.get(sec, "description", fallback="N/A") + meta.author = parser.get(sec, "author", fallback="N/A") + meta.credit = parser.get(sec, "credit", fallback="N/A") + meta.url = parser.get(sec, "url", fallback="") + meta.license = parser.get(sec, "license", fallback="N/A") + meta.licenseUrl = parser.get(sec, "licenseurl", fallback="") self.themeMeta = meta # Icons - sec = "Icons" + sec = "Base" if parser.has_section(sec): - self.iconCache.setIconColor("default", self._parseColor(parser, sec, "default")) - self.iconCache.setIconColor("faded", self._parseColor(parser, sec, "faded")) - self.iconCache.setIconColor("red", self._parseColor(parser, sec, "red")) - self.iconCache.setIconColor("orange", self._parseColor(parser, sec, "orange")) - self.iconCache.setIconColor("yellow", self._parseColor(parser, sec, "yellow")) - self.iconCache.setIconColor("green", self._parseColor(parser, sec, "green")) - self.iconCache.setIconColor("aqua", self._parseColor(parser, sec, "aqua")) - self.iconCache.setIconColor("blue", self._parseColor(parser, sec, "blue")) - self.iconCache.setIconColor("purple", self._parseColor(parser, sec, "purple")) + self._setBaseColor("default", self._readColor(parser, sec, "default")) + self._setBaseColor("faded", self._readColor(parser, sec, "faded")) + self._setBaseColor("red", self._readColor(parser, sec, "red")) + self._setBaseColor("orange", self._readColor(parser, sec, "orange")) + self._setBaseColor("yellow", self._readColor(parser, sec, "yellow")) + self._setBaseColor("green", self._readColor(parser, sec, "green")) + self._setBaseColor("aqua", self._readColor(parser, sec, "aqua")) + self._setBaseColor("blue", self._readColor(parser, sec, "blue")) + self._setBaseColor("purple", self._readColor(parser, sec, "purple")) # Project sec = "Project" if parser.has_section(sec): - self.iconCache.setIconColor("root", self._parseColor(parser, sec, "root")) - self.iconCache.setIconColor("folder", self._parseColor(parser, sec, "folder")) - self.iconCache.setIconColor("file", self._parseColor(parser, sec, "file")) - self.iconCache.setIconColor("title", self._parseColor(parser, sec, "title")) - self.iconCache.setIconColor("chapter", self._parseColor(parser, sec, "chapter")) - self.iconCache.setIconColor("scene", self._parseColor(parser, sec, "scene")) - self.iconCache.setIconColor("note", self._parseColor(parser, sec, "note")) + self._setBaseColor("root", self._readColor(parser, sec, "root")) + self._setBaseColor("folder", self._readColor(parser, sec, "folder")) + self._setBaseColor("file", self._readColor(parser, sec, "file")) + self._setBaseColor("title", self._readColor(parser, sec, "title")) + self._setBaseColor("chapter", self._readColor(parser, sec, "chapter")) + self._setBaseColor("scene", self._readColor(parser, sec, "scene")) + self._setBaseColor("note", self._readColor(parser, sec, "note")) # Palette sec = "Palette" @@ -314,34 +353,34 @@ class GuiTheme: # GUI sec = "GUI" if parser.has_section(sec): - self.helpText = self._parseColor(parser, sec, "helptext") - self.fadedText = self._parseColor(parser, sec, "fadedtext") - self.errorText = self._parseColor(parser, sec, "errortext") + self.helpText = self._readColor(parser, sec, "helptext") + self.fadedText = self._readColor(parser, sec, "fadedtext") + self.errorText = self._readColor(parser, sec, "errortext") # Syntax sec = "Syntax" self.syntaxTheme = SyntaxColors() if parser.has_section(sec): - self.syntaxTheme.back = self._parseColor(parser, sec, "background") - self.syntaxTheme.text = self._parseColor(parser, sec, "text") - self.syntaxTheme.link = self._parseColor(parser, sec, "link") - self.syntaxTheme.head = self._parseColor(parser, sec, "headertext") - self.syntaxTheme.headH = self._parseColor(parser, sec, "headertag") - self.syntaxTheme.emph = self._parseColor(parser, sec, "emphasis") - self.syntaxTheme.dialN = self._parseColor(parser, sec, "dialog") - self.syntaxTheme.dialA = self._parseColor(parser, sec, "altdialog") - self.syntaxTheme.hidden = self._parseColor(parser, sec, "hidden") - self.syntaxTheme.note = self._parseColor(parser, sec, "note") - self.syntaxTheme.code = self._parseColor(parser, sec, "shortcode") - self.syntaxTheme.key = self._parseColor(parser, sec, "keyword") - self.syntaxTheme.tag = self._parseColor(parser, sec, "tag") - self.syntaxTheme.val = self._parseColor(parser, sec, "value") - self.syntaxTheme.opt = self._parseColor(parser, sec, "optional") - self.syntaxTheme.spell = self._parseColor(parser, sec, "spellcheckline") - self.syntaxTheme.error = self._parseColor(parser, sec, "errorline") - self.syntaxTheme.repTag = self._parseColor(parser, sec, "replacetag") - self.syntaxTheme.mod = self._parseColor(parser, sec, "modifier") - self.syntaxTheme.mark = self._parseColor(parser, sec, "texthighlight") + self.syntaxTheme.back = self._readColor(parser, sec, "background") + self.syntaxTheme.text = self._readColor(parser, sec, "text") + self.syntaxTheme.link = self._readColor(parser, sec, "link") + self.syntaxTheme.head = self._readColor(parser, sec, "headertext") + self.syntaxTheme.headH = self._readColor(parser, sec, "headertag") + self.syntaxTheme.emph = self._readColor(parser, sec, "emphasis") + self.syntaxTheme.dialN = self._readColor(parser, sec, "dialog") + self.syntaxTheme.dialA = self._readColor(parser, sec, "altdialog") + self.syntaxTheme.hidden = self._readColor(parser, sec, "hidden") + self.syntaxTheme.note = self._readColor(parser, sec, "note") + self.syntaxTheme.code = self._readColor(parser, sec, "shortcode") + self.syntaxTheme.key = self._readColor(parser, sec, "keyword") + self.syntaxTheme.tag = self._readColor(parser, sec, "tag") + self.syntaxTheme.val = self._readColor(parser, sec, "value") + self.syntaxTheme.opt = self._readColor(parser, sec, "optional") + self.syntaxTheme.spell = self._readColor(parser, sec, "spellcheckline") + self.syntaxTheme.error = self._readColor(parser, sec, "errorline") + self.syntaxTheme.repTag = self._readColor(parser, sec, "replacetag") + self.syntaxTheme.mod = self._readColor(parser, sec, "modifier") + self.syntaxTheme.mark = self._readColor(parser, sec, "texthighlight") # Update Dependant Colours # Based on: https://github.com/qt/qtbase/blob/dev/src/gui/kernel/qplatformtheme.cpp @@ -398,6 +437,18 @@ class GuiTheme: self._guiPalette.setBrush(QtColInactive, QPalette.ColorRole.Accent, highlight) self._guiPalette.setBrush(QtColDisabled, QPalette.ColorRole.Accent, grey) + # Set project override colours + if (override := CONFIG.iconColTree) != "theme": + color = self._svgColors.get(override, b"#000000") + self._svgColors["root"] = color + self._svgColors["folder"] = color + if not CONFIG.iconColDocs: + self._svgColors["file"] = color + self._svgColors["title"] = color + self._svgColors["chapter"] = color + self._svgColors["scene"] = color + self._svgColors["note"] = color + # Load icons after the theme is parsed self.iconCache.loadTheme(CONFIG.iconTheme) @@ -416,7 +467,7 @@ class GuiTheme: return self._themeList themes: list[T_ThemeEntry] = [] - parser = NWConfigParser() + parser = ConfigParser() for key, path in self._availThemes.items(): logger.debug("Checking theme config '%s'", key) if meta := _loadInternalName(parser, path): @@ -434,6 +485,12 @@ class GuiTheme: # Internal Functions ## + def _setBaseColor(self, key: str, color: QColor) -> None: + """Set the colour for a named colour.""" + self._qColors[key] = QColor(color) + self._svgColors[key] = color.name(QColor.NameFormat.HexRgb).encode("utf-8") + return + def _resetTheme(self) -> None: """Reset GUI colours to default values.""" palette = QPalette() @@ -460,37 +517,38 @@ class GuiTheme: self._guiPalette = palette - # Reset Icons - icons = self.iconCache - icons.clear() - icons.setIconColor("default", text) - icons.setIconColor("faded", faded) - icons.setIconColor("red", red) - icons.setIconColor("orange", orange) - icons.setIconColor("yellow", yellow) - icons.setIconColor("green", green) - icons.setIconColor("aqua", aqua) - icons.setIconColor("blue", blue) - icons.setIconColor("purple", purple) - icons.setIconColor("root", blue) - icons.setIconColor("folder", yellow) - icons.setIconColor("file", text) - icons.setIconColor("title", green) - icons.setIconColor("chapter", red) - icons.setIconColor("scene", blue) - icons.setIconColor("note", yellow) + # Reset Base Colours and Icons + self.iconCache.clear() + self._svgColors = {} + self._qColors = {} + self._setBaseColor("default", text) + self._setBaseColor("faded", faded) + self._setBaseColor("red", red) + self._setBaseColor("orange", orange) + self._setBaseColor("yellow", yellow) + self._setBaseColor("green", green) + self._setBaseColor("aqua", aqua) + self._setBaseColor("blue", blue) + self._setBaseColor("purple", purple) + self._setBaseColor("root", blue) + self._setBaseColor("folder", yellow) + self._setBaseColor("file", text) + self._setBaseColor("title", green) + self._setBaseColor("chapter", red) + self._setBaseColor("scene", blue) + self._setBaseColor("note", yellow) return - def _parseColor(self, parser: NWConfigParser, section: str, name: str) -> QColor: + def _readColor(self, parser: ConfigParser, section: str, name: str) -> QColor: """Parse a colour value from a config string.""" - return QColor(*parser.rdIntList(section, name, [0, 0, 0, 255])) + return self.parseColor(parser.get(section, name, fallback="default")) def _setPalette( - self, parser: NWConfigParser, section: str, name: str, value: QPalette.ColorRole + self, parser: ConfigParser, section: str, name: str, value: QPalette.ColorRole ) -> None: """Set a palette colour value from a config string.""" - self._guiPalette.setBrush(value, self._parseColor(parser, section, name)) + self._guiPalette.setBrush(value, self._readColor(parser, section, name)) return def _buildStyleSheets(self, palette: QPalette) -> None: @@ -536,9 +594,8 @@ class GuiIcons: """ __slots__ = ( - "_availThemes", "_headerDec", "_headerDecNarrow", "_noIcon", - "_qColors", "_qIcons", "_svgColors", "_svgData", "_themeList", - "mainTheme", "themeMeta", + "_availThemes", "_headerDec", "_headerDecNarrow", "_meta", "_noIcon", + "_qIcons", "_svgData", "_theme", "_themeList", ) TOGGLE_ICON_KEYS: Final[dict[str, tuple[str, str]]] = { @@ -552,13 +609,11 @@ class GuiIcons: def __init__(self, mainTheme: GuiTheme) -> None: - self.mainTheme = mainTheme - self.themeMeta = ThemeMeta() + self._theme = mainTheme + self._meta = ThemeMeta() # Storage self._svgData: dict[str, bytes] = {} - self._svgColors: dict[str, bytes] = {} - self._qColors: dict[str, QColor] = {} self._qIcons: dict[str, QIcon] = {} self._headerDec: list[QPixmap] = [] self._headerDecNarrow: list[QPixmap] = [] @@ -578,12 +633,10 @@ class GuiIcons: def clear(self) -> None: """Clear the icon cache.""" self._svgData = {} - self._svgColors = {} - self._qColors = {} self._qIcons = {} self._headerDec = [] self._headerDecNarrow = [] - self.themeMeta = ThemeMeta() + self._meta = ThemeMeta() return ## @@ -622,7 +675,7 @@ class GuiIcons: meta.author = value elif key == "meta:license": meta.license = value - self.themeMeta = meta + self._meta = meta except Exception: logger.error("Could not read file: %s", file) logException() @@ -631,38 +684,16 @@ class GuiIcons: CONFIG.splashMessage(f"Loaded icon theme: {meta.name}") CONFIG.splashMessage("Generating additional icons ...") - # Set colour overrides for project item icons - if (override := CONFIG.iconColTree) != "theme": - color = self._svgColors.get(override, b"#000000") - self._svgColors["root"] = color - self._svgColors["folder"] = color - if not CONFIG.iconColDocs: - self._svgColors["file"] = color - self._svgColors["title"] = color - self._svgColors["chapter"] = color - self._svgColors["scene"] = color - self._svgColors["note"] = color - # Populate generated icons cache self.getHeaderDecoration(0) self.getHeaderDecorationNarrow(0) return True - def setIconColor(self, key: str, color: QColor) -> None: - """Set an icon colour for a named colour.""" - self._qColors[key] = QColor(color) - self._svgColors[key] = color.name(QColor.NameFormat.HexRgb).encode("utf-8") - return - ## # Access Functions ## - def getIconColor(self, name: str) -> QColor: - """Return an icon color.""" - return QColor(self._qColors.get(name) or QtBlack) - def getIcon(self, name: str, color: str | None = None, w: int = 24, h: int = 24) -> QIcon: """Return an icon from the icon buffer, or load it.""" variant = f"{name}-{color}" if color else name @@ -733,7 +764,7 @@ class GuiIcons: map or the icon map. This function always returns a QPixmap. """ if name in self.IMAGE_MAP: - idx = int(self.mainTheme.isDarkTheme) + idx = int(self._theme.isDarkTheme) imgPath = CONFIG.assetPath("images") / self.IMAGE_MAP[name][idx] else: logger.error("Decoration with name '%s' does not exist", name) @@ -757,7 +788,7 @@ class GuiIcons: def getHeaderDecoration(self, hLevel: int) -> QPixmap: """Get the decoration for a specific heading level.""" if not self._headerDec: - iPx = self.mainTheme.baseIconHeight + iPx = self._theme.baseIconHeight self._headerDec = [ self._generateDecoration("file", iPx, 0), self._generateDecoration("title", iPx, 0), @@ -770,7 +801,7 @@ class GuiIcons: def getHeaderDecorationNarrow(self, hLevel: int) -> QPixmap: """Get the narrow decoration for a specific heading level.""" if not self._headerDecNarrow: - iPx = self.mainTheme.baseIconHeight + iPx = self._theme.baseIconHeight self._headerDecNarrow = [ self._generateDecoration("file", iPx, 0), self._generateDecoration("title", iPx, 0), @@ -811,7 +842,7 @@ class GuiIcons: return QIcon(str(CONFIG.assetPath("icons") / "x-novelwriter-project.svg")) if svg := self._svgData.get(name, b""): - if fill := self._svgColors.get(color or "default"): + if fill := self._theme.getRawBaseColor(color or "default"): svg = svg.replace(b"#000000", fill) pixmap = QPixmap(w, h) pixmap.fill(QtTransparent) @@ -833,7 +864,7 @@ class GuiIcons: painter = QPainter(pixmap) painter.setRenderHint(QtPaintAntiAlias) - if fill := self._svgColors.get(color or "default"): + if fill := self._theme.getRawBaseColor(color or "default"): painter.fillPath(path, QColor(fill.decode(encoding="utf-8"))) painter.end() @@ -859,13 +890,14 @@ def _sortTheme(data: tuple) -> str: return f"*{name}" if key.startswith("default_") else name -def _loadInternalName(parser: NWConfigParser, path: str | Path) -> tuple[str, bool]: +def _loadInternalName(parser: ConfigParser, path: str | Path) -> tuple[str, bool]: """Open a conf file and read the 'name' setting.""" try: + parser.clear() with open(path, mode="r", encoding="utf-8") as inFile: parser.read_file(inFile) - name = parser.rdStr("Main", "name", "") - dark = parser.rdStr("Main", "mode", "light").lower() == "dark" + name = parser.get("Main", "name", fallback="") + dark = parser.get("Main", "mode", fallback="light").lower() == "dark" return name, dark except Exception: logger.error("Could not read file: %s", path) diff --git a/tests/reference/baseConfig_novelwriter.conf b/tests/reference/baseConfig_novelwriter.conf index 78441636..8943a9b2 100644 --- a/tests/reference/baseConfig_novelwriter.conf +++ b/tests/reference/baseConfig_novelwriter.conf @@ -1,10 +1,11 @@ [Meta] -timestamp = 2025-05-11 13:28:11 +timestamp = 2025-06-02 16:21:38 [Main] font = -theme = default -syntax = default_light +lighttheme = default_light +darktheme = default_dark +thememode = AUTO icons = material_rounded_normal iconcoltree = theme iconcoldocs = False diff --git a/tests/test_base/test_base_config.py b/tests/test_base/test_base_config.py index 81b03831..98a1063d 100644 --- a/tests/test_base/test_base_config.py +++ b/tests/test_base/test_base_config.py @@ -131,15 +131,15 @@ def testBaseConfig_InitLoadSave(monkeypatch, fncPath, tstPaths): assert tstConf.errorText().startswith("Could not load config file") # Change a few settings, save, reset, and reload - tstConf.guiTheme = "foo" - tstConf.guiSyntax = "bar" + tstConf.lightTheme = "foo" + tstConf.darkTheme = "bar" assert tstConf.saveConfig() is True newConf = Config() newConf.initConfig(confPath=fncPath, dataPath=fncPath) newConf.loadConfig() - assert newConf.guiTheme == "foo" - assert newConf.guiSyntax == "bar" + assert newConf.lightTheme == "foo" + assert newConf.darkTheme == "bar" # Test Correcting Quote Settings tstConf.fmtDQuoteOpen = '"' diff --git a/tests/test_dialogs/test_dlg_preferences.py b/tests/test_dialogs/test_dlg_preferences.py index 5572f430..ccb77133 100644 --- a/tests/test_dialogs/test_dlg_preferences.py +++ b/tests/test_dialogs/test_dlg_preferences.py @@ -27,7 +27,7 @@ from PyQt6.QtGui import QAction, QFont, QFontDatabase, QKeyEvent from PyQt6.QtWidgets import QFileDialog, QFontDialog from novelwriter import CONFIG, SHARED -from novelwriter.config import DEF_GUI +from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT from novelwriter.constants import nwUnicode from novelwriter.dialogs.preferences import GuiPreferences from novelwriter.dialogs.quotes import GuiQuoteSelect @@ -55,15 +55,11 @@ def testDlgPreferences_Main(qtbot, monkeypatch, nwGUI, tstPaths): assert "en_GB" in languages # Check GUI Themes - themes = [prefs.guiTheme.itemData(i) for i in range(prefs.guiTheme.count())] - assert len(themes) >= 5 - assert DEF_GUI in themes + themes = [prefs.lightTheme.itemData(i) for i in range(prefs.lightTheme.count())] + assert DEF_GUI_LIGHT in themes - # Check GUI Syntax - syntax = [prefs.guiSyntax.itemData(i) for i in range(prefs.guiSyntax.count())] - assert len(syntax) >= 10 - assert "default_dark" in syntax - assert "default_light" in syntax + themes = [prefs.darkTheme.itemData(i) for i in range(prefs.darkTheme.count())] + assert DEF_GUI_DARK in themes # Check Spell Checking spelling = [prefs.spellLanguage.itemData(i) for i in range(prefs.spellLanguage.count())] @@ -124,7 +120,7 @@ def testDlgPreferences_Actions(qtbot, monkeypatch, nwGUI): button = prefs.buttonBox.button(QtDialogSave) assert button is not None button.click() - assert signal.args == [False, False, False, False] + assert len(signal.args) == 4 # Check Close Button prefs.show() @@ -151,6 +147,12 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): (fncPath / "nw_en_US.qm").touch() (fncPath / "project_en_US.json").touch() CONFIG._nwLangPath = fncPath + SHARED.theme._themeList = [ + ("theme1", "Theme 1", False), + ("theme2", "Theme 2", False), + ("theme3", "Theme 3", True), + ("theme4", "Theme 4", True), + ] prefs = GuiPreferences(nwGUI) with qtbot.waitExposed(prefs): @@ -158,7 +160,8 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): # Appearance prefs.guiLocale.setCurrentIndex(prefs.guiLocale.findData("en_US")) - prefs.guiTheme.setCurrentIndex(prefs.guiTheme.findData("default_dark")) + prefs.lightTheme.setCurrentIndex(prefs.lightTheme.findData("theme1")) + prefs.darkTheme.setCurrentIndex(prefs.darkTheme.findData("theme3")) with monkeypatch.context() as mp: mp.setattr(QFontDialog, "getFont", lambda *a, **k: (QFont(), True)) prefs.nativeFont.setChecked(True) # Use OS font dialog @@ -169,14 +172,14 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): prefs.useCharCount.setChecked(True) assert CONFIG.guiLocale != "en_US" - assert CONFIG.guiTheme != "default_dark" + assert CONFIG.lightTheme == "default_light" + assert CONFIG.darkTheme == "default_dark" assert CONFIG.guiFont.family() != "" assert CONFIG.hideVScroll is False assert CONFIG.hideHScroll is False assert CONFIG.useCharCount is False # Document Style - prefs.guiSyntax.setCurrentIndex(prefs.guiSyntax.findData("default_dark")) with monkeypatch.context() as mp: mp.setattr(QFontDialog, "getFont", lambda *a, **k: (QFont(), True)) prefs.nativeFont.setChecked(False) # Use Qt font dialog @@ -185,7 +188,6 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): prefs.showFullPath.setChecked(False) prefs.incNotesWCount.setChecked(False) - assert CONFIG.guiSyntax != "default_dark" assert CONFIG.textFont.family() != "" assert CONFIG.showFullPath is True assert CONFIG.incNotesWCount is True @@ -344,14 +346,14 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): # Appearance assert CONFIG.guiLocale == "en_US" - assert CONFIG.guiTheme == "default_dark" + assert CONFIG.lightTheme == "theme1" + assert CONFIG.darkTheme == "theme3" assert CONFIG.guiFont == QFont() assert CONFIG.hideVScroll is True assert CONFIG.hideHScroll is True assert CONFIG.useCharCount is True # Document Style - assert CONFIG.guiSyntax == "default_dark" assert CONFIG.textFont == QFont() assert CONFIG.showFullPath is False assert CONFIG.incNotesWCount is False diff --git a/tests/test_gui/test_gui_guimain.py b/tests/test_gui/test_gui_guimain.py index 6fda9b6a..91207d09 100644 --- a/tests/test_gui/test_gui_guimain.py +++ b/tests/test_gui/test_gui_guimain.py @@ -34,7 +34,7 @@ from PyQt6.QtWidgets import QInputDialog, QMessageBox from novelwriter import CONFIG, SHARED from novelwriter.constants import nwFiles from novelwriter.dialogs.editlabel import GuiEditLabel -from novelwriter.enum import nwDocAction, nwDocMode, nwFocus, nwItemType, nwView +from novelwriter.enum import nwDocAction, nwDocMode, nwFocus, nwItemType, nwTheme, nwView from novelwriter.gui.doceditor import GuiDocEditor from novelwriter.gui.noveltree import GuiNovelView from novelwriter.gui.outline import GuiOutlineView @@ -180,10 +180,11 @@ def testGuiMain_ProjectTreeItems(qtbot, monkeypatch, nwGUI, projPath, mockRnd): def testGuiMain_UpdateTheme(qtbot, nwGUI): """Test updating the theme in the GUI.""" mainTheme = SHARED.theme - CONFIG.guiTheme = "default_dark" - CONFIG.guiSyntax = "default_dark" + CONFIG.themeMode = nwTheme.DARK + CONFIG.darkTheme = "default_dark" + CONFIG.lightTheme = "default_light" mainTheme.loadTheme() - mainTheme.loadSyntax() + nwGUI._processConfigChanges(False, True, False, False) nwGUI._processConfigChanges(True, True, True, True) diff --git a/tests/test_gui/test_gui_theme.py b/tests/test_gui/test_gui_theme.py index c64f1172..ff4308f2 100644 --- a/tests/test_gui/test_gui_theme.py +++ b/tests/test_gui/test_gui_theme.py @@ -22,6 +22,7 @@ from __future__ import annotations import sys +from configparser import ConfigParser from pathlib import Path import pytest @@ -29,8 +30,7 @@ import pytest from PyQt6.QtGui import QColor, QIcon, QPalette, QPixmap from novelwriter import CONFIG, SHARED -from novelwriter.common import NWConfigParser -from novelwriter.config import DEF_GUI +from novelwriter.config import DEF_GUI_LIGHT from novelwriter.constants import nwLabels from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType from novelwriter.gui.theme import _listConf @@ -39,17 +39,51 @@ from tests.mocked import causeOSError from tests.tools import writeFile +@pytest.mark.gui +def testGuiTheme_ParseColor(qtbot, nwGUI): + """Test the colour parsing.""" + theme = SHARED.theme + + # Pre-Populate + theme._qColors["red"] = QColor(255, 0, 0) + theme._qColors["green"] = QColor(0, 255, 0) + theme._qColors["blue"] = QColor(0, 0, 255) + + # By Name + assert theme.parseColor("red").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("green").getRgb() == (0, 255, 0, 255) + assert theme.parseColor("blue").getRgb() == (0, 0, 255, 255) + assert theme.parseColor("bob").getRgb() == (0, 0, 0, 255) + + # CSS Format + assert theme.parseColor("#ff0000").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("#ff00007f").getRgb() == (255, 0, 0, 127) + assert theme.parseColor("#ff00").getRgb() == (0, 0, 0, 255) # Too short -> ignored + assert theme.parseColor("#ff00007f15").getRgb() == (255, 0, 0, 127) # Too long -> truncated + + # Name + Alpha + assert theme.parseColor("red, 255").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("red, 127").getRgb() == (255, 0, 0, 127) + assert theme.parseColor("red, 512").getRgb() == (255, 0, 0, 255) # Value truncated + + # Values + assert theme.parseColor("255, 0, 0").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("255, 0, 0, 255").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("255, 0, 0, 127").getRgb() == (255, 0, 0, 127) + assert theme.parseColor("255, 0, 0, 127, 42").getRgb() == (255, 0, 0, 127) # Truncated + + @pytest.mark.gui def testGuiTheme_Main(qtbot, nwGUI, tstPaths): """Test the theme class init.""" - mainTheme = SHARED.theme + theme = SHARED.theme # Methods # ======= - mSize = mainTheme.getTextWidth("m") + mSize = theme.getTextWidth("m") assert mSize > 0 - assert mainTheme.getTextWidth("m", mainTheme.guiFont) == mSize + assert theme.getTextWidth("m", theme.guiFont) == mSize # Scan for Themes # =============== @@ -70,7 +104,7 @@ def testGuiTheme_Main(qtbot, nwGUI, tstPaths): # Parse Colours # ============= - parser = NWConfigParser() + parser = ConfigParser() parser["Palette"] = { "colour1": "100, 150, 200", # Valid "colour2": "100, 150, 200, 250", # With alpha @@ -81,38 +115,39 @@ def testGuiTheme_Main(qtbot, nwGUI, tstPaths): } # Test the parser for several valid and invalid values - assert mainTheme._parseColor(parser, "Palette", "colour1").getRgb() == (100, 150, 200, 255) - assert mainTheme._parseColor(parser, "Palette", "colour2").getRgb() == (100, 150, 200, 250) - assert mainTheme._parseColor(parser, "Palette", "colour3").getRgb() == (100, 150, 200, 250) - assert mainTheme._parseColor(parser, "Palette", "colour4").getRgb() == (250, 250, 0, 255) - assert mainTheme._parseColor(parser, "Palette", "colour5").getRgb() == (0, 0, 0, 0) - assert mainTheme._parseColor(parser, "Palette", "colour6").getRgb() == (0, 127, 255, 255) + assert theme._readColor(parser, "Palette", "colour1").getRgb() == (100, 150, 200, 255) + assert theme._readColor(parser, "Palette", "colour2").getRgb() == (100, 150, 200, 250) + assert theme._readColor(parser, "Palette", "colour3").getRgb() == (100, 150, 200, 250) + assert theme._readColor(parser, "Palette", "colour4").getRgb() == (0, 0, 0, 250) + assert theme._readColor(parser, "Palette", "colour5").getRgb() == (0, 0, 0, 0) + assert theme._readColor(parser, "Palette", "colour6").getRgb() == (0, 127, 255, 255) # The palette should load with the parsed values - mainTheme._setPalette(parser, "Palette", "colour1", QPalette.ColorRole.Window) - assert mainTheme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (100, 150, 200, 255) - mainTheme._setPalette(parser, "Palette", "colour2", QPalette.ColorRole.Window) - assert mainTheme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (100, 150, 200, 250) - mainTheme._setPalette(parser, "Palette", "colour3", QPalette.ColorRole.Window) - assert mainTheme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (100, 150, 200, 250) - mainTheme._setPalette(parser, "Palette", "colour4", QPalette.ColorRole.Window) - assert mainTheme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (250, 250, 0, 255) - mainTheme._setPalette(parser, "Palette", "colour5", QPalette.ColorRole.Window) - assert mainTheme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (0, 0, 0, 0) - mainTheme._setPalette(parser, "Palette", "colour6", QPalette.ColorRole.Window) - assert mainTheme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (0, 127, 255, 255) + theme._setPalette(parser, "Palette", "colour1", QPalette.ColorRole.Window) + assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (100, 150, 200, 255) + theme._setPalette(parser, "Palette", "colour2", QPalette.ColorRole.Window) + assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (100, 150, 200, 250) + theme._setPalette(parser, "Palette", "colour3", QPalette.ColorRole.Window) + assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (100, 150, 200, 250) + theme._setPalette(parser, "Palette", "colour4", QPalette.ColorRole.Window) + assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (0, 0, 0, 250) + theme._setPalette(parser, "Palette", "colour5", QPalette.ColorRole.Window) + assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (0, 0, 0, 0) + theme._setPalette(parser, "Palette", "colour6", QPalette.ColorRole.Window) + assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (0, 127, 255, 255) # Non-existing value should return default colour - mainTheme._setPalette(parser, "Palette", "stuff", QPalette.ColorRole.Window) - assert mainTheme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (0, 0, 0, 255) + theme._setPalette(parser, "Palette", "stuff", QPalette.ColorRole.Window) + assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (0, 0, 0, 255) # qtbot.stop() @pytest.mark.gui +@pytest.mark.skip def testGuiTheme_Theme(qtbot, monkeypatch, nwGUI, tstPaths): """Test the theme part of the class.""" - mainTheme = SHARED.theme + theme = SHARED.theme # List Themes # =========== @@ -120,45 +155,46 @@ def testGuiTheme_Theme(qtbot, monkeypatch, nwGUI, tstPaths): # Block the reading of the files with monkeypatch.context() as mp: mp.setattr("builtins.open", causeOSError) - assert mainTheme.listThemes() == [] + theme._themeList = [] + assert theme.listThemes() == [] # Load the theme info, default themes first - themesList = mainTheme.listThemes() + themesList = theme.listThemes() assert themesList[0] == ("default_dark", "Default Dark Theme") assert themesList[1] == ("default_light", "Default Light Theme") assert themesList[2] == ("cyberpunk_night", "Cyberpunk Night") assert themesList[3] == ("dracula", "Dracula") # A second call should returned the cached list - assert mainTheme.listThemes() == mainTheme._themeList + assert theme.listThemes() == theme._themeList # Check handling of broken theme settings CONFIG.guiTheme = "not_a_theme" - availThemes = mainTheme._availThemes - mainTheme._availThemes = {} - assert mainTheme.loadTheme() is False - mainTheme._availThemes = availThemes + availThemes = theme._availThemes + theme._availThemes = {} + assert theme.loadTheme() is False + theme._availThemes = availThemes # Check handling of unreadable file - CONFIG.guiTheme = DEF_GUI + CONFIG.guiTheme = DEF_GUI_LIGHT with monkeypatch.context() as mp: mp.setattr("builtins.open", causeOSError) - assert mainTheme.loadTheme() is False + assert theme.loadTheme() is False # Load Default Theme # ================== if sys.platform != "win32": # Set a mock colour for the window background - mainTheme._guiPalette.color(QPalette.ColorRole.Window).setRgb(0, 0, 0, 0) + theme._guiPalette.color(QPalette.ColorRole.Window).setRgb(0, 0, 0, 0) # Load the default theme - CONFIG.guiTheme = DEF_GUI - assert mainTheme.loadTheme() is True + CONFIG.guiTheme = DEF_GUI_LIGHT + assert theme.loadTheme() is True # This should load a standard palette wCol = QPalette().color(QPalette.ColorRole.Window).getRgb() - assert mainTheme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == wCol + assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == wCol # Mock Dark Theme # =============== @@ -172,32 +208,32 @@ def testGuiTheme_Theme(qtbot, monkeypatch, nwGUI, tstPaths): "window = 0, 0, 0\n" "text = 255, 255, 255\n" ) - mainTheme._availThemes["test"] = mockTheme + theme._availThemes["test"] = mockTheme CONFIG.guiTheme = "test" - assert mainTheme.loadTheme() is True - assert mainTheme._guiPalette.window().color().getRgb() == (0, 0, 0, 255) - assert mainTheme._guiPalette.text().color().getRgb() == (255, 255, 255, 255) - assert mainTheme._guiPalette.light().color().getRgb() == (57, 57, 57, 255) - assert mainTheme.isDarkTheme is True + assert theme.loadTheme() is True + assert theme._guiPalette.window().color().getRgb() == (0, 0, 0, 255) + assert theme._guiPalette.text().color().getRgb() == (255, 255, 255, 255) + assert theme._guiPalette.light().color().getRgb() == (57, 57, 57, 255) + assert theme.isDarkTheme is True # Load Default Light Theme # ======================== CONFIG.guiTheme = "default_light" - assert mainTheme.loadTheme() is True + assert theme.loadTheme() is True # Check a few values - assert mainTheme._guiPalette.color( + assert theme._guiPalette.color( QPalette.ColorRole.Window ).getRgb() == (239, 239, 239, 255) - assert mainTheme._guiPalette.color( + assert theme._guiPalette.color( QPalette.ColorRole.WindowText ).getRgb() == (0, 0, 0, 255) - assert mainTheme._guiPalette.color( + assert theme._guiPalette.color( QPalette.ColorRole.Base ).getRgb() == (255, 255, 255, 255) - assert mainTheme._guiPalette.color( + assert theme._guiPalette.color( QPalette.ColorRole.AlternateBase ).getRgb() == (224, 224, 224, 255) @@ -205,21 +241,22 @@ def testGuiTheme_Theme(qtbot, monkeypatch, nwGUI, tstPaths): # ======================= CONFIG.guiTheme = "default_dark" - assert mainTheme.loadTheme() is True + assert theme.loadTheme() is True # Check a few values - assert mainTheme._guiPalette.color( + assert theme._guiPalette.color( QPalette.ColorRole.Window).getRgb() == (54, 54, 54, 255) - assert mainTheme._guiPalette.color( + assert theme._guiPalette.color( QPalette.ColorRole.WindowText).getRgb() == (204, 204, 204, 255) - assert mainTheme._guiPalette.color( + assert theme._guiPalette.color( QPalette.ColorRole.Base).getRgb() == (62, 62, 62, 255) - assert mainTheme._guiPalette.color( + assert theme._guiPalette.color( QPalette.ColorRole.AlternateBase).getRgb() == (78, 78, 78, 255) # qtbot.stop() +@pytest.mark.skip @pytest.mark.gui def testGuiTheme_Syntax(qtbot, monkeypatch, nwGUI): """Test the syntax part of the class.""" @@ -283,6 +320,7 @@ def testGuiTheme_Syntax(qtbot, monkeypatch, nwGUI): # qtbot.stop() +@pytest.mark.skip @pytest.mark.gui def testGuiTheme_IconThemes(qtbot, caplog, monkeypatch, nwGUI, tstPaths): """Test the icon cache class.""" From 04526385d1ae7757aeeec52c3ca5cc059995c571 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 2 Jun 2025 17:43:27 +0200 Subject: [PATCH 05/96] Update existing matched GUI and syntax themes --- .../assets/syntax/cyberpunk_night.conf | 28 ----- novelwriter/assets/syntax/dracula.conf | 44 ------- novelwriter/assets/syntax/snazzy.conf | 42 ------- novelwriter/assets/syntax/solarized_dark.conf | 29 ----- .../assets/syntax/solarized_light.conf | 29 ----- .../assets/themes/cyberpunk_night.conf | 91 +++++++++------ novelwriter/assets/themes/dracula.conf | 94 +++++++++------ novelwriter/assets/themes/snazzy.conf | 104 +++++++++++------ novelwriter/assets/themes/solarized_dark.conf | 110 ++++++++++++------ .../assets/themes/solarized_light.conf | 110 ++++++++++++------ 10 files changed, 338 insertions(+), 343 deletions(-) delete mode 100644 novelwriter/assets/syntax/cyberpunk_night.conf delete mode 100644 novelwriter/assets/syntax/dracula.conf delete mode 100644 novelwriter/assets/syntax/snazzy.conf delete mode 100644 novelwriter/assets/syntax/solarized_dark.conf delete mode 100644 novelwriter/assets/syntax/solarized_light.conf diff --git a/novelwriter/assets/syntax/cyberpunk_night.conf b/novelwriter/assets/syntax/cyberpunk_night.conf deleted file mode 100644 index 57a14536..00000000 --- a/novelwriter/assets/syntax/cyberpunk_night.conf +++ /dev/null @@ -1,28 +0,0 @@ -[Main] -name = Cyberpunk Night -author = Anders Lemvigh -url = https://github.com/alemvigh -license = CC BY-SA 4.0 -licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ - -[Syntax] -background = 0, 0, 0 -text = 150, 150, 150 -link = 77, 77, 255 -headertext = 255, 255, 255 -headertag = 50, 0, 180 -emphasis = 0, 255, 255 -dialog = 0, 255, 0 -altdialog = 0, 140, 255 -note = 150, 150, 150 -hidden = 77, 77, 100 -shortcode = 255, 255, 0 -keyword = 255, 100, 255 -tag = 255, 150, 10 -value = 255, 150, 10 -spellcheckline = 242, 72, 23 -errorline = 186, 218, 4 -replacetag = 0, 0, 180 -modifier = 144, 142, 176 -optional = 180, 180, 180 -texthighlight = 255, 255, 132, 96 diff --git a/novelwriter/assets/syntax/dracula.conf b/novelwriter/assets/syntax/dracula.conf deleted file mode 100644 index fad01ea8..00000000 --- a/novelwriter/assets/syntax/dracula.conf +++ /dev/null @@ -1,44 +0,0 @@ -[Main] -name = Dracula -author = Veronica Berglyd Olsen (adaptation) -credit = Zeno Rocha -url = https://draculatheme.com -license = MIT -licenseurl = https://github.com/dracula/dracula-theme/blob/main/LICENSE - -## -# Colours: -# Background = 282a36 : 40, 42, 54 -# Foreground = f8f8f2 : 248, 248, 242 -# Comment = 6272a4 : 98, 114, 164 -# Cyan = 8be9fd : 139, 233, 253 -# Green = 50fa7b : 80, 250, 123 -# Orange = ffb86c : 255, 184, 108 -# Pink = ff79c6 : 255, 121, 198 -# Purple = bd93f9 : 189, 147, 249 -# Red = ff5555 : 255, 85, 85 -# Yellow = f1fa8c : 241, 250, 140 -## - -[Syntax] -# See: https://spec.draculatheme.com/ -background = 40, 42, 54 -text = 248, 248, 242 -link = 255, 121, 198 -headertext = 189, 147, 249 -headertag = 189, 147, 249, 160 -emphasis = 255, 184, 108 -dialog = 80, 250, 123 -altdialog = 241, 250, 140 -note = 255, 204, 233 -hidden = 98, 114, 164 -shortcode = 139, 233, 253 -keyword = 255, 121, 198 -tag = 255, 184, 108 -value = 255, 184, 108 -optional = 80, 250, 123 -spellcheckline = 255, 85, 85 -errorline = 80, 250, 123 -replacetag = 241, 250, 140 -modifier = 139, 233, 253 -texthighlight = 241, 250, 140, 96 diff --git a/novelwriter/assets/syntax/snazzy.conf b/novelwriter/assets/syntax/snazzy.conf deleted file mode 100644 index d948b770..00000000 --- a/novelwriter/assets/syntax/snazzy.conf +++ /dev/null @@ -1,42 +0,0 @@ -[Main] -name = Snazzy Light -author = Veronica Berglyd Olsen (adaptation) -credit = Florian Reuschel (color theme) -url = https://github.com/loilo/vscode-snazzy-light -license = MIT License -licenseurl = https://github.com/loilo/vscode-snazzy-light/blob/master/LICENSE - -## -# Colours: -# Background = fafbfc : 250, 251, 252 -# Foreground = 565869 : 86, 88, 105 -# Comment = 9194a2 : 145, 148, 162 -# Yellow = cf9c00 : 207, 156, 0 -# Red = ff5c57 : 255, 92, 87 -# Pink = f767bb : 247, 103, 187 -# Blue = 09a1ed : 9, 161, 237 -# Cyan = 13bbb7 : 19, 187, 183 -# Green = 2dae58 : 45, 174, 88 -## - -[Syntax] -background = 250, 251, 252 -text = 86, 88, 105 -link = 9, 161, 237 -headertext = 45, 174, 88 -headertag = 45, 174, 88, 160 -emphasis = 247, 103, 187 -dialog = 9, 161, 237 -altdialog = 207, 156, 0 -note = 120, 187, 185 -hidden = 145, 148, 162 -shortcode = 247, 103, 187 -keyword = 9, 161, 237 -tag = 45, 174, 88 -value = 207, 156, 0 -optional = 207, 156, 0 -spellcheckline = 255, 92, 87 -errorline = 45, 174, 88 -replacetag = 19, 187, 183 -modifier = 247, 103, 187 -texthighlight = 207, 156, 0, 96 diff --git a/novelwriter/assets/syntax/solarized_dark.conf b/novelwriter/assets/syntax/solarized_dark.conf deleted file mode 100644 index 0fbacdb7..00000000 --- a/novelwriter/assets/syntax/solarized_dark.conf +++ /dev/null @@ -1,29 +0,0 @@ -[Main] -name = Solarized Dark -author = nullbasis -credit = Ethan Schoonover -url = https://ethanschoonover.com/solarized/ -license = MIT -licenseurl = https://github.com/altercation/solarized/blob/master/LICENSE - -[Syntax] -background = 7, 54, 66 -text = 253, 246, 227 -link = 38, 139, 210 -headertext = 147, 161, 161 -headertag = 42, 161, 152 -emphasis = 38, 139, 210 -dialog = 42, 161, 152 -altdialog = 42, 161, 152 -note = 101, 161, 156 -hidden = 147, 161, 161 -shortcode = 147, 161, 161 -keyword = 133, 153, 0 -tag = 203, 75, 22 -value = 203, 75, 22 -optional = 147, 161, 161 -spellcheckline = 203, 75, 22 -errorline = 220, 50, 47 -replacetag = 133, 153, 0 -modifier = 181, 137, 0 -texthighlight = 181, 137, 0, 96 diff --git a/novelwriter/assets/syntax/solarized_light.conf b/novelwriter/assets/syntax/solarized_light.conf deleted file mode 100644 index 525a59e5..00000000 --- a/novelwriter/assets/syntax/solarized_light.conf +++ /dev/null @@ -1,29 +0,0 @@ -[Main] -name = Solarized Light -author = nullbasis -credit = Ethan Schoonover -url = https://ethanschoonover.com/solarized/ -license = MIT -licenseurl = https://github.com/altercation/solarized/blob/master/LICENSE - -[Syntax] -background = 253, 246, 227 -text = 0, 43, 54 -link = 38, 139, 210 -headertext = 88, 110, 117 -headertag = 42, 161, 152 -emphasis = 38, 139, 210 -dialog = 42, 161, 152 -altdialog = 42, 161, 152 -note = 27, 102, 96 -hidden = 88, 110, 117 -shortcode = 88, 110, 117 -keyword = 133, 153, 0 -tag = 203, 75, 22 -value = 203, 75, 22 -optional = 88, 110, 117 -spellcheckline = 203, 75, 22 -errorline = 220, 50, 47 -replacetag = 133, 153, 0 -modifier = 181, 137, 0 -texthighlight = 181, 137, 0, 96 diff --git a/novelwriter/assets/themes/cyberpunk_night.conf b/novelwriter/assets/themes/cyberpunk_night.conf index 125cab45..1ee10ca8 100644 --- a/novelwriter/assets/themes/cyberpunk_night.conf +++ b/novelwriter/assets/themes/cyberpunk_night.conf @@ -1,48 +1,71 @@ [Main] name = Cyberpunk Night +mode = dark description = A taste of the future 80s author = Anders Lemvigh url = https://github.com/alemvigh license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ -[Icons] -default = 136, 136, 136 -faded = 97, 97, 97 -red = 242, 72, 23 -orange = 255, 150, 10 -yellow = 255, 255, 0 -green = 0, 255, 0 -aqua = 0, 255, 255 -blue = 77, 77, 255 -purple = 50, 0, 180 +[Base] +default = #888888 +faded = #616161 +red = #f24817 +orange = #ff960a +yellow = #ffff00 +green = #00ff00 +aqua = #00ffff +blue = #4d4dff +purple = #320064 [Project] -root = 77, 77, 255 -folder = 255, 255, 0 -file = 136, 136, 136 -title = 0, 255, 0 -chapter = 242, 72, 23 -scene = 77, 77, 255 -note = 255, 255, 0 +root = #4d4dff +folder = #ffff00 +file = #888888 +title = #00ff00 +chapter = #f24817 +scene = #4d4dff +note = #ffff00 [Palette] -window = 0, 0, 0 -windowtext = 150, 150, 150 -base = 0, 0, 0 -alternatebase = 40, 40, 40 -text = 150, 150, 150 -tooltipbase = 40, 20, 70 -tooltiptext = 255, 255, 255 -button = 5, 0, 10 -buttontext = 150, 150, 150 -brighttext = 255, 255, 255 -highlight = 50, 30, 80 -highlightedtext = 255, 255, 255 -link = 77, 77, 255 -linkvisited = 50, 0, 80 +window = #000000 +windowtext = #969696 +base = #000000 +alternatebase = #282828 +text = #969696 +tooltipbase = #281446 +tooltiptext = #ffffff +button = #05000a +buttontext = #969696 +brighttext = #ffffff +highlight = #321e50 +highlightedtext = #ffffff +link = #4d4dff +linkvisited = #320050 [GUI] -helptext = 97, 97, 97 -fadedtext = 97, 97, 97 -errortext = 242, 72, 23 +helptext = #616161 +fadedtext = #616161 +errortext = #f24817 + +[Syntax] +background = #000000 +text = #969696 +link = #4d4dff +headertext = #ffffff +headertag = #320064 +emphasis = #00ffff +dialog = #00ff00 +altdialog = #008cff +note = #969696 +hidden = #4d4d64 +shortcode = #ffff00 +keyword = #ff64ff +tag = #ff960a +value = #ff960a +spellcheckline = #f24817 +errorline = #bada04 +replacetag = #0000b4 +modifier = #908eb0 +optional = #b4b4b4 +texthighlight = #ffff8460 diff --git a/novelwriter/assets/themes/dracula.conf b/novelwriter/assets/themes/dracula.conf index 5805b84b..49f30501 100644 --- a/novelwriter/assets/themes/dracula.conf +++ b/novelwriter/assets/themes/dracula.conf @@ -1,5 +1,6 @@ [Main] name = Dracula +mode = dark description = A dark theme with bright colours author = Veronica Berglyd Olsen (adaptation) credit = Zeno Rocha @@ -9,9 +10,10 @@ licenseurl = https://github.com/dracula/dracula-theme/blob/main/LICENSE ## # Colours: +# See: https://spec.draculatheme.com/ # Background = 282a36 : 40, 42, 54 # Foreground = f8f8f2 : 248, 248, 242 -# Current Line = 44475A : 68, 71, 90 +# Current Line = 44475a : 68, 71, 90 # Comment = 6272a4 : 98, 114, 164 # Cyan = 8be9fd : 139, 233, 253 # Green = 50fa7b : 80, 250, 123 @@ -22,43 +24,65 @@ licenseurl = https://github.com/dracula/dracula-theme/blob/main/LICENSE # Yellow = f1fa8c : 241, 250, 140 ## -[Icons] -default = 230, 230, 224 -faded = 98, 114, 164 -red = 255, 85, 85 -orange = 255, 184, 108 -yellow = 241, 250, 140 -green = 80, 250, 123 -aqua = 139, 233, 253 -blue = 147, 207, 249 -purple = 189, 147, 249 +[Base] +default = #e6e6e0 +faded = #6272a4 +red = #ff5555 +orange = #ffb86c +yellow = #f1fa8c +green = #50fa7b +aqua = #8be9fd +blue = #93cff9 +purple = #bd93f9 [Project] -root = 189, 147, 249 -folder = 241, 250, 140 -file = 230, 230, 224 -title = 80, 250, 123 -chapter = 255, 85, 85 -scene = 139, 233, 253 -note = 241, 250, 140 +root = #bd93f9 +folder = #f1fa8c +file = #e6e6e0 +title = #50fa7b +chapter = #ff5555 +scene = #8be9fd +note = #f1fa8c [Palette] -window = 68, 71, 90 -windowtext = 248, 248, 242 -base = 40, 42, 54 -alternatebase = 51, 54, 69 -text = 248, 248, 242 -tooltipbase = 241, 250, 140 -tooltiptext = 40, 42, 54 -button = 80, 83, 105 -buttontext = 248, 248, 242 -brighttext = 68, 71, 90 -highlight = 166, 129, 218 -highlightedtext = 248, 248, 242 -link = 139, 233, 253 -linkvisited = 139, 233, 253 +window = #44475a +windowtext = #f8f8f2 +base = #282a36 +alternatebase = #333645 +text = #f8f8f2 +tooltipbase = #f1fa8c +tooltiptext = #282a36 +button = #505369 +buttontext = #f8f8f2 +brighttext = #44475a +highlight = #a681da +highlightedtext = #f8f8f2 +link = #8be9fd +linkvisited = #8be9fd [GUI] -helptext = 204, 172, 249 -fadedtext = 98, 114, 164 -errortext = 255, 85, 85 +helptext = #ccacf9 +fadedtext = #6272a4 +errortext = #ff5555 + +[Syntax] +background = #282a36 +text = #f8f8f2 +link = #ff79c6 +headertext = #bd93f9 +headertag = #bd93f9a0 +emphasis = #ffb86c +dialog = #50fa7b +altdialog = #f1fa8c +note = #ffcce9 +hidden = #6272a4 +shortcode = #8be9fd +keyword = #ff79c6 +tag = #ffb86c +value = #ffb86c +optional = #50fa7b +spellcheckline = #ff5555 +errorline = #50fa7b +replacetag = #f1fa8c +modifier = #8be9fd +texthighlight = #f1fa8c60 diff --git a/novelwriter/assets/themes/snazzy.conf b/novelwriter/assets/themes/snazzy.conf index 39ec3c87..19a662c0 100644 --- a/novelwriter/assets/themes/snazzy.conf +++ b/novelwriter/assets/themes/snazzy.conf @@ -1,48 +1,84 @@ [Main] name = Snazzy Light +mode = light author = Veronica Berglyd Olsen (adaptation) credit = Florian Reuschel (color theme) url = https://github.com/loilo/vscode-snazzy-light license = MIT License licenseurl = https://github.com/loilo/vscode-snazzy-light/blob/master/LICENSE -[Icons] -default = 86, 88, 105 -faded = 84, 85, 84 -red = 255, 92, 87 -orange = 245, 185, 0 -yellow = 207, 156, 0 -green = 45, 174, 88 -aqua = 19, 187, 183 -blue = 9, 161, 237 -purple = 247, 103, 187 +## +# Colours: +# Background = fafbfc : 250, 251, 252 +# Foreground = 565869 : 86, 88, 105 +# Comment = 9194a2 : 145, 148, 162 +# Yellow = cf9c00 : 207, 156, 0 +# Red = ff5c57 : 255, 92, 87 +# Pink = f767bb : 247, 103, 187 +# Blue = 09a1ed : 9, 161, 237 +# Cyan = 13bbb7 : 19, 187, 183 +# Green = 2dae58 : 45, 174, 88 +## + +[Base] +default = #565869 +faded = #545554 +red = #ff5c57 +orange = #f5b900 +yellow = #cf9c00 +green = #2dae58 +aqua = #13bbb7 +blue = #09a1ed +purple = #f767bb [Project] -root = 9, 161, 237 -folder = 207, 156, 0 -file = 84, 85, 84 -title = 45, 174, 88 -chapter = 255, 92, 87 -scene = 9, 161, 237 -note = 207, 156, 0 +root = #09a1ed +folder = #cf9c00 +file = #545554 +title = #2dae58 +chapter = #ff5c57 +scene = #09a1ed +note = #cf9c00 [Palette] -window = 243, 244, 245 -windowtext = 86, 88, 105 -base = 250, 251, 252 -alternatebase = 234, 234, 235 -text = 86, 88, 105 -tooltipbase = 245, 233, 194 -tooltiptext = 86, 88, 105 -button = 250, 251, 252 -buttontext = 86, 88, 105 -brighttext = 255, 255, 255 -highlight = 9, 161, 237 -highlightedtext = 255, 255, 255 -link = 9, 161, 237 -linkvisited = 9, 161, 237 +window = #f3f4f5 +windowtext = #565869 +base = #fafbfc +alternatebase = #eaeaeb +text = #565869 +tooltipbase = #f5e9c2 +tooltiptext = #565869 +button = #fafbfc +buttontext = #565869 +brighttext = #ffffff +highlight = #09a1ed +highlightedtext = #ffffff +link = #09a1ed +linkvisited = #09a1ed [GUI] -helptext = 9, 161, 237 -fadedtext = 84, 85, 84 -errortext = 255, 92, 87 +helptext = #09a1ed +fadedtext = #545554 +errortext = #ff5c57 + +[Syntax] +background = #fafbfc +text = #565869 +link = #09a1ed +headertext = #2dae58 +headertag = #2dae58a0 +emphasis = #f767bb +dialog = #09a1ed +altdialog = #cf9c00 +note = #78bbb9 +hidden = #9194a2 +shortcode = #f767bb +keyword = #09a1ed +tag = #2dae58 +value = #cf9c00 +optional = #cf9c00 +spellcheckline = #ff5c57 +errorline = #2dae58 +replacetag = #13bbb7 +modifier = #f767bb +texthighlight = #cf9c0060 diff --git a/novelwriter/assets/themes/solarized_dark.conf b/novelwriter/assets/themes/solarized_dark.conf index 0f401eb9..354b2be9 100644 --- a/novelwriter/assets/themes/solarized_dark.conf +++ b/novelwriter/assets/themes/solarized_dark.conf @@ -1,48 +1,90 @@ [Main] name = Solarized Dark +mode = dark author = nullbasis credit = Ethan Schoonover url = https://ethanschoonover.com/solarized/ license = MIT licenseurl = https://github.com/altercation/solarized/blob/master/LICENSE -[Icons] -default = 230, 223, 206 -faded = 166, 161, 149 -red = 220, 50, 47 -orange = 203, 75, 22 -yellow = 181, 137, 0 -green = 133, 153, 0 -aqua = 42, 161, 152 -blue = 38, 139, 210 -purple = 211, 54, 130 +## +# base03: #002b36 +# base02: #073642 +# base01: #586e75 +# base00: #657b83 +# base0: #839496 +# base1: #93a1a1 +# base2: #eee8d5 +# base3: #fdf6e3 +# yellow: #b58900 +# orange: #cb4b16 +# red: #dc322f +# magenta: #d33682 +# violet: #6c71c4 +# blue: #268bd2 +# cyan: #2aa198 +# green: #859900 +## + +[Base] +default = #e6dfce +faded = #a6a195 +red = #dc322f +orange = #cb4b16 +yellow = #b58900 +green = #859900 +aqua = #2aa198 +blue = #268bd2 +purple = #6c71c4 [Project] -root = 42, 161, 152 -folder = 42, 161, 152 -file = 230, 223, 206 -title = 133, 153, 0 -chapter = 220, 50, 47 -scene = 38, 139, 210 -note = 181, 137, 0 +root = #2aa198 +folder = #2aa198 +file = #e6dfce +title = #859900 +chapter = #dc322f +scene = #268bd2 +note = #b58900 [Palette] -window = 0, 43, 54 -windowtext = 253, 246, 227 -base = 7, 54, 66 -alternatebase = 88, 110, 117 -text = 253, 246, 227 -tooltipbase = 133, 153, 0 -tooltiptext = 0, 43, 54 -button = 7, 54, 66 -buttontext = 253, 246, 227 -brighttext = 7, 54, 66 -highlight = 42, 161, 152 -highlightedtext = 0, 43, 54 -link = 38, 139, 210 -linkvisited = 38, 139, 210 +window = #002b36 +windowtext = #fdf6e3 +base = #073642 +alternatebase = #586e75 +text = #fdf6e3 +tooltipbase = #859900 +tooltiptext = #002b36 +button = #073642 +buttontext = #fdf6e3 +brighttext = #073642 +highlight = #2aa198 +highlightedtext = #002b36 +link = #268bd2 +linkvisited = #268bd2 [GUI] -helptext = 101, 123, 131 -fadedtext = 101, 123, 131 -errortext = 220, 50, 47 +helptext = #657b83 +fadedtext = #657b83 +errortext = #dc322f + +[Syntax] +background = #073642 +text = #fdf6e3 +link = #268bd2 +headertext = #93a1a1 +headertag = #2aa198 +emphasis = #268bd2 +dialog = #2aa198 +altdialog = #2aa198 +note = #65a19c +hidden = #93a1a1 +shortcode = #93a1a1 +keyword = #859900 +tag = #cb4b16 +value = #cb4b16 +optional = #93a1a1 +spellcheckline = #cb4b16 +errorline = #dc322f +replacetag = #859900 +modifier = #b58900 +texthighlight = #b5890060 diff --git a/novelwriter/assets/themes/solarized_light.conf b/novelwriter/assets/themes/solarized_light.conf index 06f4cb20..7d7427f5 100644 --- a/novelwriter/assets/themes/solarized_light.conf +++ b/novelwriter/assets/themes/solarized_light.conf @@ -1,48 +1,90 @@ [Main] name = Solarized Light +mode = light author = nullbasis credit = Ethan Schoonover url = https://ethanschoonover.com/solarized/ license = MIT licenseurl = https://github.com/altercation/solarized/blob/master/LICENSE -[Icons] -default = 59, 68, 71 -faded = 78, 91, 95 -red = 220, 50, 47 -orange = 203, 75, 22 -yellow = 181, 137, 0 -green = 133, 153, 0 -aqua = 42, 161, 152 -blue = 38, 139, 210 -purple = 211, 54, 130 +## +# base03: #002b36 +# base02: #073642 +# base01: #586e75 +# base00: #657b83 +# base0: #839496 +# base1: #93a1a1 +# base2: #eee8d5 +# base3: #fdf6e3 +# yellow: #b58900 +# orange: #cb4b16 +# red: #dc322f +# magenta: #d33682 +# violet: #6c71c4 +# blue: #268bd2 +# cyan: #2aa198 +# green: #859900 +## + +[Base] +default = #3b4447 +faded = #4e5b5f +red = #dc322f +orange = #cb4b16 +yellow = #b58900 +green = #859900 +aqua = #2aa198 +blue = #268bd2 +purple = #6c71c4 [Project] -root = 42, 161, 152 -folder = 42, 161, 152 -file = 59, 68, 71 -title = 133, 153, 0 -chapter = 220, 50, 47 -scene = 38, 139, 210 -note = 181, 137, 0 +root = #2aa198 +folder = #2aa198 +file = #3b4447 +title = #859900 +chapter = #dc322f +scene = #268bd2 +note = #b58900 [Palette] -window = 238, 232, 213 -windowtext = 0, 43, 54 -base = 253, 246, 227 -alternatebase = 147, 161, 161 -text = 0, 43, 54 -tooltipbase = 133, 153, 0 -tooltiptext = 0, 43, 54 -button = 238, 232, 213 -buttontext = 0, 43, 54 -brighttext = 253, 246, 227 -highlight = 42, 161, 152 -highlightedtext = 253, 246, 227 -link = 38, 139, 210 -linkvisited = 38, 139, 210 +window = #eee8d5 +windowtext = #002b36 +base = #fdf6e3 +alternatebase = #93a1a1 +text = #002b36 +tooltipbase = #859900 +tooltiptext = #002b36 +button = #eee8d5 +buttontext = #002b36 +brighttext = #fdf6e3 +highlight = #2aa198 +highlightedtext = #fdf6e3 +link = #268bd2 +linkvisited = #268bd2 [GUI] -helptext = 78, 91, 95 -fadedtext = 78, 91, 95 -errortext = 220, 50, 47 +helptext = #4e5b5f +fadedtext = #4e5b5f +errortext = #dc322f + +[Syntax] +background = #fdf6e3 +text = #002b36 +link = #268bd2 +headertext = #586e75 +headertag = #2aa198 +emphasis = #268bd2 +dialog = #2aa198 +altdialog = #2aa198 +note = #1b6660 +hidden = #586e75 +shortcode = #586e75 +keyword = #859900 +tag = #cb4b16 +value = #cb4b16 +optional = #586e75 +spellcheckline = #cb4b16 +errorline = #dc322f +replacetag = #859900 +modifier = #b58900 +texthighlight = #b5890060 From 072d0f0acdd5f6f583f9b96d37556186e91fb94a Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 2 Jun 2025 18:40:58 +0200 Subject: [PATCH 06/96] Merge and update the default themes --- novelwriter/assets/syntax/default_dark.conf | 42 --------- novelwriter/assets/syntax/default_light.conf | 42 --------- novelwriter/assets/themes/default_dark.conf | 90 ++++++++++++-------- novelwriter/assets/themes/default_light.conf | 90 ++++++++++++-------- novelwriter/gui/theme.py | 2 +- 5 files changed, 113 insertions(+), 153 deletions(-) delete mode 100644 novelwriter/assets/syntax/default_dark.conf delete mode 100644 novelwriter/assets/syntax/default_light.conf diff --git a/novelwriter/assets/syntax/default_dark.conf b/novelwriter/assets/syntax/default_dark.conf deleted file mode 100644 index 8e467189..00000000 --- a/novelwriter/assets/syntax/default_dark.conf +++ /dev/null @@ -1,42 +0,0 @@ -[Main] -name = Default Dark -author = Veronica Berglyd Olsen -credit = Veronica Berglyd Olsen -url = https://github.com/vkbo/novelWriter -license = CC BY-SA 4.0 -licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ - -## -# Colours: -# Background = 2a2a2a : 42, 42, 42 -# Foreground = cccccc : 204, 204, 204 -# Comment = 969696 : 150, 150, 150 -# Red = e64250 : 230, 66, 80 -# Orange = f99157 : 249, 145, 87 -# Yellow = ffff84 : 255, 255, 132 -# Green = 99cc99 : 153, 204, 153 -# Blue = 288ed7 : 102, 153, 204 -# Purple = 8c56d7 : 140, 86, 215 -## - -[Syntax] -background = 42, 42, 42 -text = 204, 204, 204 -link = 102, 153, 204 -headertext = 153, 204, 153 -headertag = 153, 204, 153, 160 -emphasis = 249, 145, 87 -dialog = 102, 153, 204 -altdialog = 102, 153, 204 -note = 255, 255, 216 -hidden = 150, 150, 150 -shortcode = 153, 204, 153 -keyword = 230, 66, 80 -tag = 153, 204, 153 -value = 102, 153, 204 -optional = 153, 204, 153 -spellcheckline = 230, 66, 80 -errorline = 153, 204, 153 -replacetag = 153, 204, 153 -modifier = 153, 204, 153 -texthighlight = 255, 255, 132, 96 diff --git a/novelwriter/assets/syntax/default_light.conf b/novelwriter/assets/syntax/default_light.conf deleted file mode 100644 index 2e5ae404..00000000 --- a/novelwriter/assets/syntax/default_light.conf +++ /dev/null @@ -1,42 +0,0 @@ -[Main] -name = Default Light -author = Veronica Berglyd Olsen -credit = Veronica Berglyd Olsen -url = https://github.com/vkbo/novelWriter -license = CC BY-SA 4.0 -licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ - -## -# Colours: -# Background = ffffff : 255, 255, 255 -# Foreground = 000000 : 0, 0, 0 -# Comment = 646464 : 100, 100, 100 -# Red = c83232 : 200, 50, 50 -# Orange = ae6e1e : 174, 110, 30 -# Yellow = 969600 : 150, 150, 0 -# Green = 006400 : 0, 100, 0 -# Blue = 0000c8 : 0, 0, 200 -# Purple = 6400ae : 100, 0, 174 -## - -[Syntax] -background = 255, 255, 255 -text = 0, 0, 0 -link = 0, 0, 200 -headertext = 0, 100, 0 -headertag = 0, 100, 0, 160 -emphasis = 174, 110, 30 -dialog = 0, 0, 200 -altdialog = 0, 0, 200 -note = 100, 100, 0 -hidden = 100, 100, 100 -shortcode = 0, 100, 0 -keyword = 200, 50, 50 -tag = 0, 100, 0 -value = 0, 0, 200 -optional = 0, 100, 0 -spellcheckline = 200, 50, 50 -errorline = 0, 100, 0 -replacetag = 0, 100, 0 -modifier = 0, 100, 0 -texthighlight = 150, 150, 0, 96 diff --git a/novelwriter/assets/themes/default_dark.conf b/novelwriter/assets/themes/default_dark.conf index 6ccf6ede..a8e6a3de 100644 --- a/novelwriter/assets/themes/default_dark.conf +++ b/novelwriter/assets/themes/default_dark.conf @@ -8,43 +8,65 @@ url = https://github.com/vkbo/novelWriter license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ -[Icons] -default = 184, 184, 184 -faded = 148, 148, 148 -red = 242, 119, 122 -orange = 249, 145, 57 -yellow = 255, 204, 102 -green = 153, 204, 153 -aqua = 102, 204, 204 -blue = 102, 153, 204 -purple = 204, 153, 204 +[Base] +default = #cccccc +faded = #949494 +red = #f2777a +orange = #f99139 +yellow = #ffcc66 +green = #99cc99 +aqua = #66cccc +blue = #6699cc +purple = #cc99cc [Project] -root = 102, 153, 204 -folder = 255, 204, 102 -file = 184, 184, 184 -title = 153, 204, 153 -chapter = 242, 119, 122 -scene = 102, 153, 204 -note = 255, 204, 102 +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] -window = 54, 54, 54 -windowtext = 204, 204, 204 -base = 62, 62, 62 -alternatebase = 78, 78, 78 -text = 204, 204, 204 -tooltipbase = 255, 255, 192 -tooltiptext = 21, 21, 13 -button = 62, 62, 62 -buttontext = 204, 204, 204 -brighttext = 62, 62, 62 -highlight = 44, 152, 247 -highlightedtext = 255, 255, 255 -link = 102, 153, 204 -linkvisited = 102, 153, 204 +window = #363636 +windowtext = default +base = #3e3e3e +alternatebase = #4e4e4e +text = default +tooltipbase = #ffffc0 +tooltiptext = #15150d +button = #3e3e3e +buttontext = default +brighttext = #3e3e3e +highlight = #2c98f7 +highlightedtext = #ffffff +link = blue +linkvisited = blue [GUI] -helptext = 164, 164, 164 -fadedtext = 148, 148, 148 -errortext = 255, 164, 164 +helptext = #a4a4a4 +fadedtext = #949494 +errortext = red + +[Syntax] +background = #363636 +text = default +link = blue +headertext = green +headertag = green, 160 +emphasis = orange +dialog = blue +altdialog = blue +note = yellow +hidden = faded +shortcode = green +keyword = red +tag = green +value = blue +optional = green +spellcheckline = red +errorline = green +replacetag = green +modifier = green +texthighlight = yellow, 72 diff --git a/novelwriter/assets/themes/default_light.conf b/novelwriter/assets/themes/default_light.conf index f236f404..c4496d13 100644 --- a/novelwriter/assets/themes/default_light.conf +++ b/novelwriter/assets/themes/default_light.conf @@ -8,43 +8,65 @@ url = https://github.com/vkbo/novelWriter license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ -[Icons] -default = 72, 72, 72 -faded = 108, 108, 108 -red = 240, 40, 41 -orange = 245, 135, 31 -yellow = 234, 183, 0 -green = 113, 140, 0 -aqua = 62, 153, 159 -blue = 66, 113, 174 -purple = 137, 89, 168 +[Base] +default = #303030 +faded = #6c6c6c +red = #a62a2d +orange = #b36829 +yellow = #a68542 +green = #296629 +aqua = #269999 +blue = #3a70a6 +purple = #b35ab3 [Project] -root = 66, 113, 174 -folder = 234, 183, 0 -file = 72, 72, 72 -title = 113, 140, 0 -chapter = 240, 40, 41 -scene = 66, 113, 174 -note = 234, 183, 0 +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] -window = 239, 239, 239 -windowtext = 0, 0, 0 -base = 255, 255, 255 -alternatebase = 224, 224, 224 -text = 0, 0, 0 -tooltipbase = 255, 255, 220 -tooltiptext = 0, 0, 0 -button = 239, 239, 239 -buttontext = 0, 0, 0 -brighttext = 255, 255, 255 -highlight = 48, 135, 198 -highlightedtext = 255, 255, 255 -link = 66, 113, 174 -linkvisited = 66, 113, 174 +window = #efefef +windowtext = #000000 +base = #ffffff +alternatebase = #e0e0e0 +text = #000000 +tooltipbase = #ffffdc +tooltiptext = #000000 +button = #efefef +buttontext = #000000 +brighttext = #ffffff +highlight = #3087c6 +highlightedtext = #ffffff +link = blue +linkvisited = blue [GUI] -helptext = 92, 92, 92 -fadedtext = 108, 108, 108 -errortext = 255, 92, 92 +helptext = #5c5c5c +fadedtext = #6c6c6c +errortext = red + +[Syntax] +background = #ffffff +text = #000000 +link = blue +headertext = green +headertag = green, 160 +emphasis = orange +dialog = blue +altdialog = blue +note = yellow +hidden = faded +shortcode = green +keyword = red +tag = green +value = blue +optional = green +spellcheckline = red +errorline = green +replacetag = green +modifier = green +texthighlight = #c8c80060 diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 437531a3..4a53f453 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -244,7 +244,7 @@ class GuiTheme: entries = len(data) if entries == 2: # Assume name, alpha - color = self._qColors.get(data[0].strip(), default) + color = QColor(self._qColors.get(data[0].strip(), default)) color.setAlpha(checkInt(data[1], 255)) return color else: From 3258b8806f74ff89cd421bbea3be0f67350cdac4 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 2 Jun 2025 19:15:33 +0200 Subject: [PATCH 07/96] Merge and update the tomorrow themes --- novelwriter/assets/syntax/tomorrow.conf | 49 ---------- novelwriter/assets/syntax/tomorrow_night.conf | 49 ---------- .../assets/syntax/tomorrow_night_blue.conf | 49 ---------- .../assets/syntax/tomorrow_night_bright.conf | 49 ---------- .../syntax/tomorrow_night_eighties.conf | 49 ---------- novelwriter/assets/themes/default_dark.conf | 40 ++++---- novelwriter/assets/themes/tomorrow.conf | 91 +++++++++++++++++++ novelwriter/assets/themes/tomorrow_night.conf | 90 ++++++++++++++++++ .../assets/themes/tomorrow_night_blue.conf | 91 +++++++++++++++++++ .../assets/themes/tomorrow_night_bright.conf | 91 +++++++++++++++++++ .../themes/tomorrow_night_eighties.conf | 91 +++++++++++++++++++ 11 files changed, 474 insertions(+), 265 deletions(-) delete mode 100644 novelwriter/assets/syntax/tomorrow.conf delete mode 100644 novelwriter/assets/syntax/tomorrow_night.conf delete mode 100644 novelwriter/assets/syntax/tomorrow_night_blue.conf delete mode 100644 novelwriter/assets/syntax/tomorrow_night_bright.conf delete mode 100644 novelwriter/assets/syntax/tomorrow_night_eighties.conf create mode 100644 novelwriter/assets/themes/tomorrow.conf create mode 100644 novelwriter/assets/themes/tomorrow_night.conf create mode 100644 novelwriter/assets/themes/tomorrow_night_blue.conf create mode 100644 novelwriter/assets/themes/tomorrow_night_bright.conf create mode 100644 novelwriter/assets/themes/tomorrow_night_eighties.conf diff --git a/novelwriter/assets/syntax/tomorrow.conf b/novelwriter/assets/syntax/tomorrow.conf deleted file mode 100644 index d3d2b8e4..00000000 --- a/novelwriter/assets/syntax/tomorrow.conf +++ /dev/null @@ -1,49 +0,0 @@ -## -# Theme: Tomorrow -# Source: https://github.com/chriskempson/tomorrow-theme -# Credit: Chris Kempson -## -# Colours: -# Background = ffffff : 255, 255, 255 -# Current Line = efefef : 239, 239, 239 -# Selection = d6d6d6 : 214, 214, 214 -# Foreground = 4d4d4c : 77, 77, 76 -# Comment = 8e908c : 142, 144, 140 -# Red = c82829 : 240, 40, 41 -# Orange = f5871f : 245, 135, 31 -# Yellow = eab700 : 234, 183, 0 -# Green = 718c00 : 113, 140, 0 -# Aqua = 3e999f : 62, 153, 159 -# Blue = 4271ae : 66, 113, 174 -# Purple = 8959a8 : 137, 89, 168 -## - -[Main] -name = Tomorrow -author = Veronica Berglyd Olsen (adaptation) -credit = Chris Kempson (color theme) -url = https://github.com/chriskempson/tomorrow-theme -license = MIT License -licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md - -[Syntax] -background = 255, 255, 255 -text = 77, 77, 76 -link = 66, 113, 174 -headertext = 66, 113, 174 -headertag = 66, 113, 174, 160 -emphasis = 245, 135, 31 -dialog = 113, 140, 0 -altdialog = 234, 183, 0 -note = 115, 90, 0 -hidden = 142, 144, 140 -shortcode = 66, 113, 174 -keyword = 240, 40, 41 -tag = 137, 89, 168 -value = 234, 183, 0 -optional = 66, 113, 174 -spellcheckline = 240, 40, 41 -errorline = 113, 140, 0 -replacetag = 62, 153, 159 -modifier = 245, 135, 31 -texthighlight = 234, 183, 0, 96 diff --git a/novelwriter/assets/syntax/tomorrow_night.conf b/novelwriter/assets/syntax/tomorrow_night.conf deleted file mode 100644 index 15257945..00000000 --- a/novelwriter/assets/syntax/tomorrow_night.conf +++ /dev/null @@ -1,49 +0,0 @@ -## -# Theme: Tomorrow Night -# Source: https://github.com/chriskempson/tomorrow-theme -# Credit: Chris Kempson -## -# Colours: -# Background = 1d1f21 : 29, 31, 33 -# Current Line = 282a2e : 40, 42, 46 -# Selection = 373b41 : 55, 59. 65 -# Foreground = c5c8c6 : 197, 200, 198 -# Comment = 969896 : 150, 152, 150 -# Red = cc6666 : 204, 102, 102 -# Orange = de935f : 222, 147, 95 -# Yellow = f0c674 : 240, 198, 116 -# Green = b5bd68 : 181, 189, 104 -# Aqua = 8abeb7 : 138, 190, 183 -# Blue = 81a2be : 129, 162, 190 -# Purple = b294bb : 178, 148, 187 -## - -[Main] -name = Tomorrow Night -author = Veronica Berglyd Olsen (adaptation) -credit = Chris Kempson (color theme) -url = https://github.com/chriskempson/tomorrow-theme -license = MIT License -licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md - -[Syntax] -background = 29, 31, 33 -text = 197, 200, 198 -link = 197, 200, 198, 160 -headertext = 129, 162, 190 -headertag = 94, 119, 139 -emphasis = 222, 147, 95 -dialog = 181, 189, 104 -altdialog = 240, 198, 116 -note = 240, 219, 178 -hidden = 150, 152, 150 -shortcode = 129, 162, 190 -keyword = 204, 102, 102 -tag = 178, 148, 187 -value = 240, 198, 116 -optional = 129, 162, 190 -spellcheckline = 204, 102, 102 -errorline = 181, 189, 104 -replacetag = 138, 190, 183 -modifier = 222, 147, 95 -texthighlight = 240, 198, 116, 96 diff --git a/novelwriter/assets/syntax/tomorrow_night_blue.conf b/novelwriter/assets/syntax/tomorrow_night_blue.conf deleted file mode 100644 index 89067e4f..00000000 --- a/novelwriter/assets/syntax/tomorrow_night_blue.conf +++ /dev/null @@ -1,49 +0,0 @@ -## -# Theme: Tomorrow Night Blue -# Source: https://github.com/chriskempson/tomorrow-theme -# Credit: Chris Kempson -## -# Colours: -# Background = 002451 : 0, 36, 81 -# Current Line = 00346e : 0, 52, 110 -# Selection = 003f8e : 0, 63, 142 -# Foreground = ffffff : 255, 255, 255 -# Comment = 7285b7 : 114, 133, 183 -# Red = ff9da4 : 255, 157, 164 -# Orange = ffc58f : 255, 197, 143 -# Yellow = ffeead : 255, 238, 173 -# Green = d1f1a9 : 209, 241, 169 -# Aqua = 99ffff : 153, 255, 255 -# Blue = bbdaff : 187, 218, 255 -# Purple = ebbbff : 235, 187, 255 -## - -[Main] -name = Tomorrow Night Blue -author = Veronica Berglyd Olsen (adaptation) -credit = Chris Kempson (color theme) -url = https://github.com/chriskempson/tomorrow-theme -license = MIT License -licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md - -[Syntax] -background = 0, 36, 81 -text = 255, 255, 255 -link = 187, 218, 255 -headertext = 187, 218, 255 -headertag = 187, 218, 255, 160 -emphasis = 255, 197, 143 -dialog = 209, 241, 169 -altdialog = 255, 238, 173 -note = 255, 247, 214 -hidden = 114, 133, 183 -shortcode = 187, 218, 255 -keyword = 255, 157, 164 -tag = 235, 187, 255 -value = 255, 238, 173 -optional = 187, 218, 255 -spellcheckline = 255, 157, 164 -errorline = 209, 241, 169 -replacetag = 153, 255, 255 -modifier = 255, 197, 143 -texthighlight = 255, 238, 173, 96 diff --git a/novelwriter/assets/syntax/tomorrow_night_bright.conf b/novelwriter/assets/syntax/tomorrow_night_bright.conf deleted file mode 100644 index 0f1fd055..00000000 --- a/novelwriter/assets/syntax/tomorrow_night_bright.conf +++ /dev/null @@ -1,49 +0,0 @@ -## -# Theme: Tomorrow Night Bright -# Source: https://github.com/chriskempson/tomorrow-theme -# Credit: Chris Kempson -## -# Colours: -# Background = 000000 : 0, 0, 0 -# Current Line = 2a2a2a : 42, 42, 42 -# Selection = 424242 : 66, 66, 66 -# Foreground = eaeaea : 234, 234, 234 -# Comment = 969896 : 150, 152, 150 -# Red = d54e53 : 213, 78, 83 -# Orange = e78c45 : 231, 140, 69 -# Yellow = e7c547 : 231, 197, 71 -# Green = b9ca4a : 185, 202, 74 -# Aqua = 70c0b1 : 112, 192, 177 -# Blue = 7aa6da : 122, 166, 218 -# Purple = c397d8 : 195, 151, 216 -## - -[Main] -name = Tomorrow Night Bright -author = Veronica Berglyd Olsen (adaptation) -credit = Chris Kempson (color theme) -url = https://github.com/chriskempson/tomorrow-theme -license = MIT License -licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md - -[Syntax] -background = 0, 0, 0 -text = 234, 234, 234 -link = 122, 166, 218 -headertext = 122, 166, 218 -headertag = 122, 166, 218, 160 -emphasis = 231, 140, 69 -dialog = 185, 202, 74 -altdialog = 231, 197, 71 -note = 231, 214, 150 -hidden = 150, 152, 150 -shortcode = 122, 166, 218 -keyword = 213, 78, 83 -tag = 195, 151, 216 -value = 231, 197, 71 -optional = 122, 166, 218 -spellcheckline = 213, 78, 83 -errorline = 185, 202, 74 -replacetag = 112, 192, 177 -modifier = 231, 140, 69 -texthighlight = 231, 197, 71, 128 diff --git a/novelwriter/assets/syntax/tomorrow_night_eighties.conf b/novelwriter/assets/syntax/tomorrow_night_eighties.conf deleted file mode 100644 index a638a871..00000000 --- a/novelwriter/assets/syntax/tomorrow_night_eighties.conf +++ /dev/null @@ -1,49 +0,0 @@ -## -# Theme: Tomorrow Night Eighties -# Source: https://github.com/chriskempson/tomorrow-theme -# Credit: Chris Kempson -## -# Colours: -# Background = 2d2d2d : 45, 45, 45 -# Current Line = 393939 : 57, 57, 57 -# Selection = 515151 : 81, 81, 81 -# Foreground = cccccc : 204, 204, 204 -# Comment = 999999 : 153, 153, 153 -# Red = f2777a : 242, 119, 122 -# Orange = f99157 : 249, 145, 57 -# Yellow = ffcc66 : 255, 204, 102 -# Green = 99cc99 : 153, 204, 153 -# Aqua = 66cccc : 102, 204, 204 -# Blue = 6699cc : 102, 153, 204 -# Purple = cc99cc : 204, 153, 204 -## - -[Main] -name = Tomorrow Night Eighties -author = Veronica Berglyd Olsen (adaptation) -credit = Chris Kempson (color theme) -url = https://github.com/chriskempson/tomorrow-theme -license = MIT License -licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md - -[Syntax] -background = 45, 45, 45 -text = 204, 204, 204 -link = 102, 153, 204 -headertext = 102, 153, 204 -headertag = 102, 153, 204, 160 -emphasis = 249, 145, 57 -dialog = 153, 204, 153 -altdialog = 255, 204, 102 -note = 255, 230, 179 -hidden = 153, 153, 153 -shortcode = 102, 153, 204 -keyword = 242, 119, 122 -tag = 204, 153, 204 -value = 255, 204, 102 -optional = 102, 153, 204 -spellcheckline = 242, 119, 122 -errorline = 153, 204, 153 -replacetag = 102, 204, 204 -modifier = 249, 145, 57 -texthighlight = 255, 204, 102, 96 diff --git a/novelwriter/assets/themes/default_dark.conf b/novelwriter/assets/themes/default_dark.conf index a8e6a3de..7b0c3922 100644 --- a/novelwriter/assets/themes/default_dark.conf +++ b/novelwriter/assets/themes/default_dark.conf @@ -50,23 +50,23 @@ fadedtext = #949494 errortext = red [Syntax] -background = #363636 -text = default -link = blue -headertext = green -headertag = green, 160 -emphasis = orange -dialog = blue -altdialog = blue -note = yellow -hidden = faded -shortcode = green -keyword = red -tag = green -value = blue -optional = green -spellcheckline = red -errorline = green -replacetag = green -modifier = green -texthighlight = yellow, 72 +background = #363636 +text = default +link = blue +headertext = green +headertag = green, 160 +emphasis = orange +dialog = blue +altdialog = blue +note = yellow +hidden = faded +shortcode = green +keyword = red +tag = green +value = blue +optional = green +spellcheckline = red +errorline = green +replacetag = green +modifier = green +texthighlight = yellow, 72 diff --git a/novelwriter/assets/themes/tomorrow.conf b/novelwriter/assets/themes/tomorrow.conf new file mode 100644 index 00000000..ab49754b --- /dev/null +++ b/novelwriter/assets/themes/tomorrow.conf @@ -0,0 +1,91 @@ +[Main] +name = Tomorrow +mode = light +author = Veronica Berglyd Olsen (adaptation) +credit = Chris Kempson (color theme) +url = https://github.com/chriskempson/tomorrow-theme +license = MIT License +licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md + +## +# Theme: Tomorrow +# Source: https://github.com/chriskempson/tomorrow-theme +# Credit: Chris Kempson +## +# Colours: +# Background = #ffffff +# Current Line = #efefef +# Selection = #d6d6d6 +# Foreground = #4d4d4c +# Comment = #8e908c +# Red = #c82829 +# Orange = #f5871f +# Yellow = #eab700 +# Green = #718c00 +# Aqua = #3e999f +# Blue = #4271ae +# Purple = #8959a8 +## + +[Base] +default = #484848 +faded = #6c6c6c +red = #c82829 +orange = #f5871f +yellow = #eab700 +green = #718c00 +aqua = #3e999f +blue = #4271ae +purple = #8959a8 + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow + +[Palette] +window = #efefef +windowtext = #000000 +base = #ffffff +alternatebase = #d6d6d6 +text = #000000 +tooltipbase = #ffffdc +tooltiptext = #000000 +button = #ffffff +buttontext = #000000 +brighttext = #ffffff +highlight = blue +highlightedtext = #ffffff +link = blue +linkvisited = blue + +[GUI] +helptext = #5c5c5c +fadedtext = faded +errortext = red + +[Syntax] +background = #ffffff +text = #4d4d4c +link = blue +headertext = blue +headertag = blue, 160 +emphasis = orange +dialog = green +altdialog = yellow +note = #b38c00 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = yellow +optional = blue +spellcheckline = red +errorline = green +replacetag = aqua +modifier = orange +texthighlight = yellow, 96 diff --git a/novelwriter/assets/themes/tomorrow_night.conf b/novelwriter/assets/themes/tomorrow_night.conf new file mode 100644 index 00000000..16290bf0 --- /dev/null +++ b/novelwriter/assets/themes/tomorrow_night.conf @@ -0,0 +1,90 @@ +[Main] +name = Tomorrow Night +mode = dark +author = Veronica Berglyd Olsen (adaptation) +credit = Chris Kempson (color theme) +url = https://github.com/chriskempson/tomorrow-theme +license = MIT License +licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md +## +# Theme: Tomorrow Night +# Source: https://github.com/chriskempson/tomorrow-theme +# Credit: Chris Kempson +## +# Colours: +# Background = #1d1f21 +# Current Line = #282a2e +# Selection = #373b41 +# Foreground = #c5c8c6 +# Comment = #969896 +# Red = #cc6666 +# Orange = #de935f +# Yellow = #f0c674 +# Green = #b5bd68 +# Aqua = #8abeb7 +# Blue = #81a2be +# Purple = #b294bb +## + +[Base] +default = #c5c8c6 +faded = #969896 +red = #cc6666 +orange = #de935f +yellow = #f0c674 +green = #b5bd68 +aqua = #8abeb7 +blue = #81a2be +purple = #b294bb + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow + +[Palette] +window = #282a2e +windowtext = default +base = #1d1f21 +alternatebase = #373b41 +text = default +tooltipbase = #ffffc0 +tooltiptext = #15150d +button = #1d1f21 +buttontext = default +brighttext = #1d1f21 +highlight = #2c98f7 +highlightedtext = #ffffff +link = blue +linkvisited = blue + +[GUI] +helptext = #a4a4a4 +fadedtext = #949494 +errortext = red + +[Syntax] +background = #1d1f21 +text = default +link = blue +headertext = blue +headertag = blue, 160 +emphasis = orange +dialog = green +altdialog = yellow +note = #f0dbb2 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = yellow +optional = blue +spellcheckline = red +errorline = green +replacetag = aqua +modifier = orange +texthighlight = yellow, 96 diff --git a/novelwriter/assets/themes/tomorrow_night_blue.conf b/novelwriter/assets/themes/tomorrow_night_blue.conf new file mode 100644 index 00000000..93b6592e --- /dev/null +++ b/novelwriter/assets/themes/tomorrow_night_blue.conf @@ -0,0 +1,91 @@ +[Main] +name = Tomorrow Night Blue +mode = dark +author = Veronica Berglyd Olsen (adaptation) +credit = Chris Kempson (color theme) +url = https://github.com/chriskempson/tomorrow-theme +license = MIT License +licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md + +## +# Theme: Tomorrow Night Blue +# Source: https://github.com/chriskempson/tomorrow-theme +# Credit: Chris Kempson +## +# Colours: +# Background = #002451 +# Current Line = #00346e +# Selection = #003f8e +# Foreground = #ffffff +# Comment = #7285b7 +# Red = #ff9da4 +# Orange = #ffc58f +# Yellow = #ffeead +# Green = #d1f1a9 +# Aqua = #99ffff +# Blue = #bbdaff +# Purple = #ebbbff +## + +[Base] +default = #ffffff +faded = #7285b7 +red = #ff9da4 +orange = #ffc58f +yellow = #ffeead +green = #d1f1a9 +aqua = #99ffff +blue = #bbdaff +purple = #ebbbff + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow + +[Palette] +window = #00346e +windowtext = default +base = #002451 +alternatebase = #003f8e +text = default +tooltipbase = #ffffc0 +tooltiptext = #15150d +button = #002451 +buttontext = default +brighttext = #002451 +highlight = #2c98f7 +highlightedtext = #ffffff +link = blue +linkvisited = blue + +[GUI] +helptext = #a4a4a4 +fadedtext = #949494 +errortext = red + +[Syntax] +background = #002451 +text = default +link = blue +headertext = blue +headertag = blue, 160 +emphasis = orange +dialog = green +altdialog = yellow +note = #fff4cc +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = yellow +optional = blue +spellcheckline = red +errorline = green +replacetag = aqua +modifier = orange +texthighlight = yellow, 96 diff --git a/novelwriter/assets/themes/tomorrow_night_bright.conf b/novelwriter/assets/themes/tomorrow_night_bright.conf new file mode 100644 index 00000000..de76e694 --- /dev/null +++ b/novelwriter/assets/themes/tomorrow_night_bright.conf @@ -0,0 +1,91 @@ +[Main] +name = Tomorrow Night Bright +mode = dark +author = Veronica Berglyd Olsen (adaptation) +credit = Chris Kempson (color theme) +url = https://github.com/chriskempson/tomorrow-theme +license = MIT License +licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md + +## +# Theme: Tomorrow Night Bright +# Source: https://github.com/chriskempson/tomorrow-theme +# Credit: Chris Kempson +## +# Colours: +# Background = #000000 +# Current Line = #2a2a2a +# Selection = #424242 +# Foreground = #eaeaea +# Comment = #969896 +# Red = #d54e53 +# Orange = #e78c45 +# Yellow = #e7c547 +# Green = #b9ca4a +# Aqua = #70c0b1 +# Blue = #7aa6da +# Purple = #c397d8 +## + +[Base] +default = #eaeaea +faded = #969896 +red = #d54e53 +orange = #e78c45 +yellow = #e7c547 +green = #b9ca4a +aqua = #70c0b1 +blue = #7aa6da +purple = #c397d8 + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow + +[Palette] +window = #2a2a2a +windowtext = default +base = #000000 +alternatebase = #424242 +text = default +tooltipbase = #ffffc0 +tooltiptext = #15150d +button = #000000 +buttontext = default +brighttext = #000000 +highlight = #2c98f7 +highlightedtext = #ffffff +link = blue +linkvisited = blue + +[GUI] +helptext = #a4a4a4 +fadedtext = #949494 +errortext = red + +[Syntax] +background = #000000 +text = default +link = blue +headertext = blue +headertag = blue, 160 +emphasis = orange +dialog = green +altdialog = yellow +note = #e7d696 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = yellow +optional = blue +spellcheckline = red +errorline = green +replacetag = aqua +modifier = orange +texthighlight = yellow, 96 diff --git a/novelwriter/assets/themes/tomorrow_night_eighties.conf b/novelwriter/assets/themes/tomorrow_night_eighties.conf new file mode 100644 index 00000000..e3e8bbec --- /dev/null +++ b/novelwriter/assets/themes/tomorrow_night_eighties.conf @@ -0,0 +1,91 @@ +[Main] +name = Tomorrow Night Eighties +mode = dark +author = Veronica Berglyd Olsen (adaptation) +credit = Chris Kempson (color theme) +url = https://github.com/chriskempson/tomorrow-theme +license = MIT License +licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md + +## +# Theme: Tomorrow Night Eighties +# Source: https://github.com/chriskempson/tomorrow-theme +# Credit: Chris Kempson +## +# Colours: +# Background = #2d2d2d +# Current Line = #393939 +# Selection = #515151 +# Foreground = #cccccc +# Comment = #999999 +# Red = #f2777a +# Orange = #f99157 +# Yellow = #ffcc66 +# Green = #99cc99 +# Aqua = #66cccc +# Blue = #6699cc +# Purple = #cc99cc +## + +[Base] +default = #cccccc +faded = #999999 +red = #f2777a +orange = #f99157 +yellow = #ffcc66 +green = #99cc99 +aqua = #66cccc +blue = #6699cc +purple = #cc99cc + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow + +[Palette] +window = #393939 +windowtext = default +base = #2d2d2d +alternatebase = #515151 +text = default +tooltipbase = #ffffc0 +tooltiptext = #15150d +button = #2d2d2d +buttontext = default +brighttext = #2d2d2d +highlight = #2c98f7 +highlightedtext = #ffffff +link = blue +linkvisited = blue + +[GUI] +helptext = #a4a4a4 +fadedtext = #949494 +errortext = red + +[Syntax] +background = #2d2d2d +text = default +link = blue +headertext = blue +headertag = blue, 160 +emphasis = orange +dialog = green +altdialog = yellow +note = #ffe6b3 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = yellow +optional = blue +spellcheckline = red +errorline = green +replacetag = aqua +modifier = orange +texthighlight = yellow, 96 From eed5cd187738ce43a30a6e0b2b73b711b68deb41 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:02:00 +0200 Subject: [PATCH 08/96] Merge and update the owl and tango themes --- novelwriter/assets/syntax/light_owl.conf | 49 ------------ novelwriter/assets/syntax/night_owl.conf | 49 ------------ novelwriter/assets/syntax/tango.conf | 39 ---------- novelwriter/assets/themes/light_owl.conf | 91 ++++++++++++++++++++++ novelwriter/assets/themes/night_owl.conf | 91 ++++++++++++++++++++++ novelwriter/assets/themes/tango_dark.conf | 81 +++++++++++++++++++ novelwriter/assets/themes/tango_light.conf | 81 +++++++++++++++++++ 7 files changed, 344 insertions(+), 137 deletions(-) delete mode 100644 novelwriter/assets/syntax/light_owl.conf delete mode 100644 novelwriter/assets/syntax/night_owl.conf delete mode 100644 novelwriter/assets/syntax/tango.conf create mode 100644 novelwriter/assets/themes/light_owl.conf create mode 100644 novelwriter/assets/themes/night_owl.conf create mode 100644 novelwriter/assets/themes/tango_dark.conf create mode 100644 novelwriter/assets/themes/tango_light.conf diff --git a/novelwriter/assets/syntax/light_owl.conf b/novelwriter/assets/syntax/light_owl.conf deleted file mode 100644 index ce65e704..00000000 --- a/novelwriter/assets/syntax/light_owl.conf +++ /dev/null @@ -1,49 +0,0 @@ -## -# Theme: Light Owl -# Source: https://github.com/sdras/night-owl-vscode-theme -# Credit: Sarah Drasner -## -# Colours: -# Background = fbfbfb : 251, 251, 251 -# Current Line = e0e0e0 : 224, 224, 224 -# Selection = e0e0e0 : 224, 224, 224 -# Foreground = 403f52 : 64, 63, 82 -# Comment = 989fb1 : 152, 159, 177 -# Red = de3d3a : 222, 61, 58 -# Orange = e0af05 : 224, 175, 5 -# Yellow = daaa01 : 218, 170, 1 -# Green = 08916a : 8, 145, 106 -# Aqua = 2aa298 : 42, 162, 152 -# Blue = 288ed7 : 40, 142, 215 -# Purple = 964ac1 : 150, 74, 193 -## - -[Main] -name = Light Owl -author = Veronica Berglyd Olsen (adaptation) -credit = Sarah Drasner (color theme) -url = https://github.com/sdras/night-owl-vscode-theme -license = MIT License -licenseurl = https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE - -[Syntax] -background = 251, 251, 251 -text = 64, 63, 82 -link = 40, 142, 215 -headertext = 40, 142, 215 -headertag = 40, 142, 215, 160 -emphasis = 224, 175, 5 -dialog = 8, 145, 106 -altdialog = 218, 170, 1 -note = 128, 118, 75 -hidden = 152, 159, 177 -shortcode = 40, 142, 215 -keyword = 222, 61, 58 -tag = 150, 74, 193 -value = 224, 175, 5 -optional = 40, 142, 215 -spellcheckline = 222, 61, 58 -errorline = 8, 145, 106 -replacetag = 42, 162, 152 -modifier = 8, 145, 106 -texthighlight = 218, 170, 1, 96 diff --git a/novelwriter/assets/syntax/night_owl.conf b/novelwriter/assets/syntax/night_owl.conf deleted file mode 100644 index 337cdfb8..00000000 --- a/novelwriter/assets/syntax/night_owl.conf +++ /dev/null @@ -1,49 +0,0 @@ -## -# Theme: Night Owl -# Source: https://github.com/sdras/night-owl-vscode-theme -# Credit: Sarah Drasner -## -# Colours: -# Background = 011627 : 1, 22, 39 -# Current Line = 32374d : 50, 55, 77 -# Selection = 32374d : 50, 55, 77 -# Foreground = d6deeb : 214, 222, 235 -# Comment = 637777 : 99, 119, 119 -# Red = f78c6c : 247, 140, 108 -# Orange = ecc48d : 236, 196, 141 -# Yellow = ffeb95 : 255, 235, 149 -# Green = addb67 : 173, 219, 103 -# Aqua = 7fdbca : 127, 219, 202 -# Blue = 82aaff : 130, 170, 255 -# Purple = c792ea : 199, 146, 234 -## - -[Main] -name = Night Owl -author = Veronica Berglyd Olsen (adaptation) -credit = Sarah Drasner (color theme) -url = https://github.com/sdras/night-owl-vscode-theme -license = MIT License -licenseurl = https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE - -[Syntax] -background = 1, 22, 39 -text = 214, 222, 235 -link = 130, 170, 255 -headertext = 130, 170, 255 -headertag = 130, 170, 255, 160 -emphasis = 236, 196, 141 -dialog = 173, 219, 103 -altdialog = 255, 235, 149 -note = 255, 249, 202 -hidden = 99, 119, 119 -shortcode = 130, 170, 255 -keyword = 247, 140, 108 -tag = 199, 146, 234 -value = 255, 235, 149 -optional = 130, 170, 255 -spellcheckline = 247, 140, 108 -errorline = 173, 219, 103 -replacetag = 127, 219, 202 -modifier = 173, 219, 103 -texthighlight = 255, 235, 149, 96 diff --git a/novelwriter/assets/syntax/tango.conf b/novelwriter/assets/syntax/tango.conf deleted file mode 100644 index 7c5e9daa..00000000 --- a/novelwriter/assets/syntax/tango.conf +++ /dev/null @@ -1,39 +0,0 @@ -[Main] -name = Tango -author = Veronica Berglyd Olsen (adaptation) - -## -# Colours: -# Background = 30302f : 48, 48, 47 -# Foreground = eeeeec : 238, 238, 236 -# Comment = 8f8f8d : 143, 143, 141 -# Red = ef2929 : 239, 41, 41 -# Orange = c4a000 : 196, 160, 0 -# Yellow = fce94f : 252, 233, 79 -# Green = 8ae234 : 138, 226, 52 -# Cyan = 34e2e2 : 52, 226, 226 -# Blue = 3465a4 : 114, 159, 207 -# Purple = ad7fa8 : 173, 127, 168 -## - -[Syntax] -background = 48, 48, 47 -text = 238, 238, 236 -link = 114, 159, 207 -headertext = 114, 159, 207 -headertag = 114, 159, 207, 160 -emphasis = 196, 160, 0 -dialog = 138, 226, 52 -altdialog = 252, 233, 79 -note = 252, 242, 164 -hidden = 143, 143, 141 -shortcode = 114, 159, 207 -keyword = 239, 41, 41 -tag = 173, 127, 168 -value = 239, 41, 41 -optional = 114, 159, 207 -spellcheckline = 239, 41, 41 -errorline = 138, 226, 52 -replacetag = 52, 226, 226 -modifier = 114, 159, 207 -texthighlight = 252, 233, 79, 96 diff --git a/novelwriter/assets/themes/light_owl.conf b/novelwriter/assets/themes/light_owl.conf new file mode 100644 index 00000000..d91cf0ba --- /dev/null +++ b/novelwriter/assets/themes/light_owl.conf @@ -0,0 +1,91 @@ +[Main] +name = Light Owl +mode = light +author = Veronica Berglyd Olsen (adaptation) +credit = Sarah Drasner (color theme) +url = https://github.com/sdras/night-owl-vscode-theme +license = MIT License +licenseurl = https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE + +## +# Theme: Light Owl +# Source: https://github.com/sdras/night-owl-vscode-theme +# Credit: Sarah Drasner +## +# Colours: +# Background = #fbfbfb +# Current Line = #e0e0e0 +# Selection = #e0e0e0 +# Foreground = #403f52 +# Comment = #989fb1 +# Red = #de3d3a +# Orange = #e0af05 +# Yellow = #daaa01 +# Green = #08916a +# Aqua = #2aa298 +# Blue = #288ed7 +# Purple = #964ac1 +## + +[Base] +default = #403f52 +faded = #989fb1 +red = #de3d3a +orange = #e0af05 +yellow = #daaa01 +green = #08916a +aqua = #2aa298 +blue = #288ed7 +purple = #964ac1 + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow + +[Palette] +window = #e0e0e0 +windowtext = default +base = #fbfbfb +alternatebase = #e0e0e0 +text = default +tooltipbase = #ffffc0 +tooltiptext = #15150d +button = #e0e0e0 +buttontext = default +brighttext = #e0e0e0 +highlight = #3087c6 +highlightedtext = #ffffff +link = blue +linkvisited = blue + +[GUI] +helptext = blue +fadedtext = faded +errortext = red + +[Syntax] +background = #fbfbfb +text = default +link = blue +headertext = blue +headertag = blue, 160 +emphasis = orange +dialog = green +altdialog = yellow +note = #80764b +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = orange +optional = blue +spellcheckline = red +errorline = green +replacetag = aqua +modifier = green +texthighlight = yellow, 96 diff --git a/novelwriter/assets/themes/night_owl.conf b/novelwriter/assets/themes/night_owl.conf new file mode 100644 index 00000000..a5f0a02b --- /dev/null +++ b/novelwriter/assets/themes/night_owl.conf @@ -0,0 +1,91 @@ +[Main] +name = Night Owl +mode = dark +author = Veronica Berglyd Olsen (adaptation) +credit = Sarah Drasner (color theme) +url = https://github.com/sdras/night-owl-vscode-theme +license = MIT License +licenseurl = https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE + +## +# Theme: Night Owl +# Source: https://github.com/sdras/night-owl-vscode-theme +# Credit: Sarah Drasner +## +# Colours: +# Background = #011627 +# Current Line = #32374d +# Selection = #32374d +# Foreground = #d6deeb +# Comment = #637777 +# Red = #f78c6c +# Orange = #ecc48d +# Yellow = #ffeb95 +# Green = #addb67 +# Aqua = #7fdbca +# Blue = #82aaff +# Purple = #c792ea +## + +[Base] +default = #d6deeb +faded = #637777 +red = #f78c6c +orange = #ecc48d +yellow = #addb67 +green = #addb67 +aqua = #7fdbca +blue = #82aaff +purple = #c792ea + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow + +[Palette] +window = #32374d +windowtext = default +base = #011627 +alternatebase = #32374d +text = default +tooltipbase = #ffffc0 +tooltiptext = #15150d +button = #32374d +buttontext = default +brighttext = #32374d +highlight = #2c98f7 +highlightedtext = #ffffff +link = blue +linkvisited = blue + +[GUI] +helptext = blue +fadedtext = faded +errortext = red + +[Syntax] +background = #011627 +text = default +link = blue +headertext = blue +headertag = blue, 160 +emphasis = orange +dialog = green +altdialog = yellow +note = #fff9ca +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = orange +optional = blue +spellcheckline = red +errorline = green +replacetag = aqua +modifier = green +texthighlight = yellow, 96 diff --git a/novelwriter/assets/themes/tango_dark.conf b/novelwriter/assets/themes/tango_dark.conf new file mode 100644 index 00000000..873e7f11 --- /dev/null +++ b/novelwriter/assets/themes/tango_dark.conf @@ -0,0 +1,81 @@ +[Main] +name = Tango Dark +mode = dark +author = Veronica Berglyd Olsen (adaptation) + +## +# Colours: +# Background = 30302f : 48, 48, 47 +# Foreground = eeeeec : 238, 238, 236 +# Comment = 8f8f8d : 143, 143, 141 +# Red = ef2929 : 239, 41, 41 +# Orange = c4a000 : 196, 160, 0 +# Yellow = fce94f : 252, 233, 79 +# Green = 8ae234 : 138, 226, 52 +# Cyan = 34e2e2 : 52, 226, 226 +# Blue = 3465a4 : 114, 159, 207 +# Purple = ad7fa8 : 173, 127, 168 +## + +[Base] +default = #eeeeec +faded = #babdb6 +red = #ef2929 +orange = #fcaf3e +yellow = #fce94f +green = #8ae234 +aqua = #34e2e2 +blue = #729fcf +purple = #ad7fa8 + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow + +[Palette] +window = #555753 +windowtext = default +base = #2e3436 +alternatebase = #888a85 +text = default +tooltipbase = #ffffc0 +tooltiptext = #15150d +button = #555753 +buttontext = default +brighttext = #555753 +highlight = #2c98f7 +highlightedtext = #ffffff +link = blue +linkvisited = blue + +[GUI] +helptext = #e9b96e +fadedtext = faded +errortext = red + +[Syntax] +background = #2e3436 +text = default +link = blue +headertext = blue +headertag = blue, 160 +emphasis = orange +dialog = green +altdialog = yellow +note = #fcf2a4 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = red +optional = blue +spellcheckline = red +errorline = green +replacetag = cyan +modifier = blue +texthighlight = yellow, 96 diff --git a/novelwriter/assets/themes/tango_light.conf b/novelwriter/assets/themes/tango_light.conf new file mode 100644 index 00000000..6ba5566a --- /dev/null +++ b/novelwriter/assets/themes/tango_light.conf @@ -0,0 +1,81 @@ +[Main] +name = Tango Light +mode = light +author = Veronica Berglyd Olsen (adaptation) + +## +# Colours: +# Background = #eeeeec +# Foreground = #2e3436 +# Comment = 8f8f8d : 143, 143, 141 +# Red = #a40000 +# Orange = c4a000 : 196, 160, 0 +# Yellow = fce94f : 252, 233, 79 +# Green = 8ae234 : 138, 226, 52 +# Cyan = 34e2e2 : 52, 226, 226 +# Blue = 3465a4 : 114, 159, 207 +# Purple = ad7fa8 : 173, 127, 168 +## + +[Base] +default = #2e3436 +faded = #888a85 +red = #a40000 +orange = #ce5c00 +yellow = #c4a000 +green = #4e9a06 +aqua = #069a9a +blue = #204a87 +purple = #5c3566 + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow + +[Palette] +window = #d3d7cf +windowtext = default +base = #eeeeec +alternatebase = #e0e0e0 +text = default +tooltipbase = #ffffc0 +tooltiptext = #15150d +button = #d3d7cf +buttontext = default +brighttext = #d3d7cf +highlight = #3087c6 +highlightedtext = #ffffff +link = blue +linkvisited = blue + +[GUI] +helptext = #8f5902 +fadedtext = faded +errortext = red + +[Syntax] +background = #eeeeec +text = default +link = blue +headertext = blue +headertag = blue, 160 +emphasis = orange +dialog = green +altdialog = yellow +note = #a78800 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = red +optional = blue +spellcheckline = red +errorline = green +replacetag = cyan +modifier = blue +texthighlight = yellow, 96 From d0f11a25956b94717c42f1eae67e7b6e1b7eaea9 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:05:52 +0200 Subject: [PATCH 09/96] Fix a few inconsistencies --- novelwriter/assets/themes/default.conf | 3 -- novelwriter/assets/themes/default_light.conf | 44 +++++++++---------- novelwriter/assets/themes/light_owl.conf | 40 ++++++++--------- novelwriter/assets/themes/night_owl.conf | 40 ++++++++--------- novelwriter/assets/themes/tango_dark.conf | 40 ++++++++--------- novelwriter/assets/themes/tango_light.conf | 40 ++++++++--------- novelwriter/assets/themes/tomorrow.conf | 8 ++-- novelwriter/assets/themes/tomorrow_night.conf | 1 + 8 files changed, 107 insertions(+), 109 deletions(-) delete mode 100644 novelwriter/assets/themes/default.conf diff --git a/novelwriter/assets/themes/default.conf b/novelwriter/assets/themes/default.conf deleted file mode 100644 index 9cd9cd5b..00000000 --- a/novelwriter/assets/themes/default.conf +++ /dev/null @@ -1,3 +0,0 @@ -[Main] -name = Qt Default Theme -description = Qt standard colours diff --git a/novelwriter/assets/themes/default_light.conf b/novelwriter/assets/themes/default_light.conf index c4496d13..0c309a3c 100644 --- a/novelwriter/assets/themes/default_light.conf +++ b/novelwriter/assets/themes/default_light.conf @@ -34,8 +34,8 @@ windowtext = #000000 base = #ffffff alternatebase = #e0e0e0 text = #000000 -tooltipbase = #ffffdc -tooltiptext = #000000 +tooltipbase = #ffffc0 +tooltiptext = #15150d button = #efefef buttontext = #000000 brighttext = #ffffff @@ -50,23 +50,23 @@ fadedtext = #6c6c6c errortext = red [Syntax] -background = #ffffff -text = #000000 -link = blue -headertext = green -headertag = green, 160 -emphasis = orange -dialog = blue -altdialog = blue -note = yellow -hidden = faded -shortcode = green -keyword = red -tag = green -value = blue -optional = green -spellcheckline = red -errorline = green -replacetag = green -modifier = green -texthighlight = #c8c80060 +background = #ffffff +text = #000000 +link = blue +headertext = green +headertag = green, 160 +emphasis = orange +dialog = blue +altdialog = blue +note = yellow +hidden = faded +shortcode = green +keyword = red +tag = green +value = blue +optional = green +spellcheckline = red +errorline = green +replacetag = green +modifier = green +texthighlight = #c8c80060 diff --git a/novelwriter/assets/themes/light_owl.conf b/novelwriter/assets/themes/light_owl.conf index d91cf0ba..f72b8d70 100644 --- a/novelwriter/assets/themes/light_owl.conf +++ b/novelwriter/assets/themes/light_owl.conf @@ -69,23 +69,23 @@ fadedtext = faded errortext = red [Syntax] -background = #fbfbfb -text = default -link = blue -headertext = blue -headertag = blue, 160 -emphasis = orange -dialog = green -altdialog = yellow -note = #80764b -hidden = faded -shortcode = blue -keyword = red -tag = purple -value = orange -optional = blue -spellcheckline = red -errorline = green -replacetag = aqua -modifier = green -texthighlight = yellow, 96 +background = #fbfbfb +text = default +link = blue +headertext = blue +headertag = blue, 160 +emphasis = orange +dialog = green +altdialog = yellow +note = #80764b +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = orange +optional = blue +spellcheckline = red +errorline = green +replacetag = aqua +modifier = green +texthighlight = yellow, 96 diff --git a/novelwriter/assets/themes/night_owl.conf b/novelwriter/assets/themes/night_owl.conf index a5f0a02b..0d176c45 100644 --- a/novelwriter/assets/themes/night_owl.conf +++ b/novelwriter/assets/themes/night_owl.conf @@ -69,23 +69,23 @@ fadedtext = faded errortext = red [Syntax] -background = #011627 -text = default -link = blue -headertext = blue -headertag = blue, 160 -emphasis = orange -dialog = green -altdialog = yellow -note = #fff9ca -hidden = faded -shortcode = blue -keyword = red -tag = purple -value = orange -optional = blue -spellcheckline = red -errorline = green -replacetag = aqua -modifier = green -texthighlight = yellow, 96 +background = #011627 +text = default +link = blue +headertext = blue +headertag = blue, 160 +emphasis = orange +dialog = green +altdialog = yellow +note = #fff9ca +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = orange +optional = blue +spellcheckline = red +errorline = green +replacetag = aqua +modifier = green +texthighlight = yellow, 96 diff --git a/novelwriter/assets/themes/tango_dark.conf b/novelwriter/assets/themes/tango_dark.conf index 873e7f11..ca0ba841 100644 --- a/novelwriter/assets/themes/tango_dark.conf +++ b/novelwriter/assets/themes/tango_dark.conf @@ -59,23 +59,23 @@ fadedtext = faded errortext = red [Syntax] -background = #2e3436 -text = default -link = blue -headertext = blue -headertag = blue, 160 -emphasis = orange -dialog = green -altdialog = yellow -note = #fcf2a4 -hidden = faded -shortcode = blue -keyword = red -tag = purple -value = red -optional = blue -spellcheckline = red -errorline = green -replacetag = cyan -modifier = blue -texthighlight = yellow, 96 +background = #2e3436 +text = default +link = blue +headertext = blue +headertag = blue, 160 +emphasis = orange +dialog = green +altdialog = yellow +note = #fcf2a4 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = red +optional = blue +spellcheckline = red +errorline = green +replacetag = cyan +modifier = blue +texthighlight = yellow, 96 diff --git a/novelwriter/assets/themes/tango_light.conf b/novelwriter/assets/themes/tango_light.conf index 6ba5566a..174b0571 100644 --- a/novelwriter/assets/themes/tango_light.conf +++ b/novelwriter/assets/themes/tango_light.conf @@ -59,23 +59,23 @@ fadedtext = faded errortext = red [Syntax] -background = #eeeeec -text = default -link = blue -headertext = blue -headertag = blue, 160 -emphasis = orange -dialog = green -altdialog = yellow -note = #a78800 -hidden = faded -shortcode = blue -keyword = red -tag = purple -value = red -optional = blue -spellcheckline = red -errorline = green -replacetag = cyan -modifier = blue -texthighlight = yellow, 96 +background = #eeeeec +text = default +link = blue +headertext = blue +headertag = blue, 160 +emphasis = orange +dialog = green +altdialog = yellow +note = #a78800 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = red +optional = blue +spellcheckline = red +errorline = green +replacetag = cyan +modifier = blue +texthighlight = yellow, 96 diff --git a/novelwriter/assets/themes/tomorrow.conf b/novelwriter/assets/themes/tomorrow.conf index ab49754b..2b734209 100644 --- a/novelwriter/assets/themes/tomorrow.conf +++ b/novelwriter/assets/themes/tomorrow.conf @@ -53,11 +53,11 @@ windowtext = #000000 base = #ffffff alternatebase = #d6d6d6 text = #000000 -tooltipbase = #ffffdc -tooltiptext = #000000 -button = #ffffff +tooltipbase = #ffffc0 +tooltiptext = #15150d +button = #efefef buttontext = #000000 -brighttext = #ffffff +brighttext = #efefef highlight = blue highlightedtext = #ffffff link = blue diff --git a/novelwriter/assets/themes/tomorrow_night.conf b/novelwriter/assets/themes/tomorrow_night.conf index 16290bf0..27abd454 100644 --- a/novelwriter/assets/themes/tomorrow_night.conf +++ b/novelwriter/assets/themes/tomorrow_night.conf @@ -6,6 +6,7 @@ credit = Chris Kempson (color theme) url = https://github.com/chriskempson/tomorrow-theme license = MIT License licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md + ## # Theme: Tomorrow Night # Source: https://github.com/chriskempson/tomorrow-theme From 55e601cf9d04689682ccce645217af3ef20c00d3 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:18:19 +0200 Subject: [PATCH 10/96] Merge and update the grey themes --- novelwriter/assets/syntax/grey_dark.conf | 29 --------- novelwriter/assets/syntax/grey_light.conf | 29 --------- novelwriter/assets/themes/default_dark.conf | 2 +- novelwriter/assets/themes/grey_dark.conf | 71 +++++++++++++++++++++ novelwriter/assets/themes/grey_light.conf | 71 +++++++++++++++++++++ 5 files changed, 143 insertions(+), 59 deletions(-) delete mode 100644 novelwriter/assets/syntax/grey_dark.conf delete mode 100644 novelwriter/assets/syntax/grey_light.conf create mode 100644 novelwriter/assets/themes/grey_dark.conf create mode 100644 novelwriter/assets/themes/grey_light.conf diff --git a/novelwriter/assets/syntax/grey_dark.conf b/novelwriter/assets/syntax/grey_dark.conf deleted file mode 100644 index cc36478c..00000000 --- a/novelwriter/assets/syntax/grey_dark.conf +++ /dev/null @@ -1,29 +0,0 @@ -[Main] -name = Grey Dark -author = Veronica Berglyd Olsen -credit = Veronica Berglyd Olsen -url = https://github.com/vkbo/novelWriter -license = CC BY-SA 4.0 -licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ - -[Syntax] -background = 54, 54, 54 -text = 200, 200, 200 -link = 200, 200, 200 -headertext = 225, 225, 225 -headertag = 225, 225, 225, 160 -emphasis = 200, 200, 200 -dialog = 200, 200, 200 -altdialog = 200, 200, 200 -note = 200, 200, 200 -hidden = 150, 150, 150 -shortcode = 225, 225, 225 -keyword = 225, 225, 225 -tag = 200, 200, 200 -value = 200, 200, 200 -optional = 225, 225, 225 -spellcheckline = 200, 46, 0 -errorline = 46, 200, 0 -replacetag = 225, 225, 225 -modifier = 225, 225, 225 -texthighlight = 255, 255, 255, 64 diff --git a/novelwriter/assets/syntax/grey_light.conf b/novelwriter/assets/syntax/grey_light.conf deleted file mode 100644 index 80a8a01c..00000000 --- a/novelwriter/assets/syntax/grey_light.conf +++ /dev/null @@ -1,29 +0,0 @@ -[Main] -name = Grey Light -author = Veronica Berglyd Olsen -credit = Veronica Berglyd Olsen -url = https://github.com/vkbo/novelWriter -license = CC BY-SA 4.0 -licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ - -[Syntax] -background = 255, 255, 255 -text = 20, 20, 20 -link = 20, 20, 20 -headertext = 0, 0, 0 -headertag = 0, 0, 0, 160 -emphasis = 20, 20, 20 -dialog = 20, 20, 20 -altdialog = 20, 20, 20 -note = 20, 20, 20 -hidden = 100, 100, 100 -shortcode = 0, 0, 0 -keyword = 0, 0, 0 -tag = 20, 20, 20 -value = 20, 20, 20 -optional = 0, 0, 0 -spellcheckline = 200, 0, 0 -errorline = 0, 150, 0 -replacetag = 0, 0, 0 -modifier = 0, 0, 0 -texthighlight = 0, 0, 0, 64 diff --git a/novelwriter/assets/themes/default_dark.conf b/novelwriter/assets/themes/default_dark.conf index 7b0c3922..35acdb4c 100644 --- a/novelwriter/assets/themes/default_dark.conf +++ b/novelwriter/assets/themes/default_dark.conf @@ -46,7 +46,7 @@ linkvisited = blue [GUI] helptext = #a4a4a4 -fadedtext = #949494 +fadedtext = faded errortext = red [Syntax] diff --git a/novelwriter/assets/themes/grey_dark.conf b/novelwriter/assets/themes/grey_dark.conf new file mode 100644 index 00000000..d8c4a1fd --- /dev/null +++ b/novelwriter/assets/themes/grey_dark.conf @@ -0,0 +1,71 @@ +[Main] +name = Grey Dark +mode = dark +author = Veronica Berglyd Olsen +credit = Veronica Berglyd Olsen +url = https://github.com/vkbo/novelWriter +license = CC BY-SA 4.0 +licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ + +[Base] +default = #cccccc +faded = #949494 +red = #f2777a +orange = #f99139 +yellow = #ffcc66 +green = #99cc99 +aqua = #66cccc +blue = #6699cc +purple = #cc99cc + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow + +[Palette] +window = #363636 +windowtext = default +base = #3e3e3e +alternatebase = #4e4e4e +text = default +tooltipbase = #ffffc0 +tooltiptext = #15150d +button = #3e3e3e +buttontext = default +brighttext = #3e3e3e +highlight = #2c98f7 +highlightedtext = #ffffff +link = blue +linkvisited = blue + +[GUI] +helptext = #a4a4a4 +fadedtext = faded +errortext = red + +[Syntax] +background = #363636 +text = #c8c8c8 +link = #c8c8c8 +headertext = #e1e1e1 +headertag = #e1e1e1a0 +emphasis = #c8c8c8 +dialog = #c8c8c8 +altdialog = #c8c8c8 +note = #c8c8c8 +hidden = faded +shortcode = #e1e1e1 +keyword = #e1e1e1 +tag = #c8c8c8 +value = #c8c8c8 +optional = #e1e1e1 +spellcheckline = red +errorline = green +replacetag = #e1e1e1 +modifier = #e1e1e1 +texthighlight = #ffffff40 diff --git a/novelwriter/assets/themes/grey_light.conf b/novelwriter/assets/themes/grey_light.conf new file mode 100644 index 00000000..ffa8fe61 --- /dev/null +++ b/novelwriter/assets/themes/grey_light.conf @@ -0,0 +1,71 @@ +[Main] +name = Grey Light +mode = light +author = Veronica Berglyd Olsen +credit = Veronica Berglyd Olsen +url = https://github.com/vkbo/novelWriter +license = CC BY-SA 4.0 +licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ + +[Base] +default = #303030 +faded = #6c6c6c +red = #a62a2d +orange = #b36829 +yellow = #a68542 +green = #296629 +aqua = #269999 +blue = #3a70a6 +purple = #b35ab3 + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow + +[Palette] +window = #efefef +windowtext = default +base = #ffffff +alternatebase = #e0e0e0 +text = default +tooltipbase = #ffffc0 +tooltiptext = #15150d +button = #efefef +buttontext = default +brighttext = #ffffff +highlight = #3087c6 +highlightedtext = #ffffff +link = blue +linkvisited = blue + +[GUI] +helptext = #5c5c5c +fadedtext = faded +errortext = red + +[Syntax] +background = #ffffff +text = #141414 +link = #141414 +headertext = #000000 +headertag = #000000a0 +emphasis = #141414 +dialog = #141414 +altdialog = #141414 +note = #141414 +hidden = faded +shortcode = #000000 +keyword = #000000 +tag = #141414 +value = #141414 +optional = #000000 +spellcheckline = red +errorline = green +replacetag = #000000 +modifier = #000000 +texthighlight = #00000040 From 10475f32fbee62724b3d65832700f295f23968a8 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:21:35 +0200 Subject: [PATCH 11/96] Remove references to syntax themes --- CREDITS.md | 4 ++-- novelwriter/assets/text/credits_en.htm | 4 ++-- novelwriter/config.py | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index 9ac3b34a..b3c527a5 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -62,8 +62,8 @@ Some of the assets bundled with novelWriter were adapted from the following sour * **Material Symbols** icons by Google Inc (Apache 2.0) * **Remix** icons by RemixIcon (Apache 2.0) * **Font Awesome** icons by Fonticons Inc (CC BY 4.0) -* **Tomorrow** syntax themes by Chris Kempson (MIT License) -* **Owl** syntax themes by Sarah Drasner (MIT License) +* **Tomorrow** themes by Chris Kempson (MIT License) +* **Owl** themes by Sarah Drasner (MIT License) * **Solarized** themes by Ethan Schoonover (MIT License) * **Cyberpunk Night** theme by Anders Lemvigh (CC BY-SA 4.0) * **Dracula** theme by Zeno Rocha (MIT License) diff --git a/novelwriter/assets/text/credits_en.htm b/novelwriter/assets/text/credits_en.htm index 88b3887d..33903616 100644 --- a/novelwriter/assets/text/credits_en.htm +++ b/novelwriter/assets/text/credits_en.htm @@ -75,8 +75,8 @@ more contributions are listed on the project's Members page.

  • Material Symbols icons by Google Inc (Apache 2.0)
  • Remix icons by RemixIcon (Apache 2.0)
  • Font Awesome icons by Fonticons Inc (CC BY 4.0)
  • -
  • Tomorrow syntax themes by Chris Kempson (MIT License)
  • -
  • Owl syntax themes by Sarah Drasner (MIT License)
  • +
  • Tomorrow themes by Chris Kempson (MIT License)
  • +
  • Owl themes by Sarah Drasner (MIT License)
  • Solarized themes by Ethan Schoonover (MIT License)
  • Cyberpunk Night theme by Anders Lemvigh (CC BY-SA 4.0)
  • Dracula theme by Zeno Rocha (MIT License)
  • diff --git a/novelwriter/config.py b/novelwriter/config.py index 9b8752fc..db173019 100644 --- a/novelwriter/config.py +++ b/novelwriter/config.py @@ -553,11 +553,10 @@ class Config: self._confPath.mkdir(exist_ok=True) self._dataPath.mkdir(exist_ok=True) - # Also create the syntax, themes and icons folders if possible + # Also create the themes and icons folders if possible if self._dataPath.is_dir(): (self._dataPath / "cache").mkdir(exist_ok=True) (self._dataPath / "icons").mkdir(exist_ok=True) - (self._dataPath / "syntax").mkdir(exist_ok=True) (self._dataPath / "themes").mkdir(exist_ok=True) self._recentPaths.loadCache() From 89a7c3e5cb4914441e607b0f48ddc43fdb4c8ba6 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 2 Jun 2025 23:08:01 +0200 Subject: [PATCH 12/96] Add dark/light toggle button to sidebar --- novelwriter/constants.py | 13 ++++++++- novelwriter/gui/sidebar.py | 43 ++++++++++++++++++++++++++--- novelwriter/gui/theme.py | 33 ++++++++++++----------- novelwriter/guimain.py | 55 ++++++++++++++++++++++++++------------ 4 files changed, 107 insertions(+), 37 deletions(-) diff --git a/novelwriter/constants.py b/novelwriter/constants.py index c20b9c47..336c6318 100644 --- a/novelwriter/constants.py +++ b/novelwriter/constants.py @@ -28,7 +28,8 @@ from typing import Final from PyQt6.QtCore import QT_TRANSLATE_NOOP, QCoreApplication from novelwriter.enum import ( - nwBuildFmt, nwComment, nwItemClass, nwItemLayout, nwOutline, nwStatusShape + nwBuildFmt, nwComment, nwItemClass, nwItemLayout, nwOutline, nwStatusShape, + nwTheme ) @@ -453,6 +454,16 @@ class nwLabels: "blue": QT_TRANSLATE_NOOP("Constant", "Blue"), "purple": QT_TRANSLATE_NOOP("Constant", "Purple"), } + THEME_MODE_ICON: Final[dict[nwTheme, str]] = { + nwTheme.AUTO: "theme_auto", + nwTheme.LIGHT: "theme_light", + nwTheme.DARK: "theme_dark", + } + THEME_MODE_LABEL: Final[dict[nwTheme, str]] = { + nwTheme.AUTO: QT_TRANSLATE_NOOP("Constant", "System Theme"), + nwTheme.LIGHT: QT_TRANSLATE_NOOP("Constant", "Light Theme"), + nwTheme.DARK: QT_TRANSLATE_NOOP("Constant", "Dark Theme"), + } class nwHeadFmt: diff --git a/novelwriter/gui/sidebar.py b/novelwriter/gui/sidebar.py index f784623f..a4dd3c9c 100644 --- a/novelwriter/gui/sidebar.py +++ b/novelwriter/gui/sidebar.py @@ -27,12 +27,13 @@ import logging from typing import TYPE_CHECKING -from PyQt6.QtCore import QEvent, QPoint, QSize, pyqtSignal +from PyQt6.QtCore import QEvent, QPoint, QSize, pyqtSignal, pyqtSlot from PyQt6.QtWidgets import QMenu, QVBoxLayout, QWidget -from novelwriter import SHARED +from novelwriter import CONFIG, SHARED from novelwriter.common import qtLambda -from novelwriter.enum import nwView +from novelwriter.constants import nwLabels, trConst +from novelwriter.enum import nwTheme, nwView from novelwriter.extensions.eventfilters import StatusTipFilter from novelwriter.extensions.modified import NIconToolButton from novelwriter.gui.theme import STYLES_BIG_TOOLBUTTON @@ -77,6 +78,10 @@ class GuiSideBar(QWidget): self.tbOutline.setToolTip("{0} [Ctrl+Shift+T]".format(self.tr("Novel Outline View"))) self.tbOutline.clicked.connect(qtLambda(self.requestViewChange.emit, nwView.OUTLINE)) + self.tbTheme = NIconToolButton(self, iSz) + self.tbTheme.setToolTip(self.tr("Switch Colour Theme")) + self.tbTheme.clicked.connect(self._cycleColurTheme) + self.tbBuild = NIconToolButton(self, iSz) self.tbBuild.setToolTip("{0} [F5]".format(self.tr("Build Manuscript"))) self.tbBuild.clicked.connect(self.mainGui.showBuildManuscriptDialog) @@ -109,6 +114,7 @@ class GuiSideBar(QWidget): self.outerBox.addWidget(self.tbOutline) self.outerBox.addWidget(self.tbBuild) self.outerBox.addStretch(1) + self.outerBox.addWidget(self.tbTheme) self.outerBox.addWidget(self.tbDetails) self.outerBox.addWidget(self.tbStats) self.outerBox.addWidget(self.tbSettings) @@ -131,6 +137,7 @@ class GuiSideBar(QWidget): self.tbSearch.setStyleSheet(buttonStyle) self.tbOutline.setStyleSheet(buttonStyle) self.tbBuild.setStyleSheet(buttonStyle) + self.tbTheme.setStyleSheet(buttonStyle) self.tbDetails.setStyleSheet(buttonStyle) self.tbStats.setStyleSheet(buttonStyle) self.tbSettings.setStyleSheet(buttonStyle) @@ -144,6 +151,36 @@ class GuiSideBar(QWidget): self.tbStats.setThemeIcon("sb_stats") self.tbSettings.setThemeIcon("settings") + self._setThemeModeIcon() + + return + + ## + # Private Slots + ## + + @pyqtSlot() + def _cycleColurTheme(self) -> None: + """Go to nex colour theme.""" + match CONFIG.themeMode: + case nwTheme.AUTO: + CONFIG.themeMode = nwTheme.LIGHT + case nwTheme.LIGHT: + CONFIG.themeMode = nwTheme.DARK + case nwTheme.DARK: + CONFIG.themeMode = nwTheme.AUTO + self.mainGui.checkThemeUpdate() + self._setThemeModeIcon() + return + + ## + # Internal Functions + ## + + def _setThemeModeIcon(self) -> None: + """Set the theme button icon.""" + self.tbTheme.setThemeIcon(nwLabels.THEME_MODE_ICON[CONFIG.themeMode]) + self.tbTheme.setToolTip(trConst(nwLabels.THEME_MODE_LABEL[CONFIG.themeMode])) return diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 4a53f453..43a6ffe3 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -100,22 +100,22 @@ class GuiTheme: """ __slots__ = ( - "_availSyntax", "_availThemes", "_darkThemes", "_guiPalette", "_lightThemes", "_qColors", - "_styleSheets", "_svgColors", "_syntaxList", "_themeList", "baseButtonHeight", - "baseIconHeight", "baseIconSize", "buttonIconSize", "errorText", "fadedText", - "fontPixelSize", "fontPointSize", "getDecoration", "getHeaderDecoration", + "_availSyntax", "_availThemes", "_currentTheme", "_darkThemes", "_guiPalette", + "_lightThemes", "_qColors", "_styleSheets", "_svgColors", "_syntaxList", "_themeList", + "baseButtonHeight", "baseIconHeight", "baseIconSize", "buttonIconSize", "errorText", + "fadedText", "fontPixelSize", "fontPointSize", "getDecoration", "getHeaderDecoration", "getHeaderDecorationNarrow", "getIcon", "getItemIcon", "getPixmap", "getToggleIcon", "guiFont", "guiFontB", "guiFontBU", "guiFontFixed", "guiFontSmall", "helpText", - "iconCache", "isDarkTheme", "syntaxMeta", "syntaxTheme", "textNHeight", "textNWidth", + "iconCache", "isDarkTheme", "syntaxTheme", "textNHeight", "textNWidth", "themeMeta", ) def __init__(self) -> None: - self.iconCache = GuiIcons(self) - - # GUI Theme + # Theme Objects self.themeMeta = ThemeMeta() + self.iconCache = GuiIcons(self) + self.syntaxTheme = SyntaxColors() self.isDarkTheme = False # Special Text Colours @@ -123,11 +123,8 @@ class GuiTheme: self.fadedText = QColor(0, 0, 0) self.errorText = QColor(255, 0, 0) - # Syntax Theme - self.syntaxMeta = ThemeMeta() - self.syntaxTheme = SyntaxColors() - # Load Themes + self._currentTheme = "" self._guiPalette = QPalette() self._themeList: list[T_ThemeEntry] = [] self._availThemes: dict[str, Path] = {} @@ -275,6 +272,10 @@ class GuiTheme: theme = DEF_GUI_LIGHT CONFIG.lightTheme = DEF_GUI_LIGHT + if theme == self._currentTheme: + logger.info("Theme '%s' is already loaded", theme) + return False + if not (file := self._availThemes.get(theme)): logger.error("Could not load GUI theme") return False @@ -387,7 +388,6 @@ class GuiTheme: text = self._guiPalette.text().color() window = self._guiPalette.window().color() highlight = self._guiPalette.highlight().color() - isDark = text.lightnessF() > window.lightnessF() QtColActive = QPalette.ColorGroup.Active QtColInactive = QPalette.ColorGroup.Inactive @@ -407,8 +407,8 @@ class GuiTheme: darkOff = dark.darker(150) shadowOff = ref.darker(150) - grey = QColor(120, 120, 120) if isDark else QColor(140, 140, 140) - dimmed = QColor(130, 130, 130) if isDark else QColor(190, 190, 190) + grey = QColor(120, 120, 120) if darkMode else QColor(140, 140, 140) + dimmed = QColor(130, 130, 130) if darkMode else QColor(190, 190, 190) placeholder = QColor(text) placeholder.setAlpha(128) @@ -453,10 +453,11 @@ class GuiTheme: self.iconCache.loadTheme(CONFIG.iconTheme) # Finalise - self.isDarkTheme = isDark + self.isDarkTheme = darkMode QApplication.setPalette(self._guiPalette) self._buildStyleSheets(self._guiPalette) + self._currentTheme = theme CONFIG.splashMessage(f"Loaded GUI theme: {meta.name}") return True diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index 601540f0..6af7b3c7 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -30,7 +30,7 @@ from datetime import datetime from pathlib import Path from time import time -from PyQt6.QtCore import Qt, QTimer, pyqtSlot +from PyQt6.QtCore import QEvent, Qt, QTimer, pyqtSlot from PyQt6.QtGui import QCloseEvent, QCursor, QIcon, QShortcut from PyQt6.QtWidgets import ( QApplication, QFileDialog, QHBoxLayout, QMainWindow, QMessageBox, @@ -902,10 +902,46 @@ class GuiMain(QMainWindow): return not self.splitView.isVisible() + def checkThemeUpdate(self) -> None: + """Load theme if mode changed.""" + if SHARED.theme.loadTheme(): + self.refreshThemeColors(syntax=True) + self.docEditor.initEditor() + self.docViewer.initViewer() + return + + def refreshThemeColors(self, syntax: bool) -> None: + """Refresh the GUI theme.""" + SHARED.theme.loadTheme() + self.setPalette(QApplication.palette()) + self.docEditor.updateTheme() + self.docViewer.updateTheme() + self.docViewerPanel.updateTheme() + self.sideBar.updateTheme() + self.projView.updateTheme() + self.novelView.updateTheme() + self.projSearch.updateTheme() + self.outlineView.updateTheme() + self.itemDetails.updateTheme() + self.mainStatus.updateTheme() + SHARED.project.tree.refreshAllItems() + + if syntax: + self.docEditor.updateSyntaxColors() + + return + ## # Events ## + def changeEvent(self, event: QEvent) -> None: + """Capture application change events.""" + if int(event.type()) == 210: + # ThemeChange + self.checkThemeUpdate() + return + def closeEvent(self, event: QCloseEvent) -> None: """Capture the closing event of the GUI and call the close function to handle all the close process steps. @@ -1054,22 +1090,7 @@ class GuiMain(QMainWindow): self.novelView.refreshCurrentTree() if theme: - SHARED.theme.loadTheme() - self.setPalette(QApplication.palette()) - self.docEditor.updateTheme() - self.docViewer.updateTheme() - self.docViewerPanel.updateTheme() - self.sideBar.updateTheme() - self.projView.updateTheme() - self.novelView.updateTheme() - self.projSearch.updateTheme() - self.outlineView.updateTheme() - self.itemDetails.updateTheme() - self.mainStatus.updateTheme() - SHARED.project.tree.refreshAllItems() - - if syntax: - self.docEditor.updateSyntaxColors() + self.refreshThemeColors(syntax=syntax) self.docEditor.initEditor() self.docViewer.initViewer() From 059085a21a50d53f5b7d543bcbc14b00068033bc Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 2 Jun 2025 23:13:30 +0200 Subject: [PATCH 13/96] Add theme icons --- novelwriter/assets/icons/font_awesome.icons | 3 +++ novelwriter/assets/icons/material_filled_bold.icons | 3 +++ novelwriter/assets/icons/material_filled_normal.icons | 3 +++ novelwriter/assets/icons/material_filled_thin.icons | 3 +++ novelwriter/assets/icons/material_rounded_bold.icons | 3 +++ novelwriter/assets/icons/material_rounded_normal.icons | 3 +++ novelwriter/assets/icons/material_rounded_thin.icons | 3 +++ novelwriter/assets/icons/remix_filled.icons | 3 +++ novelwriter/assets/icons/remix_outline.icons | 3 +++ utils/icon_themes.py | 4 ++++ utils/icon_themes/font_awesome.json | 4 ++++ utils/icon_themes/material_symbols.json | 4 ++++ utils/icon_themes/remix.json | 4 ++++ 13 files changed, 43 insertions(+) diff --git a/novelwriter/assets/icons/font_awesome.icons b/novelwriter/assets/icons/font_awesome.icons index 550fd857..75204942 100644 --- a/novelwriter/assets/icons/font_awesome.icons +++ b/novelwriter/assets/icons/font_awesome.icons @@ -56,6 +56,9 @@ icon:sb_outline = icon:sb_search = icon:sb_stats = +icon:theme_light = +icon:theme_dark = +icon:theme_auto = icon:add = icon:bookmarks = icon:browse = diff --git a/novelwriter/assets/icons/material_filled_bold.icons b/novelwriter/assets/icons/material_filled_bold.icons index bc902698..584a04bb 100644 --- a/novelwriter/assets/icons/material_filled_bold.icons +++ b/novelwriter/assets/icons/material_filled_bold.icons @@ -56,6 +56,9 @@ icon:sb_outline = icon:sb_search = icon:sb_stats = +icon:theme_light = +icon:theme_dark = +icon:theme_auto = icon:add = icon:bookmarks = icon:browse = diff --git a/novelwriter/assets/icons/material_filled_normal.icons b/novelwriter/assets/icons/material_filled_normal.icons index ce666d14..a6d7933e 100644 --- a/novelwriter/assets/icons/material_filled_normal.icons +++ b/novelwriter/assets/icons/material_filled_normal.icons @@ -56,6 +56,9 @@ icon:sb_outline = icon:sb_search = icon:sb_stats = +icon:theme_light = +icon:theme_dark = +icon:theme_auto = icon:add = icon:bookmarks = icon:browse = diff --git a/novelwriter/assets/icons/material_filled_thin.icons b/novelwriter/assets/icons/material_filled_thin.icons index 70c4f364..a405ea3e 100644 --- a/novelwriter/assets/icons/material_filled_thin.icons +++ b/novelwriter/assets/icons/material_filled_thin.icons @@ -56,6 +56,9 @@ icon:sb_outline = icon:sb_search = icon:sb_stats = +icon:theme_light = +icon:theme_dark = +icon:theme_auto = icon:add = icon:bookmarks = icon:browse = diff --git a/novelwriter/assets/icons/material_rounded_bold.icons b/novelwriter/assets/icons/material_rounded_bold.icons index 08564be2..02d83821 100644 --- a/novelwriter/assets/icons/material_rounded_bold.icons +++ b/novelwriter/assets/icons/material_rounded_bold.icons @@ -56,6 +56,9 @@ icon:sb_outline = icon:sb_search = icon:sb_stats = +icon:theme_light = +icon:theme_dark = +icon:theme_auto = icon:add = icon:bookmarks = icon:browse = diff --git a/novelwriter/assets/icons/material_rounded_normal.icons b/novelwriter/assets/icons/material_rounded_normal.icons index 3da2739e..06887aa7 100644 --- a/novelwriter/assets/icons/material_rounded_normal.icons +++ b/novelwriter/assets/icons/material_rounded_normal.icons @@ -56,6 +56,9 @@ icon:sb_outline = icon:sb_search = icon:sb_stats = +icon:theme_light = +icon:theme_dark = +icon:theme_auto = icon:add = icon:bookmarks = icon:browse = diff --git a/novelwriter/assets/icons/material_rounded_thin.icons b/novelwriter/assets/icons/material_rounded_thin.icons index 61fcd5fa..1002fcbf 100644 --- a/novelwriter/assets/icons/material_rounded_thin.icons +++ b/novelwriter/assets/icons/material_rounded_thin.icons @@ -56,6 +56,9 @@ icon:sb_outline = icon:sb_search = icon:sb_stats = +icon:theme_light = +icon:theme_dark = +icon:theme_auto = icon:add = icon:bookmarks = icon:browse = diff --git a/novelwriter/assets/icons/remix_filled.icons b/novelwriter/assets/icons/remix_filled.icons index b2305187..51e73a78 100644 --- a/novelwriter/assets/icons/remix_filled.icons +++ b/novelwriter/assets/icons/remix_filled.icons @@ -56,6 +56,9 @@ icon:sb_outline = icon:sb_search = icon:sb_stats = +icon:theme_light = +icon:theme_dark = +icon:theme_auto = icon:add = icon:bookmarks = icon:browse = diff --git a/novelwriter/assets/icons/remix_outline.icons b/novelwriter/assets/icons/remix_outline.icons index 0fae7c91..02ce0243 100644 --- a/novelwriter/assets/icons/remix_outline.icons +++ b/novelwriter/assets/icons/remix_outline.icons @@ -56,6 +56,9 @@ icon:sb_outline = icon:sb_search = icon:sb_stats = +icon:theme_light = +icon:theme_dark = +icon:theme_auto = icon:add = icon:bookmarks = icon:browse = diff --git a/utils/icon_themes.py b/utils/icon_themes.py index 00d75714..752b29e5 100644 --- a/utils/icon_themes.py +++ b/utils/icon_themes.py @@ -90,6 +90,10 @@ ICONS = [ "sb_search", "sb_stats", + "theme_light", + "theme_dark", + "theme_auto", + "add", "bookmarks", "browse", diff --git a/utils/icon_themes/font_awesome.json b/utils/icon_themes/font_awesome.json index 5ed09376..d98dc9e2 100644 --- a/utils/icon_themes/font_awesome.json +++ b/utils/icon_themes/font_awesome.json @@ -56,6 +56,10 @@ "sb_search": "magnifying-glass", "sb_stats": "chart-simple", + "theme_light": "sun", + "theme_dark": "moon", + "theme_auto": "circle-half-stroke", + "add": "plus", "bookmarks": "bookmark", "browse": "folder-open", diff --git a/utils/icon_themes/material_symbols.json b/utils/icon_themes/material_symbols.json index 230f5c60..61c1975a 100644 --- a/utils/icon_themes/material_symbols.json +++ b/utils/icon_themes/material_symbols.json @@ -56,6 +56,10 @@ "sb_search": "search", "sb_stats": "bar_chart", + "theme_light": "light_mode", + "theme_dark": "dark_mode", + "theme_auto": "contrast", + "add": "add", "bookmarks": "bookmarks", "browse": "folder_open", diff --git a/utils/icon_themes/remix.json b/utils/icon_themes/remix.json index 300b8bbe..0ac173ec 100644 --- a/utils/icon_themes/remix.json +++ b/utils/icon_themes/remix.json @@ -56,6 +56,10 @@ "sb_search": "file-search", "sb_stats": "bar-chart-fill", + "theme_light": "sun", + "theme_dark": "moon", + "theme_auto": "contrast", + "add": "add", "bookmarks": "bookmark", "browse": "folder-2", From 44528b61735f0a4e161262799cf9fa1698f83f6a Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 2 Jun 2025 23:20:51 +0200 Subject: [PATCH 14/96] Fix icon theme reload --- novelwriter/gui/theme.py | 4 ++-- novelwriter/guimain.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 43a6ffe3..bcdb1108 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -252,7 +252,7 @@ class GuiTheme: return QColor(*result) return default - def loadTheme(self) -> bool: + def loadTheme(self, force: bool = False) -> bool: """Load the currently specified GUI theme.""" match CONFIG.themeMode: case nwTheme.LIGHT: @@ -272,7 +272,7 @@ class GuiTheme: theme = DEF_GUI_LIGHT CONFIG.lightTheme = DEF_GUI_LIGHT - if theme == self._currentTheme: + if theme == self._currentTheme and not force: logger.info("Theme '%s' is already loaded", theme) return False diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index 6af7b3c7..41edcf3e 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -910,9 +910,9 @@ class GuiMain(QMainWindow): self.docViewer.initViewer() return - def refreshThemeColors(self, syntax: bool) -> None: + def refreshThemeColors(self, syntax: bool = False, force: bool = False) -> None: """Refresh the GUI theme.""" - SHARED.theme.loadTheme() + SHARED.theme.loadTheme(force=force) self.setPalette(QApplication.palette()) self.docEditor.updateTheme() self.docViewer.updateTheme() @@ -1090,7 +1090,7 @@ class GuiMain(QMainWindow): self.novelView.refreshCurrentTree() if theme: - self.refreshThemeColors(syntax=syntax) + self.refreshThemeColors(syntax=syntax, force=True) self.docEditor.initEditor() self.docViewer.initViewer() From b0ea1781e7cc3b90c32d609cf7d401e0ac08fdbf Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 2 Jun 2025 23:28:28 +0200 Subject: [PATCH 15/96] Fix test --- tests/test_gui/test_gui_theme.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_gui/test_gui_theme.py b/tests/test_gui/test_gui_theme.py index ff4308f2..316f029b 100644 --- a/tests/test_gui/test_gui_theme.py +++ b/tests/test_gui/test_gui_theme.py @@ -137,8 +137,9 @@ def testGuiTheme_Main(qtbot, nwGUI, tstPaths): assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (0, 127, 255, 255) # Non-existing value should return default colour + theme._setBaseColor("default", QColor(64, 64, 64, 255)) theme._setPalette(parser, "Palette", "stuff", QPalette.ColorRole.Window) - assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (0, 0, 0, 255) + assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (64, 64, 64, 255) # qtbot.stop() From 82188d156bb6e7bf57e4e83a6c97f8c8bf2aa2b6 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 3 Jun 2025 12:02:38 +0200 Subject: [PATCH 16/96] Change the name and alpha format of colour themes --- novelwriter/assets/themes/default_dark.conf | 4 +- novelwriter/assets/themes/default_light.conf | 2 +- novelwriter/assets/themes/light_owl.conf | 4 +- novelwriter/assets/themes/night_owl.conf | 4 +- novelwriter/assets/themes/tango_dark.conf | 6 +- novelwriter/assets/themes/tango_light.conf | 10 +-- novelwriter/assets/themes/tomorrow.conf | 4 +- novelwriter/assets/themes/tomorrow_night.conf | 4 +- .../assets/themes/tomorrow_night_blue.conf | 4 +- .../assets/themes/tomorrow_night_bright.conf | 4 +- .../themes/tomorrow_night_eighties.conf | 4 +- novelwriter/gui/sidebar.py | 12 ++-- novelwriter/gui/theme.py | 36 +++++----- tests/test_gui/test_gui_theme.py | 72 +++++++++---------- 14 files changed, 84 insertions(+), 86 deletions(-) diff --git a/novelwriter/assets/themes/default_dark.conf b/novelwriter/assets/themes/default_dark.conf index 35acdb4c..71943bd8 100644 --- a/novelwriter/assets/themes/default_dark.conf +++ b/novelwriter/assets/themes/default_dark.conf @@ -54,7 +54,7 @@ background = #363636 text = default link = blue headertext = green -headertag = green, 160 +headertag = green:160 emphasis = orange dialog = blue altdialog = blue @@ -69,4 +69,4 @@ spellcheckline = red errorline = green replacetag = green modifier = green -texthighlight = yellow, 72 +texthighlight = yellow:72 diff --git a/novelwriter/assets/themes/default_light.conf b/novelwriter/assets/themes/default_light.conf index 0c309a3c..a67759dc 100644 --- a/novelwriter/assets/themes/default_light.conf +++ b/novelwriter/assets/themes/default_light.conf @@ -54,7 +54,7 @@ background = #ffffff text = #000000 link = blue headertext = green -headertag = green, 160 +headertag = green:160 emphasis = orange dialog = blue altdialog = blue diff --git a/novelwriter/assets/themes/light_owl.conf b/novelwriter/assets/themes/light_owl.conf index f72b8d70..3544b6cd 100644 --- a/novelwriter/assets/themes/light_owl.conf +++ b/novelwriter/assets/themes/light_owl.conf @@ -73,7 +73,7 @@ background = #fbfbfb text = default link = blue headertext = blue -headertag = blue, 160 +headertag = blue:160 emphasis = orange dialog = green altdialog = yellow @@ -88,4 +88,4 @@ spellcheckline = red errorline = green replacetag = aqua modifier = green -texthighlight = yellow, 96 +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/night_owl.conf b/novelwriter/assets/themes/night_owl.conf index 0d176c45..36ec3432 100644 --- a/novelwriter/assets/themes/night_owl.conf +++ b/novelwriter/assets/themes/night_owl.conf @@ -73,7 +73,7 @@ background = #011627 text = default link = blue headertext = blue -headertag = blue, 160 +headertag = blue:160 emphasis = orange dialog = green altdialog = yellow @@ -88,4 +88,4 @@ spellcheckline = red errorline = green replacetag = aqua modifier = green -texthighlight = yellow, 96 +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tango_dark.conf b/novelwriter/assets/themes/tango_dark.conf index ca0ba841..9c4dc59e 100644 --- a/novelwriter/assets/themes/tango_dark.conf +++ b/novelwriter/assets/themes/tango_dark.conf @@ -63,7 +63,7 @@ background = #2e3436 text = default link = blue headertext = blue -headertag = blue, 160 +headertag = blue:160 emphasis = orange dialog = green altdialog = yellow @@ -76,6 +76,6 @@ value = red optional = blue spellcheckline = red errorline = green -replacetag = cyan +replacetag = aqua modifier = blue -texthighlight = yellow, 96 +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tango_light.conf b/novelwriter/assets/themes/tango_light.conf index 174b0571..3c66d1e9 100644 --- a/novelwriter/assets/themes/tango_light.conf +++ b/novelwriter/assets/themes/tango_light.conf @@ -1,6 +1,6 @@ [Main] -name = Tango Light -mode = light +name = Tango Light +mode = light author = Veronica Berglyd Olsen (adaptation) ## @@ -63,7 +63,7 @@ background = #eeeeec text = default link = blue headertext = blue -headertag = blue, 160 +headertag = blue:160 emphasis = orange dialog = green altdialog = yellow @@ -76,6 +76,6 @@ value = red optional = blue spellcheckline = red errorline = green -replacetag = cyan +replacetag = aqua modifier = blue -texthighlight = yellow, 96 +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow.conf b/novelwriter/assets/themes/tomorrow.conf index 2b734209..f8b9d5df 100644 --- a/novelwriter/assets/themes/tomorrow.conf +++ b/novelwriter/assets/themes/tomorrow.conf @@ -73,7 +73,7 @@ background = #ffffff text = #4d4d4c link = blue headertext = blue -headertag = blue, 160 +headertag = blue:160 emphasis = orange dialog = green altdialog = yellow @@ -88,4 +88,4 @@ spellcheckline = red errorline = green replacetag = aqua modifier = orange -texthighlight = yellow, 96 +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow_night.conf b/novelwriter/assets/themes/tomorrow_night.conf index 27abd454..d0e91fbd 100644 --- a/novelwriter/assets/themes/tomorrow_night.conf +++ b/novelwriter/assets/themes/tomorrow_night.conf @@ -73,7 +73,7 @@ background = #1d1f21 text = default link = blue headertext = blue -headertag = blue, 160 +headertag = blue:160 emphasis = orange dialog = green altdialog = yellow @@ -88,4 +88,4 @@ spellcheckline = red errorline = green replacetag = aqua modifier = orange -texthighlight = yellow, 96 +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow_night_blue.conf b/novelwriter/assets/themes/tomorrow_night_blue.conf index 93b6592e..79fa3ea4 100644 --- a/novelwriter/assets/themes/tomorrow_night_blue.conf +++ b/novelwriter/assets/themes/tomorrow_night_blue.conf @@ -73,7 +73,7 @@ background = #002451 text = default link = blue headertext = blue -headertag = blue, 160 +headertag = blue:160 emphasis = orange dialog = green altdialog = yellow @@ -88,4 +88,4 @@ spellcheckline = red errorline = green replacetag = aqua modifier = orange -texthighlight = yellow, 96 +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow_night_bright.conf b/novelwriter/assets/themes/tomorrow_night_bright.conf index de76e694..3c2ad22d 100644 --- a/novelwriter/assets/themes/tomorrow_night_bright.conf +++ b/novelwriter/assets/themes/tomorrow_night_bright.conf @@ -73,7 +73,7 @@ background = #000000 text = default link = blue headertext = blue -headertag = blue, 160 +headertag = blue:160 emphasis = orange dialog = green altdialog = yellow @@ -88,4 +88,4 @@ spellcheckline = red errorline = green replacetag = aqua modifier = orange -texthighlight = yellow, 96 +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow_night_eighties.conf b/novelwriter/assets/themes/tomorrow_night_eighties.conf index e3e8bbec..8f969073 100644 --- a/novelwriter/assets/themes/tomorrow_night_eighties.conf +++ b/novelwriter/assets/themes/tomorrow_night_eighties.conf @@ -73,7 +73,7 @@ background = #2d2d2d text = default link = blue headertext = blue -headertag = blue, 160 +headertag = blue:160 emphasis = orange dialog = green altdialog = yellow @@ -88,4 +88,4 @@ spellcheckline = red errorline = green replacetag = aqua modifier = orange -texthighlight = yellow, 96 +texthighlight = yellow:96 diff --git a/novelwriter/gui/sidebar.py b/novelwriter/gui/sidebar.py index a4dd3c9c..e0ccb9e5 100644 --- a/novelwriter/gui/sidebar.py +++ b/novelwriter/gui/sidebar.py @@ -82,10 +82,6 @@ class GuiSideBar(QWidget): self.tbTheme.setToolTip(self.tr("Switch Colour Theme")) self.tbTheme.clicked.connect(self._cycleColurTheme) - self.tbBuild = NIconToolButton(self, iSz) - self.tbBuild.setToolTip("{0} [F5]".format(self.tr("Build Manuscript"))) - self.tbBuild.clicked.connect(self.mainGui.showBuildManuscriptDialog) - self.tbDetails = NIconToolButton(self, iSz) self.tbDetails.setToolTip("{0} [Shift+F6]".format(self.tr("Novel Details"))) self.tbDetails.clicked.connect(self.mainGui.showNovelDetailsDialog) @@ -94,6 +90,10 @@ class GuiSideBar(QWidget): self.tbStats.setToolTip("{0} [F6]".format(self.tr("Writing Statistics"))) self.tbStats.clicked.connect(self.mainGui.showWritingStatsDialog) + self.tbBuild = NIconToolButton(self, iSz) + self.tbBuild.setToolTip("{0} [F5]".format(self.tr("Build Manuscript"))) + self.tbBuild.clicked.connect(self.mainGui.showBuildManuscriptDialog) + # Settings Menu self.tbSettings = NIconToolButton(self, iSz) self.tbSettings.setToolTip(self.tr("Settings")) @@ -114,9 +114,9 @@ class GuiSideBar(QWidget): self.outerBox.addWidget(self.tbOutline) self.outerBox.addWidget(self.tbBuild) self.outerBox.addStretch(1) - self.outerBox.addWidget(self.tbTheme) self.outerBox.addWidget(self.tbDetails) self.outerBox.addWidget(self.tbStats) + self.outerBox.addWidget(self.tbTheme) self.outerBox.addWidget(self.tbSettings) self.outerBox.setContentsMargins(0, 0, 0, 0) self.outerBox.setSpacing(6) @@ -137,9 +137,9 @@ class GuiSideBar(QWidget): self.tbSearch.setStyleSheet(buttonStyle) self.tbOutline.setStyleSheet(buttonStyle) self.tbBuild.setStyleSheet(buttonStyle) - self.tbTheme.setStyleSheet(buttonStyle) self.tbDetails.setStyleSheet(buttonStyle) self.tbStats.setStyleSheet(buttonStyle) + self.tbTheme.setStyleSheet(buttonStyle) self.tbSettings.setStyleSheet(buttonStyle) self.tbProject.setThemeIcon("sb_project") diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index bcdb1108..236bebe7 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -229,27 +229,25 @@ class GuiTheme: if value in self._qColors: # Named colour return self._qColors[value] - elif value.startswith("#"): - if len(value) >= 9: - # Convert from #RRGGBBAA to #AARRGGBB - return QColor.fromString(f"#{value[7:9]}{value[1:7]}") - else: - # Assume #RRGGBB - return QColor.fromString(value[:7]) + elif value.startswith("#") and len(value) == 7: + # Assume #RRGGBB + return QColor.fromString(value) + elif value.startswith("#") and len(value) == 9: + # Assume #RRGGBBAA and convert to #AARRGGBB + return QColor.fromString(f"#{value[7:9]}{value[1:7]}") + elif ":" in value: + # Colour name and alpha + name, _, alpha = value.partition(":") + color = QColor(self._qColors.get(name.strip(), default)) + color.setAlpha(checkInt(alpha, 255)) + return color elif "," in value: + # Integer red, green, blue, alpha data = value.split(",") - entries = len(data) - if entries == 2: - # Assume name, alpha - color = QColor(self._qColors.get(data[0].strip(), default)) - color.setAlpha(checkInt(data[1], 255)) - return color - else: - # Assume red, green, blue, alpha - result = [0, 0, 0, 255] - for i in range(min(entries, 4)): - result[i] = checkInt(data[i].strip(), result[i]) - return QColor(*result) + result = [0, 0, 0, 255] + for i in range(min(len(data), 4)): + result[i] = checkInt(data[i].strip(), result[i]) + return QColor(*result) return default def loadTheme(self, force: bool = False) -> bool: diff --git a/tests/test_gui/test_gui_theme.py b/tests/test_gui/test_gui_theme.py index 316f029b..f57a2c30 100644 --- a/tests/test_gui/test_gui_theme.py +++ b/tests/test_gui/test_gui_theme.py @@ -39,40 +39,6 @@ from tests.mocked import causeOSError from tests.tools import writeFile -@pytest.mark.gui -def testGuiTheme_ParseColor(qtbot, nwGUI): - """Test the colour parsing.""" - theme = SHARED.theme - - # Pre-Populate - theme._qColors["red"] = QColor(255, 0, 0) - theme._qColors["green"] = QColor(0, 255, 0) - theme._qColors["blue"] = QColor(0, 0, 255) - - # By Name - assert theme.parseColor("red").getRgb() == (255, 0, 0, 255) - assert theme.parseColor("green").getRgb() == (0, 255, 0, 255) - assert theme.parseColor("blue").getRgb() == (0, 0, 255, 255) - assert theme.parseColor("bob").getRgb() == (0, 0, 0, 255) - - # CSS Format - assert theme.parseColor("#ff0000").getRgb() == (255, 0, 0, 255) - assert theme.parseColor("#ff00007f").getRgb() == (255, 0, 0, 127) - assert theme.parseColor("#ff00").getRgb() == (0, 0, 0, 255) # Too short -> ignored - assert theme.parseColor("#ff00007f15").getRgb() == (255, 0, 0, 127) # Too long -> truncated - - # Name + Alpha - assert theme.parseColor("red, 255").getRgb() == (255, 0, 0, 255) - assert theme.parseColor("red, 127").getRgb() == (255, 0, 0, 127) - assert theme.parseColor("red, 512").getRgb() == (255, 0, 0, 255) # Value truncated - - # Values - assert theme.parseColor("255, 0, 0").getRgb() == (255, 0, 0, 255) - assert theme.parseColor("255, 0, 0, 255").getRgb() == (255, 0, 0, 255) - assert theme.parseColor("255, 0, 0, 127").getRgb() == (255, 0, 0, 127) - assert theme.parseColor("255, 0, 0, 127, 42").getRgb() == (255, 0, 0, 127) # Truncated - - @pytest.mark.gui def testGuiTheme_Main(qtbot, nwGUI, tstPaths): """Test the theme class init.""" @@ -118,7 +84,7 @@ def testGuiTheme_Main(qtbot, nwGUI, tstPaths): assert theme._readColor(parser, "Palette", "colour1").getRgb() == (100, 150, 200, 255) assert theme._readColor(parser, "Palette", "colour2").getRgb() == (100, 150, 200, 250) assert theme._readColor(parser, "Palette", "colour3").getRgb() == (100, 150, 200, 250) - assert theme._readColor(parser, "Palette", "colour4").getRgb() == (0, 0, 0, 250) + assert theme._readColor(parser, "Palette", "colour4").getRgb() == (250, 250, 0, 255) assert theme._readColor(parser, "Palette", "colour5").getRgb() == (0, 0, 0, 0) assert theme._readColor(parser, "Palette", "colour6").getRgb() == (0, 127, 255, 255) @@ -130,7 +96,7 @@ def testGuiTheme_Main(qtbot, nwGUI, tstPaths): theme._setPalette(parser, "Palette", "colour3", QPalette.ColorRole.Window) assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (100, 150, 200, 250) theme._setPalette(parser, "Palette", "colour4", QPalette.ColorRole.Window) - assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (0, 0, 0, 250) + assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (250, 250, 0, 255) theme._setPalette(parser, "Palette", "colour5", QPalette.ColorRole.Window) assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (0, 0, 0, 0) theme._setPalette(parser, "Palette", "colour6", QPalette.ColorRole.Window) @@ -144,6 +110,40 @@ def testGuiTheme_Main(qtbot, nwGUI, tstPaths): # qtbot.stop() +@pytest.mark.gui +def testGuiTheme_ParseColor(qtbot, nwGUI): + """Test the colour parsing.""" + theme = SHARED.theme + + # Pre-Populate + theme._qColors["red"] = QColor(255, 0, 0) + theme._qColors["green"] = QColor(0, 255, 0) + theme._qColors["blue"] = QColor(0, 0, 255) + + # By Name + assert theme.parseColor("red").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("green").getRgb() == (0, 255, 0, 255) + assert theme.parseColor("blue").getRgb() == (0, 0, 255, 255) + assert theme.parseColor("bob").getRgb() == (0, 0, 0, 255) + + # CSS Format + assert theme.parseColor("#ff0000").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("#ff00007f").getRgb() == (255, 0, 0, 127) + assert theme.parseColor("#ff00").getRgb() == (0, 0, 0, 255) # Too short -> ignored + assert theme.parseColor("#ff00007f15").getRgb() == (0, 0, 0, 255) # Too long -> ignored + + # Name + Alpha + assert theme.parseColor("red:255").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("red:127").getRgb() == (255, 0, 0, 127) + assert theme.parseColor("red:512").getRgb() == (255, 0, 0, 255) # Value truncated + + # Values + assert theme.parseColor("255, 0, 0").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("255, 0, 0, 255").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("255, 0, 0, 127").getRgb() == (255, 0, 0, 127) + assert theme.parseColor("255, 0, 0, 127, 42").getRgb() == (255, 0, 0, 127) # Truncated + + @pytest.mark.gui @pytest.mark.skip def testGuiTheme_Theme(qtbot, monkeypatch, nwGUI, tstPaths): From 60b5f660e8d899db5704251a9417add2049364f0 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 3 Jun 2025 17:30:13 +0200 Subject: [PATCH 17/96] Rename colour aqua to cyan in themes --- novelwriter/assets/themes/cyberpunk_night.conf | 2 +- novelwriter/assets/themes/default_dark.conf | 2 +- novelwriter/assets/themes/default_light.conf | 2 +- novelwriter/assets/themes/dracula.conf | 2 +- novelwriter/assets/themes/grey_dark.conf | 2 +- novelwriter/assets/themes/grey_light.conf | 2 +- novelwriter/assets/themes/light_owl.conf | 4 ++-- novelwriter/assets/themes/night_owl.conf | 4 ++-- novelwriter/assets/themes/snazzy.conf | 2 +- novelwriter/assets/themes/solarized_dark.conf | 2 +- novelwriter/assets/themes/solarized_light.conf | 2 +- novelwriter/assets/themes/tango_dark.conf | 4 ++-- novelwriter/assets/themes/tango_light.conf | 4 ++-- novelwriter/assets/themes/tomorrow.conf | 4 ++-- novelwriter/assets/themes/tomorrow_night.conf | 4 ++-- novelwriter/assets/themes/tomorrow_night_blue.conf | 4 ++-- novelwriter/assets/themes/tomorrow_night_bright.conf | 4 ++-- novelwriter/assets/themes/tomorrow_night_eighties.conf | 4 ++-- novelwriter/constants.py | 2 +- novelwriter/gui/theme.py | 6 +++--- 20 files changed, 31 insertions(+), 31 deletions(-) diff --git a/novelwriter/assets/themes/cyberpunk_night.conf b/novelwriter/assets/themes/cyberpunk_night.conf index 1ee10ca8..40b5dd53 100644 --- a/novelwriter/assets/themes/cyberpunk_night.conf +++ b/novelwriter/assets/themes/cyberpunk_night.conf @@ -14,7 +14,7 @@ red = #f24817 orange = #ff960a yellow = #ffff00 green = #00ff00 -aqua = #00ffff +cyan = #00ffff blue = #4d4dff purple = #320064 diff --git a/novelwriter/assets/themes/default_dark.conf b/novelwriter/assets/themes/default_dark.conf index 71943bd8..e559de9e 100644 --- a/novelwriter/assets/themes/default_dark.conf +++ b/novelwriter/assets/themes/default_dark.conf @@ -15,7 +15,7 @@ red = #f2777a orange = #f99139 yellow = #ffcc66 green = #99cc99 -aqua = #66cccc +cyan = #66cccc blue = #6699cc purple = #cc99cc diff --git a/novelwriter/assets/themes/default_light.conf b/novelwriter/assets/themes/default_light.conf index a67759dc..638d6879 100644 --- a/novelwriter/assets/themes/default_light.conf +++ b/novelwriter/assets/themes/default_light.conf @@ -15,7 +15,7 @@ red = #a62a2d orange = #b36829 yellow = #a68542 green = #296629 -aqua = #269999 +cyan = #269999 blue = #3a70a6 purple = #b35ab3 diff --git a/novelwriter/assets/themes/dracula.conf b/novelwriter/assets/themes/dracula.conf index 49f30501..04e32450 100644 --- a/novelwriter/assets/themes/dracula.conf +++ b/novelwriter/assets/themes/dracula.conf @@ -31,7 +31,7 @@ red = #ff5555 orange = #ffb86c yellow = #f1fa8c green = #50fa7b -aqua = #8be9fd +cyan = #8be9fd blue = #93cff9 purple = #bd93f9 diff --git a/novelwriter/assets/themes/grey_dark.conf b/novelwriter/assets/themes/grey_dark.conf index d8c4a1fd..21d95224 100644 --- a/novelwriter/assets/themes/grey_dark.conf +++ b/novelwriter/assets/themes/grey_dark.conf @@ -14,7 +14,7 @@ red = #f2777a orange = #f99139 yellow = #ffcc66 green = #99cc99 -aqua = #66cccc +cyan = #66cccc blue = #6699cc purple = #cc99cc diff --git a/novelwriter/assets/themes/grey_light.conf b/novelwriter/assets/themes/grey_light.conf index ffa8fe61..651ab6d0 100644 --- a/novelwriter/assets/themes/grey_light.conf +++ b/novelwriter/assets/themes/grey_light.conf @@ -14,7 +14,7 @@ red = #a62a2d orange = #b36829 yellow = #a68542 green = #296629 -aqua = #269999 +cyan = #269999 blue = #3a70a6 purple = #b35ab3 diff --git a/novelwriter/assets/themes/light_owl.conf b/novelwriter/assets/themes/light_owl.conf index 3544b6cd..b18f5fb7 100644 --- a/novelwriter/assets/themes/light_owl.conf +++ b/novelwriter/assets/themes/light_owl.conf @@ -34,7 +34,7 @@ red = #de3d3a orange = #e0af05 yellow = #daaa01 green = #08916a -aqua = #2aa298 +cyan = #2aa298 blue = #288ed7 purple = #964ac1 @@ -86,6 +86,6 @@ value = orange optional = blue spellcheckline = red errorline = green -replacetag = aqua +replacetag = cyan modifier = green texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/night_owl.conf b/novelwriter/assets/themes/night_owl.conf index 36ec3432..8aae2b62 100644 --- a/novelwriter/assets/themes/night_owl.conf +++ b/novelwriter/assets/themes/night_owl.conf @@ -34,7 +34,7 @@ red = #f78c6c orange = #ecc48d yellow = #addb67 green = #addb67 -aqua = #7fdbca +cyan = #7fdbca blue = #82aaff purple = #c792ea @@ -86,6 +86,6 @@ value = orange optional = blue spellcheckline = red errorline = green -replacetag = aqua +replacetag = cyan modifier = green texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/snazzy.conf b/novelwriter/assets/themes/snazzy.conf index 19a662c0..6220dcc3 100644 --- a/novelwriter/assets/themes/snazzy.conf +++ b/novelwriter/assets/themes/snazzy.conf @@ -27,7 +27,7 @@ red = #ff5c57 orange = #f5b900 yellow = #cf9c00 green = #2dae58 -aqua = #13bbb7 +cyan = #13bbb7 blue = #09a1ed purple = #f767bb diff --git a/novelwriter/assets/themes/solarized_dark.conf b/novelwriter/assets/themes/solarized_dark.conf index 354b2be9..5cf4e157 100644 --- a/novelwriter/assets/themes/solarized_dark.conf +++ b/novelwriter/assets/themes/solarized_dark.conf @@ -33,7 +33,7 @@ red = #dc322f orange = #cb4b16 yellow = #b58900 green = #859900 -aqua = #2aa198 +cyan = #2aa198 blue = #268bd2 purple = #6c71c4 diff --git a/novelwriter/assets/themes/solarized_light.conf b/novelwriter/assets/themes/solarized_light.conf index 7d7427f5..f185bd73 100644 --- a/novelwriter/assets/themes/solarized_light.conf +++ b/novelwriter/assets/themes/solarized_light.conf @@ -33,7 +33,7 @@ red = #dc322f orange = #cb4b16 yellow = #b58900 green = #859900 -aqua = #2aa198 +cyan = #2aa198 blue = #268bd2 purple = #6c71c4 diff --git a/novelwriter/assets/themes/tango_dark.conf b/novelwriter/assets/themes/tango_dark.conf index 9c4dc59e..33e758f7 100644 --- a/novelwriter/assets/themes/tango_dark.conf +++ b/novelwriter/assets/themes/tango_dark.conf @@ -24,7 +24,7 @@ red = #ef2929 orange = #fcaf3e yellow = #fce94f green = #8ae234 -aqua = #34e2e2 +cyan = #34e2e2 blue = #729fcf purple = #ad7fa8 @@ -76,6 +76,6 @@ value = red optional = blue spellcheckline = red errorline = green -replacetag = aqua +replacetag = cyan modifier = blue texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tango_light.conf b/novelwriter/assets/themes/tango_light.conf index 3c66d1e9..877f71ac 100644 --- a/novelwriter/assets/themes/tango_light.conf +++ b/novelwriter/assets/themes/tango_light.conf @@ -24,7 +24,7 @@ red = #a40000 orange = #ce5c00 yellow = #c4a000 green = #4e9a06 -aqua = #069a9a +cyan = #069a9a blue = #204a87 purple = #5c3566 @@ -76,6 +76,6 @@ value = red optional = blue spellcheckline = red errorline = green -replacetag = aqua +replacetag = cyan modifier = blue texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow.conf b/novelwriter/assets/themes/tomorrow.conf index f8b9d5df..974816c1 100644 --- a/novelwriter/assets/themes/tomorrow.conf +++ b/novelwriter/assets/themes/tomorrow.conf @@ -34,7 +34,7 @@ red = #c82829 orange = #f5871f yellow = #eab700 green = #718c00 -aqua = #3e999f +cyan = #3e999f blue = #4271ae purple = #8959a8 @@ -86,6 +86,6 @@ value = yellow optional = blue spellcheckline = red errorline = green -replacetag = aqua +replacetag = cyan modifier = orange texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow_night.conf b/novelwriter/assets/themes/tomorrow_night.conf index d0e91fbd..94fecbc0 100644 --- a/novelwriter/assets/themes/tomorrow_night.conf +++ b/novelwriter/assets/themes/tomorrow_night.conf @@ -34,7 +34,7 @@ red = #cc6666 orange = #de935f yellow = #f0c674 green = #b5bd68 -aqua = #8abeb7 +cyan = #8abeb7 blue = #81a2be purple = #b294bb @@ -86,6 +86,6 @@ value = yellow optional = blue spellcheckline = red errorline = green -replacetag = aqua +replacetag = cyan modifier = orange texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow_night_blue.conf b/novelwriter/assets/themes/tomorrow_night_blue.conf index 79fa3ea4..88aac2e3 100644 --- a/novelwriter/assets/themes/tomorrow_night_blue.conf +++ b/novelwriter/assets/themes/tomorrow_night_blue.conf @@ -34,7 +34,7 @@ red = #ff9da4 orange = #ffc58f yellow = #ffeead green = #d1f1a9 -aqua = #99ffff +cyan = #99ffff blue = #bbdaff purple = #ebbbff @@ -86,6 +86,6 @@ value = yellow optional = blue spellcheckline = red errorline = green -replacetag = aqua +replacetag = cyan modifier = orange texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow_night_bright.conf b/novelwriter/assets/themes/tomorrow_night_bright.conf index 3c2ad22d..ab3c4766 100644 --- a/novelwriter/assets/themes/tomorrow_night_bright.conf +++ b/novelwriter/assets/themes/tomorrow_night_bright.conf @@ -34,7 +34,7 @@ red = #d54e53 orange = #e78c45 yellow = #e7c547 green = #b9ca4a -aqua = #70c0b1 +cyan = #70c0b1 blue = #7aa6da purple = #c397d8 @@ -86,6 +86,6 @@ value = yellow optional = blue spellcheckline = red errorline = green -replacetag = aqua +replacetag = cyan modifier = orange texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow_night_eighties.conf b/novelwriter/assets/themes/tomorrow_night_eighties.conf index 8f969073..ed67eb95 100644 --- a/novelwriter/assets/themes/tomorrow_night_eighties.conf +++ b/novelwriter/assets/themes/tomorrow_night_eighties.conf @@ -34,7 +34,7 @@ red = #f2777a orange = #f99157 yellow = #ffcc66 green = #99cc99 -aqua = #66cccc +cyan = #66cccc blue = #6699cc purple = #cc99cc @@ -86,6 +86,6 @@ value = yellow optional = blue spellcheckline = red errorline = green -replacetag = aqua +replacetag = cyan modifier = orange texthighlight = yellow:96 diff --git a/novelwriter/constants.py b/novelwriter/constants.py index 336c6318..5b7b260d 100644 --- a/novelwriter/constants.py +++ b/novelwriter/constants.py @@ -450,7 +450,7 @@ class nwLabels: "orange": QT_TRANSLATE_NOOP("Constant", "Orange"), "yellow": QT_TRANSLATE_NOOP("Constant", "Yellow"), "green": QT_TRANSLATE_NOOP("Constant", "Green"), - "aqua": QT_TRANSLATE_NOOP("Constant", "Aqua"), + "cyan": QT_TRANSLATE_NOOP("Constant", "Cyan"), "blue": QT_TRANSLATE_NOOP("Constant", "Blue"), "purple": QT_TRANSLATE_NOOP("Constant", "Purple"), } diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 236bebe7..b5e2d2f2 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -316,7 +316,7 @@ class GuiTheme: self._setBaseColor("orange", self._readColor(parser, sec, "orange")) self._setBaseColor("yellow", self._readColor(parser, sec, "yellow")) self._setBaseColor("green", self._readColor(parser, sec, "green")) - self._setBaseColor("aqua", self._readColor(parser, sec, "aqua")) + self._setBaseColor("cyan", self._readColor(parser, sec, "cyan")) self._setBaseColor("blue", self._readColor(parser, sec, "blue")) self._setBaseColor("purple", self._readColor(parser, sec, "purple")) @@ -505,7 +505,7 @@ class GuiTheme: orange = QColor(249, 145, 57) if isDark else QColor(245, 135, 31) yellow = QColor(255, 204, 102) if isDark else QColor(234, 183, 0) green = QColor(153, 204, 153) if isDark else QColor(113, 140, 0) - aqua = QColor(102, 204, 204) if isDark else QColor(62, 153, 159) + cyan = QColor(102, 204, 204) if isDark else QColor(62, 153, 159) blue = QColor(102, 153, 204) if isDark else QColor(66, 113, 174) purple = QColor(204, 153, 204) if isDark else QColor(137, 89, 168) @@ -526,7 +526,7 @@ class GuiTheme: self._setBaseColor("orange", orange) self._setBaseColor("yellow", yellow) self._setBaseColor("green", green) - self._setBaseColor("aqua", aqua) + self._setBaseColor("cyan", cyan) self._setBaseColor("blue", blue) self._setBaseColor("purple", purple) self._setBaseColor("root", blue) From df7a7216268cae42938fe92e17cbcc7ac81eb11d Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 3 Jun 2025 17:30:59 +0200 Subject: [PATCH 18/96] Update documentation on colour themes --- docs/source/index.rst | 1 + docs/source/more/customise.rst | 353 ++++++++++--------- docs/source/more/dictionaries.rst | 55 +++ docs/source/user_interface/editor_viewer.rst | 2 +- 4 files changed, 242 insertions(+), 169 deletions(-) create mode 100644 docs/source/more/dictionaries.rst diff --git a/docs/source/index.rst b/docs/source/index.rst index 8e863ff8..793d1d38 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -75,6 +75,7 @@ storage for robustness. more/counting more/typography + more/dictionaries more/customise more/handling_errors more/project_format diff --git a/docs/source/more/customise.rst b/docs/source/more/customise.rst index 80aa1201..8f3d2f60 100644 --- a/docs/source/more/customise.rst +++ b/docs/source/more/customise.rst @@ -1,94 +1,35 @@ .. _docs_more_custom: -************** -Customisations -************** +************* +Custom Themes +************* -.. _Enchant: https://rrthomas.github.io/enchant/ -.. _Free Desktop: https://cgit.freedesktop.org/libreoffice/dictionaries/tree/ - -There are a few ways you can customise novelWriter yourself. Currently, you can add new GUI themes, -your own syntax themes, and install additional dictionaries. - - -.. _docs_more_custom_dict: - -Spell Check Dictionaries -======================== - -novelWriter uses Enchant_ as the spell checking tool. Depending on your operating system, it may or -may not load all installed spell check dictionaries automatically. - - -Linux and MacOS ---------------- - -On Linux and MacOS, you generally only have to install hunspell, aspell or myspell dictionaries on -your system like you do for other applications. See your distro or OS documentation for how to do -this. These dictionaries should show up as available spell check languages in novelWriter. - - -Windows -------- - -For Windows, English is included with the installation. For other languages you have to download -and add dictionaries yourself. - -**Install Tool** - -A small tool to assist with this can be found under **Tools > Add Dictionaries**. It will import -spell checking dictionaries from Free Office or Libre Office extensions. The dictionaries are then -installed in the install location for the Enchant library and should thus work for any application -that uses Enchant for spell checking. - -**Manual Install** - -If you prefer to do this manually or want to use a different source than the ones mentioned above, -You need to get compatible dictionary files for your language. You need two files files ending with -``.aff`` and ``.dic``. These files must then be copied to the following location: - -``C:\Users\\AppData\Local\enchant\hunspell`` - -This assumes your user profile is stored at ``C:\Users\``. The last one or two folders may -not exist, so you may need to create them. - -You can find the various dictionaries on the `Free Desktop`_ website. - -.. note:: - The Free Desktop link points to a repository, and what may look like file links inside the - dictionary folder are actually links to web pages. If you right-click and download those, you - get HTML files, not dictionaries! - - In order to download the actual dictionary files, right-click the "plain" label at the end of - each line and download that. +There are a few ways you can customise novelWriter yourself. Currently, you can relatively easily +add new GUI themes. You can also add new icon themes, although this is not as straightforward. .. _docs_more_custom_theme: -Syntax and GUI Themes -===================== +Colour Themes +============= -Adding your own GUI and syntax themes is relatively easy, although it requires that you manually -edit config files with colour values. The themes are defined by simple plain text config files with -meta data and colour settings. +Adding your own colour themes is relatively easy, although it requires that you manually edit +config files with colour values. The themes are defined by simple plain text config files with meta +data and colour settings. In order to make your own versions, first copy one of the existing files to your local computer and modify it as you like. -* The existing syntax themes are stored in - `novelwriter/assets/syntax `_. -* The existing GUI themes are stored in - `novelwriter/assets/themes `_. -* The existing icon themes are stored in - `novelwriter/assets/icons `_. +The existing colour themes are stored in +`novelwriter/assets/themes `_. Remember to also change the name of your theme by modifying the ``name`` setting at the top of the file, otherwise you may not be able to distinguish them in **Preferences**. For novelWriter to be able to locate the custom theme files, you must copy them to the -:ref:`docs_technical_locations_data` location in your home or user area. There should be a folder there named -``syntax`` for syntax themes, just ``themes`` for GUI themes, and ``icons`` for icon themes. These -folders are created the first time you start novelWriter. +:ref:`docs_technical_locations_data` location in your home or user area. There should be a folder +there named ``themes`` for colour themes. These folders are created the first time you start +novelWriter. Once the files are copied there, they should show up in **Preferences** with the label you set as ``name`` inside the file. @@ -99,71 +40,123 @@ set as ``name`` inside the file. files up to date. -Custom GUI and Icons Theme --------------------------- +The Theme File Format +--------------------- -A GUI theme ``.conf`` file consists of the following settings: +A colour theme ``.conf`` file consists of the following settings: .. code-block:: cfg + :caption: The theme file for the "Default Light Theme" [Main] - name = My Custom Theme - description = A description of my custom theme - author = Jane Doe - credit = John Doe - url = https://example.com + name = Default Light Theme + mode = light + description = The novelWriter standard light theme + author = Veronica Berglyd Olsen + credit = Veronica Berglyd Olsen + url = https://github.com/vkbo/novelWriter license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ - [Icons] - default = 100, 100, 100 - faded = 100, 100, 100 - red = 255, 0, 0 - orange = 255, 128, 0 - yellow = 255, 255, 0 - green = 0, 255, 0 - aqua = 0, 255, 255 - blue = 0, 0, 255 - purple = 255, 0, 255 + [Base] + default = #303030 + faded = #6c6c6c + red = #a62a2d + orange = #b36829 + yellow = #a68542 + green = #296629 + cyan = #269999 + blue = #3a70a6 + purple = #b35ab3 [Project] - root = 0, 255, 255 - folder = 255, 255, 0 - file = 100, 100, 100 - title = 0, 255, 0 - chapter = 255, 0, 0 - scene = 0, 0, 255 - note = 255, 255, 0 + root = blue + folder = yellow + file = default + title = green + chapter = red + scene = blue + note = yellow [Palette] - window = 100, 100, 100 - windowtext = 100, 100, 100 - base = 100, 100, 100 - alternatebase = 100, 100, 100 - text = 100, 100, 100 - tooltipbase = 100, 100, 100 - tooltiptext = 100, 100, 100 - button = 100, 100, 100 - buttontext = 100, 100, 100 - brighttext = 100, 100, 100 - highlight = 100, 100, 100 - highlightedtext = 100, 100, 100 - link = 100, 100, 100 - linkvisited = 100, 100, 100 + window = #efefef + windowtext = #000000 + base = #ffffff + alternatebase = #e0e0e0 + text = #000000 + tooltipbase = #ffffc0 + tooltiptext = #15150d + button = #efefef + buttontext = #000000 + brighttext = #ffffff + highlight = #3087c6 + highlightedtext = #ffffff + link = blue + linkvisited = blue [GUI] - helptext = 0, 0, 0 - fadedtext = 128, 128, 128 - errortext = 255, 0, 0 + helptext = #5c5c5c + fadedtext = #6c6c6c + errortext = red -In the Main section you must at least define the ``name`` settings. + [Syntax] + background = #ffffff + text = #000000 + link = blue + headertext = green + headertag = green:160 + emphasis = orange + dialog = blue + altdialog = blue + note = yellow + hidden = faded + shortcode = green + keyword = red + tag = green + value = blue + optional = green + spellcheckline = red + errorline = green + replacetag = green + modifier = green + texthighlight = #c8c80060 -The Palette values correspond to the Qt enum values for ``QPalette::ColorRole``, see the -`Qt documentation `_ for more details. The -colour values are RGB numbers on the format ``r, g, b`` where each is an integer from ``0`` to -``255``. Omitted values are not loaded and will use default values. If the ``helptext`` colour is -not defined, it is computed as a colour between the ``window`` and ``windowtext`` colour. -Additional shades of some of the colours are also computed. These are mainly used for 3D effects. + +Theme Sections +-------------- + +.. _ColorRole: https://doc.qt.io/qt-6/qpalette.html#ColorRole-enum + +The theme file is made up of different sections depending on what part of novelWriter the theme +affects. + +.. csv-table:: Theme Sections Overview + :header: "Section", "Description" + :class: "tight-table" + + "``[Main]``", "Meta data about the theme, You must at least set ``name`` and ``mode``, and ``mode`` must be either ``light`` or ``dark``." + "``[Base]``", "The base colours of the theme. These are also selectable colours in various places inside the app, like for icon colours in **Preferences**." + "``[Project]``", "The colours used for icons and markers for the different project item types." + "``[Palette]``", "The colours used for styling the user interface. The values correspond to the ColorRole_ values in the Qt library." + "``[GUI]``", "The colours used for styling additional elements of the user interface." + "``[Syntax]``", "The colours used for syntax highlighting in documents." + + +Colour Value Formats +-------------------- + +There are several ways to enter colour values: + +.. csv-table:: Colour Formats + :header: "Syntax", "Description" + :class: "tight-table" + + "``#RRGGBB``", "A CSS style hexadecimal values, like ``#ff0000`` for red." + "``#RRGGBBAA``", "A CSS style hexadecimal values with transparency, like ``#ff00007f`` for half-transparent red." + "``name``", "A name referring to one of the colours already specified under the ``[Base]`` section, like ``red``. Note that you should not use named colours in the ``[Base]`` section itself as that may have unintended results." + "``name:alpha``", "A name referring to one of the colours already specified under the ``[Base]`` section, with a transparency value added. The alpha value must be in the range ``0`` to ``255``, like ``red:127`` for half-transparent red." + "``r, g, b``", "A set of red, green and blue numbers in the range ``0`` to ``255``, like ``255, 0, 0`` for red." + "``r, g, b, a``", "A set of red, green, blue and alpha numbers in the range ``0`` to ``255``, like ``255, 0, 0, 127`` for half-transparent red." .. versionadded:: 2.5 The ``fadedtext`` and ``errortext`` theme colour entries were added. @@ -172,60 +165,84 @@ Additional shades of some of the colours are also computed. These are mainly use The ``icontheme`` setting was dropped as the icon theme is now its own setting. The ``[Icons]`` and ``[Project]`` sections were added, and the ``status*`` settings removed. +.. versionadded:: 2.8 + The ``[Syntax]`` section was moved into the main theme file. Previously, these settings were in + their own file. The ``[Icons]`` section was renamed to ``[Base]``. -Custom Syntax Theme -------------------- -A syntax theme ``.conf`` file consists of the following settings: +Icon Themes +=========== + +Icon themes are *not* straightforward to add, but if you want to make the effort, this section +describes how to do it. + +The existing icon themes are stored in +`novelwriter/assets/icons `_. + +As with colour themes, remember to change the name of your theme by modifying the ``name`` setting +at the top of the file, otherwise you may not be able to distinguish them in **Preferences**. + +For novelWriter to be able to locate the custom theme files, you must copy them to the +:ref:`docs_technical_locations_data` location in your home or user area. There should be a folder +there ``icons`` for icon themes. These folders are created the first time you start novelWriter. + + +The Icons File Format +--------------------- + +Icon themes are kept in files with the ``.icons`` file extension. The file format is a custom +format with entries on the form ``section:key = value``. .. code-block:: cfg + :caption: The icons file for "Material Symbols - Rounded Medium" (truncated) - [Main] - name = My Syntax Theme - author = Jane Doe - credit = John Doe - url = https://example.com - license = CC BY-SA 4.0 - licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ + # Meta + meta:name = Material Symbols - Rounded Medium + meta:author = Google Inc + meta:license = Apache 2.0 - [Syntax] - background = 255, 255, 255 - text = 0, 0, 0 - link = 0, 0, 0 - headertext = 0, 0, 0 - headertag = 0, 0, 0 - emphasis = 0, 0, 0 - dialog = 0, 0, 0 - altdialog = 0, 0, 0 - note = 0, 0, 0 - hidden = 0, 0, 0 - shortcode = 0, 0, 0 - keyword = 0, 0, 0 - tag = 0, 0, 0 - value = 0, 0, 0 - optional = 0, 0, 0 - spellcheckline = 0, 0, 0 - errorline = 0, 0, 0 - replacetag = 0, 0, 0 - modifier = 0, 0, 0 - texthighlight = 255, 255, 255, 128 + # Icons + icon:alert_error = + icon:alert_info = + icon:alert_question = + icon:alert_warn = + icon:cls_archive = + icon:cls_character = + icon:cls_custom = + icon:cls_entity = + icon:cls_none = + icon:cls_novel = + icon:cls_object = + icon:cls_plot = + icon:cls_template = + icon:cls_timeline = + icon:cls_trash = + icon:cls_world = -In the Main section, you must define at least the ``name`` setting. The Syntax colour values are -RGB(A) numbers of the format ``r, g, b, a`` where each is an integer from ``0`` to ``255``. The -fourth value is the alpha channel, which can be omitted. +The icon keys are associated with icon placement locations inside novelWriter, and the template for +them is defined in the script that generates the default icon themes. -Omitted syntax colours default to black, except ``background`` which defaults to white, and -``texthighlight`` which defaults to white with half transparency. +The script can be found under +`utils/icon_themes.py `__ +in the source code. -.. versionadded:: 2.2 - The ``shortcode`` syntax colour entry was added. +This file includes all the code needed to generate the themes that are included in novelWriter. The +icon keys are mapped to icon keys from the specific themes in JSON files in the ``icon_themes`` +folder next to the script. This is the recommended way to generate these themes. Doing it manually +is not advisable. -.. versionadded:: 2.3 - The ``optional`` syntax colour entry was added. -.. versionadded:: 2.4 - The ``texthighlight`` syntax colour entry was added. +Icon Value Format +----------------- -.. versionadded:: 2.5 - The ``dialog``, ``altdialog``, ``note`` and ``tag`` syntax colour entries were added. - ``straightquotes``, ``doublequotes`` and ``singlequotes`` were removed. +As can be seen from the example, an icon is defined in the ``icon`` section with a key and an +in-line SVG XML block. The XML must fit on one line and obey the following rules: + +#. It must be single colour, that is, the fill colour attribute must be able to colourise the + entire icon. +#. The fill colour attribute *must* be defined and must be set to: ``fill="#000000"``. This value + is replaced by the relevant theme colour when the icon is processed in novelWriter. + +.. versionadded:: 2.7 + The icon theme files were added. Previously, icons were stored as individual SVG files with a + config file mapping the file names to the internal icon keys. diff --git a/docs/source/more/dictionaries.rst b/docs/source/more/dictionaries.rst new file mode 100644 index 00000000..1ca896d5 --- /dev/null +++ b/docs/source/more/dictionaries.rst @@ -0,0 +1,55 @@ +.. _docs_more_dictionaries: + +************************ +Spell Check Dictionaries +************************ + +.. _Enchant: https://rrthomas.github.io/enchant/ +.. _Free Desktop: https://cgit.freedesktop.org/libreoffice/dictionaries/tree/ + +Spell checking is provided by the Enchant_ library. Depending on your operating system, it may or +may not load all installed spell check dictionaries automatically. + + +Linux and MacOS +=============== + +On Linux and MacOS, you generally only have to install hunspell, aspell or myspell dictionaries on +your system like you do for other applications. See your distro or OS documentation for how to do +this. These dictionaries should show up as available spell check languages in novelWriter. + + +Windows +======= + +For Windows, English is included with the installation. For other languages you have to download +and add dictionaries yourself. + +**Install Tool** + +A small tool to assist with this can be found under **Tools > Add Dictionaries**. It will import +spell checking dictionaries from Free Office or Libre Office extensions. The dictionaries are then +installed in the install location for the Enchant library and should thus work for any application +that uses Enchant for spell checking. + +**Manual Install** + +If you prefer to do this manually or want to use a different source than the ones mentioned above, +You need to get compatible dictionary files for your language. You need two files files ending with +``.aff`` and ``.dic``. These files must then be copied to the following location: + +``C:\Users\\AppData\Local\enchant\hunspell`` + +This assumes your user profile is stored at ``C:\Users\``. The last one or two folders may +not exist, so you may need to create them. + +You can find the various dictionaries on the `Free Desktop`_ website. + +.. note:: + + The Free Desktop link points to a repository, and what may look like file links inside the + dictionary folder are actually links to web pages. If you right-click and download those, you + get HTML files, not dictionaries! + + In order to download the actual dictionary files, right-click the "plain" label at the end of + each line and download that. diff --git a/docs/source/user_interface/editor_viewer.rst b/docs/source/user_interface/editor_viewer.rst index 841be0b0..ee0c1eb3 100644 --- a/docs/source/user_interface/editor_viewer.rst +++ b/docs/source/user_interface/editor_viewer.rst @@ -55,7 +55,7 @@ edited from the **Project Word List** tool available from the **Tools** menu. .. note:: Generally, spell checking dictionaries are collected from your operating system, but on Windows - they are not. See :ref:`docs_more_custom_dict` for how to add spell checking dictionaries on + they are not. See :ref:`docs_more_dictionaries` for how to add spell checking dictionaries on Windows. From 638f93499bfd80384331ff24e28f7a35b1dd50b6 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 3 Jun 2025 17:31:52 +0200 Subject: [PATCH 19/96] Scan themes on startup instead --- novelwriter/__init__.py | 2 +- novelwriter/config.py | 4 +- novelwriter/dialogs/preferences.py | 14 +- novelwriter/gui/theme.py | 267 ++++++++++++++------------- novelwriter/guimain.py | 3 +- novelwriter/shared.py | 1 + tests/test_gui/test_gui_statusbar.py | 2 +- tests/test_gui/test_gui_theme.py | 25 ++- 8 files changed, 168 insertions(+), 150 deletions(-) diff --git a/novelwriter/__init__.py b/novelwriter/__init__.py index 4905f4b3..acc73ee6 100644 --- a/novelwriter/__init__.py +++ b/novelwriter/__init__.py @@ -49,7 +49,7 @@ __license__ = "GPLv3" __author__ = "Veronica Berglyd Olsen" __maintainer__ = "Veronica Berglyd Olsen" __email__ = "code@vkbo.net" -__version__ = "2.8 Alpha 0" +__version__ = "2.8a0" __hexversion__ = "0x020800a0" __date__ = "2025-06-01" __status__ = "Stable" diff --git a/novelwriter/config.py b/novelwriter/config.py index db173019..404391b1 100644 --- a/novelwriter/config.py +++ b/novelwriter/config.py @@ -405,7 +405,7 @@ class Config: else: font = QFontDatabase.systemFont(QFontDatabase.SystemFont.GeneralFont) self.guiFont = fontMatcher(font) - logger.debug("GUI font set to: %s", describeFont(font)) + logger.debug("Main font set to: %s", describeFont(font)) QApplication.setFont(self.guiFont) return @@ -723,7 +723,7 @@ class Config: # Check Values # ============ - self._prepareFont(self.guiFont, "GUI") + self._prepareFont(self.guiFont, "main") self._prepareFont(self.textFont, "document") # If we're using straight quotes, disable auto-replace diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index 9587db6a..3d284c2e 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -169,11 +169,12 @@ class GuiPreferences(NDialog): self.lightTheme.setMinimumWidth(200) self.darkTheme = NComboBox(self) self.darkTheme.setMinimumWidth(200) - for theme, name, dark in SHARED.theme.listThemes(): - if dark: - self.darkTheme.addItem(name, theme) + for key, theme in SHARED.theme.colourThemes.items(): + if theme.dark: + self.darkTheme.addItem(theme.name, key) else: - self.lightTheme.addItem(name, theme) + self.lightTheme.addItem(theme.name, key) + self.lightTheme.setCurrentData(CONFIG.lightTheme, DEF_GUI_LIGHT) self.darkTheme.setCurrentData(CONFIG.darkTheme, DEF_GUI_DARK) @@ -189,8 +190,9 @@ class GuiPreferences(NDialog): # Icon Theme self.iconTheme = NComboBox(self) self.iconTheme.setMinimumWidth(200) - for theme, name in SHARED.theme.iconCache.listThemes(): - self.iconTheme.addItem(name, theme) + for key, theme in SHARED.theme.iconCache.iconThemes.items(): + self.iconTheme.addItem(theme.name, key) + self.iconTheme.setCurrentData(CONFIG.iconTheme, DEF_ICONS) self.mainForm.addRow( diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index b5e2d2f2..463a8dc0 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -27,6 +27,7 @@ from __future__ import annotations import logging from configparser import ConfigParser +from dataclasses import dataclass from math import ceil from typing import TYPE_CHECKING, Final @@ -50,13 +51,19 @@ if TYPE_CHECKING: logger = logging.getLogger(__name__) -T_ThemeEntry = tuple[str, str, bool] - STYLES_FLAT_TABS = "flatTabWidget" STYLES_MIN_TOOLBUTTON = "minimalToolButton" STYLES_BIG_TOOLBUTTON = "bigToolButton" +@dataclass +class ThemeEntry: + + name: str + dark: bool + path: Path + + class ThemeMeta: name: str = "" @@ -100,20 +107,18 @@ class GuiTheme: """ __slots__ = ( - "_availSyntax", "_availThemes", "_currentTheme", "_darkThemes", "_guiPalette", - "_lightThemes", "_qColors", "_styleSheets", "_svgColors", "_syntaxList", "_themeList", - "baseButtonHeight", "baseIconHeight", "baseIconSize", "buttonIconSize", "errorText", - "fadedText", "fontPixelSize", "fontPointSize", "getDecoration", "getHeaderDecoration", + "_allThemes", "_currentTheme", "_darkThemes", "_guiPalette", "_lightThemes", "_meta", + "_qColors", "_styleSheets", "_svgColors", "_syntaxList", "baseButtonHeight", + "baseIconHeight", "baseIconSize", "buttonIconSize", "errorText", "fadedText", + "fontPixelSize", "fontPointSize", "getDecoration", "getHeaderDecoration", "getHeaderDecorationNarrow", "getIcon", "getItemIcon", "getPixmap", "getToggleIcon", "guiFont", "guiFontB", "guiFontBU", "guiFontFixed", "guiFontSmall", "helpText", "iconCache", "isDarkTheme", "syntaxTheme", "textNHeight", "textNWidth", - "themeMeta", ) def __init__(self) -> None: # Theme Objects - self.themeMeta = ThemeMeta() self.iconCache = GuiIcons(self) self.syntaxTheme = SyntaxColors() self.isDarkTheme = False @@ -123,12 +128,11 @@ class GuiTheme: self.fadedText = QColor(0, 0, 0) self.errorText = QColor(255, 0, 0) - # Load Themes + # Theme Data + self._meta = ThemeMeta() self._currentTheme = "" self._guiPalette = QPalette() - self._themeList: list[T_ThemeEntry] = [] - self._availThemes: dict[str, Path] = {} - self._availSyntax: dict[str, Path] = {} + self._allThemes: dict[str, ThemeEntry] = {} self._styleSheets: dict[str, str] = {} self._svgColors: dict[str, bytes] = {} self._qColors: dict[str, QColor] = {} @@ -180,16 +184,19 @@ class GuiTheme: logger.debug("Text 'N' Height: %d", self.textNHeight) logger.debug("Text 'N' Width: %d", self.textNWidth) - # Process Themes - _listConf(self._availThemes, CONFIG.assetPath("themes"), ".conf") - _listConf(self._availThemes, CONFIG.dataPath("themes"), ".conf") - - self.loadTheme() - return ## - # Methods + # Properties + ## + + @property + def colourThemes(self) -> dict[str, ThemeEntry]: + """Return a dictionary of all themes.""" + return self._allThemes + + ## + # Getters ## def getTextWidth(self, text: str, font: QFont | None = None) -> int: @@ -214,6 +221,19 @@ class GuiTheme: # Theme Methods ## + def initThemes(self) -> None: + """Initialise themes.""" + CONFIG.splashMessage("Scanning for colour themes ...") + themes: list[Path] = [] + _listContent(themes, CONFIG.assetPath("themes"), ".conf") + _listContent(themes, CONFIG.dataPath("themes"), ".conf") + self._scanThemes(themes) + + self.iconCache.initIcons() + self.loadTheme() + + return + def isDesktopDarkMode(self) -> bool: """Check if the desktop is in dark mode.""" if CONFIG.verQtValue >= 0x060500 and (hint := QGuiApplication.styleHints()): @@ -261,8 +281,8 @@ class GuiTheme: darkMode = self.isDesktopDarkMode() theme = CONFIG.darkTheme if darkMode else CONFIG.lightTheme - if theme not in self._availThemes: - logger.error("Could not find GUI theme '%s'", theme) + if theme not in self._allThemes: + logger.error("Could not find theme for key '%s'", theme) if darkMode: theme = DEF_GUI_DARK CONFIG.darkTheme = DEF_GUI_DARK @@ -274,18 +294,19 @@ class GuiTheme: logger.info("Theme '%s' is already loaded", theme) return False - if not (file := self._availThemes.get(theme)): + entry = self._allThemes.get(theme) + if not entry: logger.error("Could not load GUI theme") return False - CONFIG.splashMessage("Loading GUI theme ...") + CONFIG.splashMessage(f"Loading colour theme: {entry.name}") logger.info("Loading GUI theme '%s'", theme) parser = ConfigParser() try: - with open(file, mode="r", encoding="utf-8") as fo: + with open(entry.path, mode="r", encoding="utf-8") as fo: parser.read_file(fo) except Exception: - logger.error("Could not read file: %s", file) + logger.error("Could not read file: %s", entry.path) logException() return False @@ -305,9 +326,9 @@ class GuiTheme: meta.license = parser.get(sec, "license", fallback="N/A") meta.licenseUrl = parser.get(sec, "licenseurl", fallback="") - self.themeMeta = meta + self._meta = meta - # Icons + # Base sec = "Base" if parser.has_section(sec): self._setBaseColor("default", self._readColor(parser, sec, "default")) @@ -447,35 +468,18 @@ class GuiTheme: self._svgColors["scene"] = color self._svgColors["note"] = color + self.isDarkTheme = darkMode + self._currentTheme = theme + # Load icons after the theme is parsed self.iconCache.loadTheme(CONFIG.iconTheme) # Finalise - self.isDarkTheme = darkMode QApplication.setPalette(self._guiPalette) self._buildStyleSheets(self._guiPalette) - self._currentTheme = theme - CONFIG.splashMessage(f"Loaded GUI theme: {meta.name}") - return True - def listThemes(self) -> list[T_ThemeEntry]: - """Scan the GUI themes folder and list all themes.""" - if self._themeList: - return self._themeList - - themes: list[T_ThemeEntry] = [] - parser = ConfigParser() - for key, path in self._availThemes.items(): - logger.debug("Checking theme config '%s'", key) - if meta := _loadInternalName(parser, path): - themes.append((key, meta[0], meta[1])) - - self._themeList = sorted(themes, key=_sortTheme) - - return self._themeList - def getStyleSheet(self, name: str) -> str: """Load a standard style sheet.""" return self._styleSheets.get(name, "") @@ -493,12 +497,10 @@ class GuiTheme: def _resetTheme(self) -> None: """Reset GUI colours to default values.""" palette = QPalette() - - text = palette.color(QPalette.ColorRole.Text) - window = palette.color(QPalette.ColorRole.Window) - isDark = text.lightnessF() > window.lightnessF() + isDark = self.isDesktopDarkMode() # Reset GUI Palette + default = palette.color(QPalette.ColorRole.Text) faded = QColor(128, 128, 128) dimmed = QColor(130, 130, 130) if isDark else QColor(190, 190, 190) red = QColor(242, 119, 122) if isDark else QColor(240, 40, 41) @@ -520,7 +522,7 @@ class GuiTheme: self.iconCache.clear() self._svgColors = {} self._qColors = {} - self._setBaseColor("default", text) + self._setBaseColor("default", default) self._setBaseColor("faded", faded) self._setBaseColor("red", red) self._setBaseColor("orange", orange) @@ -531,7 +533,7 @@ class GuiTheme: self._setBaseColor("purple", purple) self._setBaseColor("root", blue) self._setBaseColor("folder", yellow) - self._setBaseColor("file", text) + self._setBaseColor("file", default) self._setBaseColor("title", green) self._setBaseColor("chapter", red) self._setBaseColor("scene", blue) @@ -582,6 +584,35 @@ class GuiTheme: return + def _scanThemes(self, files: list[Path]) -> None: + """Scan the GUI themes folder and list all themes.""" + parser = ConfigParser() + data: dict[str, tuple[str, str, bool, Path]] = {} + keys = [] + for file in files: + try: + parser.clear() + parser.read(file, encoding="utf-8") + name = parser.get("Main", "name", fallback="") + dark = parser.get("Main", "mode", fallback="light").lower() == "dark" + if name: + key = file.stem + prefix = "*" if key.startswith("default") else "" + lookup = f"{prefix}{name} {key}" + keys.append(lookup) + data[lookup] = (file.stem, name, dark, file) + except Exception: # noqa: PERF203 + logger.error("Could not read file: %s", file) + logException() + + self._allThemes = {} + for lookup in sorted(keys): + key, name, dark, item = data[lookup] + logger.debug("Checking theme config '%s'", key) + self._allThemes[key] = ThemeEntry(name, dark, item) + + return + class GuiIcons: """The icon class manages the content of the assets/icons folder, @@ -593,8 +624,8 @@ class GuiIcons: """ __slots__ = ( - "_availThemes", "_headerDec", "_headerDecNarrow", "_meta", "_noIcon", - "_qIcons", "_svgData", "_theme", "_themeList", + "_allThemes", "_headerDec", "_headerDecNarrow", "_meta", + "_noIcon", "_qIcons", "_svgData", "_theme", ) TOGGLE_ICON_KEYS: Final[dict[str, tuple[str, str]]] = { @@ -612,21 +643,15 @@ class GuiIcons: self._meta = ThemeMeta() # Storage + self._allThemes: dict[str, ThemeEntry] = {} self._svgData: dict[str, bytes] = {} self._qIcons: dict[str, QIcon] = {} self._headerDec: list[QPixmap] = [] self._headerDecNarrow: list[QPixmap] = [] - # Icon Theme Path - self._availThemes: dict[str, Path] = {} - self._themeList: list[tuple[str, str]] = [] - # None Icon self._noIcon = QIcon(str(CONFIG.assetPath("icons") / "none.svg")) - _listConf(self._availThemes, CONFIG.assetPath("icons"), ".icons") - _listConf(self._availThemes, CONFIG.dataPath("icons"), ".icons") - return def clear(self) -> None: @@ -638,29 +663,48 @@ class GuiIcons: self._meta = ThemeMeta() return + ## + # Properties + ## + + @property + def iconThemes(self) -> dict[str, ThemeEntry]: + """Return a dictionary of all icon themes.""" + return self._allThemes + ## # Actions ## + def initIcons(self) -> None: + """Initialise icons.""" + CONFIG.splashMessage("Scanning for icon themes ...") + icons: list[Path] = [] + _listContent(icons, CONFIG.assetPath("icons"), ".icons") + _listContent(icons, CONFIG.dataPath("icons"), ".icons") + self._scanThemes(icons) + return + def loadTheme(self, theme: str) -> bool: """Update the theme map. This is more of an init, since many of the GUI icons cannot really be replaced without writing specific update functions for the classes where they're used. """ - if theme not in self._availThemes: + if theme not in self._allThemes: logger.error("Could not find icon theme '%s'", theme) theme = DEF_ICONS CONFIG.iconTheme = theme - if not (file := self._availThemes.get(theme)): + entry = self._allThemes.get(theme) + if not entry: logger.error("Could not load icon theme") return False - CONFIG.splashMessage("Loading icon theme ...") + CONFIG.splashMessage(f"Loading icon theme: {entry.name}") logger.info("Loading icon theme '%s'", theme) try: meta = ThemeMeta() - with open(file, mode="r", encoding="utf-8") as icons: + with open(entry.path, mode="r", encoding="utf-8") as icons: for icon in icons: bits = icon.partition("=") key = bits[0].strip() @@ -676,14 +720,12 @@ class GuiIcons: meta.license = value self._meta = meta except Exception: - logger.error("Could not read file: %s", file) + logger.error("Could not read file: %s", entry.path) logException() return False - CONFIG.splashMessage(f"Loaded icon theme: {meta.name}") - CONFIG.splashMessage("Generating additional icons ...") - # Populate generated icons cache + CONFIG.splashMessage("Generating additional icons ...") self.getHeaderDecoration(0) self.getHeaderDecorationNarrow(0) @@ -811,21 +853,6 @@ class GuiIcons: ] return self._headerDecNarrow[minmax(hLevel, 0, 5)] - def listThemes(self) -> list[tuple[str, str]]: - """Scan the GUI icons folder and list all themes.""" - if self._themeList: - return self._themeList - - themes = [] - for key, path in self._availThemes.items(): - logger.debug("Checking icon theme '%s'", key) - if name := _loadIconName(path): - themes.append((key, name)) - - self._themeList = sorted(themes, key=_sortTheme) - - return self._themeList - ## # Internal Functions ## @@ -870,49 +897,39 @@ class GuiIcons: tMode = Qt.TransformationMode.SmoothTransformation return pixmap.scaledToHeight(height, tMode) + def _scanThemes(self, entries: list[Path]) -> None: + """Scan the GUI themes folder and list all themes.""" + data: dict[str, tuple[str, str, Path]] = {} + keys = [] + for entry in entries: + try: + with open(entry, mode="r", encoding="utf-8") as fo: + for line in fo: + key, _, value = line.partition("=") + if key.strip() == "meta:name": + if name := value.strip(): + lookup = entry.stem + keys.append(lookup) + data[lookup] = (lookup, name, entry) + break + except Exception: + logger.error("Could not read file: %s", entry) + logException() + + self._allThemes = {} + for lookup in sorted(keys): + key, name, item = data[lookup] + logger.debug("Checking icon theme '%s'", key) + self._allThemes[key] = ThemeEntry(name, False, item) + + return + # Module Functions # ================ -def _listConf(target: dict, path: Path, extension: str) -> None: - """Scan for theme files and populate the dictionary.""" +def _listContent(data: list[Path], path: Path, extension: str) -> None: + """List files of a specific type and extend the list.""" if path.is_dir(): - for item in path.iterdir(): - if item.is_file() and item.name.endswith(extension): - target[item.stem] = item + data.extend(n for n in path.iterdir() if n.is_file() and n.suffix == extension) return - - -def _sortTheme(data: tuple) -> str: - """Key function for theme sorting.""" - key, name = data[:2] - return f"*{name}" if key.startswith("default_") else name - - -def _loadInternalName(parser: ConfigParser, path: str | Path) -> tuple[str, bool]: - """Open a conf file and read the 'name' setting.""" - try: - parser.clear() - with open(path, mode="r", encoding="utf-8") as inFile: - parser.read_file(inFile) - name = parser.get("Main", "name", fallback="") - dark = parser.get("Main", "mode", fallback="light").lower() == "dark" - return name, dark - except Exception: - logger.error("Could not read file: %s", path) - logException() - return "", False - - -def _loadIconName(path: Path) -> str: - """Open an icons file and read the name setting.""" - try: - with open(path, mode="r", encoding="utf-8") as icons: - for icon in icons: - key, _, value = icon.partition("=") - if key.strip() == "meta:name": - return value.strip() - except Exception: - logger.error("Could not read file: %s", path) - logException() - return "" diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index 41edcf3e..25f997f6 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -937,8 +937,7 @@ class GuiMain(QMainWindow): def changeEvent(self, event: QEvent) -> None: """Capture application change events.""" - if int(event.type()) == 210: - # ThemeChange + if int(event.type()) == 210: # ThemeChange self.checkThemeUpdate() return diff --git a/novelwriter/shared.py b/novelwriter/shared.py index 228b9678..c5b7025c 100644 --- a/novelwriter/shared.py +++ b/novelwriter/shared.py @@ -175,6 +175,7 @@ class SharedData(QObject): is created. """ self._theme = theme + self._theme.initThemes() return def initSharedData(self, gui: GuiMain) -> None: diff --git a/tests/test_gui/test_gui_statusbar.py b/tests/test_gui/test_gui_statusbar.py index a4d5d91f..efb19f48 100644 --- a/tests/test_gui/test_gui_statusbar.py +++ b/tests/test_gui/test_gui_statusbar.py @@ -31,7 +31,7 @@ from tests.tools import C, buildTestProject @pytest.mark.gui def testGuiStatusBar_Main(qtbot, monkeypatch, nwGUI, projPath, mockRnd): - """Test the the various features of the status bar.""" + """Test the various features of the status bar.""" buildTestProject(nwGUI, projPath) cHandle = SHARED.project.newFile("A Note", C.hCharRoot) newDoc = SHARED.project.storage.getDocument(cHandle) diff --git a/tests/test_gui/test_gui_theme.py b/tests/test_gui/test_gui_theme.py index f57a2c30..84ee736e 100644 --- a/tests/test_gui/test_gui_theme.py +++ b/tests/test_gui/test_gui_theme.py @@ -33,7 +33,7 @@ from novelwriter import CONFIG, SHARED from novelwriter.config import DEF_GUI_LIGHT from novelwriter.constants import nwLabels from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType -from novelwriter.gui.theme import _listConf +from novelwriter.gui.theme import _listContent from tests.mocked import causeOSError from tests.tools import writeFile @@ -54,18 +54,17 @@ def testGuiTheme_Main(qtbot, nwGUI, tstPaths): # Scan for Themes # =============== - result = {} - _listConf({}, Path("not_a_path"), ".conf") - assert result == {} + result = [] + _listContent(result, Path("not_a_path"), ".conf") + assert result == [] themeOne = tstPaths.cnfDir / "themes" / "themeone.conf" themeTwo = tstPaths.cnfDir / "themes" / "themetwo.conf" writeFile(themeOne, "# Stuff") writeFile(themeTwo, "# Stuff") - _listConf(result, tstPaths.cnfDir / "themes", ".conf") - assert result["themeone"] == themeOne - assert result["themetwo"] == themeTwo + _listContent(result, tstPaths.cnfDir / "themes", ".conf") + assert result == [themeOne, themeTwo] # Parse Colours # ============= @@ -157,17 +156,17 @@ def testGuiTheme_Theme(qtbot, monkeypatch, nwGUI, tstPaths): with monkeypatch.context() as mp: mp.setattr("builtins.open", causeOSError) theme._themeList = [] - assert theme.listThemes() == [] + assert theme.getColourThemes() == [] # Load the theme info, default themes first - themesList = theme.listThemes() + themesList = theme.getColourThemes() assert themesList[0] == ("default_dark", "Default Dark Theme") assert themesList[1] == ("default_light", "Default Light Theme") assert themesList[2] == ("cyberpunk_night", "Cyberpunk Night") assert themesList[3] == ("dracula", "Dracula") # A second call should returned the cached list - assert theme.listThemes() == theme._themeList + assert theme.getColourThemes() == theme._themeList # Check handling of broken theme settings CONFIG.guiTheme = "not_a_theme" @@ -376,18 +375,18 @@ def testGuiTheme_IconThemes(qtbot, caplog, monkeypatch, nwGUI, tstPaths): # Load error returns empty list with monkeypatch.context() as mp: mp.setattr("builtins.open", causeOSError) - themes = iconCache.listThemes() + themes = iconCache.getIconThemes() assert themes == [] # Successful read - themes = iconCache.listThemes() + themes = iconCache.getIconThemes() assert len(themes) > 1 assert "material_rounded_normal" in dict(themes) # Load error doesn't matter on second read since list is cached with monkeypatch.context() as mp: mp.setattr("builtins.open", causeOSError) - assert iconCache.listThemes() == themes + assert iconCache.getIconThemes() == themes # qtbot.stop() From 5fee3ecdb89a730acbe4f2ba0fb92ebb59ecdc89 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 3 Jun 2025 17:39:21 +0200 Subject: [PATCH 20/96] Fix broken tests --- tests/mocked.py | 3 +++ tests/test_dialogs/test_dlg_preferences.py | 13 +++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/tests/mocked.py b/tests/mocked.py index d28cdbba..e1e4097c 100644 --- a/tests/mocked.py +++ b/tests/mocked.py @@ -65,6 +65,9 @@ class MockTheme: self.guiFontBU = QFont() return + def initThemes(self) -> None: + return + def getPixmap(self, *a) -> QPixmap: return QPixmap() diff --git a/tests/test_dialogs/test_dlg_preferences.py b/tests/test_dialogs/test_dlg_preferences.py index ccb77133..1c54da98 100644 --- a/tests/test_dialogs/test_dlg_preferences.py +++ b/tests/test_dialogs/test_dlg_preferences.py @@ -31,6 +31,7 @@ from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT from novelwriter.constants import nwUnicode from novelwriter.dialogs.preferences import GuiPreferences from novelwriter.dialogs.quotes import GuiQuoteSelect +from novelwriter.gui.theme import ThemeEntry from novelwriter.types import QtDialogCancel, QtDialogSave, QtModNone KEY_DELAY = 1 @@ -147,12 +148,12 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): (fncPath / "nw_en_US.qm").touch() (fncPath / "project_en_US.json").touch() CONFIG._nwLangPath = fncPath - SHARED.theme._themeList = [ - ("theme1", "Theme 1", False), - ("theme2", "Theme 2", False), - ("theme3", "Theme 3", True), - ("theme4", "Theme 4", True), - ] + SHARED.theme._allThemes = { + "theme1": ThemeEntry(name="Theme 1", dark=False, path=fncPath), + "theme2": ThemeEntry(name="Theme 2", dark=False, path=fncPath), + "theme3": ThemeEntry(name="Theme 3", dark=True, path=fncPath), + "theme4": ThemeEntry(name="Theme 4", dark=True, path=fncPath), + } prefs = GuiPreferences(nwGUI) with qtbot.waitExposed(prefs): From bd2353f7bce78bae7aa7f7b2c85971ff5dfb7362 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 3 Jun 2025 22:36:53 +0200 Subject: [PATCH 21/96] Add tests for sidebar and themes --- novelwriter/gui/theme.py | 43 +- tests/test_gui/test_gui_sidebar.py | 53 +++ tests/test_gui/test_gui_theme.py | 626 +++++++++++++++-------------- 3 files changed, 389 insertions(+), 333 deletions(-) create mode 100644 tests/test_gui/test_gui_sidebar.py diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 463a8dc0..5c7533ae 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -240,8 +240,8 @@ class GuiTheme: return hint.colorScheme() == Qt.ColorScheme.Dark palette = QPalette() - text = palette.color(QPalette.ColorRole.WindowText) - window = palette.color(QPalette.ColorRole.Window) + text = palette.windowText().color() + window = palette.window().color() return text.lightnessF() > window.lightnessF() def parseColor(self, value: str, default: QColor = QtBlack) -> QColor: @@ -270,7 +270,7 @@ class GuiTheme: return QColor(*result) return default - def loadTheme(self, force: bool = False) -> bool: + def loadTheme(self, force: bool = False) -> None: """Load the currently specified GUI theme.""" match CONFIG.themeMode: case nwTheme.LIGHT: @@ -282,7 +282,7 @@ class GuiTheme: theme = CONFIG.darkTheme if darkMode else CONFIG.lightTheme if theme not in self._allThemes: - logger.error("Could not find theme for key '%s'", theme) + logger.error("Could not find theme '%s'", theme) if darkMode: theme = DEF_GUI_DARK CONFIG.darkTheme = DEF_GUI_DARK @@ -292,23 +292,22 @@ class GuiTheme: if theme == self._currentTheme and not force: logger.info("Theme '%s' is already loaded", theme) - return False + return entry = self._allThemes.get(theme) if not entry: logger.error("Could not load GUI theme") - return False + return CONFIG.splashMessage(f"Loading colour theme: {entry.name}") logger.info("Loading GUI theme '%s'", theme) parser = ConfigParser() try: - with open(entry.path, mode="r", encoding="utf-8") as fo: - parser.read_file(fo) + parser.read(entry.path, encoding="utf-8") except Exception: logger.error("Could not read file: %s", entry.path) logException() - return False + return # Reset Palette self._resetTheme() @@ -458,15 +457,15 @@ class GuiTheme: # Set project override colours if (override := CONFIG.iconColTree) != "theme": - color = self._svgColors.get(override, b"#000000") - self._svgColors["root"] = color - self._svgColors["folder"] = color + color = self._qColors.get(override, QtBlack) + self._setBaseColor("root", color) + self._setBaseColor("folder", color) if not CONFIG.iconColDocs: - self._svgColors["file"] = color - self._svgColors["title"] = color - self._svgColors["chapter"] = color - self._svgColors["scene"] = color - self._svgColors["note"] = color + self._setBaseColor("file", color) + self._setBaseColor("title", color) + self._setBaseColor("chapter", color) + self._setBaseColor("scene", color) + self._setBaseColor("note", color) self.isDarkTheme = darkMode self._currentTheme = theme @@ -478,7 +477,7 @@ class GuiTheme: QApplication.setPalette(self._guiPalette) self._buildStyleSheets(self._guiPalette) - return True + return def getStyleSheet(self, name: str) -> str: """Load a standard style sheet.""" @@ -685,7 +684,7 @@ class GuiIcons: self._scanThemes(icons) return - def loadTheme(self, theme: str) -> bool: + def loadTheme(self, theme: str) -> None: """Update the theme map. This is more of an init, since many of the GUI icons cannot really be replaced without writing specific update functions for the classes where they're used. @@ -698,7 +697,7 @@ class GuiIcons: entry = self._allThemes.get(theme) if not entry: logger.error("Could not load icon theme") - return False + return CONFIG.splashMessage(f"Loading icon theme: {entry.name}") logger.info("Loading icon theme '%s'", theme) @@ -722,14 +721,14 @@ class GuiIcons: except Exception: logger.error("Could not read file: %s", entry.path) logException() - return False + return # Populate generated icons cache CONFIG.splashMessage("Generating additional icons ...") self.getHeaderDecoration(0) self.getHeaderDecorationNarrow(0) - return True + return ## # Access Functions diff --git a/tests/test_gui/test_gui_sidebar.py b/tests/test_gui/test_gui_sidebar.py new file mode 100644 index 00000000..45e372db --- /dev/null +++ b/tests/test_gui/test_gui_sidebar.py @@ -0,0 +1,53 @@ +""" +novelWriter – Side Bar Class Tester +=================================== + +This file is a part of novelWriter +Copyright (C) 2025 Veronica Berglyd Olsen and novelWriter contributors + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" +from __future__ import annotations + +import pytest + +from novelwriter import CONFIG +from novelwriter.constants import nwLabels +from novelwriter.enum import nwTheme + + +@pytest.mark.gui +def testGuiSideBar_CycleColourTheme(nwGUI): + """Test theme cycle feature on the side bar.""" + CONFIG.themeMode = nwTheme.AUTO + sidebar = nwGUI.sideBar + sidebar.mainGui.checkThemeUpdate = lambda *a: None + + # Run 3 Cycles + for _ in range(3): + + # Cycle Light + sidebar._cycleColurTheme() + assert CONFIG.themeMode == nwTheme.LIGHT + assert sidebar.tbTheme.toolTip() == nwLabels.THEME_MODE_LABEL[nwTheme.LIGHT] + + # Cycle Dark + sidebar._cycleColurTheme() + assert CONFIG.themeMode == nwTheme.DARK + assert sidebar.tbTheme.toolTip() == nwLabels.THEME_MODE_LABEL[nwTheme.DARK] + + # Cycle Auto + sidebar._cycleColurTheme() + assert CONFIG.themeMode == nwTheme.AUTO + assert sidebar.tbTheme.toolTip() == nwLabels.THEME_MODE_LABEL[nwTheme.AUTO] diff --git a/tests/test_gui/test_gui_theme.py b/tests/test_gui/test_gui_theme.py index 84ee736e..107fd125 100644 --- a/tests/test_gui/test_gui_theme.py +++ b/tests/test_gui/test_gui_theme.py @@ -20,99 +20,31 @@ along with this program. If not, see . """ from __future__ import annotations -import sys - from configparser import ConfigParser from pathlib import Path +from unittest.mock import MagicMock, Mock import pytest -from PyQt6.QtGui import QColor, QIcon, QPalette, QPixmap +from PyQt6.QtCore import Qt +from PyQt6.QtGui import QColor, QFont, QFontDatabase, QIcon, QPalette, QPixmap, QStyleHints -from novelwriter import CONFIG, SHARED -from novelwriter.config import DEF_GUI_LIGHT +from novelwriter import CONFIG +from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT, DEF_ICONS from novelwriter.constants import nwLabels -from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType -from novelwriter.gui.theme import _listContent +from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType, nwTheme +from novelwriter.gui.theme import ( + STYLES_BIG_TOOLBUTTON, STYLES_FLAT_TABS, STYLES_MIN_TOOLBUTTON, GuiTheme, + ThemeMeta, _listContent +) from tests.mocked import causeOSError -from tests.tools import writeFile @pytest.mark.gui -def testGuiTheme_Main(qtbot, nwGUI, tstPaths): - """Test the theme class init.""" - theme = SHARED.theme - - # Methods - # ======= - - mSize = theme.getTextWidth("m") - assert mSize > 0 - assert theme.getTextWidth("m", theme.guiFont) == mSize - - # Scan for Themes - # =============== - - result = [] - _listContent(result, Path("not_a_path"), ".conf") - assert result == [] - - themeOne = tstPaths.cnfDir / "themes" / "themeone.conf" - themeTwo = tstPaths.cnfDir / "themes" / "themetwo.conf" - writeFile(themeOne, "# Stuff") - writeFile(themeTwo, "# Stuff") - - _listContent(result, tstPaths.cnfDir / "themes", ".conf") - assert result == [themeOne, themeTwo] - - # Parse Colours - # ============= - - parser = ConfigParser() - parser["Palette"] = { - "colour1": "100, 150, 200", # Valid - "colour2": "100, 150, 200, 250", # With alpha - "colour3": "100, 150, 200, 250, 300", # Too many values - "colour4": "250, 250", # Missing blue - "colour5": "-10, 127, 300", # Invalid red and blue - "colour6": "bob, 127, 255", # Invalid red - } - - # Test the parser for several valid and invalid values - assert theme._readColor(parser, "Palette", "colour1").getRgb() == (100, 150, 200, 255) - assert theme._readColor(parser, "Palette", "colour2").getRgb() == (100, 150, 200, 250) - assert theme._readColor(parser, "Palette", "colour3").getRgb() == (100, 150, 200, 250) - assert theme._readColor(parser, "Palette", "colour4").getRgb() == (250, 250, 0, 255) - assert theme._readColor(parser, "Palette", "colour5").getRgb() == (0, 0, 0, 0) - assert theme._readColor(parser, "Palette", "colour6").getRgb() == (0, 127, 255, 255) - - # The palette should load with the parsed values - theme._setPalette(parser, "Palette", "colour1", QPalette.ColorRole.Window) - assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (100, 150, 200, 255) - theme._setPalette(parser, "Palette", "colour2", QPalette.ColorRole.Window) - assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (100, 150, 200, 250) - theme._setPalette(parser, "Palette", "colour3", QPalette.ColorRole.Window) - assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (100, 150, 200, 250) - theme._setPalette(parser, "Palette", "colour4", QPalette.ColorRole.Window) - assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (250, 250, 0, 255) - theme._setPalette(parser, "Palette", "colour5", QPalette.ColorRole.Window) - assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (0, 0, 0, 0) - theme._setPalette(parser, "Palette", "colour6", QPalette.ColorRole.Window) - assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (0, 127, 255, 255) - - # Non-existing value should return default colour - theme._setBaseColor("default", QColor(64, 64, 64, 255)) - theme._setPalette(parser, "Palette", "stuff", QPalette.ColorRole.Window) - assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == (64, 64, 64, 255) - - # qtbot.stop() - - -@pytest.mark.gui -def testGuiTheme_ParseColor(qtbot, nwGUI): +def testGuiTheme_ParseColor(): """Test the colour parsing.""" - theme = SHARED.theme + theme = GuiTheme() # Pre-Populate theme._qColors["red"] = QColor(255, 0, 0) @@ -144,258 +76,333 @@ def testGuiTheme_ParseColor(qtbot, nwGUI): @pytest.mark.gui -@pytest.mark.skip -def testGuiTheme_Theme(qtbot, monkeypatch, nwGUI, tstPaths): - """Test the theme part of the class.""" - theme = SHARED.theme +def testGuiTheme_ScanThemes(monkeypatch): + """Test the themes scanning.""" + theme = GuiTheme() - # List Themes + # Load built-in themes + files = [] + _listContent(files, CONFIG.assetPath("themes"), ".conf") + assert len(files) > 0 + + # Block reading theme files + with monkeypatch.context() as mp: + mp.setattr(ConfigParser, "read", causeOSError) + theme._scanThemes(files) + assert theme.colourThemes == {} + + # Read all themes correctly + theme._scanThemes(files) + assert len(theme.colourThemes) > 0 + + dark = theme.colourThemes[DEF_GUI_DARK] + light = theme.colourThemes[DEF_GUI_LIGHT] + + assert dark.name == "Default Dark Theme" + assert dark.dark is True + assert light.name == "Default Light Theme" + assert light.dark is False + + +@pytest.mark.gui +def testGuiTheme_LoadThemes(monkeypatch): + """Test loading themes.""" + theme = GuiTheme() + theme.iconCache = MagicMock() + CONFIG.lightTheme = DEF_GUI_LIGHT + CONFIG.darkTheme = DEF_GUI_DARK + + # Load built-in themes + files = [] + _listContent(files, CONFIG.assetPath("themes"), ".conf") + theme._scanThemes(files) + assert DEF_GUI_LIGHT in theme._allThemes + assert DEF_GUI_DARK in theme._allThemes + assert theme._currentTheme == "" + + # Load light theme + CONFIG.themeMode = nwTheme.LIGHT + theme.loadTheme() + assert theme._currentTheme == DEF_GUI_LIGHT + + # Load dark theme + CONFIG.themeMode = nwTheme.DARK + theme.loadTheme() + assert theme._currentTheme == DEF_GUI_DARK + + # Let auto switch back to light, then dark + with monkeypatch.context() as mp: + mp.setattr(CONFIG, "verQtValue", 0x060500) + mp.setattr(QStyleHints, "colorScheme", lambda *a: Qt.ColorScheme.Light) + CONFIG.themeMode = nwTheme.AUTO + theme.loadTheme() + assert theme._currentTheme == DEF_GUI_LIGHT + + with monkeypatch.context() as mp: + mp.setattr(CONFIG, "verQtValue", 0x060500) + mp.setattr(QStyleHints, "colorScheme", lambda *a: Qt.ColorScheme.Dark) + CONFIG.themeMode = nwTheme.AUTO + theme.loadTheme() + assert theme._currentTheme == DEF_GUI_DARK + + # Error Cases # =========== - # Block the reading of the files + # Invalid light theme + CONFIG.lightTheme = "not_a_theme" + CONFIG.themeMode = nwTheme.LIGHT + theme.loadTheme() + assert theme._currentTheme == DEF_GUI_LIGHT + + # Invalid dark theme + CONFIG.darkTheme = "not_a_theme" + CONFIG.themeMode = nwTheme.DARK + theme.loadTheme() + assert theme._currentTheme == DEF_GUI_DARK + + # Clear meta and check exit early cases + theme._meta = ThemeMeta() + assert theme._meta.name == "" + + # Reload dark should not load anything + CONFIG.darkTheme = DEF_GUI_DARK + CONFIG.themeMode = nwTheme.DARK + theme.loadTheme() + assert theme._meta.name == "" + + # Force reload, but fail parsing with monkeypatch.context() as mp: - mp.setattr("builtins.open", causeOSError) - theme._themeList = [] - assert theme.getColourThemes() == [] + mp.setattr(ConfigParser, "read", causeOSError) + CONFIG.darkTheme = DEF_GUI_DARK + CONFIG.themeMode = nwTheme.DARK + theme.loadTheme(force=True) + assert theme._meta.name == "" - # Load the theme info, default themes first - themesList = theme.getColourThemes() - assert themesList[0] == ("default_dark", "Default Dark Theme") - assert themesList[1] == ("default_light", "Default Light Theme") - assert themesList[2] == ("cyberpunk_night", "Cyberpunk Night") - assert themesList[3] == ("dracula", "Dracula") + # Invalid theme, and defaults are missing + del theme._allThemes[DEF_GUI_DARK] + del theme._allThemes[DEF_GUI_LIGHT] - # A second call should returned the cached list - assert theme.getColourThemes() == theme._themeList + CONFIG.lightTheme = "not_a_theme" + CONFIG.themeMode = nwTheme.LIGHT + theme.loadTheme(force=True) + assert theme._meta.name == "" - # Check handling of broken theme settings - CONFIG.guiTheme = "not_a_theme" - availThemes = theme._availThemes - theme._availThemes = {} - assert theme.loadTheme() is False - theme._availThemes = availThemes + CONFIG.darkTheme = "not_a_theme" + CONFIG.themeMode = nwTheme.DARK + theme.loadTheme(force=True) + assert theme._meta.name == "" - # Check handling of unreadable file - CONFIG.guiTheme = DEF_GUI_LIGHT - with monkeypatch.context() as mp: - mp.setattr("builtins.open", causeOSError) - assert theme.loadTheme() is False - # Load Default Theme - # ================== +@pytest.mark.gui +def testGuiTheme_SpecialColors(tstPaths): + """Test handling special cases for colours.""" + theme = GuiTheme() + theme.iconCache = MagicMock() - if sys.platform != "win32": - # Set a mock colour for the window background - theme._guiPalette.color(QPalette.ColorRole.Window).setRgb(0, 0, 0, 0) - - # Load the default theme - CONFIG.guiTheme = DEF_GUI_LIGHT - assert theme.loadTheme() is True - - # This should load a standard palette - wCol = QPalette().color(QPalette.ColorRole.Window).getRgb() - assert theme._guiPalette.color(QPalette.ColorRole.Window).getRgb() == wCol - - # Mock Dark Theme - # =============== - - mockTheme: Path = tstPaths.cnfDir / "themes" / "test.conf" - mockTheme.write_text( + testTheme: Path = tstPaths.cnfDir / "themes" / "test.conf" + testTheme.write_text( "[Main]\n" "name = Test\n" + "mode = light\n" + "\n" + "[Base]\n" + "default = #cccccc\n" + "faded = #949494\n" + "red = #ff0000\n" + "orange = #ff7f00\n" + "yellow = #ffff00\n" + "green = #00ff00\n" + "cyan = #00ffff\n" + "blue = #0000ff\n" + "purple = #ff00ff\n" + "\n" + "[Project]\n" + "root = blue\n" + "folder = yellow\n" + "file = default\n" + "title = green\n" + "chapter = red\n" + "scene = blue\n" + "note = yellow\n" "\n" "[Palette]\n" - "window = 0, 0, 0\n" - "text = 255, 255, 255\n" + "window = #000000\n" + "text = #ffffff\n" ) - theme._availThemes["test"] = mockTheme + theme._scanThemes([testTheme]) + assert len(theme.colourThemes) == 1 + CONFIG.themeMode = nwTheme.LIGHT + CONFIG.lightTheme = "test" - CONFIG.guiTheme = "test" - assert theme.loadTheme() is True - assert theme._guiPalette.window().color().getRgb() == (0, 0, 0, 255) - assert theme._guiPalette.text().color().getRgb() == (255, 255, 255, 255) + # Load theme + theme.loadTheme() + + # Since window is black, a lighter version should be generated assert theme._guiPalette.light().color().getRgb() == (57, 57, 57, 255) - assert theme.isDarkTheme is True - # Load Default Light Theme - # ======================== + # Reload with project override to red + CONFIG.iconColTree = "red" + CONFIG.iconColDocs = True + theme.loadTheme(force=True) - CONFIG.guiTheme = "default_light" - assert theme.loadTheme() is True + assert theme.getBaseColor("root").getRgb() == (255, 0, 0, 255) + assert theme.getBaseColor("folder").getRgb() == (255, 0, 0, 255) + assert theme.getBaseColor("file").getRgb() == (204, 204, 204, 255) + assert theme.getBaseColor("title").getRgb() == (0, 255, 0, 255) + assert theme.getBaseColor("chapter").getRgb() == (255, 0, 0, 255) + assert theme.getBaseColor("scene").getRgb() == (0, 0, 255, 255) + assert theme.getBaseColor("note").getRgb() == (255, 255, 0, 255) - # Check a few values - assert theme._guiPalette.color( - QPalette.ColorRole.Window - ).getRgb() == (239, 239, 239, 255) - assert theme._guiPalette.color( - QPalette.ColorRole.WindowText - ).getRgb() == (0, 0, 0, 255) - assert theme._guiPalette.color( - QPalette.ColorRole.Base - ).getRgb() == (255, 255, 255, 255) - assert theme._guiPalette.color( - QPalette.ColorRole.AlternateBase - ).getRgb() == (224, 224, 224, 255) - - # Load Default Dark Theme - # ======================= - - CONFIG.guiTheme = "default_dark" - assert theme.loadTheme() is True - - # Check a few values - assert theme._guiPalette.color( - QPalette.ColorRole.Window).getRgb() == (54, 54, 54, 255) - assert theme._guiPalette.color( - QPalette.ColorRole.WindowText).getRgb() == (204, 204, 204, 255) - assert theme._guiPalette.color( - QPalette.ColorRole.Base).getRgb() == (62, 62, 62, 255) - assert theme._guiPalette.color( - QPalette.ColorRole.AlternateBase).getRgb() == (78, 78, 78, 255) - - # qtbot.stop() - - -@pytest.mark.skip -@pytest.mark.gui -def testGuiTheme_Syntax(qtbot, monkeypatch, nwGUI): - """Test the syntax part of the class.""" - mainTheme = SHARED.theme - - # List Themes - # =========== - - # Block the reading of the files - with monkeypatch.context() as mp: - mp.setattr("builtins.open", causeOSError) - assert mainTheme.listThemes() == [] - - # Load the syntax info - syntaxList = mainTheme.listSyntax() - assert syntaxList[0] == ("default_dark", "Default Dark") - assert syntaxList[1] == ("default_light", "Default Light") - - # A second call should returned the cached list - assert mainTheme.listSyntax() == mainTheme._syntaxList - - # Check handling of broken theme settings - availSyntax = mainTheme._availSyntax - mainTheme._availSyntax = {} - CONFIG.guiSyntax = "not_a_syntax" - assert mainTheme.loadSyntax() is False - mainTheme._availSyntax = availSyntax - - # Check handling of unreadable file - CONFIG.guiSyntax = "default_light" - with monkeypatch.context() as mp: - mp.setattr("builtins.open", causeOSError) - assert mainTheme.loadSyntax() is False - - # Load Default Light Syntax - # ========================= - - # Load the default syntax - CONFIG.guiSyntax = "default_light" - assert mainTheme.loadSyntax() is True - - # Check some values - assert mainTheme.syntaxMeta.name == "Default Light" - assert mainTheme.syntaxTheme.back == QColor(255, 255, 255) - assert mainTheme.syntaxTheme.text == QColor(0, 0, 0) - assert mainTheme.syntaxTheme.link == QColor(0, 0, 200) - - # Load Default Dark Theme - # ======================= - - # Load the default syntax - CONFIG.guiSyntax = "default_dark" - assert mainTheme.loadSyntax() is True - - # Check some values - assert mainTheme.syntaxMeta.name == "Default Dark" - assert mainTheme.syntaxTheme.back == QColor(42, 42, 42) - assert mainTheme.syntaxTheme.text == QColor(204, 204, 204) - assert mainTheme.syntaxTheme.link == QColor(102, 153, 204) - - # qtbot.stop() - - -@pytest.mark.skip -@pytest.mark.gui -def testGuiTheme_IconThemes(qtbot, caplog, monkeypatch, nwGUI, tstPaths): - """Test the icon cache class.""" - iconCache = SHARED.theme.iconCache - - # Load Theme - # ========== - - # Invalid theme name - availThemes = iconCache._availThemes - iconCache._availThemes = {} - assert iconCache.loadTheme("not_a_theme") is False - iconCache._availThemes = availThemes - - # Check handling of unreadable file - with monkeypatch.context() as mp: - mp.setattr("builtins.open", causeOSError) - assert iconCache.loadTheme("material_rounded_normal") is False - - # Load working theme file - assert iconCache.loadTheme("material_rounded_normal") is True - assert iconCache.themeMeta.name == "Material Symbols - Rounded Medium" - - # Load with project colour override - purple = iconCache._svgColors["purple"] - assert iconCache._svgColors["root"] != purple - assert iconCache._svgColors["folder"] != purple - assert iconCache._svgColors["file"] != purple - assert iconCache._svgColors["title"] != purple - assert iconCache._svgColors["chapter"] != purple - assert iconCache._svgColors["scene"] != purple - assert iconCache._svgColors["note"] != purple + assert theme.getRawBaseColor("root") == b"#ff0000" + assert theme.getRawBaseColor("folder") == b"#ff0000" + assert theme.getRawBaseColor("file") == b"#cccccc" + assert theme.getRawBaseColor("title") == b"#00ff00" + assert theme.getRawBaseColor("chapter") == b"#ff0000" + assert theme.getRawBaseColor("scene") == b"#0000ff" + assert theme.getRawBaseColor("note") == b"#ffff00" + # Reload with project override to purple, also for docs CONFIG.iconColTree = "purple" - assert iconCache.loadTheme("material_rounded_normal") is True - assert iconCache._svgColors["root"] == purple - assert iconCache._svgColors["folder"] == purple - assert iconCache._svgColors["file"] == purple - assert iconCache._svgColors["title"] == purple - assert iconCache._svgColors["chapter"] == purple - assert iconCache._svgColors["scene"] == purple - assert iconCache._svgColors["note"] == purple + CONFIG.iconColDocs = False + theme.loadTheme(force=True) - # Change some colours - iconCache.setIconColor("root", QColor(255, 255, 255)) - assert iconCache._svgColors["root"] != purple - assert iconCache._svgColors["root"] == b"#ffffff" + assert theme.getBaseColor("root").getRgb() == (255, 0, 255, 255) + assert theme.getBaseColor("folder").getRgb() == (255, 0, 255, 255) + assert theme.getBaseColor("file").getRgb() == (255, 0, 255, 255) + assert theme.getBaseColor("title").getRgb() == (255, 0, 255, 255) + assert theme.getBaseColor("chapter").getRgb() == (255, 0, 255, 255) + assert theme.getBaseColor("scene").getRgb() == (255, 0, 255, 255) + assert theme.getBaseColor("note").getRgb() == (255, 0, 255, 255) - # List Themes - # =========== - - # Load error returns empty list - with monkeypatch.context() as mp: - mp.setattr("builtins.open", causeOSError) - themes = iconCache.getIconThemes() - assert themes == [] - - # Successful read - themes = iconCache.getIconThemes() - assert len(themes) > 1 - assert "material_rounded_normal" in dict(themes) - - # Load error doesn't matter on second read since list is cached - with monkeypatch.context() as mp: - mp.setattr("builtins.open", causeOSError) - assert iconCache.getIconThemes() == themes - - # qtbot.stop() + assert theme.getRawBaseColor("root") == b"#ff00ff" + assert theme.getRawBaseColor("folder") == b"#ff00ff" + assert theme.getRawBaseColor("file") == b"#ff00ff" + assert theme.getRawBaseColor("title") == b"#ff00ff" + assert theme.getRawBaseColor("chapter") == b"#ff00ff" + assert theme.getRawBaseColor("scene") == b"#ff00ff" + assert theme.getRawBaseColor("note") == b"#ff00ff" @pytest.mark.gui -def testGuiTheme_LoadIcons(qtbot, nwGUI): +def testGuiTheme_Methods(monkeypatch): + """Test other themes methods.""" + theme = GuiTheme() + theme.iconCache = MagicMock() + CONFIG.darkTheme = DEF_GUI_DARK + CONFIG.themeMode = nwTheme.DARK + + # Init theme + assert theme.colourThemes == {} + theme.initThemes() + assert theme._meta.name == "Default Dark Theme" + + # Text width + theme.guiFont = QFontDatabase.systemFont(QFontDatabase.SystemFont.GeneralFont) + assert theme.getTextWidth("MMMMM") > theme.getTextWidth("MMM") + font = QFont(theme.guiFont) + font.setPointSizeF(0.5*font.pointSizeF()) + assert theme.getTextWidth("MMMMM", font) < theme.getTextWidth("MMMMM") + + # Detect desktop mode Qt 6.5+ + with monkeypatch.context() as mp: + mp.setattr(CONFIG, "verQtValue", 0x060500) + + mp.setattr(QStyleHints, "colorScheme", lambda *a: Qt.ColorScheme.Light) + assert theme.isDesktopDarkMode() is False + + mp.setattr(QStyleHints, "colorScheme", lambda *a: Qt.ColorScheme.Dark) + assert theme.isDesktopDarkMode() is True + + # Detect desktop mode Qt 6.4 + mockWhite = Mock() + mockWhite.color.return_value = QColor(255, 255, 255) + + mockBlack = Mock() + mockBlack.color.return_value = QColor(0, 0, 0) + + with monkeypatch.context() as mp: + mp.setattr(CONFIG, "verQtValue", 0x060400) + + mp.setattr(QPalette, "window", lambda *a: mockWhite) + mp.setattr(QPalette, "windowText", lambda *a: mockBlack) + assert theme.isDesktopDarkMode() is False + + mp.setattr(QPalette, "window", lambda *a: mockBlack) + mp.setattr(QPalette, "windowText", lambda *a: mockWhite) + assert theme.isDesktopDarkMode() is True + + # Stylesheets + assert theme.getStyleSheet(STYLES_FLAT_TABS) != "" + assert theme.getStyleSheet(STYLES_MIN_TOOLBUTTON) != "" + assert theme.getStyleSheet(STYLES_BIG_TOOLBUTTON) != "" + assert theme.getStyleSheet("stuff") == "" + + +@pytest.mark.gui +def testGuiTheme_ScanIcons(monkeypatch): + """Test the icon theme scanning.""" + theme = GuiTheme() + + # Load built-in themes + files = [] + _listContent(files, CONFIG.assetPath("icons"), ".icons") + assert len(files) > 0 + + # Block reading theme files + with monkeypatch.context() as mp: + mp.setattr("builtins.open", causeOSError) + theme.iconCache._scanThemes(files) + assert theme.iconCache.iconThemes == {} + + # Read all themes correctly + theme.iconCache._scanThemes(files) + assert len(theme.iconCache.iconThemes) > 0 + + +@pytest.mark.gui +def testGuiTheme_IconThemes(monkeypatch): + """Test loading icon theme.""" + CONFIG.lightTheme = DEF_GUI_LIGHT + CONFIG.themeMode = nwTheme.LIGHT + CONFIG.iconTheme = DEF_ICONS + + theme = GuiTheme() + + # Init should load default theme + theme.initThemes() + assert theme.iconCache._meta.name == "Material Symbols - Rounded Medium" + assert DEF_ICONS in theme.iconCache.iconThemes + + # Load default theme directly + theme.iconCache._meta = ThemeMeta() + theme.iconCache.loadTheme("DEF_ICONS") + assert theme.iconCache._meta.name == "Material Symbols - Rounded Medium" + + # Failed loading should load nothing + theme.iconCache._meta = ThemeMeta() + with monkeypatch.context() as mp: + mp.setattr("builtins.open", causeOSError) + theme.iconCache.loadTheme("DEF_ICONS") + assert theme.iconCache._meta.name == "" + + # Reload with non-existent theme should reload default + theme.iconCache._meta = ThemeMeta() + theme.iconCache.loadTheme("not_a_theme") + assert theme.iconCache._meta.name == "Material Symbols - Rounded Medium" + + # If default theme is missing, load nothing + del theme.iconCache._allThemes[DEF_ICONS] + theme.iconCache._meta = ThemeMeta() + theme.iconCache.loadTheme("not_a_theme") + assert theme.iconCache._meta.name == "" + + +@pytest.mark.gui +def testGuiTheme_LoadIcons(): """Test the icon cache class.""" - iconCache = SHARED.theme.iconCache - assert iconCache.loadTheme("material_rounded_normal") is True + theme = GuiTheme() + theme.initThemes() + iconCache = theme.iconCache # Load Icons # ========== @@ -493,14 +500,13 @@ def testGuiTheme_LoadIcons(qtbot, nwGUI): nwItemType.NO_TYPE, nwItemClass.NOVEL, nwItemLayout.DOCUMENT, hLevel="H0" ) == iconCache._noIcon - # qtbot.stop() - @pytest.mark.gui -def testGuiTheme_LoadDecorations(qtbot, monkeypatch, nwGUI): +def testGuiTheme_LoadDecorations(monkeypatch): """Test the icon cache class.""" - iconCache = SHARED.theme.iconCache - assert iconCache.loadTheme("material_rounded_normal") is True + theme = GuiTheme() + theme.initThemes() + iconCache = theme.iconCache # Load Decorations # ================ @@ -557,5 +563,3 @@ def testGuiTheme_LoadDecorations(qtbot, monkeypatch, nwGUI): assert iconCache.getHeaderDecorationNarrow(4) == iconCache._headerDecNarrow[4] assert iconCache.getHeaderDecorationNarrow(5) == iconCache._headerDecNarrow[5] assert iconCache.getHeaderDecorationNarrow(6) == iconCache._headerDecNarrow[5] - - # qtbot.stop() From 334f946870d491d9068f3282dfec4722a020f007 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 3 Jun 2025 22:47:17 +0200 Subject: [PATCH 22/96] Add remaining missing coverage and revert loadTheme return type --- novelwriter/gui/theme.py | 14 ++++++++------ tests/test_base/test_base_common.py | 6 ++++++ tests/test_gui/test_gui_guimain.py | 25 ++++++++++++++++++++----- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 5c7533ae..4ab4f7d8 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -270,8 +270,10 @@ class GuiTheme: return QColor(*result) return default - def loadTheme(self, force: bool = False) -> None: - """Load the currently specified GUI theme.""" + def loadTheme(self, force: bool = False) -> bool: + """Load the currently specified GUI theme. The boolean return + can be used to determine if the GUI needs refreshing. + """ match CONFIG.themeMode: case nwTheme.LIGHT: darkMode = False @@ -292,12 +294,12 @@ class GuiTheme: if theme == self._currentTheme and not force: logger.info("Theme '%s' is already loaded", theme) - return + return False entry = self._allThemes.get(theme) if not entry: logger.error("Could not load GUI theme") - return + return False CONFIG.splashMessage(f"Loading colour theme: {entry.name}") logger.info("Loading GUI theme '%s'", theme) @@ -307,7 +309,7 @@ class GuiTheme: except Exception: logger.error("Could not read file: %s", entry.path) logException() - return + return False # Reset Palette self._resetTheme() @@ -477,7 +479,7 @@ class GuiTheme: QApplication.setPalette(self._guiPalette) self._buildStyleSheets(self._guiPalette) - return + return True def getStyleSheet(self, name: str) -> str: """Load a standard style sheet.""" diff --git a/tests/test_base/test_base_common.py b/tests/test_base/test_base_common.py index 006daa42..ef16baaa 100644 --- a/tests/test_base/test_base_common.py +++ b/tests/test_base/test_base_common.py @@ -41,6 +41,7 @@ from novelwriter.common import ( readTextFile, simplified, transferCase, uniqueCompact, xmlElement, xmlIndent, xmlSubElem, yesNo ) +from novelwriter.enum import nwItemClass from tests.mocked import causeOSError from tests.tools import writeFile @@ -804,6 +805,7 @@ def testBaseCommon_NWConfigParser(fncPath): "list1 = a, b, c\n" "list2 = 17, 18, 19\n" "float1 = 4.2\n" + "enum1 = NOVEL\n" f"path1 = {fncPath}\n" )) @@ -875,3 +877,7 @@ def testBaseCommon_NWConfigParser(fncPath): assert cfgParser.rdIntList("nope", "list2", [1]) == [1] assert cfgParser.rdIntList("main", "blabla", [1]) == [1] + + # Read Enum + assert cfgParser.rdEnum("main", "enum1", nwItemClass.NO_CLASS) == nwItemClass.NOVEL + assert cfgParser.rdEnum("main", "blabla", nwItemClass.NO_CLASS) == nwItemClass.NO_CLASS diff --git a/tests/test_gui/test_gui_guimain.py b/tests/test_gui/test_gui_guimain.py index 91207d09..5010094d 100644 --- a/tests/test_gui/test_gui_guimain.py +++ b/tests/test_gui/test_gui_guimain.py @@ -24,6 +24,7 @@ import shutil from pathlib import Path from shutil import copyfile +from unittest.mock import Mock import pytest @@ -32,6 +33,7 @@ from PyQt6.QtGui import QPalette from PyQt6.QtWidgets import QInputDialog, QMessageBox from novelwriter import CONFIG, SHARED +from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT from novelwriter.constants import nwFiles from novelwriter.dialogs.editlabel import GuiEditLabel from novelwriter.enum import nwDocAction, nwDocMode, nwFocus, nwItemType, nwTheme, nwView @@ -179,22 +181,35 @@ def testGuiMain_ProjectTreeItems(qtbot, monkeypatch, nwGUI, projPath, mockRnd): @pytest.mark.gui def testGuiMain_UpdateTheme(qtbot, nwGUI): """Test updating the theme in the GUI.""" - mainTheme = SHARED.theme + theme = SHARED.theme CONFIG.themeMode = nwTheme.DARK - CONFIG.darkTheme = "default_dark" - CONFIG.lightTheme = "default_light" - mainTheme.loadTheme() + CONFIG.darkTheme = DEF_GUI_DARK + CONFIG.lightTheme = DEF_GUI_LIGHT + theme.loadTheme() + assert theme.isDarkTheme is True nwGUI._processConfigChanges(False, True, False, False) nwGUI._processConfigChanges(True, True, True, True) + # Check editor syntax syntax = SHARED.theme.syntaxTheme - assert nwGUI.docEditor.palette().color(QPalette.ColorRole.Window) == syntax.back assert nwGUI.docEditor.docHeader.palette().color(QPalette.ColorRole.Window) == syntax.back assert nwGUI.docViewer.palette().color(QPalette.ColorRole.Window) == syntax.back assert nwGUI.docViewer.docHeader.palette().color(QPalette.ColorRole.Window) == syntax.back + # Update by check + CONFIG.themeMode = nwTheme.LIGHT + nwGUI.checkThemeUpdate() + assert theme.isDarkTheme is False + + # Through change event + event = Mock() + event.type.return_value = 210 + CONFIG.themeMode = nwTheme.DARK + nwGUI.changeEvent(event) + assert theme.isDarkTheme is True + # qtbot.stop() From 492294163cb8134fd50d5ba5ae1c146f0f5041b2 Mon Sep 17 00:00:00 2001 From: Myian <60368695+HeyMyian@users.noreply.github.com> Date: Tue, 3 Jun 2025 23:23:09 +0200 Subject: [PATCH 23/96] Add Primer Dark theme Adds the Primer Dark theme based on the GitHub/Primer colors. --- novelwriter/assets/themes/primer_dark.conf | 71 ++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 novelwriter/assets/themes/primer_dark.conf diff --git a/novelwriter/assets/themes/primer_dark.conf b/novelwriter/assets/themes/primer_dark.conf new file mode 100644 index 00000000..d8d334c0 --- /dev/null +++ b/novelwriter/assets/themes/primer_dark.conf @@ -0,0 +1,71 @@ +[Main] +name = Primer Dark +mode = dark +author = Myian (adaptation) +credit = GitHub Inc. +url = https://github.com/primer +license = MIT License +licenseurl = https://github.com/primer/brand/blob/main/LICENSE + +[Base] +default = #f0f6fc +faded = #a3b0be +red = #ff7b72 +orange = #ffa657 +yellow = #f8e3a1 +green = #7ee787 +cyan = #57CCC5 +blue = #79c0ff +purple = #bc8cff + +[Project] +root = purple +folder = orange +file = default +title = green +chapter = red +scene = blue +note = yellow + +[Palette] +window = #141b23 +windowtext = default +base = #0c1117 +alternatebase = #1e242a +text = default +tooltipbase = yellow +tooltiptext = #0c1117 +button = #212830 +buttontext = default +brighttext = default +highlight = #104C35 +highlightedtext = default +link = blue +linkvisited = blue + +[GUI] +helptext = faded +fadedtext = faded:128 +errortext = #f85149 + +[Syntax] +background = #0c1117 +text = faded +link = blue +headertext = default +headertag = faded +emphasis = #97ee9e +dialog = default +altdialog = default +note = yellow +hidden = faded:128 +shortcode = #ff9bce +keyword = #4493f8 +tag = blue +value = #ffc680 +optional = #a5d6ff +spellcheckline = #f85149 +errorline = cyan +replacetag = purple +modifier = orange +texthighlight = faded:32 From d850d901e911e4686a762572ffb74431aab93b3e Mon Sep 17 00:00:00 2001 From: Myian <60368695+HeyMyian@users.noreply.github.com> Date: Wed, 4 Jun 2025 11:28:05 +0200 Subject: [PATCH 24/96] Add Primer Light theme Adds the Primer Light theme based on the GitHub/Primer colors. --- novelwriter/assets/themes/primer_light.conf | 71 +++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 novelwriter/assets/themes/primer_light.conf diff --git a/novelwriter/assets/themes/primer_light.conf b/novelwriter/assets/themes/primer_light.conf new file mode 100644 index 00000000..3b6ba897 --- /dev/null +++ b/novelwriter/assets/themes/primer_light.conf @@ -0,0 +1,71 @@ +[Main] +name = Primer Light +mode = light +author = Myian (adaptation) +credit = GitHub Inc. +url = https://github.com/primer +license = MIT License +licenseurl = https://github.com/primer/brand/blob/main/LICENSE + +[Base] +default = #1f2328 +faded = #59636e +red = #fa4549 +orange = #e16f24 +yellow = #d4a72c +green = #2da44e +cyan = #339D9B +blue = #0969da +purple = #a475f9 + +[Project] +root = purple +folder = orange +file = faded +title = green +chapter = red +scene = blue +note = yellow + +[Palette] +window = #eaeef2 +windowtext = default +base = #ffffff +alternatebase = #dfe4e9 +text = default +tooltipbase = #fae17d +tooltiptext = #0c1117 +button = #f6f8fa +buttontext = default +brighttext = faded +highlight = #dafbe1 +highlightedtext = #1a7f37 +link = blue +linkvisited = blue + +[GUI] +helptext = faded +fadedtext = faded:128 +errortext = #cf222e + +[Syntax] +background = #ffffff +text = faded +link = blue +headertext = default +headertag = faded:128 +emphasis = green +dialog = default +altdialog = default +note = #d4a72c +hidden = faded:128 +shortcode = #e85aad +keyword = blue +tag = #218bff +value = #fb8f44 +optional = #54aeff +spellcheckline = #cf222e +errorline = cyan +replacetag = purple +modifier = orange +texthighlight = faded:32 From 92f68dfd5850acfb393be91dbc8aa09d7f4d92ea Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 4 Jun 2025 15:05:22 +0200 Subject: [PATCH 25/96] Add tests for the theme and icons files --- tests/files/all_icons.json | 114 +++++++++++++++++++++++++++++++ tests/test_gui/test_gui_theme.py | 113 ++++++++++++++++++++++++++++++ utils/icon_themes.py | 1 + 3 files changed, 228 insertions(+) create mode 100644 tests/files/all_icons.json diff --git a/tests/files/all_icons.json b/tests/files/all_icons.json new file mode 100644 index 00000000..3d85f818 --- /dev/null +++ b/tests/files/all_icons.json @@ -0,0 +1,114 @@ +[ + "alert_error", + "alert_info", + "alert_question", + "alert_warn", + + "cls_archive", + "cls_character", + "cls_custom", + "cls_entity", + "cls_none", + "cls_novel", + "cls_object", + "cls_plot", + "cls_template", + "cls_timeline", + "cls_trash", + "cls_world", + + "prj_folder", + "prj_document", + "prj_title", + "prj_chapter", + "prj_scene", + "prj_note", + + "fmt_bold", + "fmt_italic", + "fmt_mark", + "fmt_strike", + "fmt_subscript", + "fmt_superscript", + "fmt_underline", + "fmt_toolbar", + + "search", + "search_cancel", + "search_case", + "search_loop", + "search_preserve", + "search_project", + "search_regex", + "search_replace", + "search_word", + + "bullet-off", + "bullet-on", + "unfold-hide", + "unfold-show", + + "sb_build", + "sb_details", + "sb_novel", + "sb_outline", + "sb_project", + "sb_search", + "sb_stats", + + "theme_light", + "theme_dark", + "theme_auto", + + "add", + "bookmarks", + "browse", + "build_settings", + "cancel", + "checked", + "chevron_down", + "chevron_left", + "chevron_right", + "chevron_up", + "close", + "copy", + "document_add", + "document", + "edit", + "exclude", + "export", + "filter", + "fit_height", + "fit_width", + "folder", + "font", + "import", + "language", + "lines", + "list", + "margin_bottom", + "margin_left", + "margin_right", + "margin_top", + "maximise", + "minimise", + "more_arrow", + "more_vertical", + "noncheckable", + "open", + "panel", + "pin", + "project_copy", + "quote", + "refresh", + "remove", + "revert", + "settings", + "star", + "stats", + "text", + "timer_off", + "timer", + "unchecked", + "view" +] diff --git a/tests/test_gui/test_gui_theme.py b/tests/test_gui/test_gui_theme.py index 107fd125..d14304d1 100644 --- a/tests/test_gui/test_gui_theme.py +++ b/tests/test_gui/test_gui_theme.py @@ -20,6 +20,8 @@ along with this program. If not, see . """ from __future__ import annotations +import json + from configparser import ConfigParser from pathlib import Path from unittest.mock import MagicMock, Mock @@ -563,3 +565,114 @@ def testGuiTheme_LoadDecorations(monkeypatch): assert iconCache.getHeaderDecorationNarrow(4) == iconCache._headerDecNarrow[4] assert iconCache.getHeaderDecorationNarrow(5) == iconCache._headerDecNarrow[5] assert iconCache.getHeaderDecorationNarrow(6) == iconCache._headerDecNarrow[5] + + +THEMES = [] +_listContent(THEMES, CONFIG.assetPath("themes"), ".conf") + + +@pytest.mark.gui +@pytest.mark.parametrize("theme", [a.stem for a in THEMES]) +def testGuiTheme_CheckTheme(theme): + """Test loading all themes.""" + themes = GuiTheme() + themes.iconCache = MagicMock() + themes._scanThemes(THEMES) + + assert theme in themes.colourThemes + current = themes.colourThemes[theme] + if current.dark: + CONFIG.darkTheme = theme + CONFIG.themeMode = nwTheme.DARK + else: + CONFIG.lightTheme = theme + CONFIG.themeMode = nwTheme.LIGHT + + # Check loading + themes.loadTheme() + assert themes._meta.name == current.name + assert themes.isDarkTheme == current.dark + + # Check completeness + parser = ConfigParser() + parser.read(current.path, encoding="utf-8") + + sections = ["Main", "Base", "Project", "Palette", "GUI", "Syntax"] + assert sorted(parser.sections()) == sorted(sections) + + structure = { + "Main": [ + "name", "mode", # The rest are not required + ], + "Base": [ + "default", "faded", "red", "orange", "yellow", "green", "cyan", + "blue", "purple", + ], + "Project": [ + "root", "folder", "file", "title", "chapter", "scene", "note", + ], + "Palette": [ + "window", "windowtext", "base", "alternatebase", "text", + "tooltipbase", "tooltiptext", "button", "buttontext", "brighttext", + "highlight", "highlightedtext", "link", "linkvisited", + ], + "GUI": [ + "helptext", "fadedtext", "errortext", + ], + "Syntax": [ + "background", "text", "link", "headertext", "headertag", + "emphasis", "dialog", "altdialog", "hidden", "note", "shortcode", + "keyword", "tag", "value", "optional", "spellcheckline", + "errorline", "replacetag", "modifier", "texthighlight", + ], + } + optional = ["description", "author", "credit", "url", "license", "licenseurl"] + missing = [] + for section, options in structure.items(): + missing.extend(opt for opt in options if opt not in parser[section]) + assert missing == [], "Missing options in theme file" + + # Check deprecated + deprecated = [] + for section in sections: + deprecated.extend( + opt for opt in parser[section] + if opt not in structure[section] and opt not in optional + ) + assert deprecated == [], "Deprecated options in theme file" + + +ICONS = [] +_listContent(ICONS, CONFIG.assetPath("icons"), ".icons") + + +@pytest.mark.gui +@pytest.mark.parametrize("icons", [a.stem for a in ICONS]) +def testGuiTheme_CheckIcons(icons, tstPaths): + """Test loading all icons.""" + keysFile: Path = tstPaths.filesDir / "all_icons.json" + iconKeys = json.loads(keysFile.read_text(encoding="utf-8")) + assert isinstance(iconKeys, list) + + CONFIG.lightTheme = DEF_GUI_LIGHT + CONFIG.themeMode = nwTheme.LIGHT + + themes = GuiTheme() + themes.initThemes() + iconCache = themes.iconCache + + assert icons in iconCache.iconThemes + current = iconCache.iconThemes[icons] + CONFIG.iconTheme = icons + + # Check loading + iconCache.loadTheme(icons) + assert iconCache._meta.name == current.name + + # Check completeness + missing = [key for key in iconKeys if key not in iconCache._svgData] + assert missing == [], "Missing keys in icons file" + + # Check deprecated + deprecated = [key for key in iconCache._svgData if key not in iconKeys] + assert deprecated == [], "Deprecated keys in icons file" diff --git a/utils/icon_themes.py b/utils/icon_themes.py index 752b29e5..acb2e230 100644 --- a/utils/icon_themes.py +++ b/utils/icon_themes.py @@ -33,6 +33,7 @@ from utils.common import ROOT_DIR UTILS = Path(__file__).parent ET.register_namespace("", "http://www.w3.org/2000/svg") ICONS = [ + # Remember to also update tests/files/all_icons.json for test coverage "alert_error", "alert_info", "alert_question", From 320578a61cbfbd9417758a3e3d438708b26c2958 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 4 Jun 2025 15:05:35 +0200 Subject: [PATCH 26/96] Clean up theme files a little --- .../assets/themes/cyberpunk_night.conf | 80 +++++++-------- novelwriter/assets/themes/default_dark.conf | 78 +++++++-------- novelwriter/assets/themes/default_light.conf | 78 +++++++-------- novelwriter/assets/themes/dracula.conf | 84 ++++++++-------- novelwriter/assets/themes/grey_dark.conf | 38 +++---- novelwriter/assets/themes/grey_light.conf | 38 +++---- novelwriter/assets/themes/light_owl.conf | 86 ++++++++-------- novelwriter/assets/themes/night_owl.conf | 86 ++++++++-------- novelwriter/assets/themes/snazzy.conf | 92 ++++++++--------- novelwriter/assets/themes/solarized_dark.conf | 92 ++++++++--------- .../assets/themes/solarized_light.conf | 99 ++++++++++--------- novelwriter/assets/themes/tango_dark.conf | 98 +++++++++--------- novelwriter/assets/themes/tango_light.conf | 98 +++++++++--------- novelwriter/assets/themes/tomorrow.conf | 78 +++++++-------- novelwriter/assets/themes/tomorrow_night.conf | 78 +++++++-------- .../assets/themes/tomorrow_night_blue.conf | 78 +++++++-------- .../assets/themes/tomorrow_night_bright.conf | 78 +++++++-------- .../themes/tomorrow_night_eighties.conf | 78 +++++++-------- 18 files changed, 719 insertions(+), 718 deletions(-) diff --git a/novelwriter/assets/themes/cyberpunk_night.conf b/novelwriter/assets/themes/cyberpunk_night.conf index 40b5dd53..66c3932c 100644 --- a/novelwriter/assets/themes/cyberpunk_night.conf +++ b/novelwriter/assets/themes/cyberpunk_night.conf @@ -8,24 +8,24 @@ license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] -default = #888888 -faded = #616161 -red = #f24817 -orange = #ff960a -yellow = #ffff00 -green = #00ff00 -cyan = #00ffff -blue = #4d4dff -purple = #320064 +default = #888888 +faded = #616161 +red = #f24817 +orange = #ff960a +yellow = #ffff00 +green = #00ff00 +cyan = #00ffff +blue = #4d4dff +purple = #320064 [Project] -root = #4d4dff -folder = #ffff00 -file = #888888 -title = #00ff00 -chapter = #f24817 -scene = #4d4dff -note = #ffff00 +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #000000 @@ -40,32 +40,32 @@ buttontext = #969696 brighttext = #ffffff highlight = #321e50 highlightedtext = #ffffff -link = #4d4dff +link = blue linkvisited = #320050 [GUI] -helptext = #616161 -fadedtext = #616161 -errortext = #f24817 +helptext = faded +fadedtext = faded +errortext = red [Syntax] -background = #000000 -text = #969696 -link = #4d4dff -headertext = #ffffff -headertag = #320064 -emphasis = #00ffff -dialog = #00ff00 -altdialog = #008cff -note = #969696 -hidden = #4d4d64 -shortcode = #ffff00 -keyword = #ff64ff -tag = #ff960a -value = #ff960a -spellcheckline = #f24817 -errorline = #bada04 -replacetag = #0000b4 -modifier = #908eb0 -optional = #b4b4b4 -texthighlight = #ffff8460 +background = #000000 +text = #969696 +link = blue +headertext = #ffffff +headertag = purple +emphasis = cyan +dialog = green +altdialog = #008cff +note = #969696 +hidden = #4d4d64 +shortcode = yellow +keyword = #ff64ff +tag = orange +value = orange +spellcheckline = red +errorline = #bada04 +replacetag = #0000b4 +modifier = #908eb0 +optional = #b4b4b4 +texthighlight = #ffff8460 diff --git a/novelwriter/assets/themes/default_dark.conf b/novelwriter/assets/themes/default_dark.conf index e559de9e..e2e41efb 100644 --- a/novelwriter/assets/themes/default_dark.conf +++ b/novelwriter/assets/themes/default_dark.conf @@ -9,24 +9,24 @@ license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] -default = #cccccc -faded = #949494 -red = #f2777a -orange = #f99139 -yellow = #ffcc66 -green = #99cc99 -cyan = #66cccc -blue = #6699cc -purple = #cc99cc +default = #cccccc +faded = #949494 +red = #f2777a +orange = #f99139 +yellow = #ffcc66 +green = #99cc99 +cyan = #66cccc +blue = #6699cc +purple = #cc99cc [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #363636 @@ -45,28 +45,28 @@ link = blue linkvisited = blue [GUI] -helptext = #a4a4a4 -fadedtext = faded -errortext = red +helptext = #a4a4a4 +fadedtext = faded +errortext = red [Syntax] -background = #363636 -text = default -link = blue -headertext = green -headertag = green:160 -emphasis = orange -dialog = blue -altdialog = blue -note = yellow -hidden = faded -shortcode = green -keyword = red -tag = green -value = blue -optional = green -spellcheckline = red -errorline = green -replacetag = green -modifier = green -texthighlight = yellow:72 +background = #363636 +text = default +link = blue +headertext = green +headertag = green:160 +emphasis = orange +dialog = blue +altdialog = blue +note = yellow +hidden = faded +shortcode = green +keyword = red +tag = green +value = blue +optional = green +spellcheckline = red +errorline = green +replacetag = green +modifier = green +texthighlight = yellow:72 diff --git a/novelwriter/assets/themes/default_light.conf b/novelwriter/assets/themes/default_light.conf index 638d6879..ad38e0e7 100644 --- a/novelwriter/assets/themes/default_light.conf +++ b/novelwriter/assets/themes/default_light.conf @@ -9,24 +9,24 @@ license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] -default = #303030 -faded = #6c6c6c -red = #a62a2d -orange = #b36829 -yellow = #a68542 -green = #296629 -cyan = #269999 -blue = #3a70a6 -purple = #b35ab3 +default = #303030 +faded = #6c6c6c +red = #a62a2d +orange = #b36829 +yellow = #a68542 +green = #296629 +cyan = #269999 +blue = #3a70a6 +purple = #b35ab3 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #efefef @@ -45,28 +45,28 @@ link = blue linkvisited = blue [GUI] -helptext = #5c5c5c -fadedtext = #6c6c6c -errortext = red +helptext = #5c5c5c +fadedtext = #6c6c6c +errortext = red [Syntax] -background = #ffffff -text = #000000 -link = blue -headertext = green -headertag = green:160 -emphasis = orange -dialog = blue -altdialog = blue -note = yellow -hidden = faded -shortcode = green -keyword = red -tag = green -value = blue -optional = green -spellcheckline = red -errorline = green -replacetag = green -modifier = green -texthighlight = #c8c80060 +background = #ffffff +text = #000000 +link = blue +headertext = green +headertag = green:160 +emphasis = orange +dialog = blue +altdialog = blue +note = yellow +hidden = faded +shortcode = green +keyword = red +tag = green +value = blue +optional = green +spellcheckline = red +errorline = green +replacetag = green +modifier = green +texthighlight = #c8c80060 diff --git a/novelwriter/assets/themes/dracula.conf b/novelwriter/assets/themes/dracula.conf index 04e32450..0d5dd373 100644 --- a/novelwriter/assets/themes/dracula.conf +++ b/novelwriter/assets/themes/dracula.conf @@ -25,24 +25,24 @@ licenseurl = https://github.com/dracula/dracula-theme/blob/main/LICENSE ## [Base] -default = #e6e6e0 -faded = #6272a4 -red = #ff5555 -orange = #ffb86c -yellow = #f1fa8c -green = #50fa7b -cyan = #8be9fd -blue = #93cff9 -purple = #bd93f9 +default = #e6e6e0 +faded = #6272a4 +red = #ff5555 +orange = #ffb86c +yellow = #f1fa8c +green = #50fa7b +cyan = #8be9fd +blue = #93cff9 +purple = #bd93f9 [Project] -root = #bd93f9 -folder = #f1fa8c -file = #e6e6e0 -title = #50fa7b -chapter = #ff5555 -scene = #8be9fd -note = #f1fa8c +root = purple +folder = yellow +file = default +title = green +chapter = red +scene = cyan +note = yellow [Palette] window = #44475a @@ -50,39 +50,39 @@ windowtext = #f8f8f2 base = #282a36 alternatebase = #333645 text = #f8f8f2 -tooltipbase = #f1fa8c +tooltipbase = yellow tooltiptext = #282a36 button = #505369 buttontext = #f8f8f2 brighttext = #44475a highlight = #a681da highlightedtext = #f8f8f2 -link = #8be9fd -linkvisited = #8be9fd +link = cyan +linkvisited = cyan [GUI] -helptext = #ccacf9 -fadedtext = #6272a4 -errortext = #ff5555 +helptext = #ccacf9 +fadedtext = faded +errortext = red [Syntax] -background = #282a36 -text = #f8f8f2 -link = #ff79c6 -headertext = #bd93f9 -headertag = #bd93f9a0 -emphasis = #ffb86c -dialog = #50fa7b -altdialog = #f1fa8c -note = #ffcce9 -hidden = #6272a4 -shortcode = #8be9fd -keyword = #ff79c6 -tag = #ffb86c -value = #ffb86c -optional = #50fa7b -spellcheckline = #ff5555 -errorline = #50fa7b -replacetag = #f1fa8c -modifier = #8be9fd -texthighlight = #f1fa8c60 +background = #282a36 +text = #f8f8f2 +link = #ff79c6 +headertext = purple +headertag = #bd93f9a0 +emphasis = orange +dialog = green +altdialog = yellow +note = #ffcce9 +hidden = faded +shortcode = cyan +keyword = #ff79c6 +tag = orange +value = orange +optional = green +spellcheckline = red +errorline = green +replacetag = yellow +modifier = cyan +texthighlight = #f1fa8c60 diff --git a/novelwriter/assets/themes/grey_dark.conf b/novelwriter/assets/themes/grey_dark.conf index 21d95224..c51879a3 100644 --- a/novelwriter/assets/themes/grey_dark.conf +++ b/novelwriter/assets/themes/grey_dark.conf @@ -8,24 +8,24 @@ license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] -default = #cccccc -faded = #949494 -red = #f2777a -orange = #f99139 -yellow = #ffcc66 -green = #99cc99 -cyan = #66cccc -blue = #6699cc -purple = #cc99cc +default = #cccccc +faded = #949494 +red = #f2777a +orange = #f99139 +yellow = #ffcc66 +green = #99cc99 +cyan = #66cccc +blue = #6699cc +purple = #cc99cc [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #363636 @@ -44,9 +44,9 @@ link = blue linkvisited = blue [GUI] -helptext = #a4a4a4 -fadedtext = faded -errortext = red +helptext = #a4a4a4 +fadedtext = faded +errortext = red [Syntax] background = #363636 diff --git a/novelwriter/assets/themes/grey_light.conf b/novelwriter/assets/themes/grey_light.conf index 651ab6d0..3bd22238 100644 --- a/novelwriter/assets/themes/grey_light.conf +++ b/novelwriter/assets/themes/grey_light.conf @@ -8,24 +8,24 @@ license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] -default = #303030 -faded = #6c6c6c -red = #a62a2d -orange = #b36829 -yellow = #a68542 -green = #296629 -cyan = #269999 -blue = #3a70a6 -purple = #b35ab3 +default = #303030 +faded = #6c6c6c +red = #a62a2d +orange = #b36829 +yellow = #a68542 +green = #296629 +cyan = #269999 +blue = #3a70a6 +purple = #b35ab3 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #efefef @@ -44,9 +44,9 @@ link = blue linkvisited = blue [GUI] -helptext = #5c5c5c -fadedtext = faded -errortext = red +helptext = #5c5c5c +fadedtext = faded +errortext = red [Syntax] background = #ffffff diff --git a/novelwriter/assets/themes/light_owl.conf b/novelwriter/assets/themes/light_owl.conf index b18f5fb7..8851b0d2 100644 --- a/novelwriter/assets/themes/light_owl.conf +++ b/novelwriter/assets/themes/light_owl.conf @@ -14,7 +14,7 @@ licenseurl = https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE ## # Colours: # Background = #fbfbfb -# Current Line = #e0e0e0 +# Current Line = #eaeaea # Selection = #e0e0e0 # Foreground = #403f52 # Comment = #989fb1 @@ -28,64 +28,64 @@ licenseurl = https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE ## [Base] -default = #403f52 -faded = #989fb1 -red = #de3d3a -orange = #e0af05 -yellow = #daaa01 -green = #08916a -cyan = #2aa298 -blue = #288ed7 -purple = #964ac1 +default = #403f52 +faded = #989fb1 +red = #de3d3a +orange = #e0af05 +yellow = #daaa01 +green = #08916a +cyan = #2aa298 +blue = #288ed7 +purple = #964ac1 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] -window = #e0e0e0 +window = #eaeaea windowtext = default base = #fbfbfb alternatebase = #e0e0e0 text = default tooltipbase = #ffffc0 tooltiptext = #15150d -button = #e0e0e0 +button = #eaeaea buttontext = default -brighttext = #e0e0e0 +brighttext = #eaeaea highlight = #3087c6 highlightedtext = #ffffff link = blue linkvisited = blue [GUI] -helptext = blue -fadedtext = faded -errortext = red +helptext = blue +fadedtext = faded +errortext = red [Syntax] -background = #fbfbfb -text = default -link = blue -headertext = blue -headertag = blue:160 -emphasis = orange -dialog = green -altdialog = yellow -note = #80764b -hidden = faded -shortcode = blue -keyword = red -tag = purple -value = orange -optional = blue -spellcheckline = red -errorline = green -replacetag = cyan -modifier = green -texthighlight = yellow:96 +background = #fbfbfb +text = default +link = blue +headertext = blue +headertag = blue:160 +emphasis = orange +dialog = green +altdialog = yellow +note = #80764b +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = orange +optional = blue +spellcheckline = red +errorline = green +replacetag = cyan +modifier = green +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/night_owl.conf b/novelwriter/assets/themes/night_owl.conf index 8aae2b62..3e0a5aca 100644 --- a/novelwriter/assets/themes/night_owl.conf +++ b/novelwriter/assets/themes/night_owl.conf @@ -14,7 +14,7 @@ licenseurl = https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE ## # Colours: # Background = #011627 -# Current Line = #32374d +# Current Line = #434652 # Selection = #32374d # Foreground = #d6deeb # Comment = #637777 @@ -28,64 +28,64 @@ licenseurl = https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE ## [Base] -default = #d6deeb -faded = #637777 -red = #f78c6c -orange = #ecc48d -yellow = #addb67 -green = #addb67 -cyan = #7fdbca -blue = #82aaff -purple = #c792ea +default = #d6deeb +faded = #637777 +red = #f78c6c +orange = #ecc48d +yellow = #addb67 +green = #addb67 +cyan = #7fdbca +blue = #82aaff +purple = #c792ea [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] -window = #32374d +window = #434652 windowtext = default base = #011627 alternatebase = #32374d text = default tooltipbase = #ffffc0 tooltiptext = #15150d -button = #32374d +button = #434652 buttontext = default -brighttext = #32374d +brighttext = #434652 highlight = #2c98f7 highlightedtext = #ffffff link = blue linkvisited = blue [GUI] -helptext = blue -fadedtext = faded -errortext = red +helptext = blue +fadedtext = faded +errortext = red [Syntax] -background = #011627 -text = default -link = blue -headertext = blue -headertag = blue:160 -emphasis = orange -dialog = green -altdialog = yellow -note = #fff9ca -hidden = faded -shortcode = blue -keyword = red -tag = purple -value = orange -optional = blue -spellcheckline = red -errorline = green -replacetag = cyan -modifier = green -texthighlight = yellow:96 +background = #011627 +text = default +link = blue +headertext = blue +headertag = blue:160 +emphasis = orange +dialog = green +altdialog = yellow +note = #fff9ca +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = orange +optional = blue +spellcheckline = red +errorline = green +replacetag = cyan +modifier = green +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/snazzy.conf b/novelwriter/assets/themes/snazzy.conf index 6220dcc3..737107e7 100644 --- a/novelwriter/assets/themes/snazzy.conf +++ b/novelwriter/assets/themes/snazzy.conf @@ -21,64 +21,64 @@ licenseurl = https://github.com/loilo/vscode-snazzy-light/blob/master/LICENSE ## [Base] -default = #565869 -faded = #545554 -red = #ff5c57 -orange = #f5b900 -yellow = #cf9c00 -green = #2dae58 -cyan = #13bbb7 -blue = #09a1ed -purple = #f767bb +default = #565869 +faded = #545554 +red = #ff5c57 +orange = #f5b900 +yellow = #cf9c00 +green = #2dae58 +cyan = #13bbb7 +blue = #09a1ed +purple = #f767bb [Project] -root = #09a1ed -folder = #cf9c00 -file = #545554 -title = #2dae58 -chapter = #ff5c57 -scene = #09a1ed -note = #cf9c00 +root = blue +folder = yellow +file = faded +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #f3f4f5 -windowtext = #565869 +windowtext = default base = #fafbfc alternatebase = #eaeaeb -text = #565869 +text = default tooltipbase = #f5e9c2 -tooltiptext = #565869 +tooltiptext = default button = #fafbfc -buttontext = #565869 +buttontext = default brighttext = #ffffff -highlight = #09a1ed +highlight = blue highlightedtext = #ffffff -link = #09a1ed -linkvisited = #09a1ed +link = blue +linkvisited = blue [GUI] -helptext = #09a1ed -fadedtext = #545554 -errortext = #ff5c57 +helptext = blue +fadedtext = faded +errortext = red [Syntax] -background = #fafbfc -text = #565869 -link = #09a1ed -headertext = #2dae58 -headertag = #2dae58a0 -emphasis = #f767bb -dialog = #09a1ed -altdialog = #cf9c00 -note = #78bbb9 -hidden = #9194a2 -shortcode = #f767bb -keyword = #09a1ed -tag = #2dae58 -value = #cf9c00 -optional = #cf9c00 -spellcheckline = #ff5c57 -errorline = #2dae58 -replacetag = #13bbb7 -modifier = #f767bb -texthighlight = #cf9c0060 +background = #fafbfc +text = default +link = blue +headertext = green +headertag = #2dae58a0 +emphasis = purple +dialog = blue +altdialog = yellow +note = #78bbb9 +hidden = #9194a2 +shortcode = purple +keyword = blue +tag = green +value = yellow +optional = yellow +spellcheckline = red +errorline = green +replacetag = cyan +modifier = purple +texthighlight = #cf9c0060 diff --git a/novelwriter/assets/themes/solarized_dark.conf b/novelwriter/assets/themes/solarized_dark.conf index 5cf4e157..495d68eb 100644 --- a/novelwriter/assets/themes/solarized_dark.conf +++ b/novelwriter/assets/themes/solarized_dark.conf @@ -27,64 +27,64 @@ licenseurl = https://github.com/altercation/solarized/blob/master/LICENSE ## [Base] -default = #e6dfce -faded = #a6a195 -red = #dc322f -orange = #cb4b16 -yellow = #b58900 -green = #859900 -cyan = #2aa198 -blue = #268bd2 -purple = #6c71c4 +default = #fdf6e3 +faded = #eee8d5 +red = #dc322f +orange = #cb4b16 +yellow = #b58900 +green = #859900 +cyan = #2aa198 +blue = #268bd2 +purple = #6c71c4 [Project] -root = #2aa198 -folder = #2aa198 -file = #e6dfce -title = #859900 -chapter = #dc322f -scene = #268bd2 -note = #b58900 +root = cyan +folder = cyan +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #002b36 -windowtext = #fdf6e3 +windowtext = default base = #073642 alternatebase = #586e75 -text = #fdf6e3 -tooltipbase = #859900 +text = default +tooltipbase = yellow tooltiptext = #002b36 button = #073642 -buttontext = #fdf6e3 +buttontext = default brighttext = #073642 -highlight = #2aa198 +highlight = cyan highlightedtext = #002b36 -link = #268bd2 -linkvisited = #268bd2 +link = blue +linkvisited = blue [GUI] -helptext = #657b83 -fadedtext = #657b83 -errortext = #dc322f +helptext = purple +fadedtext = faded +errortext = red [Syntax] -background = #073642 -text = #fdf6e3 -link = #268bd2 -headertext = #93a1a1 -headertag = #2aa198 -emphasis = #268bd2 -dialog = #2aa198 -altdialog = #2aa198 -note = #65a19c -hidden = #93a1a1 -shortcode = #93a1a1 -keyword = #859900 -tag = #cb4b16 -value = #cb4b16 -optional = #93a1a1 -spellcheckline = #cb4b16 -errorline = #dc322f -replacetag = #859900 -modifier = #b58900 -texthighlight = #b5890060 +background = #073642 +text = default +link = blue +headertext = default:196 +headertag = cyan +emphasis = blue +dialog = cyan +altdialog = cyan +note = cyan:196 +hidden = default:196 +shortcode = yellow +keyword = green +tag = orange +value = orange +optional = cyan:196 +spellcheckline = orange +errorline = red +replacetag = green +modifier = yellow +texthighlight = yellow:128 diff --git a/novelwriter/assets/themes/solarized_light.conf b/novelwriter/assets/themes/solarized_light.conf index f185bd73..bfdcdad1 100644 --- a/novelwriter/assets/themes/solarized_light.conf +++ b/novelwriter/assets/themes/solarized_light.conf @@ -27,64 +27,65 @@ licenseurl = https://github.com/altercation/solarized/blob/master/LICENSE ## [Base] -default = #3b4447 -faded = #4e5b5f -red = #dc322f -orange = #cb4b16 -yellow = #b58900 -green = #859900 -cyan = #2aa198 -blue = #268bd2 -purple = #6c71c4 +default = #002b36 +faded = #073642 +red = #dc322f +orange = #cb4b16 +yellow = #b58900 +green = #859900 +cyan = #2aa198 +blue = #268bd2 +purple = #6c71c4 [Project] -root = #2aa198 -folder = #2aa198 -file = #3b4447 -title = #859900 -chapter = #dc322f -scene = #268bd2 -note = #b58900 +root = cyan +folder = cyan +file = default +title = green +chapter = red +scene = blue +note = yellow + [Palette] -window = #eee8d5 -windowtext = #002b36 -base = #fdf6e3 +window = #fdf6e3 +windowtext = default +base = #eee8d5 alternatebase = #93a1a1 -text = #002b36 -tooltipbase = #859900 +text = default +tooltipbase = yellow tooltiptext = #002b36 button = #eee8d5 -buttontext = #002b36 -brighttext = #fdf6e3 -highlight = #2aa198 +buttontext = default +brighttext = #eee8d5 +highlight = cyan highlightedtext = #fdf6e3 -link = #268bd2 -linkvisited = #268bd2 +link = blue +linkvisited = blue [GUI] -helptext = #4e5b5f -fadedtext = #4e5b5f -errortext = #dc322f +helptext = purple +fadedtext = faded +errortext = red [Syntax] -background = #fdf6e3 -text = #002b36 -link = #268bd2 -headertext = #586e75 -headertag = #2aa198 -emphasis = #268bd2 -dialog = #2aa198 -altdialog = #2aa198 -note = #1b6660 -hidden = #586e75 -shortcode = #586e75 -keyword = #859900 -tag = #cb4b16 -value = #cb4b16 -optional = #586e75 -spellcheckline = #cb4b16 -errorline = #dc322f -replacetag = #859900 -modifier = #b58900 -texthighlight = #b5890060 +background = #eee8d5 +text = default +link = blue +headertext = default:196 +headertag = cyan +emphasis = blue +dialog = cyan +altdialog = cyan +note = cyan:196 +hidden = default:196 +shortcode = yellow +keyword = green +tag = orange +value = orange +optional = cyan:196 +spellcheckline = orange +errorline = red +replacetag = green +modifier = yellow +texthighlight = yellow:128 diff --git a/novelwriter/assets/themes/tango_dark.conf b/novelwriter/assets/themes/tango_dark.conf index 33e758f7..dd0b9746 100644 --- a/novelwriter/assets/themes/tango_dark.conf +++ b/novelwriter/assets/themes/tango_dark.conf @@ -5,37 +5,37 @@ author = Veronica Berglyd Olsen (adaptation) ## # Colours: -# Background = 30302f : 48, 48, 47 -# Foreground = eeeeec : 238, 238, 236 -# Comment = 8f8f8d : 143, 143, 141 -# Red = ef2929 : 239, 41, 41 -# Orange = c4a000 : 196, 160, 0 -# Yellow = fce94f : 252, 233, 79 -# Green = 8ae234 : 138, 226, 52 -# Cyan = 34e2e2 : 52, 226, 226 -# Blue = 3465a4 : 114, 159, 207 -# Purple = ad7fa8 : 173, 127, 168 +# Background = #30302f +# Foreground = #eeeeec +# Comment = #8f8f8d +# Red = #ef2929 +# Orange = #c4a000 +# Yellow = #fce94f +# Green = #8ae234 +# Cyan = #34e2e2 +# Blue = #3465a4 +# Purple = #ad7fa8 ## [Base] -default = #eeeeec -faded = #babdb6 -red = #ef2929 -orange = #fcaf3e -yellow = #fce94f -green = #8ae234 -cyan = #34e2e2 -blue = #729fcf -purple = #ad7fa8 +default = #eeeeec +faded = #babdb6 +red = #ef2929 +orange = #fcaf3e +yellow = #fce94f +green = #8ae234 +cyan = #34e2e2 +blue = #729fcf +purple = #ad7fa8 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #555753 @@ -54,28 +54,28 @@ link = blue linkvisited = blue [GUI] -helptext = #e9b96e -fadedtext = faded -errortext = red +helptext = #e9b96e +fadedtext = faded +errortext = red [Syntax] -background = #2e3436 -text = default -link = blue -headertext = blue -headertag = blue:160 -emphasis = orange -dialog = green -altdialog = yellow -note = #fcf2a4 -hidden = faded -shortcode = blue -keyword = red -tag = purple -value = red -optional = blue -spellcheckline = red -errorline = green -replacetag = cyan -modifier = blue -texthighlight = yellow:96 +background = #2e3436 +text = default +link = blue +headertext = blue +headertag = blue:160 +emphasis = orange +dialog = green +altdialog = yellow +note = #fcf2a4 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = red +optional = blue +spellcheckline = red +errorline = green +replacetag = cyan +modifier = blue +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tango_light.conf b/novelwriter/assets/themes/tango_light.conf index 877f71ac..047be605 100644 --- a/novelwriter/assets/themes/tango_light.conf +++ b/novelwriter/assets/themes/tango_light.conf @@ -5,37 +5,37 @@ author = Veronica Berglyd Olsen (adaptation) ## # Colours: -# Background = #eeeeec -# Foreground = #2e3436 -# Comment = 8f8f8d : 143, 143, 141 -# Red = #a40000 -# Orange = c4a000 : 196, 160, 0 -# Yellow = fce94f : 252, 233, 79 -# Green = 8ae234 : 138, 226, 52 -# Cyan = 34e2e2 : 52, 226, 226 -# Blue = 3465a4 : 114, 159, 207 -# Purple = ad7fa8 : 173, 127, 168 +# Background = #eeeeec +# Foreground = #2e3436 +# Comment = #8f8f8d +# Red = #a40000 +# Orange = #c4a000 +# Yellow = #fce94f +# Green = #8ae234 +# Cyan = #34e2e2 +# Blue = #3465a4 +# Purple = #ad7fa8 ## [Base] -default = #2e3436 -faded = #888a85 -red = #a40000 -orange = #ce5c00 -yellow = #c4a000 -green = #4e9a06 -cyan = #069a9a -blue = #204a87 -purple = #5c3566 +default = #2e3436 +faded = #888a85 +red = #a40000 +orange = #ce5c00 +yellow = #c4a000 +green = #4e9a06 +cyan = #069a9a +blue = #204a87 +purple = #5c3566 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #d3d7cf @@ -54,28 +54,28 @@ link = blue linkvisited = blue [GUI] -helptext = #8f5902 -fadedtext = faded -errortext = red +helptext = #8f5902 +fadedtext = faded +errortext = red [Syntax] -background = #eeeeec -text = default -link = blue -headertext = blue -headertag = blue:160 -emphasis = orange -dialog = green -altdialog = yellow -note = #a78800 -hidden = faded -shortcode = blue -keyword = red -tag = purple -value = red -optional = blue -spellcheckline = red -errorline = green -replacetag = cyan -modifier = blue -texthighlight = yellow:96 +background = #eeeeec +text = default +link = blue +headertext = blue +headertag = blue:160 +emphasis = orange +dialog = green +altdialog = yellow +note = #a78800 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = red +optional = blue +spellcheckline = red +errorline = green +replacetag = cyan +modifier = blue +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow.conf b/novelwriter/assets/themes/tomorrow.conf index 974816c1..b37ab4be 100644 --- a/novelwriter/assets/themes/tomorrow.conf +++ b/novelwriter/assets/themes/tomorrow.conf @@ -28,24 +28,24 @@ licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE. ## [Base] -default = #484848 -faded = #6c6c6c -red = #c82829 -orange = #f5871f -yellow = #eab700 -green = #718c00 -cyan = #3e999f -blue = #4271ae -purple = #8959a8 +default = #484848 +faded = #6c6c6c +red = #c82829 +orange = #f5871f +yellow = #eab700 +green = #718c00 +cyan = #3e999f +blue = #4271ae +purple = #8959a8 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #efefef @@ -64,28 +64,28 @@ link = blue linkvisited = blue [GUI] -helptext = #5c5c5c -fadedtext = faded -errortext = red +helptext = #5c5c5c +fadedtext = faded +errortext = red [Syntax] -background = #ffffff -text = #4d4d4c -link = blue -headertext = blue -headertag = blue:160 -emphasis = orange -dialog = green -altdialog = yellow -note = #b38c00 -hidden = faded -shortcode = blue -keyword = red -tag = purple -value = yellow -optional = blue -spellcheckline = red -errorline = green -replacetag = cyan -modifier = orange -texthighlight = yellow:96 +background = #ffffff +text = #4d4d4c +link = blue +headertext = blue +headertag = blue:160 +emphasis = orange +dialog = green +altdialog = yellow +note = #b38c00 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = yellow +optional = blue +spellcheckline = red +errorline = green +replacetag = cyan +modifier = orange +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow_night.conf b/novelwriter/assets/themes/tomorrow_night.conf index 94fecbc0..ea94cdec 100644 --- a/novelwriter/assets/themes/tomorrow_night.conf +++ b/novelwriter/assets/themes/tomorrow_night.conf @@ -28,24 +28,24 @@ licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE. ## [Base] -default = #c5c8c6 -faded = #969896 -red = #cc6666 -orange = #de935f -yellow = #f0c674 -green = #b5bd68 -cyan = #8abeb7 -blue = #81a2be -purple = #b294bb +default = #c5c8c6 +faded = #969896 +red = #cc6666 +orange = #de935f +yellow = #f0c674 +green = #b5bd68 +cyan = #8abeb7 +blue = #81a2be +purple = #b294bb [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #282a2e @@ -64,28 +64,28 @@ link = blue linkvisited = blue [GUI] -helptext = #a4a4a4 -fadedtext = #949494 -errortext = red +helptext = #a4a4a4 +fadedtext = #949494 +errortext = red [Syntax] -background = #1d1f21 -text = default -link = blue -headertext = blue -headertag = blue:160 -emphasis = orange -dialog = green -altdialog = yellow -note = #f0dbb2 -hidden = faded -shortcode = blue -keyword = red -tag = purple -value = yellow -optional = blue -spellcheckline = red -errorline = green -replacetag = cyan -modifier = orange -texthighlight = yellow:96 +background = #1d1f21 +text = default +link = blue +headertext = blue +headertag = blue:160 +emphasis = orange +dialog = green +altdialog = yellow +note = #f0dbb2 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = yellow +optional = blue +spellcheckline = red +errorline = green +replacetag = cyan +modifier = orange +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow_night_blue.conf b/novelwriter/assets/themes/tomorrow_night_blue.conf index 88aac2e3..8ac01e1e 100644 --- a/novelwriter/assets/themes/tomorrow_night_blue.conf +++ b/novelwriter/assets/themes/tomorrow_night_blue.conf @@ -28,24 +28,24 @@ licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE. ## [Base] -default = #ffffff -faded = #7285b7 -red = #ff9da4 -orange = #ffc58f -yellow = #ffeead -green = #d1f1a9 -cyan = #99ffff -blue = #bbdaff -purple = #ebbbff +default = #ffffff +faded = #7285b7 +red = #ff9da4 +orange = #ffc58f +yellow = #ffeead +green = #d1f1a9 +cyan = #99ffff +blue = #bbdaff +purple = #ebbbff [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #00346e @@ -64,28 +64,28 @@ link = blue linkvisited = blue [GUI] -helptext = #a4a4a4 -fadedtext = #949494 -errortext = red +helptext = #a4a4a4 +fadedtext = #949494 +errortext = red [Syntax] -background = #002451 -text = default -link = blue -headertext = blue -headertag = blue:160 -emphasis = orange -dialog = green -altdialog = yellow -note = #fff4cc -hidden = faded -shortcode = blue -keyword = red -tag = purple -value = yellow -optional = blue -spellcheckline = red -errorline = green -replacetag = cyan -modifier = orange -texthighlight = yellow:96 +background = #002451 +text = default +link = blue +headertext = blue +headertag = blue:160 +emphasis = orange +dialog = green +altdialog = yellow +note = #fff4cc +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = yellow +optional = blue +spellcheckline = red +errorline = green +replacetag = cyan +modifier = orange +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow_night_bright.conf b/novelwriter/assets/themes/tomorrow_night_bright.conf index ab3c4766..4a0bbd9c 100644 --- a/novelwriter/assets/themes/tomorrow_night_bright.conf +++ b/novelwriter/assets/themes/tomorrow_night_bright.conf @@ -28,24 +28,24 @@ licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE. ## [Base] -default = #eaeaea -faded = #969896 -red = #d54e53 -orange = #e78c45 -yellow = #e7c547 -green = #b9ca4a -cyan = #70c0b1 -blue = #7aa6da -purple = #c397d8 +default = #eaeaea +faded = #969896 +red = #d54e53 +orange = #e78c45 +yellow = #e7c547 +green = #b9ca4a +cyan = #70c0b1 +blue = #7aa6da +purple = #c397d8 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #2a2a2a @@ -64,28 +64,28 @@ link = blue linkvisited = blue [GUI] -helptext = #a4a4a4 -fadedtext = #949494 -errortext = red +helptext = #a4a4a4 +fadedtext = #949494 +errortext = red [Syntax] -background = #000000 -text = default -link = blue -headertext = blue -headertag = blue:160 -emphasis = orange -dialog = green -altdialog = yellow -note = #e7d696 -hidden = faded -shortcode = blue -keyword = red -tag = purple -value = yellow -optional = blue -spellcheckline = red -errorline = green -replacetag = cyan -modifier = orange -texthighlight = yellow:96 +background = #000000 +text = default +link = blue +headertext = blue +headertag = blue:160 +emphasis = orange +dialog = green +altdialog = yellow +note = #e7d696 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = yellow +optional = blue +spellcheckline = red +errorline = green +replacetag = cyan +modifier = orange +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/tomorrow_night_eighties.conf b/novelwriter/assets/themes/tomorrow_night_eighties.conf index ed67eb95..8f9850fa 100644 --- a/novelwriter/assets/themes/tomorrow_night_eighties.conf +++ b/novelwriter/assets/themes/tomorrow_night_eighties.conf @@ -28,24 +28,24 @@ licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE. ## [Base] -default = #cccccc -faded = #999999 -red = #f2777a -orange = #f99157 -yellow = #ffcc66 -green = #99cc99 -cyan = #66cccc -blue = #6699cc -purple = #cc99cc +default = #cccccc +faded = #999999 +red = #f2777a +orange = #f99157 +yellow = #ffcc66 +green = #99cc99 +cyan = #66cccc +blue = #6699cc +purple = #cc99cc [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow [Palette] window = #393939 @@ -64,28 +64,28 @@ link = blue linkvisited = blue [GUI] -helptext = #a4a4a4 -fadedtext = #949494 -errortext = red +helptext = #a4a4a4 +fadedtext = #949494 +errortext = red [Syntax] -background = #2d2d2d -text = default -link = blue -headertext = blue -headertag = blue:160 -emphasis = orange -dialog = green -altdialog = yellow -note = #ffe6b3 -hidden = faded -shortcode = blue -keyword = red -tag = purple -value = yellow -optional = blue -spellcheckline = red -errorline = green -replacetag = cyan -modifier = orange -texthighlight = yellow:96 +background = #2d2d2d +text = default +link = blue +headertext = blue +headertag = blue:160 +emphasis = orange +dialog = green +altdialog = yellow +note = #ffe6b3 +hidden = faded +shortcode = blue +keyword = red +tag = purple +value = yellow +optional = blue +spellcheckline = red +errorline = green +replacetag = cyan +modifier = orange +texthighlight = yellow:96 From 8ce6c678aa76fb6ac40f39e702c62e9649ecf15c Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:37:30 +0200 Subject: [PATCH 27/96] Use a transparent image for the welcome dialog --- novelwriter/assets/images/welcome-dark.jpg | Bin 299007 -> 0 bytes novelwriter/assets/images/welcome-light.jpg | Bin 279989 -> 0 bytes novelwriter/assets/images/welcome.webp | Bin 0 -> 352664 bytes novelwriter/gui/theme.py | 2 +- novelwriter/tools/welcome.py | 5 ++--- 5 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 novelwriter/assets/images/welcome-dark.jpg delete mode 100644 novelwriter/assets/images/welcome-light.jpg create mode 100644 novelwriter/assets/images/welcome.webp diff --git a/novelwriter/assets/images/welcome-dark.jpg b/novelwriter/assets/images/welcome-dark.jpg deleted file mode 100644 index 1b4349120fdc7b3b7320d697eb746bd65abb1f7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299007 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
    J& zM@Ptq3FoI@r|;0*h9%7fch>eP36?K|R!ROh?gN2}+CqQx(&4Y&tVIemUYg#nBd^!q zT1F<1Vmiusoy*VeRPl@~3_h3Ix zYhmRinEey94&Ax2VIAh#Z_=!r=~Nromkp^3OA2H)%sp>SgMo@V3pwQujZ|r=0Y(LC zFSR8%h!@F-6Uqcpt`>vxy3rU79I{oE|6o|sskUC&8iX-I%wRu}$AVLm2VN9^@02PH z2aO{myFOK*Ke8KtrdmV>h~JOC+>0x>R1*_xjM*!2JQc#p$};jck?h%Q4TOw}vHh=% zJWa!8rmuhnW!|rnRK&vU+&oqtEyl43N58CNwMlxa{*$=>{*=MO`v2|>)N(?Vo-<|0 zNG8xddO(pX?#fbyeya84;D)meP7(xrkxj(H9C?d<&P;4PlgS~X40`A{H0y~88Em&F$e0R~U+aD(Vw zgpYF&%kSt3K&>%H;6KDxm+`u9qNWV>I~ zREAQ2$oOI-zB_cQQagp4akP%Se}==oWf@;**9z_zxR}d*HLU*_o$hE>)>8PvV;e_M zjc-}fYLtztYNdAt5_0U%%Ep|qz;15-8&wSbxaE&k=-4UL-Wt*vqGB%HM&MZR1p(0b*a( zW?}(s=1y?|=EkPJ@iW*6U?c+%e~||k=iQ==!Yw#2arCgO>#I9`IUYtzX=Rj&wH3ps zt^-+8GB5`)PP#h|fnh$|Zp}GCbh-{8rr$HRM$RTMt=e8 zhc9DrK*BahPMVqq8Vy8b&1O$Uw?LtGtSw^bRv7y>FpC5w{~V5356uaEuP7|a4KPEA zsIC{XxDgWO>vJ=sOI7YevzV|=46dtvM!l^XzmleG?G)fj!qf| z1roe0hm3Md*XlzuILXbJ;QTanIj5tFP9CRV1k0$MmR(v!mG)~qO3E4Nla^_jcQY~H zOHrtE7YLL1PNJyS*X=8oVXatq2H{x0TiLMUhwon7In}0{Zv=C$_ZmVVj|8`vFR69# zW+SRl^H*^%uJgDxg~$`px$;h71J&dyh#p8KDH>qsp|{BzqvLRJ=L8s~D$wBz7^@5t z^;e%GnP~X8dUSvl^Ts84ONa&>TgzM4t6T+@xjf56$2Vlp)e(Ek$0XC$UYlESR&ec) z&)W%K0#j$_mn(RLow8WBSJoLi#k`6R#*YLjx>WK;t**9imQD@puzvRhq@9=X;PT~T zDJ#zeG`o#-?>8hIS^Fcc77mT_ujT)CQ3tdPRj7-0r}`)j6;x`fq}eh-Te+!74g$JL zcvp;-Z#X74bKLnxqJ-BS+LGqC1m~H*gz~jIV=tSy7MtzE*~Qr8GJp?g}kW zf#<%j3>57dE_tsauNkbvs0&m0n!M^AIgF*nAeoAaG2=ax5{#J9?!CQ3q&n^T)Y6CX zUj3{kdphuk<6eR){#u�C_aI@LxdYvL{=q*?nZY^4B0?!W2#ALgJyzpQ^pE@M-GV)|2VihUhR&w z-*zWkcWF1*N~PKw5>f8a=$9$UC!phhFdRxhqy#oT)tQus&015t70fR$-{vjRnr)%z zD`0AGg*(bhy3!!~9~^8#d6qPLR>XlR?0gI&RE4CffABf0O|S@tWCzq< zmIkS>CI(pGIHiB9@6h@t{ez)@VMcL`pqSpGZVuCEP44_J~(RF)Z!JMFU?2ZkN z7j2!%c=C`pVPRON(VqvEQjf~{OY;&6@S!0lEpVpvUNjSP`K6Jw$IhoAoV(B3piL5p z5hhH8v7MIs#P`rDb})GXP04xH<~I4k4W4JFQEd}3#g@5(KP+OpZNI6|uaKc6`8lk? z%DF=39S#jk+FYAB>yaiD@#|q)&BtVnqN?Xcvg}gV#ZY;^7VYBL=)W(03a z)+j}}Y4hYsz=e23RQl>d?4PlN=BIB&=bQ-Oy8UK!qnT{buKAN5-1@binadU_HESOju^ft&yAvZ)^A&#s;4HQVa8uX|su z!R!82QT{png}SLp8kd4QS=Y9)mJr%KtQwiz2iwhoxn8T3Cy#nYx7Bmp4+d7=sis8v zdFWyVP_ERH6Snt1kie0mr^e@ql(iOb{J`he&8)Q}(Qqk_II;c*W24K)Cy{=xnth0L z-A_1C`n&Bd^@)_hW0fpNgvC^qIlpMdJ8j>_rDoqu?9-<1RU`h;U1W#6YVg@7xsZ8T zYIedJ0R%S_-9rbmt&6prtqD;l76npKEs)<-kczHAo1yiJ{D`Ix9jHCk%Ln8No}78f z8}M)C2@n2Z`&PUDVj$#c7x2R7ec+wHRsKYAu%mjb zC8a^4B5esXPe<`KkUH1JO2F_W+1!SYdH4CWG1WMD#mu16ctq9Ly|u}tFPHAEwD%5P zrZ*$ou|}&5-Oe6o^>y`i5JO;ZJJ0oUQvV@oDN&in8U7N*}IaRke zio2cBdL=v4c+sMK3i2H?A-@RE2_Y_7#ZR_GHfMD7&_oR0^_RPG2u0YO$LO<;`sfCn z?U(Vvb!x4Z&%--g@p0gvcP4Cfq!VI_Ew~NsAUHNnC;0{DZ>V<>3Ud2mvl5C`X2(K$ zq#Xz`%g&c_zo)*+@>5^lBD3PGx}?6P7smZUT`qWN_%m^g4l{0^s1#MN#w%pG&zCT6 zRAZXP;8J6OOL_9ekMm%cswnFio#3(lvmZkM!>hCMlM_Ync@6^ClRiPsuXPI@78&H$ zkf;(pEWeRqnak}+0sh+ zZD>K#;1MzWGj^y1k(7pjP;MSK*?HqRc62G57Lx9Se$Gu6cGU#HDwf*xRvMJ0DyziE z{g{|APylfz8M6hPgaz#M!M`3(2dGe~ijb6{X5mVE)4G!YXC!bYyTT}GILSruE`;+$n6&Z!E9SctKn+OID}bgKAyq5bm45#HSv61fPZ0lybiwtayE z-Hi|juLRGQ6^F(gDVj-PeFlrOo|=3S#OKrwwNu_wlszO8o1AVyNJ7dRK44M40dNl` zu(86ApF6FST)Sd)T|OJ8o!e+0a0!yQ)zPA(eOE9xqZMyg`8#nQ`S`)!E+84X7&`o3K+U707&D@v&G$v^6N8-ic^S;<1~25zi=yT z$wEICMIxL>tu|-cO9;ExlWf{`lBdT6(6lKfzcKTo@vq@|vb22*B*wzvpo&u};7=HOcc`5${vU=SNlQ_Ly+V^IR^h65ITKA^laaSt znaL{II02Uki6v90r))E~KOHlxx( zc|xAK>4kOyYz);c{+Q!qmlaF!mmz$KxO%v+k|zlt1^^o|L_4LJuy<6ZLy)NM zg$owGRxOus<6Usy1Y!uWYt?3LX?DBaE&kGP*A2p3gCZe}1GlVjk5IEbylfBf$dS_o zNrZoMYX^XAk3__coXDcA+1bWELhWJgd9!cHY99c(J!07I7$j`Q0Ifr)igH$HL#3~urC%2xp+I&K}k%CR*AioamH zxbTS78XRvEX@nrTR~1mHHSnMJN@_i)>*FiQD_X0! z=@`*%A$&e+F2Ys^$k&-OQ{1fzL$MiwBW~YRoC=G1*YjT`v%6)Iqh2aTw$)snQJc2} zUd5~g`VsXPs*_|H9lICAZshY8}LC#pq+nlbgH25z@ya{5z|6pW4wOTM9{)72pSkB+L>K<0VIAAX_YJTTN(V4t67Wb$-a=9NyJK+~9 z>Nb@3LzyBuG4ObJL>vE9#%<)isVz`DN($zwG>;#Fett~{j&0>KVF~Yt&g&59JFRCC zJVoH3nMR&-9t!q@Q}Y$7k+tv{vv|00$=;c3^aD&gBKEQ75|l)@N?M7CV9LU4odqKK zU9{Z!DQ3oEDVCGl%bvYyio7yHBF*&-4|y+6_c42-niR-vnaHL|FmvF+2ZZim z)nkR8z7D;-Mu>ul6RMx4}5tE%r(1+qO!_s5ph{ zfg*qRbSeXxT**Yy8-6L3KoduXkNSS37%ZQDEHYAW!DoC5gHZFz`dKn8 zqifoGfaHr5T&$9{nz|f45%>ZpMB(RvxmAaoAADMIKw5EvHr%_$=R%3y8{H|Zc0L14 z2FPGb$cqxYGt+J%<#BG@eg_TfxD!%$or%LhHn>=WTxCfPjz0r}?K-HZ&; z2Ruz{KN0!P2%#If@li#2-CEF7Q6T&JTp+zjwyc0lUlx};50x{urD=)BsS^BvVM4}} zas_r8D=wsX{NYt9DhcT$HV57jA?f}`f+mJOJuLi zhNWU+$_p9e*rSNdUn{O%>vJ5Jv_8tEY$NFf6n^{zzqsWKvjlCS*W*vC3MZ_+Bc=-_ z)L`kbiSa2+O($n+XA4cF3T6?O`v#h`r8&H=;*#(wLO4G~OaVDL*h)??9jvY0%vRV@ zA5IdtHNivVl!v(383^6f5s~%AB@5NJIfs~xkx#yX8lC4`T}zq#B%&hH9UkRTjP1gQ z8>T=V`OA;Wuk(!!&M45;tux~YETK=*p^qzE@o~1!fraHhq6BPTy~(|r0K7`e?awt} zlxvnh?V3YjcZPSJ{dvn_C!sO8X;ldJUVXw(z=+^2S@d}1H)|NNoVYDMF6FzN?e#)X z=QULXc7~oIo1&9Ae*BewjTSEIv^`>Hg&76M4ED47wqiWQp`4Rb4Prd0d&*#3yxs?sO9&&nQ7W_~@8gsvmIpZ<9c~TpeR>-f z$mlerZfCmEGop5GI$Ky(_R61e0}N)uq)}opkq2$3aUHrF`!_sRcej~m0*|D&Jj>e+ znfGXVOK1}$e=TT4OFtqU6RP{9Tg|y%S<=@gdS}b{TD=s3_PG%h>z@C?w2p!N-irz; z^CDRwyX6k7CrHauocrf$@^mjz*}q~yP8Z-#TIr%6jP#6te5UJSEfrachyz^l_W+`h zhK$|@ep{2y=I^CpfuePm+BVjSu-{uEDUE+tKGo}!12>5i#*v9GcWS{NKRmc0=TKF& zxMSChb(|_tY38YBBr)*bOu2&>qU)vJZvg5!1n5Kr5ii3$wN~e>bsTgy;n-=EC|>}8 zwA;b-`}|0Ngy{i3v7ZrzYYyGLcd9)eb$~`_;!N2Ow;Wc57X!%`oq>-c>xFzhAmt)M z3%=8P!}^>UcR6|%DMsF5W;(X>1cl|AHoKWq`_>8`p}-mRPJJA#vZ9G{9XWPb*u5T; zyeS|v%B|EiZob(e!5YO(v!I4H_s@#S^i5jahldtYYwSZj#yjkK{n zT)BWx@-tn$=ua_R`rHG2sv;?`FwfKMAyOo9yn$nUTFO5lZOC)Q?cr&(en3n*NB(ZY z_8w(uu=w4jEwX=oO`uwGMMyFJH0@$>1A`RMT;%sPm~czwaBr}TiYN&J7g zC|hw(_mv6b*G65K$Rx&#G*;xJ%zZWlb@=Ojr>G{JEo*ev2nnV))(|*n6D`SXEFS1G z76`d9j=b+C5++@*U^jwqyvavXHZ`+l1N4VvSk&(;dS==J<*WKA>>Uv^lfNjD))#(>OBYjrHR;Rg@N49q|Vx8O4@AjxX}esW(pKyJbt4z>eZxh-#ehkhFud*`$lWKqa2H%f6Wmu9%(=0F! zZ$We(&Cb)timt2TS<69JdiJ2qm;4#rGiGb5_v-S|9Q_v}5>?qAZmN)L?Qi%V*R4#U zzJg8zsS>Y8qiy9SrwZXvk4yF+kycXxLU zp5X2@F2UX18iGr3NJE0WXXpFR6*r8ryLYduHCL^gPj#m9%jiT}KTBUT_Oi%QQ>55j z=eP7$l5uVi4NNx(Jd17BYQ-uIo(I=%no3WdGMHYtmzp~1W**J0ql>licPo2a^jW<5 z1c^rM?tg*ZGjp(CTU|lntS^f6M%B~x3uvfDt$(4Wy-k>uHkk_ifz(TNudbeSBM1OZ zfcMl^@4&3C8|=lT_0LniRK@hb%%t_tNUYJ=j2&3CAegX)ofE*;EIlV&{}>eux#!dB z(yMq$zQjo|&il1P;XL zn9n@lYU_MqD<+%1!+17{_5US$>_vXxhI5^FW3e6KJ=!It(PlSFwxc*LGxb8!^Z?2# zt4EapoZggb59j~hSx6`wG?4_yE7g5qM0U&fZOYus_tp2W6!vD&kou5zlXktu{f`TO0~mGf?z!3AhvoN|cLL~t zTVo;qYs0U7)vkT9`Lpbgp;gPKCM$x|c^!G4R{11J#Z!_uu&6wpWvjPC$A=XrJMnQ( z3)VmZ)v?*)Z&11Pxt31GW*J2LkJwh&%70MI*j>GUxT3e|TX(!M{sIf6T;a!z(8CFa zd-j4FegNN0qr*h$HjbAN94D&t#(ba9_3{Dt7@A2j5iU*3?2kyjUle{cBgbHNie zCCg5ap@vN~23EdSQg0I!F{7gLs&@wsF)1+{^=R$~@RNBEE7T|x={Exl0WjzZ)w9}^ z+cRW7MJm5_idg+i(ukK%CL0PqOfS(^8jjYNM{nDkavgoUrG-m$*~=XxXc5zD*~eZm zYxqU~)~cC+lt~CvMzUvR&oF8HOP_ ztPB=nUB4|LHvWZBxs}P*{Dm_Ani(+ojAAUR3eHmcTI{C#sVo4gT<&zrrwa1M3v{e} zT&uU&wFQVUAKF^bVtlV%OAGoVz=ZAb67;x~e;6bdnv!4yRB*fN4?E;UrsbZsu%JJV zT2B~0S~!qw%Q8<_SDGi0W9eTyM^rnATABET_@f_-RvkOMQH)a(Ox^Nkt+=#Y1XA4x z^o=_)%^dj&|4@2;2RrQ(>Ekqu-l>f66BX!m&=s3jo%#)l^R^GJBft!7$C!c zoGypSQAXq?9m6P*NxRFv`ql71edbg}>hoL+4bS>p&@QbHGKBFABTCDi=#3d|=kGA7DAL%L2juAZ)3L-s!$Szfo3c(L03&i3WMy$ira`H>$Q z-r`h16BS%zU-0u#U+Y9iLXrAxl|*0-r?`W-do2U}RJJK9UdKcFcc7P9D-~2GIt$YT zdiZ5U2$sJ0uwSObq)MY!~qMo+smT`9pG;Apdpv5JK#ZD_Pv>BGal>y)k8UAiFemK6T5 z0(JxY3vMrowKi5OV8h<{|Ni@Wla2rF+CVM^V!7ty*Lr=>X0X;=cNs5!%E$SAG~kPR z{}grxsv=Kr+c+S8?yW6S;f0%zKQsu?-~XV+*G0&yHQASL6QG1x?g|JLcG^3TytAD8=! zh_5=--;^U(aD6-JNpNquiM8!}^!GARz83DxVM{h~qlb%>l;H;EG0W?tuu?zX?yK-f zbDHHEZ>s+L(5AOt@>3#)_+;yrg5%D#(fqr6;T~|H4R!M!%p?w(A4>sF4*GF7Hsxds zb`D5+t?~m|MGbl9_0YDca@sp5>lxAj+t-Mr+o1vkUtB9E1rysS0_e1NbKqSTY^lo@ zoC3e`+oz=)NI4nH)Z4?70va>Wy+jd=D{BA^Xbp_FoB~PqW+Ka%sG?eWe*W><5>VC>b6K}Z_c{DBs-!k1dxDhC|7~-A z-0%EJYd=?rp~}VWP!)r*ErNk@pDjy3yqDj)efe;-4o;BLG{2a1^m=1AK-^2(D-DeU2p99 zPnrQ*5fmk^_JXR@#tINB>Py+z@3Y{upd4!;Cowrq0$C6=@y+cegY~;()yQTqHMiPV}%t>#;KSMJ^dk! z|K$qle*wJpf6MVL>EAA1Zepcq)dC#Yj%_CvnlM&tCtaJrZ1om!(>qNy- zq5P!MDX%(>8+nw*&}{zDlT9Um+SX7WGa?7xvJ?L;Bva1@4tc=*S{Wp#8&xC!k-1Hf za+^juQ#13Huuyi=Awf9`fkCmg-F;Qu=r-Z8n1ZySX3ft?$}nKdGapG%tv5N4Rq_}} zGw`dZwSXQ58Yi4}4nTasZN|D-F*4bi`1KE@XxvXjYx{)X-v;@+RfB+>0KDRV8gX;! zp9tDdrKF(iIdXo=UXBU<&XC9aKP6w(26y3J2J}bFaAgwWll`^$LDcix4_mQV>L(eB zkRNdTM`zPZ>{dcRvfXF@IHPxL-i=H)v^m?MDPW(yma+UnRFD5RpFheVy1>~Pr1uen=C^xIGKx8 z(9KGYRY*4@re!Gtn0MCg+${kUNzPnCAO>7ODc8zrXVnrYjH6a90F?~I`@|opRdPW3 z7SUB+^-Gic03M3LHEO*d5nm;7kEK{tPHnUQw26=XF7sLs5beP*z#G$)IlofgHqSjn z^2XRP-Jkm9d^hyn`xvWDT%%#B0OzoNh-&OYj@kQZ=Y*6&q~Uiv2|! z5%NBdEQWeOJRAMo+2kzUz!ToH=6!x7*_j!McQ<-Zc|}@Mr8$9ehi7?M3r(luQVs(DdhmhhmD4oug$0qZwtLv4C z)7T2M)u{{+iS%B?zuljJXy@u{`FtorZFRr6V^Hm}+GpZ>6w zh1?s-1lGdq{n3lQh&>Wl?%r#QQauNIw7m7mmscCFH3r6eNDc`SPu{le(2t#XE?@&f;;Fsn>LhOeVa2E?e2J)ALRabr0U&zsl8gZmA(&!MsL}D zIRjXfKuZ;djUdMDjpe!6lS)9m*=>~lLb;iKY79!7m@@~$1HpAdsEle<6>#~sPv+z{ zl%D)2EdY;&w!m$(s@{^}4!1DHSN6kcLuSfO#r_t*MD*}Hs(39R1do^9vB|xbjL3m1 zD=6&voUwTixxP^}3mA0JuQp>Y+Tsu~npmD7-aKY$Wv0JUuipv*q|cAOvWW#KZ}?|B zmB$~bpN3vpegNHYr4bn$QO}IQ60c}`_eiE?Pt3Qfe`KNdu93HnA>w4EtUJdGLqK5hv?jAy)L;c|Cy;&0pjKmE$gG`|I8@cuQ*4&V8# zvJ$AHQf5S?i6?)Fg{QyqSYcD>u%WfbP%yr5&UyP4Yi)oC90HM|a6m=YRuO2GQm483 zFlE``#e^501C-`jf|fE5#?rr8$94>#5#WgN^p~`uB1nT$hm#E>h<9PW>Tgi&VQz%k zO5|dZy8taTPV<@zdZ==KMiTEwQOoWzIxkM5wTp|UczvFGN=#&HI9%+k+JB; zQpTHYxaTLDap|8 zriHa%WOW8ZB{?%jjHZtNcI%XtreZ@k749|{`$f#H@(Ra@Wa-E* z*0FxDC$Mnvif#3Q439SP9~3T(_Y|UCu*P4774533&`{Nr{TEaZ@wKw2;Yv2&^iq-*vV3XVfIR@}O=?!hWpC!i=UR-c25YAEDod zhGnN)B9mRnC~k0(TsoH#b~chW;E{;Z3r)0TRb!HkqOO635#1~iW7tM?-Wama?w!`xMLdA6azm^#%G+qMcDV`7BN>TMQ%?%roms~0kl_8lU_Dd2*R~@HV zQ=@Cmg8+1_t_Lr?6``s-OaH|&-c3$ylDG9Q-}(6mdrLVb04C*u+3F!u{4_cc(^Sy7 znwv#Ofk5@dSottR{xX`zqlqb+ko zJQ`rV(XWP^Jb^PQyG^JT( zXksZ5lWcPFYYlx0-C75x=ehBGv%_lZEQ4e_Z?c*OJJbq=qwf6POgb`sDRBs@P6Nz)$+9SdPC~ zk-`r*)D4C2%r_h9$G*KTWHttDiyPVqDkEGR@?;62BxTkG>*ZwmJGZ`)5LNIT6@N@>-}JI+1L`ErpBv_g@j`ssL;l~O6MCHLb_=%v@*COve+o+H(cZT11JZ(UV2RP##$4*om67^GzeX?XyE+S%}6WRJAk#K z)_M$WvTyvxWN|Rp7!?zva(x*fIf_T)k8VZsD6rt_3P_0EeS2lE$cH;Xj~O1vc;_PM zeckcfH+lQv!9yWq2QZ_^)M*~_WlF`RBfM(?NR-SRVybjQPMPaVX*6?*LAT&#f&xVf z3xL}o)t;*P4+=?{(Z&U;Qt9v}U(e7^8q3CGgN#?BL$Q{j9I*3+HT$U&Jn^#WWbVJq zaV+PTyXIUeBhq(Bf{vlO5VyN^TC?arcLyTRvGI5~7{2A@hBs(ZS_Y?`Y7~K@mhI0{ zET2b#`x_QlX;9v_l#W@HEFlRn3)-{Zg-L$rt%t%k;H;tvlS(c!wnM%&lhYQk`W$oV z2THP)0KU1&&y&}PEY$Vg?xS2W7k{RBAHmhIA+~a))y=HdgZ$Sa^z6u7xO(cww75XW zJ7fhvHBmCsLS%BFaEg_&Zj-yG;!<=lLw-5>zC5Gqa+~D)koCuIALXRF#}p=8ujg>8 zmT>*sg4i||eO^+_McawC-MddM+V#6*If?vWhnR zdS*E-q1Go8fbyY;1qBTQ3l9&6hyVu<2Mq@U3k?MWi%p63;j_3p92JL|8xBQS8a2Cw zhI?@{E~l8O`5?TS>mrS0c=|q1_xH?LpAivfv7P=`m(CR`sNQqaqcb+= z*IVQ|_9M(Tu5teK)B}%Ja-RJ5AdiB#n$o-6k2R*RmX8(xRd znyaG4j9Sn4H12EDSi}}B{J}7p6uS+EPvL)@sEKUz@$TUwgmI0k8(1RAyF9qD7e(%G z2)YZ1f6Y!j^~j7mSe+Dg3#k(&d4DKN+w%6F=H-2QPg6JEA~eE&<=|GeUgvX-K4PD* zR`$R|&P$}qoiQF1;F8?z*ut5`2CkXOUJ3lS4`(H#IrpJibwJ_*^7Fbh{d2KXcbO-N@spu`ByU?oJ-wAPqDu zF%aYr*ie;pH23%#VNa$~PfEo;AB}yztXfE31Q{k_FJqO5zR8cKSeW4)m5c;T@4|C5 zJ_a=;(+w0%Xa_{m@c9=}`E#tNTDONG7fDj1BUB}XbDCUnWT4QS8==~{cCO7s6}IsF z%9}Ews=C4~kV_->p_eFuq?xpWUeIL@3;Ra3^e;J8UZiA+_;zeZKc`K;puWZJc9q0$ zuy3%Taeu_o*B|^~NR_TKc=^UxihPM}P8`jr`B&TQ0ZW8E_-K(tC_Sw{XWbtip(ts?J7HS*;dwzmXho9P9gLIrv3-WZ zu_f*UY!RA;thV|Qre1MJ2PN_h##oQ$D8eVop*47OSmVl5ZyZ9 zSE#&cTgQmJVB#>~SWn{+KvYXK(wL9F?KIT52V5Vuaw+&3z#uGh0v9C)8Ca$7^5*Tq zdvPWC3|<75XZ$%<9UVjQ&pj`K_G@z<0>1PugjmjbP2Ex+1~PNRrwbr{MSiO5nd!}5 z%i@8I5*crb%nd;~-`v8dc5zW#3>eJ5n#_|Kbv|Aw93s@D10RqkAJB;T-JQhv)cQ!6 zgtjDlE!)^F_ZvDb&l%ehPVN>$t{Y}aAfXZrGyD=&d%xYRqr>wD@v3h%G~P0?dk1LM z2py>bp)7noG-ql*+XcUEN#WHX2u>Fu+%fhTc-uA;Z{d7Tw~a$vT)~+|bTu5U!&BbO zXReFfY2r|WbbikDNsFHOkzqUCO+g0oX}L|hWLOu9-0e|O8Rl-9j|GYvv3Mq zWjx$t#}33bwzhFPdR(j2^$*@xGa3vt+Osd44kQK#hit+7g}6})8F~7i%q`(`*Vb|o zvG2*;4bUrG!UWhXuHf&jlLW-D;qjl0J$_FLpW4#fMcZ3_V=T<*(Mx{}Ez~@0KUsLL zuy&p~E5y5jp5yRrQ_Dwq@LV^zLs280K*w#)9ze)Tuz@0uS85EgRLm$QobmslgZqxSNI&<)XC>`u*P7A?io33F$bxuX)G^d1FM#&V?|&wos$M0~+(L5(fRaZ6~?Q zpfMh6;|oa))3_1&D-0uzkRPvL0vV{1_%b+3c%3|r7iZHlr!mtVZP|RRpOo15X-H`{ zpyZ&e^Py8%;{;$O10-;Y$3<=Y4hmgOoTAsnSjK#LzJzx0v_raJ#R3-|6JMk%mNAJM z#&qdNe!9IUs+{KP#o6P(92**F?HJW$)>ch&hi8=QT48sLsSL#>vG7v0VrSFL#knF=4Ny4}DD9>77f{O0X(wtXf2 zen!~*ku;;O7gt6qX1tda$AHk7J2M%1G&}K=AE5Yh9FL~xezfg|fLjy}eGG)|RGbDG z5984hx{q+>K9ln#6F|r5ewyLEh?J|x~(SuEi@%^KN{4kZmpnMST@H_T<)BmhN4=h5GuxT8l`b>B=q6c?gM^%zCLtO^nq6Tv-uW})K%Jy$ z!n&qIix`N7mj&7D4toI>#=LF@eq38LG&UfzCW57$T$9_-J*`5QFu6oCMF3h@h{Rf4rb4kG83#RQsAtXJ~dNJtD!+*8; z)}YOC(lFdDhTChIVyXYKhEv(1r@H@xRks@Z)*bYpxpMD}9z%5NM1*kg{*ae) z>?ae9a@$4)n=kd>(#N~Js(_@Q;4F@QVO{le@UMO?8GTrKejNSxDl=~!<75?zlOFTG zZI2kUpPTaeW*n!r4wA-dXAo#8Xbgljd2H2Qc)J<)T!}K-gi~lHIv1rdLTs04q|S6! zTSsb(+ugHdzBWf4VEgp<@N_@QWcU{2dj&MTr|v=gOA%PFUQxB^c$lA5Fu2mU2u*tT z*>S$nZzj2_9mZJN32E`=)38EB9=hTh=2$3+PY7D12EwpUQ`Nv&JvIRkt_OGO)coc7 z$h;BTS9Ame(A}L%A0i3et(N`Lh&gq`dc`mIJ|A+FBR>^`bLx)YD0$`6Ehq;aNZ}Hr z8Sjd-KUY)V*Ruj z+J)Pn<+O}zX=~ymro6#W!2KAPra$3Dn^^;0LduJ2SFe(2{-e$NQ=!(5ywHD8r7aeU zDHIiE_?YWGza?I69glcZCduYFZG*a%jS|p-<|4HcNrKa)i*>0_$bxykY%aDAn_*gn z&-D)UPZqdVAVg`BropdFcOSN-Dh|`m5|m`J&Hd=Hgh~49HG5>i*?*D;O2)fpw@Qcz zNKq0n2(eo|3O3EZ^RfT5-SAcX%h`iK-OU}ex>#EPBV4f#{R3^Mqf{znXfpUBU$F2$ zsC0TrI&`Y3B7#OR%|s{JaOz#~%=-r9sgbn$sbIpBHOWCX0R@<`(mBn>`oh2so7Jgq!{`BGeItTiJXQ@EshyMPV@Y zDf}@!?goac`|IA2uD)EXr{?#G5EKX40G`FU;)Hr!$>zbN?dB({7Lp(mOkp7$DydEL zp+24Lc4?@W>sW-l9$KP>qzyF3FxJtXWz$h!>Q2@4idKC^>DFHcup0;Cn06J?0(4U} zFRfPvE+iWb6JQ4wUK!CPqQk11W|VN1xAEIiKRscP9zy?XG@ev(1S-8%W8> zSQPV!t+g`IP!Ur^XY=oY#jh~!H=NNOtGTYuCw;59%AMFpWD&@%LzY;dZ@1sep0w|X zkvj)Ux~ZuO^QfmIMb;4=_}O;23cq=`eU#?2O7t0PS=tRq8))zZ0TQ9mliWn?(IZ4ai1J(4A_h~|JYe~O*Ow!}J0 z%Gn~j`Pb*_=wUdu{5IL;&Ok2Xbn5SgN-M2QI*J%otlI2an(CB&^_B!$i7;4%Yb{u1 zTLp6cV*AQlY}vf2g)7e_LiAGMa&DYut=W@EZm9b6mYrI)i#3-}D0HjDg8S`+td}F@ zIB6;YiPMSmkM`y*MhXoI754Ueb*{1(9fzMQbB$9#iC2_OSqy@3nx6tEm7Dg(9nXwJ z!TwI&Ucg%aE`=sHAHSdcgUfndC`RqaSty!DUt&TY4z;9k9luuaAW{=$>S7niH90(T zYN@wP%7K9(5qfcbU+~8e(BSKcVhlUVj=}HI;ShWJC%c}@k^rCV4sTV$B6B5V%x|_6 z&QpCjqo;;=A5frRP0qj$lotI7+VxTJTB4ReS4e6y4%$i;r_7$_>8d5euNxS%&6)=4p~*AbH2hd>MZtd=Rg__}N-}+O9`#o)uNN(E)rA<3+nGXqjr-?c z6-`MnRz&}VvHtlP7D?o~VmL^sz8~8(r=m{fXakB#F~5|Rs9;*$10#8-#=5ME#}Shq z@yZ2fZE^5gBIU%|#*Nsw`=RJ!VxDc6T=vJkG32A#+iiK9iBSd5iD$ph0?xN=;*2xL z%l0bqL+X5gJRD2sm9tcRYuHY?v#=Mu!@`Xpw@KjGy{|4M-8;%KEU`=D=mB+~NrFOG zyCdI9;NQM!68s0XucF(~bdz2@98icIw(^}@W?@NM_kN41_7_^SYe&TK>mODy1L0uYEz=FENyDE5P13c3skB0WR54+dO3ON8G{7Ms?30(OF# zOh0&vrNULUw>QbDgfIu5_U*D)P{Plr>6u6fCEz7Z1@!aMGgM zd{*2Vq)}nEf$97YN@g-bF*+VjGa+A)nmmwu@6+?O1vf2WaMr5yb5i|I!9v*q|8u7K zl^CHTNs%_E&rKl(F{e8E!OL8qVcMcZ@AMtLU!^?rwS#_$+>C~}b&`L2>5 zwR#_l)JD8bY1OBV9$%r5N4e>tCE+7n^kCS!6n;!Mo^ zMias{_MB;bLT>sj>mE-pEg~I+9qTq}-vHb1mX-7!?V_lkRE8^zpZ$(%Z8!SLaFvXN zg70&EU&x+v06I#jz<*FQQ0AJH)6nq^{6$)A8cjwxLTMhM4#_xT#wZ?rS@_YLGSQ@M z(Y~rDKtI@rE&l}31=f#RQ*pxh{3K9>R6&_0EKV+)lrdvyvn|l#xqH2f6AkgXRU)F3 z#I*b_tcOP(2Syji-GN#A>UlV0b_f4RreVz1zab*6!E#$`T zkn}3*2e^L$i3VCCE>RE%SczNvT7&mW@#SG02tDq0<0s@X#7wZsFZHR>r|eDF0;x^9(=y zpgd%fKdfv?Q+&qDFUsqhm(zif%Lvgj{!S=I4I`W~&;@BPe)2u9fu6`t`pFDzUp3ZI z)SB0rz6s#!fAtrL2z2&ObygcHsAc%vWMOj1$<8_}k`ue9fzSbev zkb-MlN&B-&TaU2t#UFj5OY?(>FLWSFJpB&UaEe6iE?LX=*li)zJGGe?&Z|iMeR>qE z5VmaoF^HA417$lid6H$>>{pVHH~bGqAm8i)&kyPIBlR1;)g4y!xsIuR>_yXiOaUrj z-=noQObPE8`}>B=Z59U7VQq6fUA9^++$lU0W(qqKP2=~fTxBwE_;89iazmwSkaY*V z7Y`Vr-23`~j}?n!*79e0wksY_F1EIIb0Lt_{{v7LwH@&%iQxSb=;29Bd;6Ogh3MsB z5|0-;C)W)U6z-3oLb@pEbazI8X4nE>veS3oibZbBe*# zfPK^nmqKIApvG1;UZg>+u=}M(-~S6$>|_WkA(7A5ciX2RgCKn@eUb~`mg?I~P_jq)BxO&arz4ffPUQWoaC_@Xbhi|sxL0asPOQ**YU z1~r;BbCFDTErPA^dE=&lR5KYg?EG6famrHWtI;G0tr>FSQ+yP3MXH&?xYU#Dm!BQG zBrI)u=>jZ)L%bjTq+)VvJUnG5p=&A_Y-6~k=*k5utvBTdP6)Qz{V$V6FJEi#wWRXt z(>V?9HiWFJOmOze!Tx+?Z0=x|nAX<_Ku!zLh@Hc)vabYbvl>@W%1Qg$dp+T+XZ+NZg zoMI0~t)m8CvOwbn!v`M(tgN1+uYR9(kTiI!kP>v-!@M-@#Z50M7-l)JYc{0%)lmGZ zP^!sVS_xKwC_9E9RdB2-ZfU4)nyUlpFr6#|ZUzLnVW7-nx3 z?1{}mc{Sh82DAw%^J?<@FNq&aOvCrLr4O@P_Wpn@p;A%X zVgvY0I2Tb<^;LT>ve<*=Ovo5k@Glbd>|(ToKX+p&G}31s)8U5|WGEVOGq(t3{q!%Y z>MAPFQR9i;CnJ58Jr+!g!nE0nW=-8aYZ(1V`WdNP!*4&9&uG;UP$6h34H0)KHF+O! z7=g<@sn{L*(3^osT2G~eit~8 z&AEyld26KBg1mU&f;tacQ2XkQ+5}$HGOAdC%zu2vn~nX-xfLs|DvgyPaOjvCBfzDg zaKSMucN!~$qCGGCErzBLgVcTJ99(i<;|uHd;K^@SUVp6h$!5}s zFmv2nb}T*=#lGgu)PuoztBAKY6Vbcg?TP`xv(?%n&sY*}<{`ae5<_w;$2i3X&dZ>% z;8RrV-;(D>j~x%Uyh@V#5;rP$+!p&bX4m{<@8o@QZfQzs!DG_EReSzA`wHx`vYLi0 zo`Ym*!Wc?g(AeZW$N3-irnneTGw5U0?t_|?%;&_YP^7aEQR7Ogtny z3@sGQc+tRa?C#P=nyV_cVbQ~_WhMPvZ&Jn&5|2LRb=Ckp+W-_u#?6B_9Jp7yJRLb0zLkhVo^0C*5`oX zCso^_p|L|BE;QT1(q>)-;mps|6bS`pAfoBkx~^3TN9CSo*x2@{UB$(=7tKokk@sWy z)Ci*++djtD*b26<G6iIPcCQsD+qAja=BQ3*Es#j6i>`lL>6{mO0(`z)M zaZ00QEw3;S!^Ur!_@ATEkgtR=yEkVnN?W*j$RQagF8IOs5nYo;0u#xf3mV$7TzC%f z&Vq9bny=gQPh%@br!=l3J($`@1h~4#jX9$EGK-C9JHebX=Cz){_)s6C9gp&fh-4co5YHzE)M^$+)&&bNPx(c6?O1nP7@Gz874 z9fuEf)mD@;TRSjK=aCQRMsfyIo>m^qN<@jw&h~E>MJ1ksH%2Wp1dJ<+YKm<*#R!HmOQfQOhWWaP-FU6O~$-?ciJpkRP>n4TjFAYkPOs0R>&z8omty}`75t5$ucN&{eU{d&LKw#6PG0= z=I*eC0Aqt*9lIn|<>@32z)NS|Y_O0z3-wm#whytRQbo4Y8iq&E_s^|VcA({=#2_q+ z_zhU*w$9Yeb6j^Ay#%e_@tTL?(0lqoYVsip0Lw*?d0XOS?(na&vNDKME%%iT(;9Pk z3}cTTa;t9eD#I9vHM`Eg>?<77jc)tNr+Z}#+nc(hpt3Nt#puNBN%A7dHBdHIv@E`c z56=@c>kLc?cqIU#9a{jNS5&AY;F_U?h>3-vTE$)#48-qjpKgNwFJLWi^I37lh8$Cib@e?j3f?& z9xyIh`gOjIX-VP`Ej>O(@wg2R+Pb|34-uY+v89Bgp0%TE4v&hv{a1!u68>4qQ|pC? zOG&ps42zynj3pk;5t?RFKLP0KD7+A9i<Z&$KN(;sDTJDZzGGp(YeP3c=TcZb`d8ll(BN~M=oYg_PFmyCO3L8D=SYpBG z`q5>6!A0aM{eb_9ne&?RsXnzI`%xOEik}6wmjF?qfl_FU*>A#_&Ak*>B4Er}1i4ac z!(+Hp?N5V!d)8Jm;r1Y+{#7(}`IY4R8llb55Vv;C9tSL~_b?o}JcuNsBIIRO)OZ=v znvVZb?Zy#k_WJbnyH4aGel0$yv4j>Ke;bh`o2sMkD7ZRy);qcIVWcAuds5!Exjs8} z%M5+oVrs%s^aReb$EifgmLPGt-6?iwvo#og?=~I@Z<`}VR1-Z0Mu%$=mP_A`i6XRC z!PA;|(T3#*wa$bIlJbdV|D|trD144tO?mSdf0Z5qrfPofsoR?@K~kv4x?Ri6)|0}u zv61LsjdnSdC{uhSm*TS=l)?2Z88z56*XI`B4!!ED>1obN%+Z85oQ{f>6d+G|OOp-8 zrIwpHcbJO=A3XE+whpuJq2RaJAx-SPWp2OK{L>!vbh&@T=Zoj%9`G}MI#9=eLEq!R z<(!31a#xg%M0MC4Kg<{5+&$m!>x7q}HC3d_~;_GOdP}-%YR~ z6vtO4p(y}kx^kCTR*$*4E!G&Nri;Y&%kkG`WEKSKN_hYmfGT#ia_NDhp40b2=XM>VzT27< zpBeA$dR^pIsZAZkJ(8gq3=GvFw#pfab9cn@*p}aW!8-J{N?APF;FHRc8^6hIgee;& za=E)Jpc7@EAy7rMCACx5FIop2rJWX3B<7dqhL0L$s z@)eat^vz3h%@u@xub1Y5Ntw4i+5Xh5>FE1T|2wZ~O6 zB)^2Xi`eq_!!ZgU&4f|UB3+fq=}mtC0|K6Ht~dyvNv~*)=b?*jiFq5+k+k@hb+EAb zpdp33IH?{4Uc0zpts$8`Ma-*W+d_6AM772(c3d>RSraoT%*38-WpZn;N}eZz7gA}* zCr94=8C9yKQoS~eh&&4~%)+BdTLX2x6MgmN4;kjr_ob@YkGRuiad6+lG)Q7J`l2J0 zwT%PuaTps5m6Gsl_r(rZy)iD9xzt*}`!!n?t{U*jB?%UnPTC_$H{zO9Qk(W@*lA6! z)!?rapmr$Aw$XaEpbl&N0Cyd{~ z&SUht9VIB;gt-1JhaqJM9LRGOl#EdAhEj>WH$2Qwib!uTnymhL7c2J6Xt$FcA5=$= zc2%sm%)Qz6Ko_PtWba?2E|-^pJiz+B_%#KQ6sJ6u8BZgw2sq-Muq-M|I%jH~n<6*3 zw3axGAygTx!iNi`&Kghl3@UO&E85r*awC22boY*TqQu%~?<`+oov{4wFUP-07iO7x z$)x{;=mP+@#$SqArut}sukZ5zSo+F557%)1ekuC{A8e#P4 zA+gaRjnYVr?(S|-Qh#^k`={t>0+TI+M~O@)lTwqfqKY7>z%V3^uwPzZXgeZ zjUe*DKJd`ZxEC8&Ba;Rciiy-lbWtugLSsF*Cu!%YEW9JaTg z-or8B245)~jQc#&72ojU$E(~{pE-6qe2eQ0nT^d$MWfZ_gAn$3=otgqx>|u^XM~7Y zpZrMBF7!XN0H&zAI=e3#2*``GJrke0Bx3-v5G*6Dfji783;hvu^mN;`vV*)B4h%tXVG z&PGFbPBpnuL^Z&>2~X$4hl91OPgcK51ZA8k%;q#&R|d7lia_!>8m#%y1T?;F?F{#D zS;h-R88RrG8&XuzsL%Ips?!MZ5s{lmsX3Nm`}uN?x^6T#eQt6-dWbLH4iZ>4?G3yC zgiv=P6IP~g^I&}sWHjbsM;ZsfgTDN}$R49Er!&$Ywkwr%u@3&_V#=kSMZn9`1(8H+ z^6(?NV)BSd824xw;*zEa)+&Sq*LSggVGLg4PGx@4I*Uu1<5vyn6kv37q?8cLi!Mt* z@Zbk%9+eidCbm@$bYCl#LAs-qGv~FAbC0klSo>E-*?l;g;z-sYGG(q_A9h>9!=&eL z5@?I@+&n#Z+nArqkV?{f59AvANr#h5b6fht=9f7&%lLaVKTeTGw~mET)fa_9MExXm zT=qU(*?i6l9|Nu%S-jDT=JDs&AlU!Z3o86awXvlr`~5Y_8HCN##Kj!)-ktkt^~xJ} z^O^cv$-U_haD<-njRRJ)0y$z5>iu)oDOfKjuvRYD%!Rb$Ufoy?o~!nt+^Cz>wmOuqxikq|62nsJ)SQ*M=zs%&DFdYBP7iK| zWuad}BNm0@YQg(f&GKQVEd`M#ObhGKXR9oKrfZ#{CK+xa;nQ6|GY0- z&+*5OxlT8SKNIJ2{)cwK66|ok*NB^(#gU8eJ2w2xHfNW-fw|!3I&JK-t^% z*XBl&6>jd<*1`x_CF_oB!<<@Sz^QCI*4$vtyPol``E?;XJ#KK{=crWcUn{UB-%h() zdhDt9LMU)Hc-V<2fH(OvV2I6agrhX!&c$Xy6-z(tofl}e}ALLFC^VuuIFgpP9?PWQLS z1Z5j?gry1|xY(wMHRZZL!HShJ>R|ELvX5`8Q&LSi5y1C{rTH0nMh1Xcn0;3`7b3zu z-zeVd9$>z}8Lv1;x&1S`GwwgM7=VGXvee?Mbh#tDyjin{x7Hte>a^)eEKS%t)kHV^ z0*jtMaKdQVrfVKJ;dglgX;qm4oGyxlP#8uW!Cq(fgRV_J?V>PY*HXtTp75TrVU1Sv z+Q8Yov}{7ZwwNCBeS&zJQ=&J5^J>-`Y0f(-3e?|bq$2HFzC5c~aC^k)wDY~*vs`H( zHXOE)s6OW0Zl~l#m&AH?D%23b%>Mws)$J*>7jaA?>E^`ds&+1qZ8+&%IRE*jX%C&W zG{19FAJ}6pvalDkdq`T__#fI2=i8IK8zrZ2G%CG7@PRnu2iD%LK9m_e+fn<)^X%ShNqJ8ed!0hyZK z7X61(554XYBdC^EN2zWM3f+XBJF{hmL zed6@a?g$qtgLC;u`upDCYx)5OcK(c3wumn;mwfX3u61ma4KRU4J-QYO`j7?0I=YS^ zG-OYmNp*T|SX*9wGMD9rbKK0#wfCT#@5SE- zwzfz+qXZZUVT0UP$`X_6Ej4zLUBia=e21AXhy$pf2Bbjk>z%o%5@nkhD{rX7BU#f`pWjU@#W4G`>jgP@YMuNcv-wn3i5^>09db9>Baj{u6K@sg*>SUx_mGLC@ zY^hSaFeQJIS}8c1-WukBRDqHQuF2BRs7)U^GH>0ur`F*8kjyD+5=n8GpA)7#_hGrH z29u9$TEr+u-b}Iv4RGwI&!d&Io@IMruT%1+6qC^LH_h~9uGXbF1>P)z^bem0p8TAmR_Mk_TbwEvtrZBXWD+^iUp|5*B z_!N(ifOvx2{Hc#MPdiE*0y;&sKbvLO9h0k;XrCX}O%KjY^=!yCbSgHMy|l63PbBY8 z^FnXqf}FcIx@P`tfUO&DNTHd^;yJN* zu80MtYsW6oC}1K|K(CrBPG~_ z6&OI$G-D+zYq3k|T!>pd>$uOi6T0|JOyUvkuUuEUN>(I7COg`uJR}NsY{eQz4G%hz z;|K!BxT%-AE3?O~Mgc>-F#y-Fh@K6lX`B2k8uQ2KAF0Mq#>`d z(MPS|N-M4QL}sh;k3L9UmEguaFJBOL7gUMNYhx4+EH`v)ZCPHxGDq>7MU}N5T$*H4 z5%4eZ)cI->q&2CnKHBRzkQ6ZCwfq$LjZ}qaE~k1ph~)LT2G%d0*WMLffQvyB zh!*X+G4Rc=+ljWsX0^l?9rod}>4kr>+l57TYgmZioJ)k$fcfebl1LU9n{qmORFZ#1 zzHyTFkxt8p7k;8qvuJl@Sxl+~vk}{={5nGX#H;Q`$}sk~R@*hvi|hohJ6rE-1S2ug zzp!YAoBzC0MdFY&*3FGP?f!E6CZW|6A@Re8T5!KZ!j>ofcw2C{?3H(>2HbHoe3D?G{)4 z*pMh&8p(3TC+>s-<0*qS7I9oPHi=ZOD5^zRj%y+gWpeXy*pEmj8lg zhGD&PcCC*R?b{VpW@|dK-mO#Q?7ecH>to@c0TL3gT6^Ml%lIdOf3x+wd}VgDZyaIl zZVxOWWz5m^XdtA5i>|EiBTkl0ePoJGk<>S9pCU*#hsP?;?{rQ-3rwr)*ZA4W#}h;i zNgU2D7WS9C2wRLX4yc*94-staKI+tqBN;fCxynx#8XJWU-b@SwE$A36UVIrg8yO$Y zd-YK8n;>I|Dw%BIbANfI*TOZwIY5`(svK6Kl96GS=-rNO6pOM_I%3{R!#R(2B|Z1x zSVQwM8O9Jq;$2(=zv(44HL7tci7d>The12n`K!}GKy@QcF57Z1=5v08d9k;t=WcNXmdrU3z`Sf_x!<$w-jGyx`PX^tDz{`{ zBQ3|A^IFAx21_f-L`y=+wW9FfY6gIm=3Q+S~dH6^V3==J{Hu(MiHx9X~ z(_hcp z!+&Ul6X&hlB##Af-yeAOI?({lvuNC1a7eRJlB%i#2LL6Pt=W|9lLk z99Ky9ChvG_HM>~8w&X{%;eBOF+)SI-GGtjaJSSoMUIeI07eho0Bv{5Hw^7I$(^ERwKs6_h&`5_s#s=4d zD0J?U*c)grQsg(GoMK+rUJyCTv<>i+V00ZoJ6gNpfix#`T$qh}&pKi_@UoYOo1DCeN=&E;aRD`oaxNoIez5%bQCUxw@Z@6AJENq{2o&txJ? zhs1iajP_j?!4PY&Va+|fYh67;4NtY;?>rHpV<-oYd6|`8-*wGTA~O1zd#gpeN~Iz2 z%8 zuainxP5@}@=d2<<^;@(d8=wy8T#AmsPil~=%13&N4||IEyreXAh)0l9E+Kv96sJ)R zwdCYG_qh}8gLqnl>c+LtjCA7^3Gv0R4#{tZkAvIqZs8zKPIM)(0w!@Tv$>wDJ{CCt zf-iKud6a(1Z))9iX;fdG+5XES?_Kgu)?e_)ois}p+SjfL*x48DSJwt!okxbpwPr1- zi@h7!lj9Q&g$ii9Xx_Yf+)T>xcO@le;GB;VzT{n;R@EH&{>|Xa33@#d);+rn*NnVt zrLV#TjvYL6#@yfo=waNmC1z*VT1L-}#RRl+x$^aHYy8-K4Lx)d&sYUA8`LR_uM}DP z(R?^U=A=?%6aaReqcmn{XB-wIoOB4yjz2p8XsCs67m1q|C!}ourd}-8hN1V$^0(*D z)t@Jff#vcMwDnA4->_aFjuUUrqzel@oeX!W7exGXZj5s|KHtKrs3n&e;C8oWP4c6- z@ZH2q1I~lroGasl1Vh0HniNP{OMG_m#GKkcXR9&3*lIVIYD8&+ai0C0hU13RF4_9Y z`R`jSghJSp@fx6quhgbzyOKDNYv6&8oo6Ec=_mB5`GHG>h{#;*fhUt2ke|(ivvtU7 zb-rb9xDQ}ES5N9#^&Ef9%&=_7M@VvxWM+HaEv1fecO%O&U8_jVs09)_gYf*V-01pu zQJV)iEp!a9Gu}UMbVine#>3V!&7{s{Ela`2UmYBWRVNp9yrJIeWf~Ald^&-3mG+#I!b71shIA3l3h#$A-nYR7o zFrc>0@d-$U6LV7~XwbqC6}1ajGFU79N)Ol40SW_0MJ=H-kOy8z4NR|?=;_blC5Soo zjBdkkEm6r8l0U-;#$MlExaPwv8Ja(-3lBY@*ipB^ks5WE{H|{;F%#{?S`#eJZB>Rh z+V@lEePy7#Z0*+unOx2{2MmUPQ)8;3l!=*SK&ac%>Hw9*4H#Q58ow$FXrLs(@6Dk@ zsERiEI_@HPTBm~mZPoTWxwx=@6H;iM4 zZDFGrk>B9i?*>`V#RU~`N+zKxF$>kboygr!aWF_q$5ZijGeQNU!>B>mCQ-R-!4i=42NC-Ut1R@`309$brvlzdHbo+>KrsH3irGpnHi99DRZUG#4EXo&A5rfBk|B@N?iUl2TRj=RTj7zl`Lszc z*DIYzy#LV3!jdS~Ui|jd^062vMa0Sszu4qMq{coN2prY`-h0i|aWxy_xJ+ z5VgFW{JBhiDwh1Y4Yy{CPjBQ{b$P4CAKv?x;%!?jDEbp&z;`=o z6nkY8k~Tqt@loD(%Te^Pii&HI1UNY5z)kH5GK(LafpxCF)5gd50<9#y^T)jgb7Ncf zH=FuPRz((81dJR%@)#T9AOYqqiC6mgCQPcSnmJn>QcHQd`U>eiQo`UlUgwflh1hW)trtxec#(bvtr#A2Kx>&yjd>e#F^3j^BeBgo zP*7XTu;=T|R=ll;T6-_-p=(e^4wySUkmv2pn@^0{o6(RKNKM5AzBJiXe!i(I6t2)P zKb)@an)wM-qfp6Qq}AN46w3ylr%-ihv0cr{N3nt*$hl!ZjVUXaAH#vOv%;W7P8K~n z^7%xH~qF!OW$V_}l>F4~s zsyXdGJAV4oyvWq%1f}U_O$IykycEi%x3&WFt|GMW?0MY2*TGGBLOG&3ZyQV0VZjW88nLID9 zoy&zen|e^yJU;$AhFrsCbo{759$CzoYgHB9pQ2W-N+#W3!iBCcGpK0gS7ee#FASZU(P92N#3&I37nc>S;gHJSrAn?!ch| z(OgjL)<3JN$^Xz^6Cp(}l3!8^mA+4B#&P)KA>yE2N@UGnY}~0A{CaSE^sC?M#=`h zmcZa-^isr2EV<$6B@T8Wbh9vCCXuf4Jp1Ktod3GQ(GCmd5* zP~lydfL)WBNw^8|4ViOFJc51Z3ER@?cwHTh6cW~do9eUB3BDKJ7Bvz#X=5o+LZStX@6 zINMa>v$GPF`#a|$mV%%rQ(8d!X#J%F>%G;#GhX@w`mqGRbsKUs^A{nuu?0ewejO^f zqN7hmi@C@Lxai#E^h8B-AjtK=LConpN6v3>WLlkm`a^W&_NA!VN zEZCswrfWO4Qt&0D?i}#buTg5zx>1JWJ^9sLLv@|Nl7r*#`d9k$dTJl6$UhpiKt52C z=~0?s?S(L}iIKl+S@hNR!CV$z8)I6)FIPZ(8)`STX@M?;q;%o~n2D&k-W8sM-y`uN z%fJ-GV0rZTHN`ZA#F6$5nLqeZd;md0Xbm8sqZ^Cg$i|lgKYL4qdt<=%q#nraIlUU3 z9fY`((1C1$coeoD_?Q|&e8hF&5_5$fAI+hNz;@K(EtjS4#9te#5+$ zn@1&C^LFEY3FAZ2B)$R$L+06$>h?J6 zU+2!1e7ll7b?w2u6c0hCQTd$--1+m*b)y#v``u$nNDK? za1kzlXXAB&07Pd1(ChVP#X^Q^n5e4lK(GwD*JzK2L}o_fP|bj?T^(2>&Y=#>XeFBt z)Q7jgEaH-8#E@epNIQmR_uWCBtM6}fo&`ywWJ z$l|IFI)H)e9FB8pdc+l_HF!2@*UEXSobV5J4d>(sc2zH#Sw(PyL{_JMcv}WZFVGJM ztMphn$#AYIc+0ur{R-e}^LmRk93Qq4=F-=bmg(xzRCq@g6`A7^nfL23!4b0kTIG*E z{DYzG9HaGP#+#`*9iIR`S;*5+0HE`Z@}?y}uVbSWgJ;0joqW6gV$C0C3fC}J$4bmq>MA=Hi&J24G0Rrzev!=8)pj}*^a3t2&$hfoWP5tzn6>gbIsC49q zHzgCTtL2F0pVxGIqB;;1jnw9^;KnL#%vn)DZ?O}^cH`_4aRX#oboh}uF*~k-kCJbR zEUzh1y98rU$)O}21Q1`t zv>@!xZC7$x6O$w#!{+>Pb*!%SQ~o3!5yvTjG^^E=nut{m?5EEe$xAXGXl--}R7`uQ z>9>Ia?S2OB&T=3(b_9r%#^9kM`9HK(RADI-(9+*UkhL;Cbq(I){=_3!!&Zg_a>>Vr zO&hNk0(7b8e&voyM*u}Z>3Gl{>ywHFdh9#*|8>0yD)Bpb^)eb1e3bV!XcdEBi7fl2 z7f8pdP(29(tpThN`%lQ}Ykr3E({hW$E?<+F1@{F}G}&;@#RUfhk+Q%7@RVDTR1*!E zZPfilcZw-{BWvrX3n^~4S<`!fvBa9zLQm{nsm3)*^Qs^;*GeB8S(Wtj_Vo`@jk7Ey z@Vv?1HXLg>bfq&3<5vLetumJ4CCqC4J@#1#+|qkr{V5jp-E39l*U#RF-%!C~{G5|y zG$PhDKJRy>ZX-5Px@C}oQQZ3)?CuSI%lM(TUa6`q3RLQk`=^2Qkk&zb+t^GRM4t=Y zqUAiPf$zq2i8ulci4DQCgLt@q-z`!W%=}RRg60B1BvJ?-X$paM5TR2}O+~RIaHKCk z{d+S2$THj*t7J5CV?{p>jUKca-*2k438Pos!;hM6>Fl_s`Ua(Gp*RYkO>hh5eJ3{64K5e7d+6FVu0A=}uU zSuA0`jQV8{9dIz_uoZUWDArM4+L!!ky_vS80?sas&5YKnu(a*^7Ti05-#2e+NL!6G z0R4@P*fBd$pSoF2Q5k9?LJa^IZ^~P-ApYfFu25vkL06XI+!R_pB)@2i;Gw7vQQ!jU z!6M8|JoRZR?X220P_ZX&dXh(Y(J;ua<)N2A}Pz3Ll4Qx>{1bmwETYOo=Q^z08+E*M!AcYcPq*)U0v_Y~k4Xcnl8uV@ynRrZTN z??S-Lw_CEDsf%#8E91uyVb}7KbnrRH15>#>UMi-v0p?E3C@;B;ysiY|ePMhFMo(qJ z?$>W0E90&%%>C&XX6Mf6xGyla3nPoX3}g0zZ!rF-MD9HBcltx~w}aqcEt49&+UrrB z8$FV$Jz5yTH;V-Oqd$OHlU;zr^7p}Y-%tNT^I_97=jlia-%L7ax<#y^ursx4bl`|L zsCbNBWQlox2`)}{@+vWgKx;tgO%Kd`dMKU@^Nl?pPkbt=46Ft{bSDIrOx=+KuM6Uz z-}A5OityNPwl0t~ICxJP1Ne>Ow+*m8a4dEy*4p&RI*su$1}*R}h$5?0=;=)a%6JC; zU%q)vsOhuZLt2eh!aig7wo>o@IBTHET5I{1nlARhx$1PO*!Hh;SEbBlH!Z~Zi8zSofz6d8n9J(%SS%QdCEu?z?y+uimBvs$yB*037$ zJEhO7qeiNwMb|Mw8yov9Anrus{ab^UTD&+Xg71?=4qn!{ zkx&zYMi8fr;8m}8H`1>QUwS-M^d(@QN#7X8+!(qTz3=g=MZIu%p`WvZV@^Z1bH!1H z4s?3l57=XC7mljgJOf?;#L3#s>}FjfAgT2ePSgV*HYAmy<+Al34LdE*Bcm+e!St`r z7#|7UsF$<~dk|LFjr$=V0+t?8lx}*<>Onw_bJFWfC-<*>yV=v{kxtsQ8?nPdpuQ4} zEkUAVE-hQL%PG;Zn9#^{Aa>0@oP`*1`bSkUaV_Q8z*+#4c%DTkpak=Lo5=CWUnEw5 zqkda4D4uUzI7q^VEcuqX`?5SE1D3<#!L^`hmy2|7D#Ye4hrPkp|MqjsMjgH?0f+-~ z`O!U}4i0N0QdWaR_3=9u(w2Pf>Oo7W%f>gP6+?l1*ePInAjerklyHqF?PxM%bEN878tw>s%3lDucd8~U#Y^OBP6)!tf%(FW{B*% z%d__4U?0jtk4>ilw?k}vNw9s}HM&W7shGhk`|1q$j^%3m+XZGVoF{g2pC+C^`bf++ z@!IgsW~~2|zO{r1E};u&Wt28(7?UlIQEf^4Y=H@N9d$lq2j%y%^t}0(amU^t{aMAB ztKaIdrTHrxqCafd%KTrcD({u0|EnLU5Rj&zl)+16HTU7Cd>j#Z;3KWeivOcf`A;LZ zY5{N415!jE*^LnOtjgq$tqKDuKVTg|HGX={781S11<#9FedU%1-)MvUIqEw5AlXQT zdkis+UGjKQF8f=Mf0Xc7ii+%Fvsq0{9QT4Pm#AeY1y`}l7Q(ZIxM0P?$xURywT$ym&pl9>!A;OYn?Pk*q(god-pVMy{ks=mj6RzJk8NvwMXh1Ood}#oQPVVHE;HV=c)l@stH7k?{G>aRi_5 z=acNaOWdvatT8(MeWxft?nLxY!2HSId`Y8eB!Fq7BXOL=k;Lu(D}j3{2_9v_*c3T! z0qyDqWjWZXLke3i`A6|Y6w6;xu+VY66F7|3IOB{S&~pQRb!~_SaveYwOC>+bA=11B z6vG!g!Bi@F!|h6->d>qhE(*%X8wskxud?|UHoCKuEm_KxYqUU+Q74xwY3{C z-Q%z1^WJR@U@bmu-fxeXHIZ(_yR2w<>de@G91Fu_f?E!Gn{Y-0HPrH&xCs2bJO}7b zvi?IeTrxXkqF0}P;zMbq&_cgJ#i^j@-@$0;N>P^G=6pG>J$M5`!!hER84&|uU=V&OvTC0n7VVGtw+GQ zc1_&Z_?$XhOH;VJ_>=c;7Y$UzOG{951@<#|>M4rZN8L$6z+z6XC@428>NFqXnY~}D zaNT&DAyCTws~%?h?=^9K3u^jDefM?m5aTzOW~demBZv>9VlG9WEn&LwGPT7fNrZFK z#ykmwJ17RDU@&w=?bTtpX)QHYeWM13^`&v{hBJf1tn{n^tB{c_>!2~o&3WH_3WDJt zfO=LNFPDuUf(q1YN5wN0%{QxW*3@^r|B=I`o|LJPDyJ7Igt?Z(%1b4x${i}Zd*CWY z#Lcq9fkk?Tr(y;u2~XjslYHlW(42?j$80Y;?s!}1c6v(H33Lf2kSdADS&5Dkj2hNy zkiqlk`~AKtCKxF3De(xBwoK=1(2w|z0tZr@oL5;WYmGYY<8a zRf{Y=qC~MXR8gjR7~nM+p+mO^P=TP%PfnFlG*9|c2eH@tDaq=McurP{TE1GyfL=%j zyB0Zi39EjH?oUz;A4^8}@bQGey`dZsr&U=yTjC^WyEM`ktVKIWoqa)E-9>2%e4^R`VSKd z!_azciP;7CUv}R|}v-T01ey6SOd9UN!<9?WsWXGl#t0HqwuC5lP-`fsH z?S6@ukssA$rlWZ|p{W1;vVmwZSx6jlLUO*D-3U6Os{Gh&p!y*4+q%(_ixg*Cz!Ka9 zqyB+&N$Ix1`9tT)v9n#Nbh!v+@BrnY6U6g_w`wLJU%7hYJPb~lA0}pmmSp3HMtVqS`})SOrOwWZ8ueb?_+U{a3%cEZe|i) zKNQIF;|xZMHbP%vQ+Pk>7hdDX z61nr}*zA7ZK*rKS(Wo{))5=Hnv3|lP;PFZ6C3w;!L-~*%pJ;55Jt;R1w zpK$0cA^n^b^w=uY0w8?HY=w!2vxUXOLZ5vpg&?jsJAcD2Tg+*~D#Gl{RHCzsZ*EZl+Tw_wcCFI5w0%Zj5m)?)hBv>k zdZSK$MH7^(Hi@6~@5JSFE7miY_ z|LCMGZ+|gLc>ZxXb~fBm46!X*!=F5z+`7pCn(ry4SY&d82%p)wC1Fmb} zB19P3pqt;Y=5Jn76$PM7Xlim^Qnv(^As0UAwjA$?;T_jOd+e2B^{mIQm|0f)XB*6g zwfMT1M7g=j^G7B5&)fJRCrMwNohEiGk~OGIs$ZAAS1u(9>6a~4r^b}rZ&}~j{#+Q| z2aUxozb?T&zjyR-A<)os@_qC%&&}72Z;J(UCDBrzwJwr}x|VkDPABKHypvNg&Y^yf&cYDL6@(pTHs zGqcecv+RZX?PC?|oOh#sG5Q%=8`pL{aB%o9*^kOH^-_Q(Hc~YtLo>4!M?y1NY~=Pp zx7@3GEW;}U6KnV|?p2pCq}|jbp7_Vn^wD#9W32zfimdgb$)hgQ$j)<2*4DSOy8M_f zq{`C9dn#j{)0Ta-sjyksvH#G_x684oY@d1C0rdC|_x`K0cQAMyO8jEgS2}b5K(6fM zLi)Ii5g&gLdwy8z6Gg}JsUl%$KC~GkTOhbF5PSkAj;H{zvl_5y z_86WIqg+{3KN=VCwJ>}>N4q*ht21t;ee_nSDMylzsH~gS5K*+aRRHa*|f9sVr-P7{-7NM{%qT5`=y^8KK5Wr?@dW2eNp$lYa5dS zw9d%R)|}V>{Kh9NdKazQ??oHxyEqsI$I<%cOq^xLFgvn6xE$VA4VXqamDx$AW0BG$ zHT(S|482|^$}7#}U2~{GB$4WTJKu-NfBx-JtHCKXy2?@#SjyKybaR(ucM$|I45H0P z>oI4{(rA1=;+{fv!ZgHun{$X8@${OUB8w%=`;`63=#no+<`TPlgmhwH|LDetpjCyz zRou=O5*Q0EJ!2G5RR%tDWCU_i()$XQ$grUG9zbd+ z;d%3%v;E^sUDJ5FN!zGqU=~4^l3|2!W1&;BbXBpKQyqZrWGQ-#Gi!^Q{Yz?BcRsPG ziLGY!!b1dA@p#cqw_gQtie~As9v;`OG3>L{zV+FihHiC92Qn?#kX=7hTV^`D36qn< zsrd?6racXYHBEqn8>0P<+)*`vaIi+=10t6t4A-*v%P_8p=61MM@$2vThNau;3y_e~ zc6+3j7nCPdagYObg)!0dHb2U$?wL+V?)wE!s+RZq5qg|3t8`XwHu@^#Ab7T@&7(bZ z9gvub_&nDVI@?>({`Y7{1Wc>rYc(6}CH60+#rph4pKYhD`XH`oKQGi0535eo;WKzj z$%kZiyLD{-i@N;E{ko!g_N+sz{hWt*-keGmuRrDwb*rVoPMayY(ogRpj5R`U(#7-s zxSZI9;f`LW;Tf~l$_#U{N$m3^FlPHBxUqaeTJB3xe}P`_?+lPuZ})T9$8^;`j-Xz# zqWJlY{K%3fr}3~MQNLELw+>V3GO1)qL_vjwL=2&`UW9Zng>@n6=g;-us`8FbaOX%) z^WtyyaiHr=;M81Ps^~tu$SwVM>%;eUhNpr#|B6=yHsnrcYmJ<}`WqDMeR4kgEMS54`@Ncx5-ZG>ClFA-+=^>47b~*97!=gp1x9 zq{nZed+63Mv_=l-unruv`{L_%g~_~D40Z^4a0N5SmCu2D3=0QQI__WtKhQiF8NK|bA)sXS$T)+ zFs!|=W0laI>u#iX*7Q^f!X~eMrSRPV%=}RK9Z>%hk@+Xw0P`Ml($vkCkU=-^tVPx9J7C$Xid#8BL5;*u!Z7-uh-Rz3|9;Cv%q|u0a*l-@ zRqO0Zr(N8KvV_px$I9diRH!ct7{3i%VuGuM32b8yct!u;?G9sB9)eR0A75Tq`7bz^ z`Zi3=4&DYB?vi&buMQ3qB&fWeqvb_~+h9WDGd}D7HK%J|n%AvzwM|V#k(!+7eE+y( zO;EHpYkWWAAOGk5ipd82B-ECOQM1Nw8Kt>8p(Fm8%OC?%^l?d28>0XF<`s-EFz;F) zAa%ztU0Ju{<6QahB0`%bcDKc3wFAE&@%R*Vfv>UBXV(h{Rc;2t>|#?uHO$XhD9;LB zlq?Mf20A7t=Kt&}(9zJ)(9uX3QGONHUc?cp#q~W50#lb;S8`UKy5axdl>%Ls@jtZd z2XRJ=4(6{@m~U)uI=EN{v`uTCH@1auSoywE|0N7S3iob2f72I6TGH-OMK=EOaTtHa zwj2Y!Kk@+bMd35PeC5lTEvzGW9Y5f-w641=j&}A)#2$r$#vneYR%^#`mDmc5hZd!N z+a-kFZC^Vr2?e)(aZ6&1vul)|KR;w{CdLp=2O-XcZ%G~r--=t(mOX7L_K+tP(<+lHqMeOmj93qI^({NU(Dgrz~72uQrIKo1} zg!F+$Btb;`Mm7%%53zHX3XeB}DuOFClD8ZG6m|z9?i7(>A&dm06u#MLzzbvk(0vMMR70OJ?QDtajl*?ZKLh^`h5BuBk}ySZg@`)jH#dz%NX| z*G{RZ+3$U4T7@1r{JUjkex>_PIc;!`O9 zy!vB7h2L_YE%u`CSYABUc9~oNqk9Z6uAK2bx(oa#nU|N~V%eFt&*RV6P;EC%jvdh} zy~v|QBD|N$f9uG#21PcqYlE2Qc(=^To_r$1d+_#jIyr&QjML>3d61;i0@n8lER=)x z+ZjYe|D;u`Lro%!z>~0N7mvCp)W?#RB)@sjpBEZ#{!gW)8AH{8Q zajCB7hCogCpU{8y=tQGw)gk?Mz>Kh~%}*RDKJcL5`{HF*iw+B;fCy1cT6wpP`_P>` zd$}@diZCIly3!GEa$+rq)AjWy`$MCN{HbKNGJ>|M4ZyOa^oQ;zl_i>sM_!eVvb`&=XiMxJ=MvSk*x+3j9XCkzdS^dbyQ{d1)6Bj>>4L{W{uBQdxO z({xKqnN7k-WJi&(RyTbODK}cXL2STdB;S|87`UsHCIzcoFDDM zid9Vw<%mlz_P1Q|r;wn=d)wx)??OHA*+9pD)Z8j9a^*-n` zoyZwXB0KB=vO|EsNLXwIXD}n;?SE)-p=hEmr&s2|6w(HqviaFQZ2Nxw|*rv z<9Olf+!{1q^m0PM?wO-tC5bYmHg#;oz>-X=aT|w9|N0`IzP~iyMfu|CYqlr%faPf> zi_viMCx$AYkICPcac(kG2Xfg1O`5-t7x>QaWyM0A%>AQhZw+hp$if%kJ#k0{6UVuZ zzV7xr>s~r%gy@GF{!GJ&@KGwo%Z+~mi~22ceQ#BF9Vn!rIN6Kv-aCFy6{7@dv5Ek> zdQ5)>u1`#R{{D=WB8Q@qhof`RF9@p_4{3|H&^LHdAqeqLO9Y27{WK^}Aa`wPN9 zYxrh)Z+*vz9>k_VufDz%ZeGMr*z(R^eo0_58p9W&$;MH^roHly)xopFsSDn?ja6L{ zDR3Jcwqx5Qp>2KPrDWOPpVHwz?!~=x=y^r&Z(7J_O)^>jKH*A7hl(_`XXvtYh>jl-i55~&}l0L}g&HM2H| z<--?}JU+!3h8!)6XEee;r;J0@Rvt%V<1=H1eIxja%ERj4cM_N4R2AEJ<~Ftj8GI?x zekDk93nus0Jtk7%t5*2>$|o%iFWdY|o7aFNop0I_+=UB}FY60+S|U=(zR&(Lq#7B9 zMohN*$|Yz{PkRez6P2s4uhv>cvKG0#TLVO9i`5!m5wI0yx3Pk(0=WU89Mbwy%tKff zyLjAOHm&Tid~pzibPMeTvhpd9Xe_TVd&0Dnx|T}o{lu@!rWW1V(qbz`Z;{VPb`0%{ zqxG(80A;J%+k_7nAbfR&pbBkmKO-*1*g!OU{bR{}w>*F2G&Sfq%u6*3EZXprkVU*w zv8eU~He5Yx6e@Ag1V6@%UN)+Vw10-9kt=356}eB9Ie2;ISy}+-UUe*#hd_D6pbckC ze{KbHOQzrR0YfT1F_?P*YPC)KL&?1)GR-LL?dyq?k=A#ZRHW}tuO4C%(HFB8tTF!p zjZo4tnXSWyRYUG08OYCxiB|PDFD;e!hy{dmNx$tt{2XvS$R&@61}&vyJ|QV|8*QRk zB!#su<&5K_c$uh@-H}hs6*+`TYj!NUCu2jQK9V4v}=G{cViWc#ieS_FOv3-R`fPG+Ubfy>L z89f}M*QCsf23zOp1tm?mI{1&yBiJy^dn%4+5vq#~hOn*IF|e~=AL3bkG8e#e3`{&N zKu~R-Swm~_s0dsNSHx$Xb&mf4@tx5I^Y#~p_31+ei|tHG^I6g8SNQI@j$ zM#>`p0JShn+l4*Bs3TW~p>kqi#h27b{{RwJ^r?#;gG5ECOMAb>L+BvJUx~ex(O84aMaIJn4lLr=4Z>CsAy_Op#Qyb%BR9I0MA~hO zdtGwWDh7pKV^3XRYQV_E*r+ZKVg#{OzDZ%Y*R;MqBE^rEH%0xT6X}(Me=_}hZA9{gP%CF{p&=C5{%fLx{M(j$I)g996UrN#(Ia2W{wh%e{{{VVQ5yx9m z(_F`+W|i-}7qUhBRO6Xk5*y(sD1(5@mY7swHIBY9oc4~mZD_?yu1hBUru^bQfkM_e zib_xXTVUP)0O1X;o)68>p=BRPv#mt!FcT2pHol z6dwM8#-KX4^m5taQ>xgajrH6#Xe~z_u2c;H%1&#~+E+&1y_P&nuJMdhoC-GNt#j6tNNEhm1hM8r~J#1hQ(t^)uT?BKRIEbuOj;vXo#*@Wc@W81K zZ%;e#m>?HM!GQMMu?J7>KO95B38v2VP^h}SC%JLIi)pG?4v}l1m;nG?PDxfZlF{-_ zhmgze!qx2i4a*x|2QF~MMGJkuJsrQ?7jtiD(~J4eevscO3(Viq7RlSv9U9R7AR?}A z!K@Seb8!05jwtDvd$OFx>rNxHa$9@O>?vRVIL_QU=v<<1+4!QHXCw3#^@)BsVexSY zx#%B9S;kvz#W_(OS@6;uo&eL&GgeXz-_OjmH7Q$>=KD+a*md$S%JYt@eyv2-SwYIY zBEUtX}J&o{xofANj5)iC8!8ENJn^=6cZJif$8aOqE%R@gWllq(-2$19S#(!dg&!1 z3$oYgg)y(|ui-3g-OxUQXEw|GgAWRweh`}V(K-s;DyGbv&gG95dTYxpT_8t!{254$ zE;rrFMW&uM9rwLmFo=EIos zJLn;|8CdIi#72%dpqXshUQyPnV}kpDMbD$-8WUIh0q2gw&SWm@>iO zRhI>ojuQR@JnkVhCfSDHO$@u)-I#V3Qf0* zHp)5*Dp_0Y6-nq8^*4{K$WjKJ7bqvN$&TB=Z!nxRvtDpJ?krxz%cQ1OS^OX^&;B$a zUzYt;3vf$ubCJJ^s`DSsLz`Dm`OChLQD1p*I}{JHR!2+Clq#9h(AK2@*^y3rL@W8u z!o!XIWm%@J$#11V;^=pqI_I>$BTP2FDkr-;YL;_X#JzUu1$Z4=bVE*ErYPH;f4HqX zf{LPFEzG#-75-rf(!cSncoY$H!*e6^QuFBmSKx+HM$gK7i{f5R70c3GhJ==#v1a}% zSW0?Di*8y}Wek9=a|Xs50;!})~8 z)Tju<9s~aXaUGUfX}!UEhBmq#Y$_m2LH_{8i>hML0Jklu`w@nab#;|_yvoHXzBq-h zRJn_ThqO`pm(?g;HaGDY4#pBMFlaW8Dz3WC2YPsGHmm6aaty_nT@So3cmunIF==0- z*Jo_X?=fl`?e~Uk0J)WMT=$ikvrB0_XHWcU z_UYQo6a^`cvf`Y${^@Y>pt*ZXD+++w_PDPT#ec-Bc@@IXgY!N5a=x;tcz?2DQIugn zlr3yyQ{q~e8VqJoPg8colCy_-%d!_x*V-U97$Md@EiNs4^ujzGD|)H7tqB!B?!c73$Z=^!h;m0Ac5-@#0aHMlfVm zzq^MH9bwtTM&)@E@dy|nw-Uo&_|j;eq2ea(ow%MrTz8}NhMKnpMv4xV4I6b~zVd?S z>zL3@H*v(3dHxc#SkqF0%`!(zlx2w$x&jS0^zmy>Vs7w-VvS{u6Qk0F82YgJ8pndt1jm5vg8TKx_n5Ed`^4 zHP!^q=RJ$u-VJp5edvW&eNXvHG2x`E>p8^feUUI;>DgJhWuh5#slpy+AajWW5@^yxdxd^+nFs?S`+ z_X^A?8Hm@y!>;T5OZj-KLuJ-~F@Qs$zRmkWD?}6&qWgHBKls(C>6W44<{QLRuQ;GV z0%s1WU#k}1-NmMOmJdgBaRy&#ocmkND01G_BRt_jQ- zZ27!g!bFHNH*|3_x#7d(9VKo!IH-y8r5RmR7%Gvb{{Zo(`rFy|nxE?8;HgMF2f`a$ zcLp5YH4YPj(Ya65Z0j!BtNi1k>c12FF20T+!aL@7$I=LDs4`mUjcT#;s!&VJ|M6DI=}9B%bvMG zEZB1gHaP1m%Q~RJt;OfG#r5V`t{BW99E~!(+`i;bnDYQzHT%oxVW+%Pf|}e_eG$Ml zr&yxoPFt0&H1vR@+OXm zherrJ&hJAH0LfqGJN9wdl$rA$M#0$W=^T~|#WvmZEQw0rH+hJ7Du^%~UOy1so&Nyw zF=x6$%yR(LP-U0~3zNAXBP`#J-f!W`LKg<jrr>n>fKdrX^dJ&Z~Wzy2EMNkknh zORq4j*>%c;+`Zxn>J$+bU>HFRT&6wRj(DQznFcNcQmThwwK2aLFL86vS%>CuBHOdV zL|pG@zx|^os<()q+4i9G7)!_V#oy8nZiqv;u`%Sc3A^bW1)J~02$*a=p({LbvK1aY zc7@mg%J56tf}rg(c6u22r&1QV@<3s_HL$>Ah-@@`B2QwbBAokmFg-Z`0O7INEia@E zZQubGRT%eL@l!q zUa;hD-1|jTQLk|lu*iOs9b%~7QS6l~wirMtgNjS}9vNW^E(`~Un5yQ3%~nfAwH-`a z!H0J!UANb^GaR3`Cqm21yaLuA@v4sGRXGEQAbHx`3(S(9y2pu!If8Ob4pR3oWmpoJ zg0`&g7YMZek*>hJK&-aeH6a{VGtPBTJO2P3VyUC5%MQ%k#~u%(&*10 zG68EZb#N-W$|;3vrtS1a0XhAh4!W^&pI7M{LD_}R=zs#%%q<01GbOXAws8?rF=!Z! zl!!%N@EuTk1U6cAhtdu8HiH<2T}D{5uA&Y1wRDY9@}dU3Hh#-yAATPwmR7?f4DQ(5G%kRd1ST1fH)?gG22mI(~pcWTnYhkLkLN? z2gC)31s~PBjhJkSrM`51Cq;UdzVNprRjT-@ab?b+?sy{FaCW^TAmQc_QN2ZfR-ms2 zluVJo<|`)(*T!bue_)|*kGuk{uAZ8Vsgdar@4_S#IzeJ|sGGg<0Ng-Ceo0kh_oySb zxtLNjI~ZA72aaXa8FfsgsiEmA@Gc#?z@;c+n08Mq=`Qw=y5W}YoYX2ejhs%#T*?7) zD(z{9j4EE(?%XknVDP>VRiaSnHPSuSgB)tVIN^7?vwg)tZ%n zBi<7H5Cn()P<3DHp%uTQP*)A@GJYwbinSVklH+PIoJy0)PS7yaq{wmBGQ1`dVk)a2 zy6)Ar;<%LXOwku|IUFuM{K41e2n*V;auc8^tW*J{sBK%jxu?pHtgo*~6=xfTsB_i| zZT^#y#_9wA0AeQ)=`nqay|(A;{m1+eZA_)FR&C@y=Al<&{6&sN4#ee^T=e4?1DR65 z9AxIN&!v`hhzTx2R@Nme+BF-dyWAu%R$#CyRxhQPib|m@J@1fW-hfKI}M-i~|SjPxZ_j&2d5VFom^Z z{7s-WNByNrjlNP|-8M#et`R<8pAw3HO#lvxe4I;{lpoSuNNB##$Eqp|hE;|&XR$5O zUM0o-MqoX`e`u6M6R3v2BpcQ4-?S>3+6>3Ey}^q+w|3@I3hDDPOX;~>GCDg%+O^UP!wI{A z2iD~%DD%=$P5}0C3c^Ya(zjm~>2u<>V;2yyK~srgdy#LlHDy+E+S;@e<3{%C&RnhwY0M#l5 z_FYG#r)jc=YGjQw3wZT?OXb^8Wx4`PNKx_8c-07zobkkt>o$F(R|D4yus}%HiNI1 ze@K+3S_0e){HFck<>mbd;rd78JUj8%_Gvx`leEVRHQwf3^gg7py(x=Jp0_ftq(>8S zWmhoe&@1VNKYN*u0%M7U9GXI-jD*3q+hf2z?{SRmfQAF$b2ELc_kI=VOo=GHKcuAC zvDEL{BDJ@xJ(v;sjtpLh;wW_bo9V>y2;5yKkf#ZcdLE+B`qDW^977uG&uM1xd44BxMiQS=Vc^YH9>$5|QxiKV*?*4_RjYiCC*E@P zWmyus0M}vuNrt@+A|`wnIKZ~=r}BKw@zG25PzKyeo2HLWuzh?-T>C57hsBuD8gk|+ z7lpHlUZ^gsCO*{?k_~my7_Ph5SmaVovbf(`{{V9u(Pk>QfQIjGwKMb*zR39?-=3HC zuU-*uk{3s0_|qN*C(Cq%v9+ZvX#{v;Wgwm8l2Cp=N^WQUkqeq^&n-|3fz8;jJ=+?+&SV|sY|8Cr?Wp1P{NkyRTrkCmG>eN zV?=dDaQB88#1g#AnQ%%2lELX37^}!sJb_yrLn?X#Y*OHcZfg>@QC1o+$@XA|t|q*9 zl)ZPf1Mv(oDDNv#jt(NDP^!Mm_?tWFuf5^z`ba5bVec_sSa_7|!n*K)pdeeM#~J#i zUAocMD`3#iHxwC6-wf@c^-KZybd4u$9wij%QFc}Zjb$o~d7Q0#Z^!wRb7{$#dY)=O zWw(ltQw*|&n^)$3B>=EZE?v~QFSKQ5k;Fi}vreiqEs4XIiqDgMS>SuLEA_0sJc!*Or<27HG{Y`43`4@Wm zK6=KOr&i7{ubDx7fFR!O(?84oca5FKvi(lIcb`-^nP9#ja$a6Euge>3?_<%+D^R4B zUl2QRbWbb>D1f@wNTf3@8v6*zj((#YOIWB z9Iac#DMr>R@zw_#YV8+e2=h?CdB7K-b(#MFXUP8m6PVNsl=hYE5v*%8XUh{^Z4e(X ztfAoM3s-QTf%lG>+?MZ{Dj!A<P29DP8sp*u9RtA;#kq~w1mijU zl%*T+kii6LsL{3PR%I@#^u(xGGvON1jYe;@!Q!!wB@Fm&TaCpN@#!peTNT6ua%+Dq z5>n9qj-T~Ce^s(O-hN(T9i5K8c{@spFstr&=j-naR?*4PAWlqA_9yv8b9Fnz(_Q@- z;=L~tvlvZDfHJbG*~VYh@dgYW1j`N1+J_&Bn`Mqt$Bwb88c{EBS69{xjvr(4Ae%u5 z;oEKiVTA>1K1vQ#{Sg&FIx1jtBXBzFu@=B8)Q0@m2zW1h%v zs?CjUjfd887)L#)5uwk_yFe12@M#^yx72#tHC79KVZ5uPCE1$KXrRt)P(9&FN*Ntx z%2AB3#v|`UGBvq)Fb=v~KGT?g*=$Xmz@i4KC3wbSM_S~5B@-cAv0o{)h*(!?NgP1& z7Rv5>7zXl-yDjRwAib^LVpX#UMvHJzY$r5zm68t2T-sSSqfHN21mT-}~NY+qQOK`Um|_AzLL{MIEPt zU%ks=#XGlmYtkBvGZqli!+=j~0*7-nw%&R5-=!X%QlSK;I3SH1`i~e~=(Xzd&D_H^ z8fYd@q8w9FoPk~C!G`wD)y-xu4aV+w)s@omGIp|M8%PXPJE*}>S$qw_4G^Zj@PO^a ztlpn`UshHvF*B!G$~G^=Pb;Am7%c(!$@0f=v2v^(RfrKQL*C|eWe3AJGfF#SXVWtQ z$C!;B=4`HEuJZ9Z;-woG+E6Gl(mb$SwT>SUN+qnmj(q|W&nkl^V0StU7w7#-;+1@l zEkyx_ivUvFd=op8nWtQ6KZ#Ma>@79Lj8PudvM)rW&rQ%*pcJ91xB&6jy~;IgHhack zrnY^e!Nlmrww?|TU3W|^+RMISMYgr(HK-X5W8k~?0mP;%65x&+s+%-nzY$Yi)3n%O zc-+_p{g7;SZ!%hNQe5FY9LK!#-Ze*++_;5f{1W$|Q;6^JQ7ArB{;CIuuUKmwzF<~) ziS35{rEt+s3rSRI!au|;NKQ%0+SGQrH6WiIeE4vI4eJZncR9Pi|9IH zmhIK{n&qnLvRJ2>J?2>lL|??C=%5BtUy_WdOCA}#CT)qIGYZz`dTCEm8--H$tXeZuDzjZ zmko?})V^ZW4Od6&FMB#hE#0n@90j!;rT&m8zoVVXKvGrV4B{|cSS6Ow$B9U1Wn!2j z`wN7Is@Jyv)DD3b;VCDowCqwcYj7Y2-x;!w{> zf-tLaU3D-T>da+$KZ$y~Aa1Jb>-B+3%Iy}p@TrnGZOn8`ntRIRcNUphhx?0|S*$o8 z6`zk>Re1jZf+1;qTI7~!?~(a|9+!J_F$8XhDQ;5P1YJv&Wu21^M;Ryd7qqq9Z8{^S zd96wXEkWeIH5KuL>k+!TSj#8S-XmO@TwmoiOjGDS$JmIO#&W;)MzpcRrel^L4kgy= z3wLV+ zBn4;eESX!E74!YMK>D9{Iq}SD0VzDoroQsiPPaB!#3G|;wu*+>Q=pi|WhNt0S$Y2X zh6u!YFvoC1^nPHc#_m~$&S+5Jxq4ur?dU2w7l^zL%I*g9_Ow9GJvso&p zu2&nh{vzbX0)tjH=Fs*9h!MERKn#%BKj zB&-KXQu5Wl=kHw@&OtmzE_SIYV@i(|15nP;)w~n0pGwzP_>9Tqwq9L@dLQPYdIxkv zljSlku~1;(G4D6Mq!Hj<^_5zaGou}js#I_S@XQJ21#3RClnX^u(hHj_nV4$n_fBi| zU2=ZyYTc{R^8iP1KYEvqaEv}5`ZczSqV@^R(E}xeH8TJqNh_mOsMgY(s(QoaVFsSD z>g)^8_b{=6wnLthhT~bL1YokRwal(k@bEyZIpB?GFf4k()jqH`F9#{@DP!$0FCAl1 ztD@oZ?+i3&=@3{m_=JVeJ)_k4m9iYT!+D*KC2r$~Pf{ZXQ~v;yE7t*(e074{_qPl& zT~={0ILGlT4PnK>K-&mhmy{1=Pk=@DO9ii)%U=WnGcA)<_85s##Z=8TmC-S=k`R?v z>ZOM_7&^x58kl=VYEkTD%lC4j#%}}z9;;_~eUow)u%sY(e=Kn1XWj{G8ja5s&&)wb zHWdxi?RTh-(?GpH%xE~_Q(c)t-&vFb*BP0IsIDfOE24Fd&7yMDZP;QGQfVUL!n&-) zEF6yDHm?>zaI7F&u1{Bzf47Oqq;Z(4S1ol!RXBfZ6gKz#!Ecx6c+2^iN0lVW z^2_~o{{TkSp0^OJv&$NSXWW&ewOl~rx)02;YCo%lmWDf_MpQU{GW>Z#aPC*O81*P) zaM~f;F<`CU!uK+!-tHi{1kvA{`}{}gqFwV0jy%K&*O+h`s2n`1Ro7;E%D^&yCdlq9 z`-J3R(SZto54^dh@lXWRumD>*>-l`mWG66DaNiJBxJ%=9yg=NKzA&f}(v0<*%LB77 z>_M8YpP~f}c#YED>3uatrtY0H0JXKlL9Uf83}+B&=3PzSe?ZOE#cM8qcCaZ*_PYE` zJ+!3|%zuU?C0gh~b{_mi_8MTLhI@)WfcTwnv*{aKfolLYE2E0z^BmeMKh_6cEERap z<#`6CPM#AU4`N*QJZ?X&MzFmcjC>BsP|JjgNH_h&)xM+6{)lM7Lb^5~^5*YA_MV#UqyJ}o* zz&|l{&n?UY_afTdW-iPXnYU5qI@5&Z+u!d~M!Re3mBFJ3YBSE9%=^8wsoHbk60w50 zn;5h#;#z~f*;1|vQ()kLO3rIt+k3nC=@Ujh*2D2qoGj{cbba8FOieWHzcQVx%*xE; zb00CA9cN(*7(I8yX7DGfHP!9fXwBcnGxv(K4jgp8k;qWOKea(y{Dh-Ugfu`IGdnNP zgcs<7%sFtu)Jboe5yss};EzX_FzIqt=lfFXA=>2?vhSI5IlCH$Y#C|8I#RPCRlP#^ z!c47(?Z)4EeE<%OL9}D$1}syc+1tzQ95uUcEamFU$~jiqtOnHf>rs{J%^-CN=QnVTKcAAwVv@?+VV>u1n=nV%G+i~ zO|#!g=%>bmYYp?o?4zs>Fi^f=?OK^^JLL_yxJ+ONm7Dv`p%W==4;iYsb|0T?vy#g& zpOgH`5R5=DO3o&ehlq0KC}sAQ1A~Zze=@`B>KMmpX_|{o!p~AQn%SclznXvzJGb2H zC@N6=Fls8Sby)m8ziCcC<9{%bUn=hnBU@u2Z|M-cvhYCn=|@xwl%g}xw_^R+{AdOF zo)A$SvnE-LM9Cklbgm-Iuc(u6&T3Oct$^OWm{H}UxfHx(-VtNwJkgTBbu#h>RVl@n zyhK-orIO;y?Hz+AyTMV&fID1nEmN0sk;hgwZq<&^1QcWK`YiDgPLOrAOT+L>m{HbT zUKy4)H`Gc4(M4P+LBUw44EZ0={SwrL2T0Kpw*Y@_>LvNF%jkEP}Nd4hQtQ_=a9VNTXuKI|Qac(@rSSQ&H- zClJiDIRg;TUAS=rbjEG`#Njg(OSnT9Y#jzzBVLUvyYi4MiOA(|vo$UXuHUoE(7pC! z?yLz_!|Fq0$&O;@>3&kc)e9-%`J0tp_PnqvyLBk(Dz(xY)uF!<$QZ6E>nJG}qDVF+ z&E_W8!nPw=JH|q76+cUjtK-MI{vciuHarwdYb&+PxooiKh-WtPa|OUmIOZ0hSBPqk zYqZ zKLFM55uuDZAWFKtL|0eRU|MQ?i~j&bYO2&gQdHlVVmSxeWR}}~5SKUJa6^Y@q-zYO z*A?PD3Fh>aG>B3`-X_YR!s!v;L^w;&Lzr~{Q>etg@5`B%ud-wu3u*L@+%=K(MW7t! z;NiD7aPHQ+8HW+w27pu>Cx}f{v2RSuv><49O&jAgGCmIy>t2ZId&F+5g63Oad0j!$3Qr{N z%;GzoFEhXLVmUL9RYprjS3|G&q)8k#A&Z1q1siqxN3u6!h?E>KHPl+Ot-orQK9fes zgaPHbZLdSj-O^zPnOqpavH5+x#cH=;uw^SQnv_C9w(b-AiCYlEYJ3JF4wY&?X95v& zdyxvwwisCuh1w15Wm25hJy3&5k)Lc)H8Sqc^Ak8c-X*qHB`#>c=?8+jNASMhq}s1b zw9QH4R9lyhuujalVjG}2N1BnQqnWoT2D^+9YTh`3)P;41g%?@zGA8IUbNP?@B}Z9| zr4Mc;1k0}He*7t7+Obiruf0QnPJ=PYEEJIMI9-s~Cz+%@l{q+Bo0geZ1|mVVX{l7| zoX(J_GB&JZQluaqw=CRT$LA3O^`ulO@c@)bShyQ8!60~H$5^!#Q>A)`NcA^g)a6yAnPg3AqL)` zpx&0@=kX0o2F-mUfC~G;!};HM^4;CD9d!7yko?MUXr@02FjL}~`n_J*jLXldc<0~r z4DMu_X}+JNX}MJIh*r|d%P}6K*C*C#w&Iz&{sLg?oG{+sSio7A49n~{QzG4uu1K%- zJb&(GXtziL_z7P9a_tgPzE3lt2AM(*nZA(V(7`7gSW%C-|y0ubV z_pMfvGFKOh)iQO`+RUg-{XD_~G^!%8Z(}i{om*w9<>2Q30MFhVA9&kX#jHA+!3ycl zWlgly%O&L09J#F}DBZP>%&m~I+Bxg&L)`w5qjU%5>cni|Lht3Y>HWm1&?^mD2Hoc{ zqQV}@)ATQbXOu~Fu&!b?d|X3$+_d(d>$JT)=4XbYy(@-ct{$`GL{Z_W@mhvCpIBZ} z=ekwyPco|#>}Hyolxun=``16Do()7zLp?tcDz(*p<|j1PlGWF6sZckpyvxDOOc+Ur z=rQ8rxAa$~$h)#)CZE&cr3U$PaqSYHQ4LIDotkwNSNKjK_USjji{yc)Xg)o65wO9S zg1rw;jJOXi^dK{eTQ`XAxQK>TwC^}YOf?&Z)(75h1hUvmwnsw;w53ZF577d?zBuEvlyRXMY|f=kru7>f9P%cmDf+O$Cb?0RlZ;10>d+X ze$!(QgW&#UL|oJg{LG44vdDU6@!KdcmY6beJ&964WXU z%n__?Gp&by(PysAL{Dfw(vv?#O>(tNFP?qAXFE#FVMh;XoNKcDM_*|DH|;!KlK%jh z)Gar|ZKTRucQl9}IJ|EHvLCFV=dn1KtP#k*y06i-n-&+Mf~a_fgJH!Gr@Z+WoNofu^M}n$5D6aB+lNyGrFZ9;gde z^1hI{w)Fc#hTL<|hq%vzY(aD4CI;0Nx__)&Xm3$#rm-HI7>e41uCVeeZ=~O%yWsYO zW8~2c0YSkJMU`iGUec;=qUdmk>g}gU33nGam%QuZ_c>f81AsA#StW^}Ck?tMcy#Lp z-s^(56!En&j2b^njG84c+|M5~Ua&8_{L3!rjtZ&Zjv6xHXZwP7U_d>HMvSIk@*wNp zKqD%B;L6Kg+%LGAZ>qVdEM|{2079c32)*|t_O2BTm4JY?hbn_&mGYg--aTDnJ9;>5 z=C@*JXyG!W3|3-;SgOC0YortO?pkLOX1xO0r3Nas9n{f})7{akl*d%jK+p996Eqta zxm3}$>k`*t`lZ@iE-w`Ii0=NzKOgiws$TZQ(Am;sMRXw&sUg@ayoiO;RezLWNpa|B zk7-Tk++pUTwWi;6G0Y`q4B{%uSh40C9$?@5Vp5}%WHU<_o+5~2_)BbpQ_=pI*pU;KFey;XFy~OXb24frkmhr^72+XR3^nRG^(X9Un7v)~?=8n7 zaSc{Ck9kYZI?nrT%R zg;I`-A9(h|K(Y@NQ2U6wue07$y00c3Am^T&CfC&bPI$ZElAlMsN-ZP0+ce+AECkPR zERH%dr4h@I6B@h+CxToKS-rCCdKD>_uLvM>i(wEqTT5kQaePHfujX5JMs>A<0dTyz zM$AhxlH#r3RJBue`J6c_IPWjr1Hb`lcEkD=hGLg};imIG zmLbbPx^l$0W)kAdl?H0ta4jq?S9_K$ssl4v7V|I{ukFVNxbf`)P83y)T%vEI1uJ}| z%RwoN)^anBulKBBVB@?|kgdkpY77xhH~5t$InOX{Q%qW!5zp`X7^_1AnUG5sxqox( zME=156y(Iun#3`Np@Vqo11cty+{6bhL1G~R-QDGMMeHEo4k5w%a%toRXWAYh}+UzFZ*3gO6&6f01y>f?<;`= zTP>M#>fGAIAd%hsOROo_F_+-6sws5!=jeYz6mm-hxOIq{v!1{89A_LCS8vtxD|Nbz z*SA(x2ZACMx`Sm#=mT6#!v<7RErfpY3f=_2msoBQ%O2C|FUiaB*WxF_FNsz8zbp-3 z825}As2E-fuBs zDqRjS>bZ0JAxh#aG9-0lhwOX8i!yp_R4K5R7z^WbK7el(%*Z-*myX%mv-pmY6Y6IR zT~I68YUN+zqoxiD*Dg|E4VSq|XJ1!I<{DGNWffpkZB;^*v-m3gK`CBGA?v|_waKe% z_gHK@@c|3F98GJfOB*^EI&G2awxzouViV!dd45fuqcW|?^9KzM?qpiPdP<{)4={U+ z<1p8iSlP!&)(FQ$Dv`@0P-k0Rjib1|viHksCOEVizR7N+w50H=<+$CR(cSV-@uXttPG#I`rHiwTQHjPX@- zaHa*=^qkIHAqp(m=5m~q+)AlXH7X7nfazBZbOmAyz~Dpj3>6EhO_xttWM5czi+7d# zFsRx807Uz^gK%Zb4##3~h-PsG)aOs0p2YjnwJ-t_ozQeVO<)eubef$ZyL?0RF(nN1aa zu!K|WC7m72t?Rf^R0|6Oo;uHvkfPSKb&O-R!fSP=T7fs*j=OcIss8{?;xEXh^?#-% zkkVlkX2YkFSg?$lA0gr}xOzG5C@^ZeM>xGtNqX5nF)MIli}Mns<};5?u(6fmh#Ld8 zgeP#l1|_YEl7Y4nNW;aW2b^23GfTEmvx; zl_(3VzEF$n6-?MKK{3_$US$_r>2VnEsTOHI=_rX@(w)m)Ml3ze6E!gK@i$c$jAj^t zm2HUo+q?Gl;lh49A2kGCx5*oEMSEKuB^#LX3dlpEJw zCDRDYguPT-$Ml0s4NGCB{H=7Fh{J@#to5&?FRv`50(o|;uMmz5CYc_MbNL*I&)zfnqu3Hz|@DRhiyUA{rW%^btF*X zIfcNn=CSpZ($)?TcyV#hvQsHdT(+~fr`imp^ft$r(4i($uQ*`QM(mAPx=|HLNyno)NOYQm2fApokEf8Kfx?$Y=kF>@D5J%7ngRMi z0)XnK8pWYFg1Oo}Txc}>&e5Q-81$^O&ic_Oy(Qf;;*mPjEM%Guc&8rFAXfO8thCou zE;WAIV$w9?t#y~hulORX-At^ycFL^3#H%k`+~RTOWZ}f63hUw=<4BAz(0ccpC94lO z{{W{ER~RPxM`#g?RS;GF#aBo6*V;@8bd!whtmDi z4@o(MzYJ;T_B=~Um0ywu{VTIwZ%(2WmVw&;07;HcJ?2XT&I{d$mQLCHMY125M`kQO zTamNi=3RELeI{WL8&U_DK~72&W!|w7U|S;+?(+&$$maO!xBI9$4t@!ET(uB^{5kcg z4Q<5e!2KXwT5&C?ZthbRHSokMxJ0`S?qH2yfh=LGVX`%y#lxS>H`dkv08Mv-8mn)D zUIm+7PSZ1CH12m;B`_$_U{HP#_)r=oDOHR3-&=cG$ct3e>BeXIj(ZkSYWtv8*p}^0dw0{i( z-j_DVv50FZ!m(7ie;{y^%RVNI4$|)rDTDRN{zf$w&!C!%qlJbz>3ep^^BdJT8I;vw zs|;M{JIa`Y7TQ)IOJRxhd&UFMu6<6ECf#meAY;NA52e2m3IjF7$$^fCGU_itW}$*0 zv!s4dwSD0#yydtxZ=B5m-hH5>{L8W|LH__vae8(l&`Q2K5~L6^m)PwZ*5hhMCulzI zvpV_CZU%9KisoBosg>_gtTm$%;hf)TO%O^{*sOGSAL_mVTQRH%b zOB3%Or0zv7iB(DuUh>?mlAa(`I->xqggJ_r&)R5?MiU3T{LIAWRr}m@xCXn*{YF|w z80=+>-basG3FldRHw?4WBZQ1|wb*KIWk1=hw0b1f4a!_d3yuG2hY8(5&JPLoWnC}Nz z_p_!Tdq$c{8B$q{K*8z@UVzfNLl+HiVD@b$|{{TyM=CdnV-ZR={ zSL-S1^vO8BWy#(Ht|3(b$9ZcmqZMo7p#?O&u^5!v#JJ$*Zk+dk)G1wNG!3ey-U*_f z$RSC?FpCksA2l4Sy%;GIatb!J6V(^@6#<>S2bf!Td~#o{Hdr zGFD$6W5<~GnIjBazqI~@GehWgil3=0shi>xpzp*hk3OMl%Dqc}8~KEm)rCrTx<2y} z%(^>7G-?_g&dvjr>U0X3Mb+Jd%rq)2o^|~KC9ig>beGf?U`0nRgbEnhwccEBLi#0y%24vr5-Det zvTPl0rJ#bUn5tmCGgBZ%A*x|%;ZBaSmkj+LsdY_6Vih{D%Q%z2{D_jpVWX`yhg{8Sfg3A+UP%C54`6yB;G#W zmp#2D#rEYFk>@ z-#o1ELC1-kGf4p6ljQ@2aBj+--q^y8@kdFrxNaUCpAW35uFUN#TQduONbgUZY>CtC z_m6R++Wb=&k!&gd0Hat8s`VUfuP*6^Pk>xx+04O;&d0I~1?gPO;WXwsMVl8JzP0=FeoW*iK? zN!e=4V_t=+S%kJ!Z>#)ELw*EbRnk9{A0+E24d^smekJCpa(MFyB>wq@>#pS`CXRwZ7 z=_BPcn3nopS!^`KG+4$MM^YZJ0l1;Hms~5yNW7*BHg@qh@t6G-E=A@spgde}eF*sX zZjcIxHs&Ix<2-bv47q&&0CgWd3bM%0oG%d0A9O7nI;m&B<|6VndhZ$w&e~?H6gM*R z-K9n~U5(`a*Va09WzH%2{vx_Utc8b|ZFoZoq0d;-=)W@M@f~;c zJ4<8dL}U(m9KfsXAGEqQ1!s~2HszNs3RUJkZP>j-uSd}J)yvEK{nR_<_J(21qEnIF z!4$UEXk_}$lXs8iF5UzOS*&y3P&vg=;e}27k=C#{jbY&nSo7N0r`662twjRc4M?H2 z1H4O8vEX!f{{R&_QtQAG!!OP#HnC_Kr%R3p_-Xx*tl4e*{{S%~I@Gmeb!jV_gsFgZ zE;T!$Fq-+90m!s&uQgi@M626-HT}#31S>gzkGyknyB|J-P+LPBJ2idNd{{Fn$;>Bb z`&6{UHTRn)`NX>0&F%`m{{TW;BYi~8`w&fYTA!#!(RPD~WM7E4;gz#O)V)voE-Rgc zaSZ^hVpW3%hz(saho>I##@4LNCPSNmD0N)JdUF)2ajKR(!xyki>xf;Z_j~8EQ<}kd z>8RzCA_|JqtUB(_B_0;YIc8B!uVJ1Q7w;`v&DTj=lE@h+P*#e1dr41On=1#znY@x+oP!R;``m@8~QSP?O{jt^Q!NbuG1a|UoZU>vdN=}z5}4lLCZmkFk;8~ zm_ThYFyY5A0C%quC_^f>a@aRH&x}mD)MOug!z(Yf9D+8o#A^!NqvgPYmIKFFSrZN+ zseHV$!ss^llpcl8(H_rfWO{P5*m6r1-I|;{8p6?ARhdeQr)T(t1?&h?vv`ih=3i25 z)ZFtbnRxU|?h8YhsuUs_4Mz=pu)?aDj3Ffi=`wNjpH^^fy32oCjeM}b#6LNFfcnBH z^@Y!ZqqS3@{oy5LwjV-V+Rm1g{g3)3;g?mvT0&YhaaoAEFd;3*YFqv>BKB>2n28MT zxsU=;*AT!k4*Wwf@-$5Vek`lcV@$zSOroX8V%Badt$Y1t{{V$))~7h5;c*ahul zZy*Qy=i!*>RvzPUYH*`bR&)9d%d`nA*u=*Li=R_-8@wv~M2z*vXt8mCYnj24vNbTpT#A%932*M^H>$6y29mR_ zIF2-{4Kqw>fO3ZM*Th_bxJB~-&~c&!z*v=|W>dnwQSO?rk(*x-@=3Pa$D$lC|7MZHm zPA%V~F@A(7(}K%lAj}rfg*7m%sCbq%0cX6ZD+AVG zbT&(YYoalqLlF;dVHc$5tQ%bhaL_*ASgoaZ{k#1gz?1Fyf|V19Lrj> zB}_PDgva~L64VPCowX}V4(LymaWr8HwVBaoA-kw|!TQeG>%f7C0zp`?_Q&kx9Z@dM zDf+=38EHV{dak1wsM}hKZ{9=f###3mYL=001KB#X5#@O z(AGDxH$f_&ETCdoH+oO9^$FgHdvR+<)}yTcotNsZzgegt`V- z36iu6d1t02&&gp3RR`Jv>P2>4A9TM^vDG<_sd?+^sa$&)tvF-E5s}^ofMM2(>#!cwPrd%{G)%kf5h`Ea zf&eJhq#1%dc_(Uir8;^)@Pfldl0Pwhj~D%_P!u2N59SQf^Ud=!DX`B;S6mXMO?Bc> zVvejR#$6>-sC{P1xX&{^dRFn`Hm|Ibv$BpM5kc2Fmi^hDWthHW@!BTf^LPG>m-@4~KCm2o#L$@@-mt2=7)`)6zH|y(P-U4+I@~J( zg3>O|-Qc?xI=Mp?V5{hVm@f*tS6QM}GJ>63#9H3A#`eT8c^UXWP%5PrX5k+LlE_B* zEIQlp(;BxXe`8RxWaC!#M}~9LyjCj{J)nwP%Gc5Zt_#%IxyrkO_0C~aHQcF+LTNHf z=iZ^fY66trl4uY4W=ie*p+LJ!g$bA2Q0P7a^)gs?A(q;C#r zebT2uc@aGxVOkz7pW#2w9FO9mx$i;Le5ihAMJi`#$R1x#CmxTZ>%Jk@d`{f#OZJ{p zon<<)l6pi$kL>k}meEu)^oJeIg=$hI2Z*6;Uf@hROm>L2ZJ3l@%!Q89y3I3pIhhix zK7=T(PA$Y%nSIc^Z+Pt$v`N!MTn>Tb8;D_JLpy?G0WQH8r)c#WzibXGbMax zTI(FW=FL9nfZB}som*V^fCArxRbLj$g-vUThyMToD)x~elF(3ftTYpu*H|m{W>tPM zan@S9<$AG}O28?JP7h`2jzQOd;V}Yk**%!(2w@%~6nxIQ>V+|V%K8$<$y$qB8|e&a ztOzFLHBrp>^D>(pOGfx_&qzS%2Qdh`uKW=4jq>!OQ$uU0WOKiyrJ`2)Ba_cDyouj~ z^n>PrmE$4`fy}6xdJlv#f zH&@zcx&-#j9GZ_qo+HW1JLLv?_m^)pK?BEF%s&*Um)?Kbj9197@BJ?en}zP0?|&0` zJXyH&7x6eh!eF;PKh6Qm_^;w_4>V}Qe83B7-&sKl z-&{lh7q;eePOg%Qju?*|O5E-=_HadY?k_U>n>jp8hVL~j3>>q>wPsEuxOGb<^{Va5 z7*$MIGNLpUx0me{HlV?^Zf`N%Llc&RmMms^!Y)mjgWnuX3wv+T^tc){x~xCXv;*dp zbBSa#Z++G4S{CgoTw2;Yr%gVv4aJ6{SnWh@(Z;bF)O0)_GNy^AhAo1PjMP^42pqF> zERP+d0&y8@zKK!T*`Ia;)SO>}0XHKs&;yHKVh*(q{t8C2y4DZ@%bkg$mKdRKN z@hSj6Xy(z>k5izgBIphLq`m`gz|1(Qex?6OB@L5OeL&y?)-kF+=Qgje43BN z`ZY()bf+BSFr^QITJ@l1t$+MYoS=JTwz-x(rcz|pJIC#)?FIk(p@(O;u(lkvh_RtSwRqo z1Qk%}j^yA)bB1qo0DolPpuZ3lymy(5jxH%{X;4-v>gx*AucW=vx}pv>l7oujFUzKne>5^Q_17vzcm0EADk#J3K0^~ZoqVEbO5 zsmy&}MlnvY9c5z1Ke0`48o@BJJ6>@fXSfZ0CM6}sELUfpK7&pD z{VHL9deurq4*`pWnDg)lGLiy{)HiE8nYZ06@67tHWufU!Z|R9`HDJNyWfBX|A~Qz!1fh$rp;0K5+0fI;Q*hw%#q`8irosIekfqc7C&5qpu` z+)9Jtd3_RYJ|j44_LdcYTtVXA@lHQ8f`_!@{SxkS&HT~5vpafe^nDmY%<5m&>k`;K z;vdZu{{RU0J|hvk{NvC^vlZrF$|>dj_UFu75!-guT76|(?JFzUzS5}Un98eoRHaVF zlNc9pZsl%WB`6JL%uMfzmlngBkBR6M&nhZE|2kTbmAfW2jHU1?S>lTlB$(ZNN4zVnA zL)-oO{m9AmeEtcc4{zN!r0e|Ygsfcu0E&T5Ww3|d7!0QM`F!~-Mlj)+ZUb&nxU7SeQ7_68?0~ZD04+3Q0YZID1(S5_LQwxp{OXd+FJI$V#)g#o6 zo1XNjX_PpRWVC49A6ag`gnw$KN|h`2@DG$VvUPPgVcmm91a1a4<`JPz2=HI}O&@CU z52%e@I`b>=Uzw*>%p29`aQv&>N}Z}a9Moj>;->xixqH=Ja|{(#-ZMlz`GQl)cci6T-sYY6_?9z!rWh94Ue9UIjfg*^ zZ{k}${Tl`^$z-eb4c{*l8$ZEuiWnw(CPLvTAUEKHILFS7R~gS)(1DEzQ` zAK#gMTH+<(uYg)#Mt~w>)-r- zClBAOuy-Dt<_aoXhe4m(;`kH8H0ECmyL`;ZZW4sFWM+cA&XcSo=!|tX%=^S+J{QNK zHaPmjnx&|XAB3(gXKnd_sc*Jf%NvKM1n0aV^y>-CvcRxs6I;q#!1st4S6Ssey%m&| z`X5L3_=kCA*$PWbUD1*a8ymd$h7`{P$SJm-gn0&oQHtGn(me5)3iqwW&h`14-c`$N=@f6EULc=b+L{j4U=1@RZs^v6rWn7Wspb`uFsi!`V zQ7OsM2pGk6iGBeLiN|Q}Jein-1OWu5*!f@uS=B1>gc-%Vh19@ju=6lGAj=zLV94d1 zoRXX&uOJV3p;lH<(OPMu1mkU&!~}}L_cuMGl5^rX^9QUibfs41Z4)3GVg@qt8Z8=t zHc?JL-T^kSH9TM9J`=IObn=)lrwBDx096)CVWuX`TX~&XqW7gtUDY;(N^>0co#!M8 znP!WEMPyBSgX6~ zbGFMBQ2^p|E}?7-nf&n9rK8#vjhLPWXHc-zR0(G@HM$cIZP!TL@Eerj;&do4*9{f( za~zyX7nRKE^ntu)S9r*FCD&LPRKOlMne1qIiZYu%Q05qlyCadC^DPG?ypDUpY`-R% znK_rV#Rl^#&R%p^)+HHRtfmP#yyW2&%&Q&PePyVvj4XOf1hId1VRU|C@Z`X%tEUi> z<$YPl}_JO-Q+`D~q010d`6|Ilr1Uj)e3b~>c!*E%gcABib)V?*DG13+U zy8FdkG1dXm#ot+=H$aaufd2pq-!V8EbiTQkpz_h}5+oeIsUEB5F1y4A%}yreRCBps zF(DY2I0FLf;+WZIyyOApnlQoh^hylBX=}ffudm(!)7}Q)j}oV!Rxyly5;BJ|>qQb5c{El1HPqRJUC)6Br7UO0d|Mw^RktRs=Sd(2M( zlp8IwqhgEUD%kq-5;Kh5Og~s~?@`oOwR}9K0vcSs<`)WKnTM{h2s;hEUjjTumDjXG+iJVn(m@Ht;BK<#v9wgsnGsE7a9AJ)<&}=jvHRDtg4}tK@$P&6HR=g z0_AxiW1O1k!rEggdz?+%_F@~;^GB*v7;bn0h~`*eT**w-OGTm57Vf+LNL*~XoP4c& z!LS9tw>7G@yTfmHe8UEq#0;91hp$P;-{u`RJ#HAptokb^AJFDF*HBx~IGEN3yqKLb z1yh3=Zm&ZMKCCGyWx3w$fHh6Z86|Nl7Q8@OvDMOLcc^Zkr^f5OEhh*K%cQfm4Sl+!qr!*Kw=p$oDi^%&$H#FeI2Wvhznt5EW*u8~w$ zI>EeY=d{VSZQRJU<0R~CbKYR9>_i?-LwVYm3K#B?ns9cNKb5O4B?RYu&M zqx|Hm~^p>EM zGgkrE%`)}2S1~Hy+(fcwwbC}Z7jF?M&<`l43)ML3TJA#BIsC>2zM0Ili@uQ!S9H`A zu?-f*zh*W}4*Hk3ZqsXCFPUM038Qt5}MGg%=7G0-MQHJNY#>lW7SGcv)~aNb)b zL2zR1`Xb;AaL0zaP6$|~XKp52;x`J>w=io%c+XfJVVrJM!t@@bU;tJQZwy5ZJ5C&H z)9%L?bJ@7K4t`@nhxng}xcbFd&LXeb)s>UCkV0hXDePc5}5ZL zVX7E$*)E9je=}%r@eMoi3vzIn&VuEUyuD#5$HCeyt2`Vfp3ZbN1Qmypar4ZnTf3;9 z$);a~I5FcAp?Nwp1vXl_#6Vqv8GJxIaemVQHmS>*fC4I8=2n-9aje5UVqIUvFo{fV z;OCkU#(V6EW9boB@i9x`EtzlGKh70Wo+?$=?-@@FujU$_<)c(jVy7f$G3hIa`aZ0C z;vmTRkHOQeebSy^XoW zE2O-?S#RuT+7R2kZQpPKZz2&Y+RQlTn#{*AaLS4)+a$;LQbJ{t`I{0VwzUE^&fPve z5l#<36%>n2PLqrFU^-}Ttj%LrFjUo)a?McYMWrn*zenue2snv`0$uBv5ppwLS$ z{h50?;#7k@V1-_t#4xq`q6YBsF%EhYsf8s0PPmraby{Z~ULO$waN?ncvTs~Pa2J;1 zx%oDyRVseTv&`MV)b7miFyj#bo)1zK#d6n#+BdQr?Zv>;7?>$o*NK(-W&-WCOfYbenC_pLws@BBh@>(~`o~f9<~obKM^bkp zC1cy@yti3xZeRQ=sM6)yYgJIGf20MMjXkCyaT!qERrQDon!>v!oq2+ek6oE$+h5=2 z8v650R6KSk4|G(Q9`f&q;Bw`g7+a5s*fM3gP36-txxPHbEEcn=tp z+M`J7rGp{c(xsUlqK5Y97>fK^sAsHtFx^d;L>xdY+S)}so{qg8V}0iyt*t;4emrIn zyD_OnXy|p=jb-JS7-`4iEstkY0}IfJ%Hjo;RpK2?j0a}))ZKQAqQe$}W$jq+GJKD6 zXH15d?JO=J7;(fr%ds}knBs4;ReCO{)r7aTcR~xZ@lEHX0}E47E*G`e-W`X-Bm3f1 zx1>}!s_sUYj&%paxKeLUC1UBmV#)Q37T2ufbfyv?GObkpU@M{8P|lT^RBf?Wf;meu zg*r!ghOfdUDEka7#eLyGH0wrF!IkiP&Kt}#x8XPpu4xN`{+4B!v6s=% zTH-UNdZ!S0+!g7zIa6@NrF65nmT^RA%oyzPJf+;R(=T*rHY8tGZa%N0>DSWzD&U;n z(0*{cOiOx|`&HIz<8N{D${i$JR4u1Xy1`?~)>*c_T*fHVuFU+hdq+WbW$w)Wys*^& z0BQ*8@#0tlbre(yxILjl-Y(^dF>F2}W?^wrIN-fXInRrx7p4@r=&oQeV6w{&Bednl zAn{HGIEs&tiDDiSnD2F8Nr6I9B2i}AB|%pXGAM6f*WM|PkJ=42Y_m<u*VDuna1WGu+_`aih|71(q(<7Z=Pc2ugs#g<1hiu zlE#dNQO!)TcSBX*tfCtGA&Ay>GQmM_$sI7P%Dlq}PDWbZ@G}RV!3kM1H~rDY_{5BP zcZY=@bUv|#d%Cp)d-llq4LZg3m!(0-Gbynati6eoT*;lq%12beC0-eL9b7pg=)HA` zmjJG>Bx^k`khLzX)q|e6y>kyr%t$*1bqln&{h$jejz<#4FZ(V8D)|_EVgbQh z86PsK-<~B*uDTIdczB9ty36>5(8OoxiWy%r%@_`JN*4KxCwML}rsIufI>dA8?VTX^ zj*v%*%8QPWdSc@1bovz=U@_>;*nCY~sLPILGW{IFI*wwr%cy8G4o3$w?*}puEIEhf z51Dn-+EKfE!~Cl$g*pefqZrCF@cj?%vEkl$+Y}_PB}ydC8SxZLG+TXU4B7XBf~u+V zf|IRWbuv8Mse2M)IVp?@t?4#ZJ&emqgPaNb<@=>P|5S>_c*e9suD zuv3n*=}Mz*XDba{?9UgHln>;0uXS6>$=0m~H5N_Q1 z!wSb(uAsLBEn!Gp9MrpWSkVPq5(lRd0e9JnSiQD(gK@je$Qo*@XtP_6%ISY8?`~!1 ztj$c0td~K0;w;*ns$oRBK&QJA_Kt>s({WQY8HksJ+Cef8X;*5-DyHW136Y*jfIJJS zg$;_*Sqe(Aj2>bge5;Q{0I?SIs3r8%-dBM-ORqABUgYiQwS3DBwF9w)b|9c~&2XsO z!~P-L0>f+zVV?5Tz6_>AeO;kSIkrMqo-;c}=@kfZd32pl{*tCKc~5c*FKP74z*w`GA;;LoH zmQ1R_anpU$+q@6VwRs4Z9@vYl_L*YnIgMeI0^lsTmTJR{VV7zGyTwzAyf9FS&uB8a z2KNgXYOAZ(QGrG;q+BYap3#M_ZAZ-@Nf;C6pBI>tUhVVAGv>1yH*odO5+`=jc6Fg(6t-cijb@`7Y zl>)CVY`}86Et^-v7b*#*w6F&Z8<6J2{vwSL;@O}9T8*V#bv>b#13bXxXN>5>zCMfx zEl`JJ`Gjd-HT*|dFLlS7KhvyTM0PMEogxC7X}A>s05QSuKGS7RCo$ByXC|V1#|51F zca*(8XF5B#?FOc=E}*(=v2xQX_LcIW-hT4G$U|7Yqv@#bZ_&r2>d_WctWQ}NmK;3G+;ht|Qs(eY zR=i3S%=2H&6wlpH#DBVE%@ust@|~~Q{7S2@oHOMBnACc+i>ynpWYF^gc;SdLO2}9! zW0C7K3iH1ZN-TMc)}u`zuJNWeZH?T_oX;`!MCepoquOPqM4M)@74B`gPEq$*0}!0X zd&e>LW9d3*_;^cE`;vs45i;9U-3%^^+Y zmImOG>;Z6dF=^QzUQuH9AfRR-Pa zVp!8W>+2N^ySMk|U7m(zSK-zU#klVtu3z zE_hd1Vx1_R7RUG6CnvfQqcItJ#1lhmYHB%l-+xmlv{cQQ6q^*+P0C?0XW1Q8#8Zh- zxH+g|m^o%XAT#T+=oBIgaW% z^kbOEQsX`JW2Ff6KQJ)&qr{{A8PW*&;_$aG%yar#s8iAXL#(x%h`f}gF&4)VRvUIX zbu7`!oI=`TnmLMcFA=NA>L?zoE?vRB;o%(`qd;1ncq4>o!~Xzea{TM*VCc<-mNi<} zte{~)s_hlcpw2P9&Wviq3j16bcD%(C4N%85rYQ3^bHABtohtgUUwYic2SyFXn!D)| z<=Gm6c23%5MP`|n?2$u)$E4+>ENw-1uCRG>l#fld1&NJUiEN8*`V7e6T`YHnS2}r} zWxe~uX`(fE6Uwm+X}nihkElncmcr@NF;k57j6LZ~HIEQd-udq;jj>T^D@V+siq#16 zRj#t{Ay(H|n>rSGf@twJ20O$iGcCr`thfO#q3Qu1R$bD4qEa?}(fj3<%oTX9z2LIp zOnWC?O13{Tlax%R{B(^v6itCBOare`+-Prx{{UCiY!=2VL+xT^*#~_??UdBvtoe%1 zj>N8t1f47{1=}1;2T|M~c6=KL;$wO&MZZWaP_$He>ft6tP&&cTZ0iTFJ0eX1-Uw+^ zoJUyVVJHsdsu)s|*~Vq=`NX=KCfR|k!#lzz4}y;Lk2oF78qaW{uwDy<6pxBP8GmvQ zmy()ab2I3`U~t5^o~~n`RrO%(gm)&!``}I+;3X_P=tFSeu;w zhCYw!xW&ttQBwZ^N}%3un1N`tf0!!nx$LOAZtUAIa;#&dt_Ip%%23miij^hlakm5d zYF-CXe?`leKg=c5hZQzu$h{^O`%6*Tqlx4Zyj}s9Z>y~C5q1x>8M!a#5VV7X2do|{ z4G;&$x}3ACaM#{%!5!f%d0;s(uQMs+tc=5pX?>z>1zrwdrJ6H;-!m-@1@?~s6E;iq zJ^ITbdLN000~C0(5bp+Uy7BKhcscGx)DN_$A|bp(VtYErfs=%NSnJV_*X4a-lZA8I zR=wpy%J(s{&XRy`GO_J7H!1Tf_rSF24uM@FQL&1Y0C+Ppy;lp;8N#58c6QuBT+?nM zRq>oaU*;#mf3y@2RtRqDuyYv=srHuQ3c^;*PFm?YY?K;v_lvOyL@bGdv()WT3nn{{Rh4l^44F%?G?0PwlxC!DlhgYSi8Igu92`d7Roe z3vP1`OSz)_$|Hq1fzZz}+jja+K=B-M^GN51dP>J9HyB{NW*PP{{K{OnxjM%T#~ys< z1(V=R(N)qW!!yEab01T@=02;eM+eMgzsxGY#~c!ci;G8~d=cqB1l|vZ2bO!YiiE50 z3B=E(-0K*}(UmVUy=6TwY+Sswzuw21Qq;h%80d^v=NLaQU`u()%&4#*+YxWS?p##b zxRw$+97g15ucborQ(n^Y>Bf1KF`RtLtmNV>D(OUmmo&{nHU?O!vE>aB%)t)jW)(e6 zbuIjpxscxc-JmKQSk7hXTo?Wzyt-yv22LH|F7#VaRK6DVObT8@tRuG_97|ryy}h`G zj%{c2F`}02h`GSHTGJgR7IKowSz@{t^#{~FE>II<%(Ia#dTcrC9nfQU1%OOxtK_Mc zz3MJnotx=;W1{%Knfh%|scc&e}BH+~}B#g*6Ivi`Hsgc}2X+^x==zIG!bV zv5)brOykp!PGJ+H@fPI{X=^nyigjlc&8Um2i4rK!!_$78e!b4~;&weN$Mr+i4N%eh z_byyiwL-RA8tnutDS`&?6Yl}4FMek8k^8~yc!1rS>oSt>p#ZQwULtA8++3tR<5L53 zDpQlhDOuR@2PJa1qyp7fsQ3$AB0Qd``vAe`yZ9mv`-UJ4TTJ!D&l$e4tFje)6Od`a z+EL0LNDC*Fa2l25oQ}6DoYt;iCyIlT&Eipqj1@Wn7cV2-F<4R7RhLzWR=K=NdjQ?^ ziR5j-a}~h)*b-f8ZKcll1gs;ilOmKT?B;S5KxdwMJHF4>p$fd*ybzOiWO z=~po6CMD|<^PJA2Rwr3tRC#w7GcOYN8DH_}?p?6&Hhp(Ao0n14)XHiFZfZQhgEAs! z8=V@z`=3B+zrUybLOY0poA4gM9O)=l0>8{0$d=UQtdU&4msAYNjC0waj z7w;QO&VpVqCba zz#dwbD?^VEMRW|IhF=^_>7HQm8!-%|X2=mF5ca}4`wJI2A=SJca473I@f%~DqWjDX zE+@g)tizna>$X-i2~^D!M9CqC%yZsWVuj=)?S5zaSRS!1Q#TuTmJ|dW*n3NksFP>j zEt2ntVMHyXAFZYNT(TEOM5QeNe{`6G>H z+lh6~yGoyVH4SWvW6zjJo^wtNOk74O&k%pF6S<0jOqX|wqZaW2@al5u)>Y>$$;+>_ z98$3zS&g10&>oF2K?@iQ7pDieX@cpr{LV4z;e5qgX+@gvC<5JB0Ah8OeWs%-EQscu zA^BNSo1DNXOUSM39K4m|I2;AP2o9)V%@xOXqxp$bc~U$Z-s0E{aDSNd6?y^$6df9g zB@+6YntR27()5=}l&vzcus0k=E;B4L$ehKPx*LmqN9#~ckG9;vS$1$Q(GTVh?0tyb zd1Yen9th|zpeA4)ic8z66#9SZ43#xCa-o{JreKa?9C}@C^E55Q`lH8eKWtGKa7{)%2{B;(2AH+do`8qaE20X-DXs5oH zsv#?t-Anj`2n605$4Ph>f%l5XkW(BR?;N34Hv@t=aXibRhJ%MENSkSOY8I3&IhvM6 z`^N&SRUNfu&LcPjSz1(|5w~eZiZ`6HnDp_)@`+7qp+)FQo#qHMhcd?^aDmS2tXJ6j z#9s@5n>+0c3R3Q9#u!I9;-OsQv|x$jLDh$&GwlpcF+Hqe-ycRV9)q7JNbSL~oWoN@ zsO6RME81UsyB5#0XvZ%KIH!q3+kBW`LBYzF@gAdbcaMOUd3$0wTKQm=0_OyM4X{nh zWK;QxLu!vL;{KDOKLj**mn(xXr=yv#7ZNx<OQDwbD1+BfuQN~vIFv}}r9@q-fs7PO0 zJnNdX6b191udJjTVtlZ;MSD0KmkV3pw8>(v;FQX~Z)r-L5zmO~D&2&Kn-(jsnS%oE z;*1v3-${}E@}u{c6L-p6h+B1!+CAJ9ST2j{F!A>jHBfniY@P^K5jzzV@GJfzIn)sJ zo?aqsY7Mp6l$XlcgIQuHk>C?*j9eO76-e;7>nYaSvGO#;s8b4$ml0DY_`jH|!Gf=C zO{nJ#F@;eU1le$mMPV6tMVz+zfFksP;VNA{U-6u6=GdGYIzXG}pc8n$`0buql`1Ma zl(QIF;$I(CE)E~8?GtIm22-?M!@oISVKsxzxp z4d2YKIe#nh67D;FvTX3?~oTwMEl<$XKzIDvXC z?Ew|%g=u@@8^H3<3We%1nvQ1UD(1Z%`Z0`SA5NTc9+D-@V2+XOir6?I!vk&}PO@FT;!>PV^B1*ClAm^NcFRCJ?FQ^CY-mTS))t>eV0Alc zlII@Ld&?}io4pxAZzxmqF$o@SeP7~R8j8EG*u=y8MT`&3t&H1mVx}!2$plhQ4el~M z@4RtnzU+QSzaQMz;HM&%e~+OpfW;mJ{R;tK>nu_~Sq@5%)@B-?nNfk(-$6}-cwPo? zO~S+3=*#f!SKc6UTnH4mSnm>BhxkRZqZN!4e8UQ|AzG;LnWJ-&D6K)9&Ma$YA+)O2 zmf<9$6^c#dQl7SGnw(IvVm;uuR4~6Y;Eh(g!8i1qXEzr&0hw`KB`Af9Y8USSrzvL; z3_KI%JsFb;;QPb`Cnct33c5ovgW6X1m1jO6zvV1UWgCF+P+M`&Z>KS-)x>hW;g%+A zUW-p@aaMSa$$Nm~z#%vv$|P~+yRhUh1;K25Kz5$+4sVqY9>FRar>(h_cjga#{ zk|JN@JD0&YPFwy_UIcqDXpVl-ZLgU6zKnlm9U}`57*&?jCVq%>qzhjtJptyW6H?($ zp7CPA!P|Dl;tAY1oTiOULmL&u-!+V8D&c8$IZEvj^KYXL%fGxvHAa%>Y;y`m``o=i z!=$=qIN=$K=?~mVN7*kegXtaO<1e&t%2s>E$wNCR{$om&FQCqY6Hpd0H^QF~BM{3H zBFaYBNAncEF8=_QQwO9fbeWDmn2~~%d4G?ej~Cmj9bGwySam{#V)rMXnvjH zN1ES6$n6&`z{JE$nJ~L<4Miueq5^2(ec7+RpTP(B)A)+&IR5}7A3pK0eV~H*%ke)Z zkKTDJbxWluaV?#m9BQh$P>ZuR4StbcC&kmywNwGj$e9bwag=mJ`b1El5sa(J2YulV zR?cp5gTw^Nc!6I2@{?~X5ry3wO#<*oF^^d8F`P~#nB!iLsySy+N2@4LvQA0v)Z+uo z6f}LJ-97>@_?YZB%jw6a9**NU{e_n%)7{OD`ds% zw4t6ICZm*Shqz3KlT|WkDlsVRHWN+L%)|sEt>JvhTFr}yhOBjtH>@nnF+ApBgArhI z7w4%elw6aUn)!YvN^1}s9cmqwzDbIEIf?v|%5z8rgW4#$wkOi@GY&s|xXryKSD5P) z2z8Y=5aAtnh;*rnc#pyw9dUo4E*8d;S;mWSewIIY4_HH>l*jv(P4g|Am%hH8ST_A- z{{XnGlte6XnS3pIKhuaoR_%j*U{tN~q4`EMbTq5!3ZFNxL2rK(8LZ6MjNx0MFoPXr z#42}4^}6|D;br46vpaz^9eC+K!~m&(M&p(8-@GT-%$GtnmSh$07f$SaOip)8>IFI6 zE)dP`7}ajAud4Qv z8CAsbw+3BwxXIOui1r%co=Z(iroXtF8p7lV0?YwL%K`g1oA6mBoCKqPBtmM^z6nvf zZT#bm0n9OWU{}Er_aTfHV;Fz}4sVYW#Gt_UmO?hFGlWUaP9V)h_20)x9M#u0fa(~P z8AJWt#+G0m{1Vbj$aMbzC-j`?1=nfl!Yk6>KR&BPIcic)=BxRE+~y1!Ne67{U8Psp zxwyC6&LOIX6JDJ3j%8NmYBp1@?=acy(k7S6e~7JF?^c8|E1^@I^1__Fs0$wTp=cAa z01yjVj%H>|Zgy9_!!fC4vden0kkmdg0sz2$!2(c@4ZuRt#&It?YC8+iTd3qHaXz1A z%0}Hb16}B?GOptv#XfId^n`SPdN4nOIv5TIfzcUclV}>TDR}-7xS!@>6^dqf{gRc$! z=KlamI;w*&+^@7UgLW&o_(NFQ4zCd+x(^P-RfZ0difBtZUp?7DVMSOoDT@u~f83Lm zM;gk?P5mXt(DsO_%U{aCdh*IKkZ= z4i+G|I|O$N5-hmn;F2K0-JL+t;4Z=4CAh;q&&)S7@7%f1J74Af;})l=UAuPwdi7e} zd$+9aC9Im$7BlLnbU91drC#m7k*33PImd)}f*VxLfro<=;Yl*QFNjr;8LXaKb+oFh zqLpQ!CHW<(FU7}PeJgsqmjHU|@=5MWm_@rCzho$mItaSb3P;Y976CiDb=+8c2D$=) zMLb8ZQH}MSRSu_7gm8lSB82ViLmX*u$=D{cl0b9I=4@>m%I{FU__uNnGkqO`J)-{F z6IX8g1K8^x$)-1i4C5njtK0!p@qo%Y1(U=ea~;-wpZr159<|K z?I0;fdNNCu5(P$VMPA{ga>P7SQJw0*ATD@yy@+VXxlR&G#$S!Jv|6k`umt*M6|iIz zM^L%X@9jTRe_60qWzP7;4O2>zw&;=O$=0RhoTb9BNf9F#6c^&U!@L+i$A)iECXubC zeNHY>$x;5;{D#XN)4#t>q>_}OR-|x#C&f5N2Ajm!mzu(s2Zz^TPN~9=u-Z?B(YN1x zzTU20+1=Qn1pcTow*U=~p_K}&q7u#WBOzUf@uZ6xpiXm$)>=Nz!Z491yjdo%982F} zc+rI}Kisi8n5jO-=#0b+NMD}jBlwY)W6pTn)mNu=F70WA1;@#|49xV?Pr^XSVi%!+ zD^~I@)0iqU0C?zxj6k&+ttiZaP8{#Z_C)*iVz!hu;HDd|E8RSQCzXvZqEmCUziH4W zb9fXj9WoGX>$1Pg#%t%rR3`h@ zrrtYUJnCJ_&I^16HsU#0HS1l$eQ2ke7>83XQo$mjmZ2?mO3aySW=!AWWl{lZwx<>< zAxa^hh0=WR=!)W@cYY@y8c*r07d2*ol+1mSORV<&C+o$7*1MSpLhO+Esh3cXNJJ%g zww$1JqdL+LVXUn3rF11XnMx?kCl&;o)V+YF(#;g^;hJ%qB8Qir+DAGEZD=u~%od(~ zVl&==i5nMqHRj(O0i^~XqTh*w=B9Z&!tWzJgb`U?#YYg*mowy)MB#mVud78!_$ zauo!>(ZlROFDYu0JjvfH^cHvIBE5RXGakhA@Q$~ZqhMp%vu^){)j)vHo^&A1xQ#<8 z>R!-HQ9ccwo*BEfqDPi5z-hEhb)p& zjjk;?jmGqQon&6OUfRu-{uGkD2z&%St}C>bq*g&k7TL0N2j!03>-6l|fLsOXF`cg- z7VA=2PJZ%Hp7C5!5?=Q38!YU>b}^Nr=Ou#PVN7TqB3m408Nv^<-ORW8?#SQ1{&t$) z{(h9ZHW72qAW}$0SmpPkrshGSJPI7jD;ICswZnRpY~c2cpTgv=196LSH#DyWB}pC@ zQ@_xgB)P@3nfEIB;>I7i;HSSVaO2QWsF0VNQ^-Or)6elNrzjd5B1stTrskuX_G@)0 zlX0^s)XXoR`11y3Vh8FpYwHMx!Mx%*G}Rzq#|&jXeT3wJuMv&`7;aYJ?z!M7ClLAj zIXz4cqF4U3FMbf7K-D=upWhFrDw5#gx84T%ekzIA2tvh8r(J~H-D<3>dDLvurOEzO zBt?lMjc{E*u%I-lT7wo}lx5tZti4lO(5dqQi(0YoGS8sUe%DX>;y;YEuMc^Cp*?Ay zkYt7I)zTgrb*w}qidPyK);RED8*CdV%wUHzd%rMkhm}nEGBQ>8p(a(jt~M!c*DQtU z!u?~)=ux+6ed{KQLl2{C?o9gNue7~OWvE8Y6srR+Vfz!o$WrZwt;jNja8P$5UNPCa z;U~62x-#E&#h`DRadGIK?TZ-tL+;=Da+Ix=GcqB2E@eq?HSArRZVuN29>G$hhuZng zrW9X2gOwd=(o-ixY|z--Txq1c_qnVNX56wc9qmd}#&yX^=US5Qif-K+&pz}RX0 zk+OU78j;=&j|D$&>pmT+U)fL5MaAYY+qaIv;uSDhcNJOftSCW63aLu5l%DxVx>YQdwWZE^RocKGyeW^%r_@O4QBnta>T!gr&Ah184ke5HZVQr} za|oc$=(tsykddk3mZ$@E-@X*Ip~y%N9)#TYymBjoB|DUB=~+~p$ip8rU{Y7%W_PUb zG`OMGugw4217VKO5u9rVwx#3D*V@9lR_qKQZsBAkZ=1V@Gei76E*T4(nbGIgIwUcD&zi(E@H5(S6#VmAawj6Vue~sZQk_Ba z`<%ZUwh)JONC$v|B}Et%In?vPe7Xv=BX|R{Kffux@4Jb>#kxqc&q8%j74Z_x=RMr4 z3ayXmc9+8Ld+3}pvt^wwUU8=0-^a;jC|RIE65oUE3=i$z7@+5Us{H}Z?7_(_Kjh}! zzD%#>ybhkxHv+|pZ_t?6Lbv4Q4tn(p&gW?2~#b6#sT* z2L%Vx>32?dU0Ve_Q*YY6VK<6q*B7+{2HqBBmTw%>XPgZ3_L|1ZhE_)geN> zM|S7SMkC1H`~0aleqT!Wp<8im>0;Sy<^Zr*v#1F5q0o4wf*SVt-F}xqJI$>Von6l+ zbj1uwifkL^HPU2+5tYuBG*(GyIhQFqku#1Hwi8b?LcGEopI9VjEjK8Ky3Aet6;@Ln ze$V&~_3d-b?PNWjfJ;R8gdjai-rc*PGwizFyspl4=Xf4Q!uF?rV)&eNJe#|4!n9#{ z66P=!)^`zId-3U#zugu3org?(Y{b|_5$Zb`@QPO~4I~zI`!!3GcHFTJYNNjH&JGh+ ztFyepvl2Cf<%}J^ghxEkeZg8oUd)Wt)T{YfjGhr<{X`u809F3MISlG<)%1L;P3WNYf*wF}P~*`|*XMuCI(` zp+;n8j(GT90T}r%U(Ghs4gfrL`F;JmU&MKbNDaplZlW6dRi}$%*o)cW+!{~g+Yeg$ zgt`+jU?skYK>wP?@Y;kb>kJm4T3G5%6WO4rh!GCIBuTkUBWv~>iuJ7G^NuKeZ^+Zj z+HhHxvWA|MO7f+EZ3Iz+`314nfoX0hYjrwu0QX1KCryMrPpJ{XIvXlTRFlPM_4;Wb z>m9!b@f?if<~8EMacY`W+@)sF+q4WpcSy+2PM`-=?i72z(G^5@c3yQ>fl*0~>67GsO zavM(CvM6~~{?oMSa~6v8=G1Wb%Z13C;u;#%jBz*{p1$M58~`tpEO~I?Og8;1ieB%)+Q;(xP)ZV30P5D zMVgDa+WR`SSR4(ut~jpU%z5R@{{l#_rP3{ z$(9N-KEbv)2)i6!+1RP~idK*Sa;;r8QaKOrdIm0|)#L>TvL5|CuYSf9a z8rGR;Ub5NDnuO>byYPiY6RCzlN+DCb^f#y(qgw2FvA1%$Nx+rDS7Wt_>KN$o<)A_5n=15Fa|o4iwZOhdF%npU*#$>PlaV zcj)t0Bx%0tL>Mt6+raUM(d)`WDe1o(^yI_NFoFMy5?TG#ALb?%vTyDOgR8VC)}e19 zHa$=B%vGnOo_Q&{t?qZrhm6#gAZ!AGI1hnj=9PUn{%E%8$d*3Em`<4(oomEv>&z)* z`J23~Vc+kmhXc0*upSJ)M6xbvV3?n+nP^_p1z{d3bO*_<)vX>eeV&ex4Hhwa*V|`Y zM=l3ZnVFUTx^3V?R!YZT14_5Nhe z?W~YGPSkjZ-f-DR`0)l;d}+V(5_;&d%R0S4(f4Ju+)P`E?8EsgwuaHDtQAVgQn`$m zj48Dia=>wmBl@cOn~aKn{CK~i^SF60{v+8mm1t)K>`(8!{JIRQEDD>n2>I}TCu^NZ zu(**FIimnH?N+@SF1}8k&T%#?tRQ!RepIl~2RN>Uwm(z*{bb95iygk|RJ@X44_zmOEdLb3r{);8QzE8MXml2+-sW}FKNtxvBsTm3lwRnZetch^>1pVs8 zrJp9%`q3eK%`6T^+!-52+{Jq<&x24>@aoU%+luuIo}rwb_%vB^*puODV@KnMUAJjR zQOo#r+rofY?L%DKl)Vkv=;}YSoiPh`c$1-BRp5Eyl~I=K8s;dZ@JGf26+{T5sK}{Y zqgw1jnn3!zi*&nW5Z^QES)Q0n{+%}W2%I(4qFGx^T@5gzL(vP#88?}{-`OB5Lv{O5 zx^~9ZLG)YQbj)3?5qIL<_5p)ZAypSK(@*n#P=yyWT9G>~KSU7;D4?*1x`pG@Jvewh zlATIQ0&}kdB~zQ@YOp^ahxn5fiqN~+4RA7Uo*XWO0`TaiwXE=HC^L?FPMt>;Ru()#DI`Dx+Le?LkF7j*JDf<& z=5#KU@?z}p8|LeVImNc{FTCZFr{zBKscx#Wg9EnITL8y$3y+JJe?*s0If#=YcqVRlL8SQ*EHR zL7XN9pVPgb8rV#(<)Ktf<`1BJUWk&jkfy^%kvptD^n~{Q6c%Krs7W=iI&)c?c_qnK|UBTHD>nJy!fS{n>9uDuSK;5o<$-n55+pHcOD5B zWg2*Ad>mW#$B~v{pUFx;$jM|SA2|PTBYpR%{rQcxboB@7b_<^nR3ydGI*umlji?#L zcIgZ8as}N+^)e+AkQ-Hr14)`Nm}qaOFq6t0b`W=9d%INIrKMm5bKq#e*_#kx+78TRztk zvllLbvPV3>VoQFmhrLVlGo?>_bUic)g>@_(@rRp|lQUT$*sWr!$}h6Qz)aW8=fh zCc6vD7C<6lbMQO3@omQd_T2FJ+K^{@nHwY%^#7* zxy6LrpU_+*XFcL*h10}1!qC}Z4QZs15et-6rZ04kn}I3-nNx)qmUbA)!V?@#IK*sh zL5S&5Q!FK~Y0kod(I2AZby54Zmrv`wGtyAqXzJmj?78=X_Ao<$957Ls@hPD}Vq?W# zWd|mWKR<$8SR6UDbVm%B{+@g-m^;6Go)esMtuGZBR%WT|Uub3Nm5f-t_hw^~;8A%8 z+h!?5y&>4yj70{$ggrim0F`B%zd16EM?Hspdk7s5ZxOOo3QjDANzExxkkH0A@$GNH z0MJ&$K|D0@I%-g7_G=h@krFW-9g^Ab*f`eGzIJ?Lg;Tt)%k|G`t|y7Q{o+m^I4Lwz z6lshk6*2*tg`xQ6W$G50^L7_Y!rbbYxZ#{hlp@o5h3Q&B;!}OIZ21S}Fjg_knfwZ4 zNQ7m`GP71nU7!u>%uO^GF(4obP9UU9iMEN5q{y_2E~5JY~(>$k3>L9J9Jd0#<{Tzy_n(fQ)DDgTM-X z`J1TdnQwWbs+n>eVv){|ibjb?q`cVsR0Y_nidaS1v&$8wR=NqN!PVqX61==}S1i9Y zm@KD;sOU~UkK44&YRN*unEG``l(Q^!+3p0!OJp)cmk^KBW6m8&dn*>R@g?Rrc&A3} z8e$#rf8^f&LK1UjV^{c0kg=JE%WcgY@L^Rz^+dB2NlCJ zLCTBK(A@cR%JOzqiOy13{{!cX2!;IgGnV!T66dwDzzf@Mq>`OW_G&-HJG@=n!^(-s zyI_41B@M0{(~vE0nGNnf#a5(G1nQA>t!8Hy`gI}&&Y~t|2u~!>nur_^Y;&)GEkG_p zT5(G3PG}=W+_yfYdee{ka*UC1)^z+tioo4lsPEexB}U0|h)t2cvQ(&ajzl)7646dv zF1&^vED}O$i28P%S4(7!y_-ZWIew~W&l`hs?Kl?afVD|@*YL|~w#^6|?E*rN!@a9= z$PB_{#1WxsSTx&BoE`Zm3Ke>Hz=3*1IB{rS8t(m7Bk#e+6?W-tD&CjUS3t6@A+)CQ z5vJELCK=XoiACK=Ys5SLcbEpdS}EH5Czi^-#udY5PhWr`aS`9jbXA%;gkEruBhwRln_3g&Mj==3 ztk~PGNIiT4i+yaYQ#Rst_?MpqE2KRwQ`V%Xx6El#qZnJ1J?ebS>u1`L4B{}PD+r%M zW!hjA>fD;T8`1;pG@5dK;~wFQTyB>LT7LIE0aL>{0OH^Lz@)~=d;l`88GNX^T6?Mh zmK{MAj@et``l=C3ho|A0@IQZ={ED8)u3)h5YKmMqFul<>$E@2@!lkI0Zq+p(kvFQ? zJSM{G@=(c<1@XJFd>}Nnd^rf^LVJj!nR@3~VE1_(R68X4vEb~$0P*DU!Me4%9`^DT zfU1>u#L~c{EkTgCnb>KAC7+wRkIS2a`H6ri}tJrVCS zqYsB;0`*5O;`Qi&>F0O^bIj%b6caB8X?Bx}2=A*eLtjMFGOw_dr+kV(G#Ul(igOD- zXcSPX>^;$Mo7)Z}XFA`ckf!Z)&{@tcJXSA@cfCjJtP9NRG#q~Z__6BF>lFZh`ruCE zl-1HQr>FM-(1tDgy~(J@KOo=qnASoP7XceT1>?Ccf((@(Vj3q6d-b_elIg3Kxq)Iy z%ZLjf;NnLBBCFF6azg&C!)Ti@cW-KpQ6g6&FIE=w{Z~M5&a_ab( zr-pWFC&!`dB&D9U*lJx{zMKp{N2jt~-$Gjd4&?2aaAR>q8WS@e0sW>!*+u=A^VKKy zGgCaxz>Z?_&3h5@EG6H%#7THO#4kByYc`Ex1%2{}?5LL{Io{N-fS}MFW1sONv5M^X zW@dsh##6PMkSVy=MF1)c6aX3k0{{Rp!64xO-#@AV5b3`r1AV=}!RNt$r6717Ex@FI zMHRB$KS034e}$k_kzKs$`mYe=UZgP?ep~+wdU&6OOl~;N_%9GhHpSgkvvmGe&tPsNWK=by9xygE_G&wM$6I~M(O0@5(;n_t)tPdk5X3!1oY@()Yl1pjLkJb38+!GR>`7WFLj|tPQ-qkD&L{j;GN}$BUN0Hq^ z&*uAMQ!-q3Ed1VX!~OHhu*p;GmUH|CY4A^FkktwZehmHi@sHaS*m!2sBU3``1LvPs zhQu!M?AtH6I1Ybm2w?Ct6gq2Kq51J26W-qmedtE_g!|*lKs9_CSr=-?xY=2b-Yy1CGb`jwfCd4QKDk8G~o$xv6 z?k#&a^zA1|THuD*9^=0yv8Jb(jIJ4^TTcAn2@xt4=aNPYRrO#HG$88E8tJbj={Fl? zKOhlio8@(>AO2I?zqy$0QDzjWOoFoj%K$=&a;75xBBWu|k9%iLCf+@bHU0jZg#V|! zAlj>pZlu8*7ZPA{pH><5HIy!dK)E4oTxFsW9Wa&a!S%n{6c#wI1SOuAiijtqYz zj{H}>qHJ?pNGF<+kc8~eE7REfUxcvFsWSJ8$0A1!=yLvy!4(YL=LRcl7){T+`A}xV zEP#j8rv5oWo;Oe$wt9eOnkqQBL6$Zkn+xg~{EpXGOvofZq%Uxq{g|BdpA!O*0$Y}n zAD?m>P(@?;BoR95yFMmT;oB?wwHg$Bc-UZAZ2b?F{iWjn`AZn+zG_Xy!l+es*66R` z5G2|2V<(N)msD)2!w7apOhT-i=>4Cm{_)Pop&O@qRxYva3#2l!%J^u~Tdo~@Ga9e> zspX7Jd65WaW6S@KeE*TawG7m5aCwn9rvtYlM_Ro}6sNGy`33^UaR3ua(@2(dO(Xv~ zfyO1fsN`ix$_Fw99MYIhb7A1!-b3^6Sxj25RLyTs5B_rk9S3W7a0EwW$LUnQdS0pV z(#*Ht|Mty@`?ZxZQH4ckq5hZl68}-`|8_0!U+HOQM}s#BP#!U=tlQ6a@Z2f?w@kC$ zsT+?}dy<{s7g_GG0~Jm4v;5w9hJ@bw=M_?!Z;nj$54#l z%@hb2>S*&{N&YkKzhA(FS1ngpB8i1{AJ7LRJzmoP(vqV=0)pk4aXN$Za}0ya&^e_R zq3rqpj*w`7GPWXA`28(Pe>nU8&NaH{Qeu-31TMWhTF5ZR?urnz1?CeOhYkHZ!dGm0 zZjoC7On-nu%|v3DhKMm@87Yze$fTOyVexka6{O=?-wU-s8v3i% zHjXODlw;c&vWFxHq4hb6lbXB>WTU+Rlqjw+5c?0s{d?j6>pzwA0-2b}-w|Nf)Im(1O9mIExz5&D=Ej?NTxAq! zVA<~VLEz>fW%17+mV;(5N=UK)mFfQr1=^|8%%i?xBlwc1>0;VeJJNX%4X>1dJf0`V z5(T2k1ECx$I7JWK68{}RPPgCQb{S0-UCt%!^Ja5Fy!VLq7z{9+&QQ`8ZF`WO7$kIo zK&J*?;ru%SPVLN5dI7jJ4K(sT5_Ximf2}7SZjk0vtmlr<#AE~)E9gxS25ru^Hfzmxyp?n9Z3JjUnVdyIn(q7dS)UIFFN z)YHD7kYMywsy8?{PRw&C@cfbgDWXA>Y|fLNl=8$ML-Hm0YxBNd%BfMe1&O= zvmE-~`TmaojDS(NT8lrA1Kwb+LkcGs;1nW+umAiaVRd=9__Gk}dFjHmS;a~HpAh70 zHkbVqurtGC?sWrqeF_VF)ip|4TXLbZx@|kp3nV;xV_}sy{!WR1-Iw>g%+GdGO;u{2 zP@%>BC6j8$Z&CZQ^!R1L)##_>N+w%abky_Tn&B^k`oTs2ot|gE0kqX(k?61YnmTXQ zbg@+&w%u!u9Rw{VZVb+!0sGN@7AMPX-&7n|dd(81Qem3f?z#EF>&UoMlrlX%W5 z?=jXiKNXh#Cxi_7N2wqLF+3{8BR+DG-bIm2^E~&P9ZJB`c1FrX)^8Gh(M<&xdG){7 zqy*cbcI1>9qo`?!P^2cOKEEzepwVH^Ecqbtqu$RM3VM1*-?+Eh0*)o?NCt34PiCc$ENO$VT5ka^0<%Oem zwIJZr+|ebg!$M{{L#PJ$?+CIr*qKGU&!sexv_^Z1gsi;Ar<{*Z+ZtzdoFKXvnC*nb z`k915>5!+tB_Mfd5)^b2*J0tDkSrq_D~^-4xzr0 z{f3p?=a@ccWfUGqq{MJ>`)+1U-;Xk!T7ca?ftqn&})m-Rr;f=x{b))YO93 zEjxo|2$78XdTh(A60cuQpQzt0IE_knF~a%5lZmg(NrRO3naXuKdK5>7f?#=}NxwjimA^J;QMmiy_ zw%hlTXfTLY$Oj0P3lH3d3J8b20MRpoXl_`V&>^mC_Vl7^GYA|``}E%$rZjqpzlT6P z;k?fb4OsumW!5}%+Pq1dbw-aKIhvWxPOb3mH0jY`T>od;I-M|>4Bex~B%KnVv>?SR z;411Buz>l{xT+#L#I^YZzSHzQ0|66A5k&Fpk8g6(&&|*pH(Lv;W?jG=Wqr@t-I%|p z%0}wY3I@s?WOOL(1q6to+m;}?D?o`fA(!hN+l%Sebv{CrtmatvMZ88+oYsOtGZ*^w z;H%Hv(*VHSjXlFo8OzPf>QpwJ;9=jM{+5X!8iD_a+5AQ@&n zI4F0VV%G$$cI;O!IvLyxjQ>99i9PW(RuCLLaV~hUahuF-1eTw*IuG-BR?Zv#F>@|C zI&f$u5bU%%h}zk$2r`1hs*?+-o4e%V=08wX3x*-sSLA3UzKTo<}I ziqlSifWI!cb;!<%QEi<&aNqJOv@-l@aBQ5j@tbEy+Q&^DD6g4L?pGH2Ogp)H>B)8#vARIPFZ zjtUYma{U67*eLL99F?=P`lRW^EgKzg8ztNUGhQR3t)kIsMt>DH24uvj_}p?9|&p)-&HnNcVwY zWy&7|;T%Lp!ubwb6aVN~eueR(2w2P(EU%=cr?00DAKzpYn5$(^wFh!zLb zPmz_z_q4AW(4z-2WSCp`7<6+^kzm}TY zj2ApTIL^)QI(@{nPIN;9Rt1zZQhK;r=H<{z=((Pf$U!Vg_iqlTIiLf@v$YrqW-gyc z7HfipXyNHC$Gl~(a4q6W(*)6hhf}Bd#8x9?OXGv+7Pr*CJR>lI{vh79;Q?D(ibzTI z$zNp2CpUO2@jZi0qNydl6-c*sb)HEilU^%p^5?-+9;6rf*#&QoT#N$uh8&&xxc1A! zd)B5vER|LaV~8XzERGA&sgY5tQYhGhK2(ih$+1z7!CqG(FWb(@w^m`|Eo2lsqT#fz zAF6in3Yy#)2^3mK0##0l!E#GMzcn*|%t{T{>>T(ONqvFk*LZh8n^>V*ma$jbuC4VW z<64N=&@e*PU0mAOzRXJYfiSWCq5s{emu8>;goxU-;ukyPDcV1sDrD@Qc?wS=Lj{Xi#~pqT!Md>>^&px&DwkhZPvE(>p?7eNx`i zec_Y-i4mAl`<_otmwRn}oSQHK*{Adx<Mn%`NhRAo@QF4ruXcEAkue)f>jv6ct8NAc1b;m?AZ^z>Biymg z|I~F?W(L3L4t2$&ts_Gx)tDHK-#XGS)D7_F0Yt^J}EThF8L4{M8+i| z;Nlu5v{X*}O-oiW6O)$6?Z{<@pGuU!ZsJV{E(W26!jsH+QpRI@0!CxHcTQ z-R3959`Vh9|CBrt;TT=h9xg@@gSB09%Y-KzQ5GiM%P|((FS<`hw3MM$PFFO)q8<2- z8+Akc)8&{l>VXjzNcBzDmfG$o+_uYLsf8v-5{kM$;4WcMTBrx%Z@A_&YLN+H8#-Hu zo5!WWwueR5%t$BurhM^Xj)2NM(UnGmt>1e$hrY-QHOra~`Cz06pPH8zNVt^WIZ$F< z4*hqrgA-?agnaztt1-nEt!EI&62J{~V#<=Y6!7$MRdR}e9PbAJ06o>kf%P(4@A;%N@f9GZHB#KQ_R9&x2~1QwKe2k# zg`CVlffCtY>)at4_yz>bCRITPydk&yA|T|7(?!0F*FrRcBe;%ENpwDY6nJx{oVF#i z-PE}J2{xVR(ViLS{o{o5V6k$QZN5s1`}jZ{2Ej&d!gd{nIA1M zH=G`y^rqnzU>0oS*P78Z_Kc^xo4IZiT+6PtadzAkn!syk$odU%E&_vO;4<4^PVu>U zlhI=t(xa3?)X-+id7RY2MECLH4_|U%GX(FzFXG1j7Vw^X&=qq^M`?dFF^4APl>3rZ zek;cIeX@l|t3xsC;JCK|(kGQ)Y%o9Jp@iuxl`f^J&p1fAJ@MCnDV2bm1kT-i;yG%b z~~kbqzi&bkV8)*q^a_aNN96MDeX!ClBAu7R^`nOb&oCq4O_W!$=4Rc zfVQCZz5iLGek%}cvZ~~6pD6e|dT)!an}{`4f#zC98JP9g_(wka*Lr_R1w;tN$Ky)e zc8Twc;;>)<@1jZYqf;UNR}EFAy!t0~2kqxTrALwwL@@fC*N=s`nD9gxKzyAg9mL3m`@E zRj-N*pr3?8)BsF;?FGESg7~LFLqWqLKmlN&pr8N%C;%1}hXke?rK!tr_Mp$XH9sad z#7&&fRX;-9*$|;14~anzM7;M)pQBXe*pR^w++mg(DTm%X<4oXPM^SBD3m&d|0;j4; z;)C)e@^KfRc5Bv$sEm)4l+#xoL}e@_Gc0SAvwY?n&%HQ08<<(Se8g<_}mVIt>HPi!3ZGW zc9BTD896-&GHjw`FIW!X5vrW3Wfb99I^cOrqiLjiqV9QdpOCd>Ndj(K@Q$uD)CQKg9%cUpVBfKpC0rfecVLWw_ zQuphVuS9Fi@Vw$qq_?5*5G=wsie|iZ$#2fOrsPbnIOdSV4W`LHEjAkR<}Td}1V<|7 zZx&{UuD)f7c}t}@Gu->vDiZn{;5W7(ganoO#C(omjHAXkgMyrJID>DJqQ6JT5)^9% zyLm|~H5ii~sdLM&p6FoJrl=x&%zg1=*Qok&eh3+5?l~c$SLCsn2ZJj{gw}>sp`!~o zaO>8q>;y*XY;6@F9J_dPtA^m3imc&!xkyzJPwSNBOrDCMBWk3bdN3lxD7+eYkNL~_ zHX7FXXpT|v5q4<)HsAf+sdKC8?x<2RArD}XE)j=+1D1U`{mb70lPK)Uu+ z~;mKX=nA>gCPYUgTNzFw^_`Vpn@gc)7Qn^P3|AHj0+uI|iv|%!nk>xG; zp<+ifD77g(=J6LkZM^A*@f5ymYE$bVuQIN-pr9fgDpf4AXrJAd;Od=C!uL+uYmt6m z)>X4cnpp$c_hr0yE-Uu}EQ4b!3Ojv+t437L6g~JJ;!-Wo7<<#(Mxt+)@jN{k*+R1I|9>Njd(axUw zq>gZox#%q3I(x6a+v1~hfN2h1+uq4j+GqdH^tjxwlk>2ppEje;;-8$LNgb+nwJ%m5 zFN>vQpK<}mwz^r#1VqUXA8wTHXmi)vsboHAprAW6MY~)G8JBM_&9w#4ELo?v55vp{ zZX>n4Y^?8{1UgdLI+Tju`i3Rp2Ui}wU#tpzBW*%6ntVp|3FZ|r{$3LjrR3luLe&=H zhuWWv}Z_D(E z+dDW_1`aPzzy(!F5td@KB6m8Lojy~BhTs@+7-ZsM}v8WxkioOs=m zc0I;Nbke!JhZv-iHDn}qp31o$lHqj(&F!^wsiUp$e<|ZXa+{U&d-^WK*V=lBIe6vk zqr%YR)N}KwKds?1dte=wtTxo3(sbd%r)qBwxk3)>SAZMoH({JsZDk{7fpKBC%VhXr zG`FLs^PR|S&$i1GbTSfJPDab9sOPSV3_x)yq~*qJA{Y6%|6&z}@r$D44sVy*W|>ob z44_4h8U&X?#%6C-%u~`eIbUu)JmQrk)3SJ8y5Cl~9L1kas|E2Y1tXMwnqyGqHncLV z3K5?wvfFN}bU{OK^t!w>nJ8OmI?4%dvh*}r5wI=!w|uMp!`Jj#VdHdtR<351{{v#w0l88$2@^CmH@mzy^gva;m&LJlk19(JQ)p;Li! zpW5CTDYlB$*?cze>}(&$uG<&Mcxacglw-v>H6wj1?`|A8Lm?}6H^l$g%^T!1LMhIz zke14ahQ5WDqhkBx^7$oQYN3S(M(M)g>>_oZ(5BI7ltM*lKvA`QFX?gShuUZIUzcSi z&GDvMWO1~3ni@_g+V>fW3*1XG0uLz)+3Pj8m-jENaPRk6s332+nA$pmdU%esD4ad& z&pYr62Oam{*dV9OKVxQaJL|(+Ivap$pu4; zL1f68gCt{DWKX$=Mo)fizLGoc*4NC6WRSPMAQy8UFzHQ%@s9DP>-oD0`;7u!WzGq}0!vnMLf8P8>C)W~?gc5*l6 zPXZlLesQci)O}%^VPU0AWo7aR6iy*~bdj;gH`t9vue-35K8S)?gy3PCz z{pHXEyR9goc5chQ9y$D%i4@5F5I5TUc`d6j`>rX{ut2I{a^g+#8HW*-S=urtRHX7H zess84u{@Xe@Yxh;`DY4}%qJh;9^0D77y1O!&RAO$eFJ}wi)89WDY%6bMjZq!_~5(` z3DCiv=fQUG{86#&Sz(KIzg?1;-|OEopJBWo@H5VT3ze=`Zg&QaMp<8QdmDk5N#@m= zmKS%3J$ui#832oS zAE?&VHu?;B8o`;uI2pY^aQ8=5CN?uf7y~YDNi%HS|B5i1?6&j1+||n~i!+6iD}_@tMOA_9!^j9UzH95ff_ZfDeIR_qgR5Z6 ze#EJ#BB@&&Loj=K1tdxbilw2#d6S(e{4(ymox&n^GTcG#sS7-tKEose4r$JwFP)JD zKV$9_o*V}iRwN(6`Ul@bR!omqsqw6*kaXCt)36`Efrc!J8CyIhUIBeq)|dA|I->A7 zEPptU&46c1zkSbm01p;;5D!NrhIYxk4YRzcc$vEa7bli(tfohtY`Jpm% zK+7xOm})EA??&kRC7=PW>PCHY;eFfgi<-Fsya>y^kAY<6#0osu!$)6+Hc0=f5!n4h zQnP|!d@EhHi3VhLwdyoI(-QO4L)~PgBd}b7mcikK|6*G;MGPb1$Kic_(;f6?J2mE} z82?H##OAlvy=}U=`4{?KCZWrRj~$TaCO=X1qfpf_87B|MGM!RJOFi z<8qvI1^^$Mlf&n6b9vtkjEKsZTN9) z)C!X zoBAHdM>lpwr4M@(nQVI}VUif*Yl}qg*3-Wshfbc4BiE$ix+BLICHOd!z*er1w|_sw z6o>Oc^YIncG!AYtI?QIC-Z4;0ajxc(s}f@vA!ch7j?Gf+(|l@(2!Xt^b&>Suvn1-v z2oPK{g7V3$UIDZnA!|ja1Qzi{yE_t^N2djtJO`0VgO_nblqfbacB=9}h&=PBLi9@v z0%Yk1D)-rFPXzUStq3$P7t=RRi7#&yzb9{$9&~C~(vpq7xb2iX!d6XdfY(Z*>Is#MD1AD&9h&r`t#>0uZySAQObv5D5I+jpM;^+$6?h1 zmqo(P`mS2kHON7G@NQ?ujN(E90prupAJ>!AcIP{{iEB$rou9?np_m)Tn8iin)*@Km zW*@4zLnh{{hrbh^I6DM%u9bIc5f(kR9CvP;eYA~0eeU2%wC+sVN{;Nw{?_YDZKNwS zaeTj)LeQU7(?~~_X)xuSlwY51T7r&CqH=Q#g zSw-W7OOQ_tiIrc~+97Kcf_E6}B?>W1K+cs-muu-KI@!S-G#^(%ukTL=W!y6I5NCGz z;Mnhwmx;P#&k-B@s8Xb>CHpU*D#)Hm?1xm<9o4dG{>chU{fLk^oj)`vno-_(kJY3+ z4o!8Q=ky`O7jdYrbLNC~1mKiKL7{Mu&_5aU9B`fz&*@hx$ByUJG z^X7i){|5;{_P*huJL#w^4Pp5p%M`!+A$9VPG0eZT#4mK>;c+`setq*T5U#7Y85DlM zS#12D)Ia#r&7J=ML@lnz;u(YOe&cRgydQkK#Hni?{{Sz3Q_?pVxkOF~s@lWETrg-U zX9N~uk9hw8hQKqgn_aW(GhE2At1T^y?fQ&2%IjQ1NB%T39E_;Ve_4YhWltm=RM#BW z9X85$r}>J5$td);WTS|7j3DAVR`2WYv}_{J%McD!>&qC6thY`8)n=~#zI;uZJEWvI zh^%}5rqBNX6ige7<`T3FUKNJVysXNiJ&@c8LLM2+F#-rz_U?dGp1(h?Rwr zn!9iHDkJ{@#B$6^W+k@|HrN`eQa+o27*9EL6ex2AGi*yEOaB0A440erHGSulsq#N@ zSVV*fS?AKiOu#&0@*}b2%Y=x)wVu*ksNIPnaW<{=sZ6 zUjDI|oPSVDm=+vm@113=$> zL@I3VcZgzk7{A}%2v?E^F!3LMfEn2cZg71xxAJ_x(iyJ_~SUzRus+ z;sp?)_Vj_Bri+g_HJMF>RsuVvjIJuA{{VuNB%)yloxWVbu4UYI2((d5GsLV+aRoSp zE+eQ>siE(;fNf+39sFSgReQ`6$ag*5L}~v3uB&|V#iK=-6Xz1z;`VKQ^(!h?v-MFL zfalWX0vhjAB17*k2R>92+#i`$s6zEX;;%hCqYAjs>TU2DmXFM`RpX|&8C~ONWK%MO z=(x8Q;zr((g=%F;*y%no%H@M>8q`Z{v3Y0l8%0A<12IO?0X<@&aAGhm9Fo;+4Uc#A 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 DTWq5V diff --git a/novelwriter/assets/images/welcome-light.jpg b/novelwriter/assets/images/welcome-light.jpg deleted file mode 100644 index 1a1b9f6a7c692d8f0f92490e3f27f702a168190f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 279989 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

    OdiD1mhLfOnx_OMA4irTf|uPXkH zlLnU!6bPpmHg-lnxNE*&+jAMID8t!ZR9|@7-U-bLP9vX*MlRF=hQY!GQ#gM4(gCA2 z5Z*7m>($8}6lVyx8QpO8f)Lv0ID1F*YCly2lR)`cfAO}~u0XD;C%a^CeAqNa&F=w3 z$Z=fa=!bw2HJDBj;ERF9J5E|5{ zx+5o{B{uV05+hw8#+(z`5u)S!fSeOxwWjq;b3&8nX4OwtzaP=Ky;L7&VEj#==@xTA zHcJ{O`-*uehbzTiI9WJmPjDmqshn&s5nj;B3a4HIgn=y3a@wov)8qIzX5TBcdYW}b zrY~gDaEC+~$gcz5E6MF~WuuMns=Ky95#jpGqmhZTK6iV~G%ft$8{Sg&Tt%F&i(Azi zVw}Iyq@Q$R;+Pv!rcDucRy@8NCfV`MsgS)nn#&|x!2ZnPqLh}^uMh9|D|TI-#gCQe zynPWSrxI0Yr<(9Ut)l1MT;u(e%>uarr)nU`xu=C2n>2?vsx}wEt|mi12sSeeIp(i4 zhYd&OnBMY?+{5f1=-i@-(NB?IL}DCrTC0HZoMmHY-JMhy!-&R^Cng^9Ep6y-)y+}i zvIBz}+t>Yc*Ras7sQNP$`2Gl7On|8>G-HFz$3tzF6z6*?Ee*4U5VClTkZ|FDq~FaE{pGav7Jr~xI;oWsdMt7_05C-QD85+Q z-?Bpwj2W9`0)sQhd83hC6*F5`t;75N3A7e>oGuR)#C{0ehZZL`iK#iSgn6sNqckUt zj(!4CS(Qf9s?(~~139!QF-eO2 zeB|EtuzN*G+kVau{y?NQ=m-A*kRawbIj1mxm1H=Nb65=cb6hYQN;vS6k}}3ld{Zmlh&hz#uYKpc8mhH$p9Db|BXW+(7!jR$&`g2$a{Rnp=Ns9T6|9EX ztbR3;lQvjvcdX~lcG2QqanMRjKN7fM;-=k{o@KH@ov-)I5pW9jnT_ zvuv=Sa}8C9Rb0BQP*W&Xe5~4m6`O13a&%*ZbmpBJG(z+88``ehW{UPWWYdZdE+FzW z9tvit6d}fI-r3`fx+cbg@e&!#W#^fFrX$}uG%qUqtjZ9=+o060-QDAY(E}{jP6}CW z0;ba{UH<@SP}+O3xIdznV{)tSS^nim1Jm-j zyR*a{TBKSV%(+fB(8dmb@F99XY3{Banb9umf&vr>aDwk$=n)sK79Cg3R>_tz zq{TeN=MmaEjBcsoa~`(4xD|mwRBJQ>lEPAQ~ z5e^`1M_j&aF=Iq*CJfwBhx|RX!?t+(1Vni5iKr!Nn{~yeSc8I--P^M}>TKbDY<54D zXyD#~aYT9XwpghtoGj*4vy!H^5cdJpqd4t7D!4=9E*LEX+A~#&cip0eeeQP{#Hub! zYSwN2_qg60)o|W_K%%vSy6cUY+^WL1kBTl=q`C4~DQA?|HTG!0mqDN-MZoZU=GHKi z$XKb&gfHx?Y5SY(cp=2l^$i#flK(oOYz<}og zfyqpmBawOjies^f?1wM$FkK4v6TqmD^A%2Riu_Nz*~e)uPD$|{-C(>`_maqM?m`#@ zG((!A6H=X3_L&g9udn4_lAu%Gh4ZLpylJaoNxtb%zbZFHwW>i>}n_5b7yj(IS%Bl^@iCK3%Rp`#_ntdG5 zZA%?in|XyD+6gXdj+oKQ$_t-GHjv@V%`Of;-7(3_W7qgX(ajnxbn)dfxCKMRW z#g3JNsi!_=izEe~X4%+c7;FQRQ(v@!w8!V&7I{dlXT0Su-tqQ9E3*P2 zj>iW>H&tseQ?8JCsH16rXAUzY9&#!(c3ANCh_MC0A-Zy&YFA59`77BqvI~-!%T+H) zNjLu4l=`6If&8XbMLDTf2t9$X5AaR5>w+LwDS`|vgE$h=J^J90oKREGHbD8&Z*Ge3trPA4pzo~M1i?B zI_i{RFK8))F~1S|xT5R!#lsOc@BXxXXQ4V;3io4)KC^H;RB@~fWW z=Q~v+9-W#2wdlS0XgA!z1UQ`{U}SgoMg_ zL!@8cmi!1pS47S#YFcjIcX-*+r3SD`p#TsGyJI_%``+-j_pa&haGoDjskGNayA{OB zO(tqtm2`=QnRu(RR7g6Pm;1=kZtKj61DYr&LUrcABZwQ4dd= zBvDg^$@Hv{oq6hl)c|xKl>XQJJ;P+%MPw+~{{TY2^#1_j?Q|`ro|BY~*sz{F3NMBW z;p^!$`zbh0xj13xVEf?)LKD>F6*!&i9Cy0d<~f%;9s$iuL1ze{%&%HXKve?z^3h8& zq$?yH>z|dA^=yp*3B;A?e(*wVleDvD>HF{AX^|PLui<~!b8A2QX9NHoMN>Ud7*7S& z3nLCf$m82TR3)8)>^F6l7iqOUv&WAGb7Cco^r8_{(QHn>S+$5$5e;WNiixwtXzdzm z*J8U!d~lC`9-%jBgz#YzIq0KBbFUXVa^$3pu~IqW5ro>xgoGkJw|zi3E>04cT(&|9R_h(&_?!2Cjc;Rd!Nv0?7J`X><6ba$9>XPb}{C`5=V4tNjlt}tD0{Yu%7>4~YDH|m2}D5m;1O;ngZ3T00{bWLk>Kyp$;Q(Jbx1iZ7pr~!#k;TK*l z&&&$d1DK(Rj|fI^g%iCD zXJplCR{=N5?H%18HANvsJLMdHDzzNeHB$)EQdL(-by8d;djTP+;0vQ3iQ_WmpyyV|XIWnG!u*U4wQI!|f zVWvkP6@0y7A@f2TYMV@T zSg!J}dzhii1%-20O-5GC)>W4^c;fHMj)e++o11;JK?@ntNl?jM#Z<_ydLt@ijN5V{ z^xBDN?OCgAW{u)Srjn`>%#*t_OJs_PJT8!g@J(YJS}`)rt)vmeTqn^}iE#_3DWdbm z%!B|$n#ka;fCq}6ihhVpl9p=rDte<{7P{z15j{}kwbOXm-yh`!zwQJ$vB?s6WEXB* zB6Z11bL15Q6CO4hd=Qt-Ou2)S?A|zrOB*SY6DT?vne|R-po-$@>-klqAqal<8yV3} za>ZeS85KW|Bv1bUVP4I18Ye^pvWcrx`$-aerKM906d7seW}P*xl+c7bu|WsxWzKW8 z(4xgK;kZ)jcFp`NV}%kMczbA|lKz!bcF1;DwuQ}|$Ml+-n`maCGx%H{%pbjs9mY@X z;G(zqj8ga^oGx>w@Ou9MR2tA;?^UUcBJ4+TIZrz&WVgT7=bq3EXE)Ws0TvWkJn;xe zhY_xXeI+lo!6%c#@^P5{hQfVUgJU6J9D`aUG(#mtg%v5yNaCSz%w7`+BN>CrFnmI# zg&Bq0#2h}1&~r$2?8lv)c+H1A0W~UKQtz!LdK5;)9FOE^yFP}r0JIpg(sf^fURn2*k39(_BvBF^4ImxP6 zqGW96H4mMeL(icN$K<0$&;X~JGpAkNd#?Aq?`F}*7L%R`4_Q;9FvFd7$GeeEmJ(Dr zW|&-N_Ry%A$<6wyqsenpw;LeL-IJ?qXe{pIEfGO>u|DrZns&voI_v>QMQ5eRa$n)L zsIYl8)c7Xs-^A|1dG5!+9=a)tk2LL}$H6q}n+|wx6h3R3t)+IOyBmlg z>s_$KbiF8l(!&h+SVpR~TxLLIuGnCMtJLkN(ni0uKXtAxAmt^xdw*#%4TT7-KZuF2wOSal1 z#({XvJ7(C8&6_viUHy?k0-3Nzt6ld_Ck|d`XpG+T7)Y9QNRA}C8K#+{(@9YT+oZAB z%pn3fmeAb&f5_Fc7rGO9nJ>E@DqsO-7;33(R$h~?&Wfr|O>(?9%AJk?c~)^UN?G$x z>tkX=b=S1a5QSwN4mKd>nGn6LER(7cB=G5Dp5t|`sV5}pqGAj_7;WUCOiK3`#c5>M zFEHYBe3l+_t3txLt~^xQ4Ajqfv<=&Q9j4`c*?#yv#Y;=~b|5v8O#p-IQZbVoVoXEfN1#in63;|B@; zM}zK!&2MfK7Bo0x+H{xwNO94CmE^W)u|4So?#dK61O3G}x7r@@KJ3+THUNtbE&5t* z@m@C6$P7w+T5%iFQ^?pF&|Kqy3KrKCeVP+w<1@rYl0;c2@i$e8>eD4nrT2NM_nqrG zJ7C#N;REF!JtLxPTqO^@?Cy{zrw;Up|SvSCH7r_M#O>LxJu$`mZas#&q(%MOB4DCrc(y3luaM zuiZ3^u|dNFXq}R@=$ttz5NDmR<3wmNAI0FMtrhXzKUG{65pI@!gJ*Y_ia5yhTDwSt z$hQ-(Bn6aGLerWW>$}=Qrq>DFC)OGw919-WOPZ73Ovn;E{MgmopjzFs6MUo|_qvSNf)M**z>aQzfbZ z<+%3xul$b(-B0OMW{!$w(nNw!K&cJGsa}IYrmC+#3kj6h&Zb6-Rqmj1>bnPZX__cm z&v~(Boz+`5NR2!pqu{j!BG-y9XCq*{QfXAl)~XiQ7YnybN2MiovJ4mjmzf#Yb^h{& zvqd8%3V{h6F?`_{M8=AgH3Y&ejJl}*EiA8 zHRA(RE$V{79!O@dWZod9nL{PBw2T^r7~R~RqMJxWI7}||x`n|Elj}(bJ0#F7lAVQ1 zUBSBl0C_%m08TuW=`EZ802_XahI^3N3B{)qcNF&$c#bGO1X3$jdMCksqB)z6Sv517 zXmOMnoFsneMTFlf%(V*ia0jxa(YdPoObTq#Px}stY#U@wFY;V|o3Dcvq43@$K~9BJ z2=Ou6gxIj1DJXkGGw%%zuYno2p}AaeF(ALV`C_q>*3bn?fd|xJZLl^LWA~5!kRu!l z!fIGAw?%C3(iinnfx_XzN>W^qQ_)N+{1ktG_WXxAg1S`|i+`dGY&I6)CZy+xZ1q{1 zkZ*zr%4J|^7u_EkBRiu|y(7>gC?x$HQ=& zT|_$|c7{7PilG;57vka}oo6||FpTSm}L3;2E9meU&u&VQ083MVn*PX0n~ zqD6VExJIRDxuT5dqExi%#VAaM-Uu}W@_5T1^ z&w*0=TRsICPwK}vBBnf?cn_$aDVt0xPrTn$>AH4^RNA37l!_!NJ`0O6yZJEeb#gjzCoAo!`L?F4YaZ_NJy!)#loPmAQojz1*GEd|eeu7Rq7v$qIL z4MpS0Z5c!v^-!Vh3@tFhe>$*w3g#2eu@B@rkUEt(@tY-lHu*$B zg3!CtKFZ?Od`4Vb5Sb_=MT$*ZRQ}C53|| zGF?=VH*YG-rG#p`)IiFLRyTXLVB#3=bwvwi_XdqgMVmMHh@Q8i5qwj5#c0s&YVyb3o2TJ%=FE{{ZR`cFnXt7I$Yu;DH1) zXm8#^o(RK+;Qh7Zfugs0lwTSvqdeyGG!($1%380p!~4GTMOPpTG3Ke zyRfvf_DDe4;r5XZ04j0q4;*nfM$@vE9iAETj4iB`9kK!8Yoy?DYJ0tDEHMk#$y|vT zHO8Pwl*_eft>J+SYdFclwB#(%qfA#+SQikP(@Q=}8FN>Qf#k0S_Kd>p@lfIm%?}xc zd5#VotT4=O+932{3H;U5vP5%TLJ1fsj@a)u2{UVAViYZ^83eZ$`ol#JXoPrNFw>Un zV*xioc3Ks)#Bd>@!G}p2Sm(NpXqi#=hhr7@loKvE-cbJAw_-7|8>58Ld@I{C&#B$` zFDG|s9?6kk;x>1~8j(+mACgC8vC=B2o=j70?LKmVQ{8Nj!oX3mJbqFhJgd9v6@iW$LNL-h@JQHujb#%!( zBsa~28@VF}F3!vGq4`2v#d=F^fwUQITP*l}X=U+IBEP=!Tx=QG)(Vo0xZ)gKfx!|= z6~z$@qkE#3Xh3tWxwtFvB1oKNP`<{-c5Xj<_MCYtYl;M~1W_A2cftoCP}z2)<^31> z`;lP0O|NNfR8Z^8EuoeRWsZB!V4qdAkYxCtNO-6_K5-%j_$INUO=yrFWcIr>H_tNK zueozQ*Olbs#b;R+4jwle8~G2(!43C}(_zChbEzgZU)mzNBl9HAXF#ds;d+hz)YK=6 z-7}J8Ckw1?ZVbvgb42%CGg94av@>4tqL8pjYDOv^RmBz2Q{tTQ;DpMr&vuKm1Q%zy zJci*ipCzM(2-49QV%i&LWyb#inr`?bCB;=Y(hGas`6y7~LlB!R8@;s0Z+W7h6xg3> zgvsRRfI=T;dtx@=yylxKp~S43;7A$OGill0B0_kfQC{BW&^uA%j^$J0T|TH-N|jWZ zY9i=Dfg9AxOW;$cm_x2OR`6ZCiDW~<_L)nPoX3e+w5dvc71M~#cp|oFgC~Rzs$3T=kj=(so> zh;wPETIi%oB6Qz`bP__8SlDQ#G{<_vYpTaJ4Xw;9CUsO*WV~&bTB$Sd9f$Qmnz+@+ zaC5HfZy7Qum9AmI!bq^>ZP9GH-ZEE@g6N@{Roq24?K?y`ANd_6BemW>%r_s|ef&oC zgjGL?F~0aM`mgZ&TnNWTLV;~gs)s7rJycF0naxe6MFSow5b?V_PenjT$x()j8GFi37nIq> z$sCW-Niwy%9r0IUZ36a?q+8QdubfFBokp;umMPNU2(9hrZ zQU1{#tc?;UcM?D!{h;5p$emhHbT_r_Ikf&y+2INuq0V!<5BL{M(^^2DsjV2J3{^~3 zh$*)%_JgTZT(Yo*KLpK15vEwHqNT=&dikB%3J+Nq8Z>;7#yHoKSWB2 zv_umSFdorRqXAe^MR_0iH(Mbhv{O{7htW$rDio}yE2%`wivU$s0=qh`6v6N+ye?A| ziK;Wje-7;8IgNJCFI_mPQUx@c! zCsYoWP7}yxE@rA0(99k%)ADx0(}Q4~J>tHyO?Z-PzU=cs_|j8EI8CKp_$jIHIAJGQ zEbvm+h#fUV1riy{i81n^#X38%W*v8C>@>0i2Qwut!tHmRNy#~Y=WCdJ5pH0}q0YeZ zgB@g+8}e;jatK3onrBc&0#G>Gws#e5?CzvQ;un+3L|(Il~~Y?2(LT=GW$& z*R-|bg{LLZ$w&#vAa7xnlffB(b}~9k^k{mz0KD+3KGYV2=#Jah=G-&AvIUmuHCn(j+Khj((~% zZLWW3yC+CaY4AUXvE{EWFqr=IfSkTo;F<;)C;tHAKT%wsJ35jY(Edl&l$DXzvsy{%o8HCT@Z+Mk_33o8qIMENjaw? zrIHzLiDtU4d8cH#Ddd>{09DgeQJa%uQrU#iU2Fauh5C7i=<2J7!q>7>b}j0r1f4pm zIOAkSwt&gV**hnSCkJY!osi>0GJH1&0-&0|%K7vd}e%>(HjvtH==fE18ytm zr!`A9EWERSCj*uRIj0GZ(VqQ7+WgwY$o=!nazkup*^s^e!>2)13>DANbM z`)&(d?M~ns`G8O;5o`9i94$Of6U?B~M|#0si0QW?npk++4R<87nku*;46HEOD3D!S zj!^da(8b_t!KMg01W=H5#sbmMUmZ1*Ou5J1JnX?&Y}OGG}GoEtAFJqI4SE z#fMO`Mu^jQgji`~Y2@JXpV?j_SvORJS)T2ergekSdVz1&?*T? zQ5h)#L_cLY)iu!Fb~9_$2#uq#b95-Rz&WOb6z!3NfV%TfvY|y_;(&e){{WIjQ4p~B zENX*}3VAQ8k--|RjKnk%0VNRF%`(QShJTZbVzT>11I|boZQ8AvkWj(9|LAG0aZ~+Uo{KAE~@h* zK6w!3b~Af%gzzd?`!`Nff8@5eR{)I$ic@gpuM!JF9|Q-$ue3Ik#8_u+)a>xETm{EQ zp!V$V{{U4H5m^!+G8G+yg{|%E6PyhVP`zj<6hN0XUHR!{-7M#lH>))0evhJgDc}|< z`8C+83Z_3WSJuhpWCjKo$j$tMX!=_`@?C>TGo5wwS4APP$-LL@s1#|?%r$WdH0p%v zyMcF6bU*f$H&E!W1DY(a0jG_Vh;KhAV-mj7AvPXV#P!@Ze#%P;NdcZ~vy-MYUawVo zvzH_$Z#3$R_z>)Nhc&uRYVOw#M+@vh%y4r~WAZgsFwsMEsV4$e(l`!@+(7bD3%Kus z4vOHx)kB2YN>l>Ch@RxIOoG8TI*ZE}MR>+WL3t=`hfhUe;-#*rz7LXr{{X7;q0M*6 zLWm5*nhxa1n(qA7T2#KOZ1`K*lhD|6S6p|9MW+y^yPq{TS=x^LD)=cX_$jVSp;HzW zOfx4X6cz$n@yDLyhylgI>l7%_9da8a>W0bphJKZX=%*Qn*lM&jLek+TfSJ6{)NN^I2OdbM}K2(qQ zTlBKy#UzH#PjkCG$C$eBioD;2ro3yWN~&13OjmS89XGfKl6_iq*2BqQh*O2))vJa` zU#6-YA;7}m6M%g08oBCCh}RxQ&dX<%LxFVjMkGTrnBPPkHCMKnb91;_{B9|Koe$;M{`)&THF|7lWZET$~*mx{& zJp7ea;o=qGXl#|dtn8WGZ_Mvd$y{-$?xwsR@@(IJPCg%zdg!WvvjsgBLOiUh;A5T8 zDzrl$(OyzM88Ck6hQTi8@{Q03MVyc$9MG>HC0a!o+ey5&*m&IQ&V6MZ42PTE4;XboMiZnLOrBBlJQD0PN)LGfXHI+`D zWz&}qiX}0B?fDc=p-gvI(NSuQm`WTa9?{JK3(;>C!2FAH@gJH5#!B^qE zvxiW+9w(}Ncw%#_hUCQx4SgN;vZuvdgikZ(Lq$nXzD&pzofA2@{za2osL%GPk#wQj zJBM76yCQIa721t_PP+E-C&9lmDiNT|q?@y2l8^DuJOAmsq)$KD>?`dJ? zX1VKVYrGXQ`7L+7m3$r6J7|5|?z-6t%&CZPmadak*0v8_oREYTuv_Q=2+cItjeFk65KQ>xt-yQa~2Tc;tHXgK|;((O(#4#CV7pQvS$Q& zg70ZE8(IKp^E)rP;DCuaddl=J2%NAhjv1G%DmN~_jlVT?QJ-HjB@BRbC=w?8Z>dQ^ z8CUE16!uUFcSJ~p*2<$bShPA(7dXy!Qv(!m6I3!^ODpkJh!0AmCYOAb16sT1!q_V* z1n@a$VA;cg0Qa_$ma{JjF!(*39GF4t1O^#}H7xMSM2t)rj^_J}QNd z@mx?{r7F9HcS-@UoN~cSv3&X>1Q*kimtse}R}o`JRmB{hfdax|&@SPz$H9KeQpISgiU-nO(`hxWoUG`Z{E&DZ z$bgkwDS=d>Tuqo*5WDS>)nx8#xZi^AG;|0VRA!2*78%*ibWn$|KM2GuZNXvu#pm5) z1t#MqE7$$dk7o^x}w;m2)R4fT=zQLEPrL& zM|o>!ElDVimK$KV);vyM^>NFNO?;4aO|mQ&W5(;p;HKkw(y7&6w{CI&0KESIubZtc z3ZiQ0)^k}ZCr(4E)fE(tS5?szEFZ~5g2!En=#q>WjkytqPGQD&Nmj{O&m>s$Ip%j| znyTe&I8epth0~UZ4F3R|#bOpVV6a$QipTI8EERVpxiBZX>eBMXR~t1(Rmd)ga!rG@ z8J|WXx_3D$CWW#=1j)piBQlIwn?x}XVR*0lxL@vH^^m?P&|pVwNR6oh0jj#AJo-;3 z=eRT~at-U6JWTnk&6GjxsTvzO*&wN8^jtJS%L%FEjPO$_=h{=ZpYpJFsB{}cYcE(S zKjNkg!sv?D*1FoNTP1nMT~xMyGp<1$wll9r+Dzv^L}C1fA$NksX0R)|unQ%M?<`N@ zloGIR;bj2DKsvuv<`pLHN{zd?;hps@D!+6WRB}_5EimKpvm=;SftyYS*;pjDHenZt z^c3BJw0aYh{nQ@Zd%;E8Tj(&Km9(m_!C^kO5^AQn*?a1bW@pJr(AZArH0G5|mn1S4 zJYmF+=>AQS#xP<7@uiei+?MAwEUTua4U-(#5uSky!a%K_52(P~YE@!4;=b@M^!yeM zDvT&nR$2#=_{v7~%Mt=eQ z)k*@%S$Q#4V7VZO7-WsLvS=JEE!A{S9@;yu_rH*<+B%i@?Ee6A`_bSQE6`H|NdF)m{hVYBM zREayh*LNLP5t7Dgjk31H>Qrw9sv0hc94C@GF9c_b1P=sGe?)6lan-EHB`htKkv4d^ zI8f+Qphg@+J$GQii4o6-3XBKQR8_$cjPS6jTP3PvtgV$o#*Rp3m7hfu-rn)ttB1vX z<9;i@@>j4Ll_Rvm@O0Obiw*A3Iepj*(F?uuUwBu2-xOXk%x=Ki0QL=)RnZwybJ0^9 zI#>#ED+P^{%`%mD5%bvDn!#aiD<8zFgqo`$jrSh}-Vmup;bTxmRTSx?)kg5$Dw?6u z3%)uhb*eY9%|bQ0Z16z~1paG=Luqey#XbyHmPBEZY27()NfZ#C=R%r>;85&#s7XfZ zEf&eHlKaOl`@TDk2MMU~wzB56uHb3z%PA~)RNS_Mv=aCYBeHY1aZ_i(WU*c47V7uaX}Qg06#T=+S69(ux}ZL2s_7(WijZ2#5=4q* z&vc;cW^qAD3R48=&ASh2geY8Pcxk?7iU^f4XEi$4J$j1;h3l`I_W$NQNoV0=?Dh}pT&14;*XODs{5t_ zIUu^(($i&6g5eizBP3$5V~9lEmx{V*Y?78sTRJ1H>p843#ZS#(yQN`fA!4z!1&89} zk~$$^(M?Xk6p^YmN202Sn$F59;-`WM!!6eC?VtG09&UP}&cZAfx>{H_1e2@rRiZPd ziVU&-%6q2Axuk=7ibsMjn(q}tf~ZppN|>x9xmXP7q%qe-Tx=@+pG54`tTdW#u2`v+ zg2K#~c~q>{3%a|b&*N?j3vpQf77#0yw6b|yHC&UrEfhH{D5-)rQpu@`tSp?AKAXE# znQUjI4rk zz7gFP7;#u0!;wyY%6mwDq3;A*_S|-bRY{L@w8e2XuK6K&7Ai&_G*o*(+`Gf#g+Ws; z3%nP2ATeAhl4w+y6;A&EbS~YK{1>=)0#MNma`W-Bl-2xRqCA)NwioM*tgAp4hr87w5aAi1Ce zi1A(X@mQaVl*$jiowYOM6fHM#Sg!Q!X>Mpjc;G&g;AQ4$r6ehbiBBBxRW-Akln(QyJOyMyS^{v-^W|H&@`VO6>Ael+QFZCZ&JMsfExgV1}75qMVmC zdQ|SI%>?1f&T2^WvCY<=V&13jB z3kz}lGJ;DP1*r;im_}-9wLu(|fSSTxR}-<(VLqyYRy=AfezLO~=&5ZtIVckKcVT<# zd80mvso^UIibur`RX?hS&?@dw61$H0F5<{|smy;Vg27<2SgclS1%kuzIifyxRd-2MA)yJ9WT?UB z3!xjX(7>~ zx>?G}AWUV1T&y|SOIu-8Qk=Q0CXDH2z-054xGw2H z9TU!~crNn9*@AqvRNcLYB^di4-tGYfLlgd&~naN8{*qu?+dMCb9ItAUA=8RK@p%8Hh)G0M^_i|XO;8u&8 zB=k^6vZuMS9Qd;6nz|qsGE=k~A)hoB6;sV}SRjGY(VdQ#l(&_EGUUcj6R&8@MXV#WY_9e?^+3RT{7hACm7CQhqzqIQg7H#bUEq zEEY=@kK>qGkC?5Tt)e{FP`Vp1s;UylHLB#G`@68U?Ee6C*_2mHF5_TFc&9YkBi7le zHx%m)jE4+O#WEPdqFbe}6etF;%huIM)67(WyY2X{@}$X5eyVOlfoQQ@r-{DyJ(jD+@AMtX6YCd^b7S*lf%(Vq#^NRSD0G_&Za$uL_B1Lh?|))X!QG zLBINb(LQXFpV_-Vec@c%A~qbcl~ve6xwztY>w+(b-t|#rNN;K86&dqXXz^Jt_sMtN z@l`Y4oUNmm^;&LXv9}G(e+a|yfu8OQ0){I(nOXEge+|#2pDQ#wk^*6J$r842{9|^W zs9e;R6;uLp&v%3q(RU@)am4Uy!uPzS8V5wzG9C5`QB)SYnxv3ItFzf55;Jx~sZE5y z3`1CvJz|UxyNEp>>A9pqfklrJBg|1;ir$VGg(Jlb_g<%!m7>KCC9RF3qe<{mkwTy< zozG=rvGeq4_%7j968>KWg_x{u!|<9ksmWzES50D83kxP_2CKh#`!zrYT@A8Gb5j+t zED%~%RPPqG*G{rrTSJ}TB%lo#H(euyl$I44qdZWyW{|?9FnZNcOLXQmQgZ{_?J5^T zJd@oAZVh`+aq#~Dd9U$1V;c|u0BB5~jtRRq&e<`#;%tSqGtr?SV3_gg3GPYb#Yx@= zUou$shcx6>=5g%#@>B-6Q4r~>OeY4k2`r|rX^fDdrmG3>$f+ILRejsO3%If#Dz0j* zPm-&O%=oV0UDk!(YQ}52REs`-a|MOC+k(J;Cr11NFEp0?NN+vh3oIpbSlNO+tp#(= z%2iEcWflrvl7;RBY?sI_6OOy(hY?>fF+#Ygmbo>`}WU&gaSh)DE=gocFehQ5P!Bojms<Qp7s-mTYsawr6ruGT30KnBSK2ZP? z(aXuWAF9TSy(LPbPWUZ1To#Yh%tRdKfd2rt3%_mGc2ey!o(Q+@<1@Vs;w`@s;f>Uy zAww~Fnj*uq!@Hg1H0zBQXF#YC*UT3%N!lzVv1ncO-dUC1UBIy1#Z}5oL>b=IO3wGi z09}Ue3k59Hok6Oj)&Q&~s;Cr;Xr**XcS4r*%9#9fn#d|Ds#_f2?D!0yp-^M9zubyF zSFin3Wp9v(e5+gNyZfN*D5kpEitA_=G7IP&I8OW8uL=}rmMDwHTiC2tD>cnDjB#Gp z{uK%YZ$Ozi^4=S6&%+iSTwA87GA9PmF>bvSNZ8#Aw2J%3>0vo2f>~;mE7N$moU9Ft|n4-cq|+VvSU<72YcwZ)C4ZnyG+=>8=_MWdi&(Q=bl!RHB{Q zssZL@J<5tHw$4^d6(RWLWU*W?u+d>>E5d8apYV~mVvRYcL5X%W2(9WI3VRv%Z6r6M z0cyN#62{Fe35UUUQ4L3QocG+_3Ls|GJ}WCRSniZ6h&}~ynxNR7?RW2tP=@z;Xmsi= zy!Qq-QoHVdy45FNXv2x9{hjgw(`)%C+caqi*J%8ltCfT`UVBX3>(Y|02$HK2p-5hL zg5YRxTCOOLQw}4=ccwY6^rVGnT+|n|(5-iPT2F%evZr!gP`t^hvxAb8xVfp~uwB5U z1c#cblB1@nRozsOM10h*8z`kZDP*T-BV@9&S^2D1KZ?{%Qi_M-yOR@{vHt+W_NU39 z69MNV>a9t)kWRDcim8(NE{<1_YmXP#d#GROqLS<84YEaCaiCMja*Ctin-&?n5x??E zY~hGI(DY7gc;bplPAki+@K~xZlBDUPz_etlPl^}fNpOqgE)W^faXh&5D+MeR*F@2p z3mjCiQeo~D#^4dWZ_N%I72CWj_huFY&UcnG=%yW6QC3Sez}oXg)5T1mHzS3TD^X;M z#4Do}HG;z2RzHo`yP9xs-Ja=8qWhO!Gz5aUc4xbzN+FvpQ!OEsOLkbt{{V=t4UcF) z{3TE9J4gQjiE(V3Lwdm~u%18AjM*vb74FF0)*vyh_$@%RGZ4-EoVhC zZyPl$AXYymJ1D-EO-(o2ubHV*pNb8iiacQ%OdN{iZRNr)ghlEVE9T69l99&A6(eYO zUrczuBiILPXHYJMcV~kSVup3AkRF$$ zdG66^WTb`GpA}jv&B~1dW4Q#&GO-gFg|8$uv*xguCCgQH=Ig$@l3Z>Bl9VRPnNxeq zy4j_lD|xEdTR(ItrGlE4xmi3_72C#IehtY|$&U8q)d$D<3_l8yC&6R9W+$q<;tii= z+pn?FKIzPKg!EJ~$NK*Ovf*@b{-OO4;)*pT>-C~Z82hPCqOPY`l!8=10jbH z8Zxp=6-l23EC*FnRj*Zm+>jG0tt$yCeAP-38gE^Gh)Rm~4pSngvOwi&$qjTtk$bx7 zXA4~7vA8{zJoh;%tyNbv0;1v}9x1BNRfM{%sHT2PiPh1lI0Dg>?ZVt`!|)DP-fzQp zX9Z2nKNLE7g52^bwZcRxfV5nYx;lIME*%=r}_1J2W_a22X|D(O;KelL5>_KX~39${5Q z?PuA;0F)ZtmA8ka;duN?@^JnEXtyAx?BsoWNaM7uJK+(#o9f_-3x$2 z*@6E6Q6KZ7^3h)xsi(nkv3E-Hge=^o1cv2Im0j{zvgU+?Mbv-eOS*F`IZ3ABmXASd_)jy6cC z9nOD@@TxYp;Ivbe!ogs>U6|d^84#rxX(gVko=TgqMCm}T!iE|>khsjct}Z3R3~p4( zN@{7%3@$_$I!c)PN>pg%6y|2JQoMY|8}*VB>tq_z;>OyFE^CBWK%_<9WpO<83U^0R zfQMCApNhsy6iw;RRYs{khgByJ5Tw#P7ZI05Fxj0?n!!sYR-o3z}NYiu6EYRel3d4V6a*$+f}N%RaACH~}g2{P7G09Q1=BvVas<}*gycI%}l_arT)-~45 z6-S+}7SBD}EM`9z!A$N0W4zH*k~*v=R{#r|CR0;JmQu`AmI{Ga75!B6MqqD~qI~j_ z1L18-Aa_u+1u3+6sa`(?TQFFED@RMkchRmW8JVsyN~1n1bMyR{3aaj`Jk8T>;khID z%&nG|Pt6rYh3<&E(N4-}5T`(cZxw-ZzyoHh0c7mKVP$uLQ3jP!YocwOAxy~tuC{Yr z)XKuY%HiiKH9;#$DoyVn zlB>+WlE&OW45&hu&&_lEaEk%3{{SyQh3W+%g}g>ef=h_`>^~G9dUi~HH#;SzlKxs| zflymBg5jW5{09%fXt~=}MN{UaZJ7LD8#7pL&-p0;q~N*kQm#^ zpNeG~0AB}m^)+Nb+5Nvp%?72>{{XN0rHmrNwKMJ@@lOrRJe7kaAv@afO5MT^2{Jqp zbq_y-$?Z`FNgD?&&+3Db{REl>@IAlkM0P61MQ-L{;lMjm58l}D7?pQnWp;g+9v!Or z^i1rEt54O1>b`^x)!u(j8iSdHtem06eY^hvsE6;-x-aIKo7@jAzGEm*mWPskryz(e z*_rLEbZ^UXg4tDT-cDT0Jf?4T`msh31bfdI{@$W%iJ~sWp3mR@qc6WPhnw&dQ5|Dn zX0w(Dj}r00#M2j+KEj)SFc^wlYodPh7Jsg0;UAF91Gu-3C!%_}Cl4I%Uqb2iCy$u? z2d8iy%_rZWS1%IseXstbq~-qrwnjG{ty;2TZvOz&`F9vxZ}!=S2fqx6=h_BzL68pY z=IwLT@xdo2v2Cvsnbwz6$-TtmFkK73q^M*f@>}kT+f*yDj%zbp)o5DN%-z+>AGfr@ zM;6-;+Y;3KjW8ZjR9CrwF?mAYL4Qs^>GSxMB~i|Jl>j9G4rp?@mJWDriQ-s5HR4SN zVDA1ZWaRy(3=cQdq;Xt4HY*XCkh-d>*0Bn(pMI(dBO~B;fQU# zW8R>jD74Vqr~os^L2f($0NFs}Uh%N5ihi=gO<_=TmmT{-$6GRGRmh~^jC?7L)@z)5 zN6X-44P8CQQ29`1+x^Qr*9h*x-Y@GZ=6bkp-we1Dj)}*&%}QNKRKS%=neHUGG!Lb7 z8S6QB{{T%clq{KEZvPnXNE$ASin*jub*HCT=+v8yu73Z*$1`NYqgSXZVwD!G*A!oG-nMgXWF zqW)%)iY;5`Kg41qtAb{amr+{*Vsd}e+f``~Y>kwXY{TuJATN8k5lU$&Je=MArbLR0 zw!D*;qfIkq=0tl|Ys^QN64ifh52SAs20y`P+i>7^yE4u88}EoVa<2hnR#)`;LLZ#)g>NR{X4fx^a~hocMR0n@tgku z$(9NkJ7OSUh_u!#*|~~H{>pokmi)GD%MiQWi=Z8OnYv(M@PMxZodT}rkMR`+FJv`G zpYgHw!Hy36+S5$kZZbC2gSN&eAY zRco+r8gb2pSw|$j<_yb4N1hDsh#W?pI^pJJia|~E$KUBN!>bgvhlu;i)cU!EM?#$(U-gtAfaZCH`6bO^i!T0<3qx8r4qh0A`5FMc zuc9vy;fj^CLW>Sj{$^tb=Ql70Vu*0JjOrK)L3n#k?qX7bCFkEeo;uvtt3AgNa)j2m zV())Q)K%me@WWzYzzfFD?ZB&5BR+7hF}#1%P32n*uRg%@NS_z3c6C?zg~ZBHY@B@Q zxoINPW9=?kuwOhz;nNTjsUNZdoBg0Qvo?t3!xxe~KLr?u94(7yG{Qfpj6>B{9!F#8 znX$t@(fmbaVfNpb5|`ps729~`Hns#Ad@0iXrG>|`O=S2mkRC)H=B9W)ll_mxN{H#Q zhN^wku#ojU3glP)GNc+AhDJ=b{K_S0PEVT)XA_mHufN_}MY0yTyjufAW{cGtUuf70 zvfJRnRsmdq&<<&RQp`hG7QB0IE*n<%SU#LYAl(J{g4uZ#$HW#_ydN;FB<`h>yZ+)= z<L2g)Bwv@#kVO#P0>eg2x`rYdA|=n(BLZ{%ILr&P^rf}5dQ#LF?ialD$)L$jzq1P+*aj2ROR9C z%(Aor(RtLeQXK*Bi9j08nEu=f=9f*s<^qOPdSfv50M%-n_=l5vNM)K);oIIOPDfeZ zVN#R5I=p+$XH(&S=@0s8LrBJEw+w(jnRLIg!;op&dm_QaKk1QHL(ocLXyTxM zapDV#fVEITW}E*2Xfpip{L~7b>c71D&=C8|%h)8nqjn`qYL4l3FQsV?9I1Ge+Xx)~ zf4xc($9AKpxsOK8E8mzeWQ+Kz$1=DiH^NR)2LYEYFsQ<79s6TB@h_E)uYzOB6$d=c zIM1jI<~v@F*b@o|BmV$PY#Yz~A+^_o_qp~gqwN-VQnmzrIGlN!gwmHUX?B|6<@4}-4-QHj(SHkYRSN$zmmqI|lQw%iAE^+H)0EUznd_w3WoY}-hVytyy z%>hzx_#RnmA^?9m_3~+K( zIW@zNEu_~-uPhl%)@25(A-O%gedTJdxovm8cmDuOJDf|eLs8$S7Y{|v#dMHdVr0Mw z0_^0KV_7X9a%?;yl=y=iJM%DV=zH#<|+>y)j>=+dpb4wsJpV zUwD_}h966aMbAL{JDg><%u|&S)t?O^x!?^w`I@qjX8!*GS!QZdw$OKVS1&Qso4;%RnA;6g4pkwRo?+j1 zX-IR+@I;3zL_V+VgHpY-_7Ed{P*>LI3bo3h`f3?$beZ-hq1jvP-`XT~ly7~Y{VoT| z5= zrAywDQXso6e%MnQ{<{9jV`lDw_7gd_U*s5gRO|LaYu7~RD{!itGH*MUJXz_lEU|S0 zJJ0N8A~3k$l5+tAo&Y0I`HIi9vdvj_6`GpY_ZQB!DjBG}{7mVTdae`jhWOio=3x~T zSxZs%{pH{aK@TBc^td)8)AF~;pZ0&m+Yq}@=x@fi7or7~5Chy6evXwk1e>bi)@yKI3ulvjs@)Rx+qGQr?g zmj#uM68^!ScMzHs0oZc$o)h9ROhm!r@_aKXN`2-JuhEvyAT;)#IF=nqIEN3;;gDq7 zJN9K`NG_t#>??}(L~Q8=4}bcFYjWQK!Y}D81>TLN(RI)7FR`v>_6u0Lk1Q!R-YnZF z=qRaWZ^Tt6pj+9zeda=tG~l^GJ%&tn-UE4r;ia1Mf#-4J_8#t~>u|S+IhsG|p$h!B z>Y!VKTZ^2H{U)p4KfObnS6}m&eL+QjWx(uEKM7eKFE&uBXG=p`lmli(Iq?v$=Q|4y zH}{ohnztps)dP#8yxHD-OX4)cYvQ7Nv$m;cHGE6gZje`j+fImS%e2KCbFcl1)3_+B zxW$UwKr@?^Q5zml`fDBq1YGdk$o*L=Q%Sw!)kQJ_A*^;x|Udf+xcZ}oW9myIGrSkxHnBAB@WjC6)EsMIrABia%xclrFY6^o$2%2^W|&8%GsaUCjr2cxyJR?E`WQ#g}>?m|pM)mkMIizeTSP z8I|5*)HUPt4A=p4MmpuFesV_3yD0cR(OEz>gyQ%f@ThRkvO9C;HA~bPFWCh@^wsUt z#g-@vQyt5Sa^w7^!^VQ;@hq$=183smyiXPX08*{wR|`Ie?>>5RzVfJef5Ku>lwm)* z7Pc{|^p>T@gBg?))ZMV;tl{Qz?1k8C@emsf5bixKE-ifZiii^`;0r!sv_ewL@ISQ| z3I~5_t{(3n^x2>#te$L z_i*9EtUNe~+^-^j)4(r7>jOXZ(rBK;#7)~gaXr9Xd877*nzsc;iVmt8HtNHEWd+aQ zF`$}m2?VIVeK2eUij6_!-C+HC@syOokk2P zVqCVByw>HmqZFdKIf-5Ci!MGmgs`{x4ImHtYm>|y1{_P;-Z|inO7hABU?QPtEgTuH z;7smw;JwY@*H4$`h*f9V{{SgQJT#Sk&T%@w2$(N)?5x}}(G0oN;SYI;9ObPw0rJJr zw>MhU9hYsu#=Eb)66g5IZUtLjcOCx#(^b}M5g*3k3Iww!(Q){jg|E$%T0V16VaMJO zVPyBkc)Xrq1u`VD;-=pcRzxH++HCuunCecWE;Fh4oRbApaw~69%nCVly!%CmAWZ3B zJV$0HOuu+d4Ba`II4c7|pZaf8C2bi!&OOhh$XEvK{`@Dmt3x{Vy%X9xHSOYy#Qt_U<;@j`r#Lf4CS( z?P{w~gF%H_2dU^&YB-psyJU6T=-*NYXx?Pcq*Qy2a|V-eP-&W)uv> zYvEznmHs9Cyj7vH>p#3;5a?fq{vl}$G2UyB`fX}DWvF{R!+S+a^NIuzCUETw_hQ@o zxU|m_!Rg%GL6_nukr7kr3s#-oUE(Z3lqo<#?f(EbrNW<0fbz>WtAcX|8$S27%p^#I zBX>s=E1n!a*y>i}gNli64oSxc?-l1`{{T%l*51#=)c*ii7X?Z|;68|LZQK}hbksOb z2S(*TV`p;hn!n#24{P?H*>~vT3?t5Ge0`vXs)Hr2h}QSrpq-JdRsf6a{bxXGO!^@} zHpOA?aMjbhF3scK3ToKh{{T%_F88zAWzQN@T8;^isDLlR zrcYt}h?P#w{{RqHOqzY=VqBaFO#aE-1;FXg_u>Z%Idrp0sb;OwO?$yhLDDBzDQ)+| zNBuPRZkP0d)X3+Fs9YK2@h?@65~*r15G~DBt_TOh{{SShDdhyo$141b(`2so$)MPBdb8bjppB|8s}y`fxV%g;%Z{{T&2E_=!eX2X~{ zvBz?}v#Jal++KT3Uwq3I!x@AFk)~Ihm*k1{k9Y#vujXGv4L)L=6xQOa=#BxcJBltu z<+)nZPf!!_Rw}tOipSz3)&;8?vIc`5OpvvWJ0oNN0L2ZZOD&Ic_J#CxRPgWbE=sI& zbIb|hKa@jS62G;l?H1M4J6=!uhI7wS*7wMHzuo{jg$I<4?NavTIhGw1%u8NJ6*68L z@eY3CXz38>;Rn3(^f2%YmHuPDXC4VjpLp^%4+l?C$zZ%wZQnA;l&$l3n1_O>m{4Vt z2LAy3L~OYja3YMdsmjJsN^*H4#GNV5BY1EiRo@JX_ zjqlQ>2xE0;?=c|lrhfCwKrB44lFmf4{!)ePzr+s?{gD3va8;XO3z4S*)>)#s?oc_& zFC!<2&W)B1Ox05qO?^-UWWL`r?(<6Asc*7GHn5eOgnS~6O%RM>B11;A3b-&Afp6E` zxpr~!G6Ad6jlcXeG&>v;!PKuq0raR=Y`e;X?k5Cz%YUsxkeU5QtbQ7$6dOk zfb87JF>o4{R67N!jr(N1#m_y=KX|iXZC?;xp!Og6Mom?35k52VLFO=*kLQces5!bJ z4&ubelFTOWsNgK$e$XOeu=s?m@y5thc=6&FU;`_`FKP;d#L404W8$5Vwa>W$hUnJA z0gfTC(ey;01wiKV9S}MH0Pz0+(xngD;A?LH31nf&_h^K<=7L|=Rxf~NrQ4S$a>hNv zLC{+h(53N+*ss97u?^XeFm=xonEk?1VV5(m9#&mIsB!NC(QHrB+^1sM+s!h0fJe%dJF9@lU-D-Y(y=y4}HUtyL0gsQAWN*O2Z-hOm&K*c}K!j zuGnD!q7Er94$_K)U)OnM3kp&G+k&)JU?4s!(Lm>i|z+zi8KB zULaOmY?_dcE1B<|R1ZJLaa7UT%MT3P+$(>R^ZG0Ax_6$0vG7Z)+dBKp=Oo9NaN{9^ z@$Nw9K@-`>yc;aZ{{S8fV$i3-8R~vmttA#V75(>_XNVNNJW5a%hOaX~+G5OIVu$xnhG68EZb#N-X zlv9=>xG%p?@jLpL;|^ms&ITXD{bppWx)y&{%X@dDQ#mA zqlQ#ba_#Cc9on>eA3V##+Wtf%rVC^L0Knk@+US`cm|CB7WKPtUm$Rr<*vl4m)Iq;C zuA@|ZsD;4|_3ihT0OxOsP8en@g$lSv)Eq#!{i7M0;^hPa^LX60dedH~%?vuAv6+)^ zh;}@@Vl{6}3N&6(8o+YhVpK6XxNY|){{Z8+VZK&Y$6Fj`es4LjgiIO+`%BUmUZ~Qin^l&>zGF*Pa)U&o~GNwnUhknQrDQ*Ec zPGtL-}z{!lS5sxS8IY#-{uxpf#aEj8RD5q zQ$y6Nz_@ts1t~)m!?Jl_QtxRCt{HCW%|fGi*~IW=%%B$%uGW}%!lmtw?ZX(1uL1V; zW3-1{zv%dy*R&ie@PeQn@S0F^A*+88teIBX zetdYFeRTzJ-xDY8O$1e_)AW}cQHdrM_%#}h(_U_3)J_8(gMsJanI2vP`Tqcl+wzG+`^#dq z(&`etts&TqX72;(tsZ({L}!F+Hb0+yFBsxO2K`i{h;FKQ1Lqu*X}{RUhVu!=HRPB^DG197+=yl7;o>@DFt=)n5Ff( zTrxU5MB25~7lspe0uQ~)P*LZpMK}ZD!~g{xdwOZLF8=`7pGbv@3Y<$_SB<{zA*G1T zrTjvx?b{!?KtkECq_SLOdXG^7i=xJ3WcM6Cx%itdG;|j^_GyE+&zWw4OlO&ZaAT}2 zx+g&Y05EGsFx;@c-)LECryub}K)(y9^y%7cp_-W^Ov2tk`pmt(FYUl|%O1=07?*nuds)^evuJ23QMKm+eq>V`XpW)J!O? zv8IO+hwajpkJ$r+tdn zCD7#L;sV0|00^@OVCNt1W!{FnoMN6kGa8k{-eGoZwpDIioPW3R9E%G-;$oaU%MCob zd4Qo{Wq$gY*Q-?h%)}k!f3zhm+!R|L^7^=hXC8;Bv;MS>QO6L*yXV9wkW@= z)TSTUZZ2$`qD&?f{{UG|LAh1u_Nlv?_Jc^U{k;i~tW{edHiC~c9+~+?sc9r;>xiKV z;eU@2RjYiCC+2eXWmyus0M~*3Nrt@+AjK~XI$iuF#7lE5)Ot3>k*yY47-gWj|@zt6WUbeF-Z@QC1o+ z-25;@R})@5%3k-x1NMd(lzEk?#|IMEXC%Wh<;!vUN~Af`iL=3!?83X@0YE^vQygdR zm3He#aa#t4dAI=>6DR}rNhmX7*gvU|jaD8?2DX<$AhGjc-s)oDX{;6Ee{Kh%_W6)%R6|5x{dIyit z%;}Ey$xsI?R`Ci@Wn!-#z~fC`BJg1zY8Uf30`wikhl$<~LjujOX_$N;l|`!31fj(Y5GSWiG1p#Hd&^;TqA6MsLKy;<1h;4ESwZ z>Shd|x2VwW*sdTOlUw?+(6+n(0Ez4Rt&!&Q^?SlQI~{%bJW7c$tMYm0@AC^*(aF+4 zoS2{bC;LTnc6o=Uy!tW4dR`@FFq)G9Wo1>fjK8bt1`Heo%MH&Ohaa@fvd1Z7+ql&Y zD3`b^tL_VqAA|Q0O`wEu@wWgl!h*FQB?l?~h>D;cDqwOWa60S37QiahhWytEdl$^k zqNn(SGaifs)uHAn8QUDH&5do1hu(1*M?NPJq0iQ5r?^iOW$)Jy-`xmX>kZ{yLS7lH z_=*hX#RKLPq@j`A6G`aXe`%o&aKE%%;Bn|en^j&|kD-(duN6=Ai5=G?_LNM8ZpD35 zX%Mil651%F=ITI#fk7UM)eouT@iu+nui**07HDD@1?_J060Mj*G+Tm$VL79@fN|b= z`G{+3xTrvz--z5QQnv%5mtGO-Ree&5ldv!rc^wg5@+xdTs5ba=tlBX9!K*74IC%HEcF~#$cwlej=*A>cQjt!%!RK_PoBR zPub7=dql%%3a@DIm{D!5d&ac`A6WHcHXP+^uJg((x6_4~w-h!M;vo>CT;-GkY?i$B0tP0ODJ}}?Jt{N%9 zX)294NBD)V9GCKztKMvVDkJDvyqrdA21uD?gx2?mZMm^g3de?bZ02 z<*MnjSf{)nGc1FoU(!+ZpaxQ3l8mTJ9?aeoHpI`o!nL`cnp5J{_LX0jYiqMImNp1A z-BI^}NwHXYm&Q{`0I1)zxmidtUBhp3>YiffVd=q84{{p|PFNsWYfuLtuMVbW2b-HC z^k?b*<86`>Rqy?!ev;FH9kg8iB_Js(@P=_1E-VtuXk*$^8QEB-2)_hI1(Ot#>psb- zLVG3s_Reo)8y^A%W4=zHD2@ZUe70t6w6?tS7%hJ=QAo+#gtqLfqy8y~gbo9E`ix8B z=c(*!rLBKi%)LmfLGotdHaDxh%3PsWJOkHq^~wybmIqwUpa9eIa~z?wUPH+eHWlUG zvB%b0i)CJ)<`$yj{-3nsbzID-<_|!q8(qx7a_bVf4rUbDP>GAU`Y_FQo&3P{Zq-@- zsFn;1;K$|;PWR-ECK5fY@B&dL3=m7JL5oM-VVhG(1QrxAo2)dUl%RD9;jxtZ^FNx$W$@oRLlFKZ^1JnE<_b-h_d|>;;ZmyOx z$@Vvh*CtmN`%Db`r)U&c{86neaO*M452J~7x`N%_HC)ON9?WWb=l%ZbUHdy{pYIcy z-Ff$d;#KFc{?xr>POF=67QbV}P1Wo%7_l+f*CYjJ>@1mEmlgB?_g!>KCBykmUNNMYbvo90opS_r!uc3%=tG78#=P zImYj}OBDA(TF<l(1U* z&RY5q2+X!kSKwkLM-@{v)>lNv#z;a{TdI~E++glESk%MfFjnvUALX$m5GhCoIm+4Q zpM=OY5ai*gK=A%qWLPTb#;O(l)YNE%i>dQhdW+g<7q9mk4mecTW>B}>$^mPP%){8O zCYmdx?pcC{PCeqV#Il)O;7@p6Lcz%H18VVP7Yf1!s^s;1lm7r-(2`2+pRp@`sB-!| zyzAN+K?@U4_^E7)a@V7_JZR+GaM*au`@rHI==ggl^;w$!Kj7N4-NY*_^2VT<_a$iY zR}eU^gZGv#NA+-$(8rW0%7+izFUOP@4&{7dk5Yy=4Wb@177E?)FLNqw^5P4CO&)o_ z&(c3_67QH~aqkc#Uhv>GP&j+4Ro8}lm4IaZrpWFq{DkCS(SZtoXXaee_^1MESO6`Y z_xrxHSqaP(TsOoOZW8$2uV@>Q`NkCjI#HhHvcT}m{19fVr|f}49?`m6+W?ztaR+1Z*X22wV@y9hXW59VZdq^R*Z65vVeMFs^47AqmNX2Ud$PJ^ zwR13y8NTIp7X?Of#D`RSJox_rf{Q*TRp=ME5cVc$YxrCq9~U{BKQt32&HbTM71L>> zr0RBIn5?c<7NdOL>RX0~aP3s#y;pyDV?sk7$dp;mA*;rv#@qw-i>`TYU?0gA*5fgD zV64r%9%HRIPF_BLH8g9szUf>VFovT%>zSXIwsv@&_ynwAu4cw93pkdb?{-wHf>hWz zAQH2h*OuQd{+&e8kCm|fDpQ4>PEL=^5-EwMowx5P+P&shXB(LN#%y;y2vEWAd_Wg8 z0n3SA%J^XWzsGf5K}MYr(Ew!3?7w0VU!n^z<-SdIwv^5z|GOML$T zYFq?-T%xvJ^9te@b5MPQEjhg@W{l3x7(Je#iGLBD~N?c~{rMZ>F&JAV# zF)o5t`|2M9)J;lAN|##urenpQFV2^Q81s<3Y8C`QrFd+zv2M zzF_TInQS}d4Y;^WUs81W4=QE9kY?20_XB@k2ZnZOTr{GG=Vxmth6!ja0WykNUOtTn?l0SIqTtZlFly3%X z*(#d87*XY;$rQX}=2T(kH(s0{yHN4fYua0YwxwDc{_!Z>3(uJ7GHc8g9Ebz8#^TjE zcR3t(#;w}1;$ADJJ%k^k#19wMj|3fUQtD)tKV$iilYAe_4S>Df_FYXa`4(3d zaa~GbM`(&^>baQ0wYi0&?Y{p2w=Lr7Z*z8ihuT*+>^O++ou1LN;wx^ih!tXRlEWO4 zrmrlNSR-DID!cbdjPLwUcX7jqPxrW<`oK!AA95QW<~fa*qAD7X4}md^ zGS^~++g(DPp8o*6MOdo1YgUH+rI0aPQ{14WT8sYx1wuPuHqm2-=QW2?!Rs4T2J^~hlryRo63igJm=Dbb3vjLBU=37_9OJ}WE8_tEn`GV5T z>gGj}VhAW%dzpn_Y(%t}xnlFBUvjPvmRIiy=inN>;xsXbBneknh>Gg^j>g>jgZ}^o zYO2&gQdHl(F&u;OGD~f~$V;2^I3dHs)N2f;*A?v^g!6hz8bm1|^AlxIVRVS^q&Q2@ zM=vjE%$HkTd6u3N2$l*#KGL`_zknCEZs+g6=laXs7(C6*O5`_)<%mM<4fJCw4Vv*EOxz^$gg~pI-N2o7_0>tWm z>qJ(XIJ}SEIem!pdrNGrN?g%@(hmi4gdr8>9n zRBJ2qP~a1xnBBY#pCijGVW%&Nqqi~54c+2pTU$&zbECvG^{R~a zYC0ObW^0DAIMms53b~>EV1yxVTq><|KrJ32OTG_ez7QI-ztFz$^_mawQ4oqM^9i@) zdy!Lk0MWo4N0##OnELacxUZ^M=`=sGOzH+ayJ6ZMe?hI9Y35QLo;;qzshS)-A3w+G z?8XKo{C3 zTroFkMkD0VzxWtHweCSD7;=r(THpS~4ngx8wl{CgQ&DFHI=E24x;aI*4BjUVuE>@f zbsWoSYpP}Sjc;9AsV;lgt4SFvi^Xc0I_Yg@R3?7j@PLgfh^$-S%xI@=vek0%bARvi z4Uf!itYX$3OyGre&Sg!s)XOF0)Ev33B`DpskKR_uSn(Y7_960rNKv{2^?PDAa3Oc{ z+I9WJsn9D8Sq9zbFrva9$=B##1kWgv>0w;NYWiG5dEB)4pDV<@JLYGGqPb3XEi@Ai`eNe!h|CD_e1C`3{(0grz%J5*V_>Uq%ny6pqj3KK+3EVu=%LQAzNU{n2(-C_9Ygp1IctZX-syUGPhJ+T?RIp;tcIOF9eF;{MSrB?500ky@qCb1x%3%79;Tv#))pL~x)}Q=Y}(B~ zm8ZmC&0;cb;vVZXe2d?hJ_|+oh>V+a)XmGw62YOGms`u+yrc7?)0TKg^dImsaPz4{ zMV8ad;T15{ZW~x1nYa?mVJ_Jn7(OK`Sf?lLRKSjvOg=9rrLp|0e+Y1>RB59U>1p4T z%ANCZ1OtN>OQHd5Q-`oYCI;C)f@pz`9cE^3HQ6f4g8ChyVBL-%eqqEdJ&&qD z{fr-3muc1lePf99WB4Y=oN#_6lojoUJ|of1e^UwhojYO3FN_<*p? z-+zg*huHcb%&3c+fnU7HrK>E5tiDL7uT@6s`xUd_L7&z<8PPu3#@$%}~vEI2tqW6BxzjBcaUg3F2?O zbYX1$>L;|j;67$@gIu5hIMg02Qz!sCIOYa`J7<(d#3{L1f2DF0uWxW^30+JWWr=DP z2IdIXHW}TAe-UTBn24VcekCS;ku}QIFuwf!eP-h;`b=R*4~WLgU(13nVIEJv(_IV9 z_1Xr*Pu*e_u6{{XYrbp(blWik{s(TT`MqCX40B}zX2nWFk(Ui;n#2tIw0y3xO z3?iXQG|O^j*_v;)b5K~#9`yi1qa6`^?n#AuaHuNQ4iGJ2%AyL@r^wu*3_VlM+gC24 ztQYJ&KJuu&`hp{dkSg)wO?*@8oimhvkCqQRO4&bCG`{Pm!8>id_Bc;A>We! z0N{C4z3qviv#E_0(Fm1E4#8ezL@tu6{n3Rb$Dy7+B{!dOhrLB>O}{8(m`cnU#8r~9 zW8NDcVBh;N5p`dO z%%^o;Oge*}dTg6tXYD!S?}AEwpD`%3k1K4`e@Ivfp5R#=bjp-RE)Q!QS|Aajdh5I0*(Wn*!CLZyt;c*MGvb|1_dqHtrUyaM5Qa*ddlWhKR1zS7lA z*Y6eO^&D=y^E+nWigfw@KS2;^G|4ZBoBS5zAR8&u58Rj(CR%v4@pCwuS;iOkxkM!D z2lzv^Y#+OGL;W*%5x?tR2m&+#?u!2afvv|?zu`~;)j(VIfDF0g{fSvsI8FPx{6^0% zyu~8N;B%m?>N3E?NmpUbB&$cK-l-j4T{^iZT_r+YLd2DaQW*X;M?1^9I#4#i@}T z{{TOsinK5}nFO(Gm-jxjPw)@{PE1VstV0-T7&nffWkk|^n1JP|EJPqXyS%QDc*50L z@AYcwzUmQJ18;~3!&+~BZwI24rT2nMCsj~2_Ln~(aoF^dniQxs;r9#k0pZaWp86hO z1IH4VhrF!YJr&FQLNc4Y7zGa^qHtlwvb903pj5bNqKH3X$Zj0?H7s$;ZBf*zGi6!$ zI9gz)1D&%HyZL{J3as~)z=5rn%(-=LZDJ5e?*1aBLNB88_PONq^j6h7_VRs3BFpiZ z@%JKx@7WZ7Ol0et{{TXtqy8g|i9PYr;?PGMe`qlUv13#0lZf;AnDw^c+VA|+B!r}xtuL_fnLj3D*pf#H6UnP?c83_>OQzi zGvR@_rZX*$*XJmSZq7? zfQ8+TCbiV1jhze~Hpuq2rMnNyFW!G1AL}{{Rmib&n}u zv{*>*r--(gSj4tBvx^CfMvU=Qb8w~w*!4M_wn7wHvCQQ;C&-mjplVbcGXd3HG0-az zUIzjnxG+>Mr8ZqX!y@{_#9O?t;e|%e{uA=z4Z)WzJRS+gA(_M%Q=L9~_$TI#sella z?t`P+YXEqQq}1vgx7r_}iqzI0C;EY<_@~$RT!=-%j&&SUk|vZNYd_RY4eBWhQ??}| znhdC~!fYe#pOz#&^N5iHNu=C#3pf7NUlFflsuq)L@416!<|24wvp)g%l}nbUfj>W` zZWMe?FjG|xI6sJ4$aNfbO^+9Og2ji-1TO93E-AMXrk>!L(~dt7#lsb*0gpj2xc4Kt z``KliXyCbIsd{D0FO}ajAtq`hC`(;iUfm4QfZSk?0*PK90iz8(A zVm{K_1jr8k?%>)EgJQUfjcOHVag27jO>VTqj;>BVAH2jJ?5^CO@ZKW)ieGR1Vp$C) z5k_n}c_oVo$&vLBXu{#>=ft4Fs_Hq#?Da2OC({zQ1}MLHl_xQrdToV_uM|Mo9kd}l zh3GLYY*dsmEtKA-6E*|i5AF4h4+oD`F-uskU&rt0JDG-9%*Xej016HxJ%4k8{{S+W z8aeI;nt^U(LQDs>50BMhs;XbSzG0U1*1bc$nRM|LYZwm+#6fp4cIx8+T3+~+344I# zdrlc~MReAQtyiVurI%iTL1v3si*igNIYa)H2lu!s{0KPz07#+4yDt9#VB!Aj>nghO z%6Mv6SZbyBz*Ja`~H97+v1D&;tHQT@lAl@hWtdPdqVhQVn^GSb8JHPAK!?-jZHCa#^7p0)I+wQ z>;3yc6?RCW!gC9OW8Sg%l+xA?5O{HM&%#qFODsjm_!h&4l2CL$)k2gtX(LIq@?4~og_M%g9pl8UD1Akdcqt#%i8el z;igoUQAdjIXb0^83InQ`YZip!3g?LNaiG)no+CkEG3v6Q$G! z+~RTXGH~Jn3nH_`ImVF~U!m{J%ffkzSNi_|hY?p8Ci;#+C|Mw<(SNipBANp*nJbd} zN7m1@QkfK}o26Om4_?v$sb^Qr7WB^9p_b~je=x2$u)vb{$0OzxE322Oi;p7{J^{kx zWiV5^V4hm@D}G`8Jsv7*YDP4Me$fx5`>Z`A<`Vodr@#0;rKL)*+=0JJ?AKe@Q3}gI z?SG`lCm%B`G{OT2H-v`s-{NDl6&`@R)k5yR;+e3BKB6zp8Uj0B>b7{J+d8YPSm)W-5N%`<^Ccm?x9rgY!5>x8C~i&>-C1))MnA zkZZPkh8?4Az003Ms*+qOhv)W*WbL2YEs*`;9hk7*mR`RkmP=)^0yM7s{|V2xj}mN3<@*&5E`;m_|k?Nnpm{u=KDHCEq3UIm+7o+f6(Y25O# zN?=i_wBm#=|o31l#N5W+x zVwpFX1RK4a5P>zqh{>bcv-O@>?i_}tXmb%!;5vXl0;*J7!RBcK^>Ww` zP-q-rm$Oz3UuRQY7uBu@$KE?mtyS+Hjvj+EEYdYi4hDVy01^B&3wm7J9|j?;rJ@eh z*%9H6op$zPk9)e@udJaV>@eercZ3eGm@)44HDx2C(;En$Sij6;j+eKLe=)sNftgKK z8nDI8(5m-SG@rI!8RXj;Jo|bza2OptAKql!t;_@rctaufx9Jd|Gh9rV80h9*Md%FF zFhmx0AG#K=%q3Txw+5~AnV>t*#1wy-ltrNf+5Z3yae8Ur`IhBml<@+g+As>ZLzt<3{{Rz2axj=aXYVr;nOF01(%>5N zEA<&^7-O-PFL@r`v=i9mA;3o|bJ1U$3v@;H5e5k^A*hrpi)<4NZg2XH`XXD$7rjCxlsO%0z}NCOeC zWY5W}fty&(q45*kzpmhnbT@wnJv4_{cl|Lt(z$o-=uAG=rBDvj=!)5R3h;g)9tA(w z);q!6d)dwvLL-K^CkkT!?lz{{Rbh?^%_s z?-}tjEBBQ2`edA6GUV?8*AS|JW6ZUeQHr(ps6kCHEJh_Zu`W0{o2NctH40aA8V1!; z?*!3Lgy+m1bpS2(;uA0Gp@;6JWndL#L+ z>0A&7O3Uf*9zEmYWQ;Lx{{R#E5X}#xxT*S*%9*|)Ivx8$xcBu7R#oh`^xxK46IdqZ z>iF(rIhRin4H|}rGsA%8J30kSqU!gmsd%W>EO6iMlwi`#C3|~BUAVdr{e55**AYNc zXok89w!_v}Dd}G&OI3kbWE^7es1~P52#4jp$!V zVKS6G+9E|P@|I15yQyd(s-`NKFIlOOB9PTEwD6}#Z~=eVuW}O;P~?Es{(jHiS(?Mc zI%NkAKGKI=s&IBy!m0d-lEq=8s=#CG6ymT4xl)cEVm-GWOMK%{75Oc^>Qn`;YUL2t zH&1F0Ll7JJxElAM>puE`ENtxm0E83;b89mBtlShigT$zAa5xBvCOLXR*T$=CYlc@2 z{o`OMh6!o%cO4j}3=FCgRr_44+3ip|e4>HI}faYIC<7D$S?J)g=nRtzlB(X-b zX|>RPydQbaW=Xt$JuZ8CON;HwVf>r3Ipg?`E{3Lb(~mJYtbx-Km`+aPm{w{)&bOe= ze;D?PQq=%Lz9KwuTt0X;2NI`B4+pBdQ@t#d0KARft^7rEX_e3G$V3lpUvoDPDu~!v z<>q&(egfaTSMEkhbknT0Q$1z##KTseu`UbHk?hOknZ{;uW9p79GMixe?=vFI^Wq!z=05Q+LnsgT%yYCdLipUJ z1V%+Q=2XqN%Tk##eMyML!O8aGU}#M8;t()uYbD1E>QIlqIA-uJ0r4!3bx6FjGek1soM!>A{KxW*s<)KQv$E~~L(^C%qRsBprj{z&Us97eGALe@O^wkh>qLcbjBXI`HnWVW??cM+yO(i%r~boN~apBW4tkY1itYLwBIj$_)2qFF8#F} zvSdL~T2+U8vx!HAvJP34Q)}2~vZDTFt695)V>dmNI$8GKp zoXx%^V7}kZ0HUcDbdE8Y*(zppmo`^0sY6k#cI0`M+&Ogp3@|jicMWe7XQsUbo6rf7 z#$%OK(vx2CW`%h11>}7Jh#eM0#&?hh?=AFq?D|Wl%`smoeghw*^8l_jU>@8~KI>~9 zBxp1z$LxqGZo7R@Fb~BmeeT}l;LnB+_byi|*nfx!T=^mY003M)tAY&OxK2R&N-Y?r zL>#|Z_UtU^`CLpBE2F2)+xD5aa!`%lJrK@491+?p3-JY~DW6;cc5uUij&|p=CoqnI zta6zg>@P%p=1xYRiSPadBxy5n*-#k%yhoO}--rAZvdN=}z5}6{gO-C7V8xI3Fo4=( zVZ)AK0P|iVP=-}%<*;sZpKMII)MOu=!z(Yv9D+8o#A^!NqvgPYmIK?kSrZN+seRsA zVRRdO$`3;4?2l)(vORLM;Bre9<(iy48p6?ARhdeQr-%B41@H(`vv`ih=3ivlsk!ee znRxV<+!lv1R47C;8jc$Ju)?aDj3Ffi>SW{XKCIx|b(a438vC%n(jT0@Kz-p9dcx<> zsO?nfe=w4=+YhlWZD&@L{tx~V@XNKoT0&YhaaoAEFd;3*YFqxXBKB>2n28MTxsU=; z-XVZs9r%V}?lesRe%4jzv8G_ErUiW3zPX+gUO!pJ=X885+t3eHzrP{{W&vhc}jQQMywnkc*|2+Sd*tZWDaW>>UtGO4Xer zD>y6s0vdAA4t>wV0C+yUzF|TVze}jR=&@c%<4oJHG38Z%A(pLg=t9FmL&N!isP%L1 z{{Rmh)>RK+T$=VKN>p#mO8Va(@AxPIqjU%5%o%rcU&Jpdu>J_5a0|{SB!wJ*y8;%Os?|;{ z-=<=@tJc^yk9ws{MVlbUvT1)*G(K2cJ4vSnmc&7rEuji(VOL?|SkMKZGN7yva|5Gf zxE8ubGwfm^?aU(eIqnUvgE(j(kGxjWy#D}>{{TmjB>aBxQl)fDXKZ^*sli_dGS;lg zQw|v6G5-L$f?9!NQ?{jPVdV+(jwXyDR8sgG~X>hw7WQ` z?*w#Zr2~!XyBNhr+SU9)V(Rs|L!Z!9{7aoD`icBnOk58&9SpS3FHiuvba-ws5-km5 zdlPgLsrPaG5b?Nr=hcSaj-m(yShuq4hpAyMvr$VhaOeL3)TeU2%F6ne{xTBi8C)hx z&@JVju`Yh)gdtQPhzpcymiUjJGV}C`w0hv9?*UmHt-wD+`h||unC&k;`f67n1}jb&_JT4zz|agkqPpw{#S`;?<>rZ(egY*+{LnxJ z8nlBjo{`$a1}N=?7|W?t>K}Qs zZZqCzuS(uMqiXueD?BLT5fmMBsc+p75GcUZOPCG@$U_#~SI?PJN*fsACl8EIjdK#b zyF*S^UqjBN{-MEfSHx*yz)mL-^$w4}yi$aiQdfW`AD#%j?fc6+Kxxx>#CBFu^_F7! zkJH3W!RGV*7ccc^aDCu7`oz$g9^TUYD((y3a|)TSB}`HiNs?bbH4Xz%6sGi(K!4jZS8wGC1>#&P_V<^n z)5JCbps{}vtZ`=pm&ClAre5Fvw6;F659aj#^YJ|CF(|v43mzqRG|k-RWJ;|25Tdm> zw-H)p`9kfzHw7W^8j`dca$HLfNf`~a)kM1o5}LET}XoX)#~zii5{#x6R`SAEy3 z8Dy*in3Ul5UYO(^dHxd+Che2qj(~;{;vq-YcdpQ;FUem-v9ea8*2emVG*$!?avG@S zeEZC%#}d)L8~5rEIswc=E~~#{9#OttsFcv!>KPpG?I~!LzLCl2nRfg?;JI;sfh?vJ z_Z1bVKO%i5bhBO(qC1G@&B7{+dEz4PZfA3zZc;UytMN140(@o;O-G}iBgx7;?t?w~ zmv1yd1IKZgew3(}-hbJS129^Vr{($o06o-0W%CmLNT2%0$oPzhr`;YoThrn#{<7Xu z-Ti5I{!5)ObKmKt0#W{R{3U7!w8g=Wf?9)#g5A*`DVz>Efb870c75OlwC}k=3g38$ z056Tq=AF8fRB*(2;#TL8r^A9PuaS9|)Y-}6WH))KU|{8*C95)V9mBM;Uv*wNV+yH@ z22@6Zw(|ZWhSV4~tb0#aEp^>VE4xp0^Zy7eJ%!#F4iCC;sNtYImEIV zx4$a&tqXXRt}SgH)2%-64aJ6{SnWh@(Z;bF)O0)_c~eBw!xq6t#%e2k1P)obmPfaU zz??=}@1&~6Hb?ECcR$GpARXaU8q$A{G?~D%&$aLp%7Ij@7>3{AcYUANYDE zTD;1r>#{3OM{V6>?;Z!i2 zdl5h@rD<`{{LylP(H=ET{?n44z(q6lbMNgJZ>`IOTMv>I$J5mPSLuJHKgCYTUgaex zvU??^pZ#>#0jv`X6Se0N=6rzH+G0{(3YLIF*7&LmotOxyCg&GcL{)aoN_Uf~wS(d> zO=HR*SZ9Q5VbbQNcq>25V!b5ah?Jw12YzD)n9+^2Fj)ZAU4`ax6!$v^Yznk&sl3a1 zGbkSGK2S!5H28z}R%cZkm3gRjQAE;R)BqcP@o-pE=3*}pv0a|}eFmHS`c%UH^{SMJ z9s?H%G3V?DGLiy{)HiE8nYZOE@7{gaGSKx{hc#K^SyQnsi^BVww|BdTj3VK$;$~i} zcQeNfu;DIyxtYa@shY0R`efD2Q29hgFl_e#=3m=H@K$C-9>EIFYJQ_@3UBSDRxpb7EHJ33nz9w8-4rWI?jgi(- z&`;>QmFTPY^Bq4)Q7}AOo39^~xbJ;J7{UHb5nmSfVA-iTmS_>UOvQ>*=!s(3b9yQ} zHY}V!wG0;1Z~^xIV6e5++ib=61Q_Qq@!YQ`q?OFd4Gz!KaTH$Y>^_7WGB8y{1%C-Z z3{0T6a~SWLsAPay`HJv@V0QBtLm9S?38wNzPrSlmHyX@sI&wm=<&8!8$VP6@V44g# za|iEM<{+T$tZV&BG2B`{XC`Bxcpb-|xqViqh5L!J_$@n6vWjGVkeTX#P9{6ATl#KM zo`Sa%qu3&?PhmD=?TEZB?&XnQ#^uY*ze6`$U%C6tHvzXO+*U!#D3|VpydW&f5|{Bf zS&=NGqZyQUr%pQKaHAXk)VAw95R6kt+8{YE#J>jdJBB@X{t6g}C=#AC%D)rC74!L) z;%(rT^Y)iTyuPz7%l!wT`fgmga^=gH24A866V(3zHUafRTPJR&>^!h&z>UDh+`=>| z!5$0$0L0PwuV{V5YU$rHze4@yovvWsuRDkCuW>4NsPJ=9liw9L@80F_RdviTRacnJ z5cl_on!loKH~kPi!N;*K`|pInbyg43C^9L}di&I=f4oh-X;IzkQmylIPW=5PjNd7S z1-4hi;&bC-59r(aOK8eCI5@b*o9*s8ja5RTx}VBsoZ}G3m(Jr~WqKW}xEGoSA4&Ez zC}`@w^6b@q@#EZ>Ex+1YH+l(ew=}oY_ndQa)L8}9g}(O-kMA^(?q+Kf2^(}0!u|%L zyr;X08EzVcErAH|8r`AJIh8WCYTjeF*8bBYdMfz^*{?zxh&hSy`oOv^+<8aLCCI%5^=G{Sxxs%$th|_?wz~AE5Q711%5G6hu#GFX}hwLLQ>& zhgYFuRImPCA?8_jLXy(gbYz1@#_v91g)_l23T>yNJcB`~#cuc1dE+n@?^}zV>-U=8 zRnBHcjY<+?@qLlX%(+W7;UKYeUTOH0I9CMK_!^f`ZobADXk+d$y@ud8PMyL9yrsQM zHC7jg4^ixfv0PNM0}eb~xW(fa8o$3trdnba8F$1*E-#*C1O;lYQ%43>$sQ^JAiuhr zbLjOFoSh*97_Q=9pdpbs@g2vLGZ0{aAe7r5b^ukKrCuEa*hEE8bV-IXHp# zRlXn-YXei-{{U$CPR9OI-7sHn5~WH4gD^&T>RsB!^4;ojln`H#!!Z1%`dkEZB{M|> z;8`W$T9V&EnS1mRKQ)E{9$m@~8q9UKDLFYpS=ow;yg7c-ls4z~ni?N;3R_}sT}5ll zb6?>-EbN`h7ARSCiezVZ@dcnCvy$-l|pu2<*G$3?J^h5PO;Mb*plI~pK zGM}5;1`Z{uv7J=JO}Vp)fCGau&Ko&G78%)$_$!%MYB#GV^vxODj6p%eRm{@NE^dW) zzuE;X({?weBrY`uErokb%ELlsZVu*K3pa>cW;wmFpg8jxwU+~;cQ62|#cEzT5pK6G z>e*aDw9Z}J6ghETX8<_jP!J53tVIYGFdy9(D(?DR?XtyGKscPss9OT&e>^p*X!wO= zW+$-B>?}1E0$I$>ZiK_*b<}Qn4a#u#ofH@EhKl;!$0rhn<#RfHpl=zK-ZCBub=C$| zFb9q%d>S4ijHb`39K#V;gmN=}@KA9bx0AT;3M#A93hTB8Wm(JLMSbE?mAjO|Cl{QY zBAJzAyAQmz6|senQo$@=<(OSRc)TWAtr?_>WW11a#P^rt10RGcVBeKSAqHQ0z~0Yz6~H3Wb~2NUgcNUmicbK`ez0XWDUh zEb0v$6Czqtw|I@99`LRec4dN8Oji&%F)!~o1}7p07#Y|bEckLjaX~RHQ7nA z>xq`mT;fnKF9aNCa@zj@?5*~TR&ki>INafT%fl&)mJz!i^0bBTlx@}H7u*&-idTLk z<^@CbA*_96P2vSg5#?a6Ws&X%FRcJ8o5Ot*3dY|s<4wOQNyf;?dGi~CYkbO0WBJeA zLPf~GMi~*zbAL&^v2$kflWE6t#_~R4S8-@Qu!vEe0PK`0Xnc8tmGZ<6*G6tpmkdj@ zf#8)^V@1IMlE*OBlW-Z$#v>qqUHYp_XslXFfH`&5T=?$aa5xI@E+#tiE0B6 zFHid;cGH4=TJ_2d4x*#rBk_I`+u9#a)WiNAyyMGKrdVaKer7?!*unb2s z!vf|?W};dx4xw)=zvP9+%c;l8*UTFLTl;fbt6R)A_jk-NX^cS0saSjJaryegrsu80 z7?qzzWW)L##~SJjdJZNvfvu}zY#d&G_e6j^>8ovN@<)*VYq-_*oD~< zdX2*VF=NmKsx3Z@L)}+hMNwGp4dYKfCQYku=0&d=Cxc_3GX-CQAo6M(&ee@fwZoY} z(wq1r;bS3*)D&@9^*zr^*)8H(4(V>$ex{)hL($)TAqyM-0N~uJ{dX+xQ@L4B(Jd|y z`482PnDs3|C}yq$ubO4+Y_4Key|{^F&1uV8_>ID}ZOj_b-ZR_|;hb(%!t@@TgDqpaiY7aw@58N^llJ7rl9kerRJgFl$|Idze7iNY*> znabC;qEjCuxN3$RcuS%@U)F66{?OCU5Vt1@jObjlHm%1Z$nT`g$Uq z9)8sni%m|a7x2Jz(BE@4jaD)sLU%DV~4-*jQqIO|PKvS+Iw%t~l$5)5iATAtKFxE}$h^_+i+*dy) z)a^>2!ff}OxEh{WpBi+Orq#PH6vcAavTYmL4fx{VX^c!1tZUk3e%XM#ZBq;%Qa1>7 z0dIqen8dwxP+ZTpKZ*to4#9nJC%8kf!7aE44esvl5L|)$2SFc{H{-`41hc6KLdaG1V&2uM~sl1hLIC;X< zLO2=twO^Q2Yp`&npOdwhm^F*Zx`S+t)4En6D*$uZnD6B-5yJEUJyDBpERv-&g*zj` z3t=o9C5wC}PjYL>gaX{&KH#`pPBft0+nB?Tk{E(DoH)xdU<$#l$Em>`7g;iXQWy?O zzdESdxqgz}7t`v6>V;xP>Tyo3WUO(%vQQlwt%k-EX&K%!XFbl$;<<+ z$UlD;#|;p+#QMrvA#J_ySw}qfBa_f(_=I4%zalt%|ILmw+-T)Zq@@gegO9C4hxAN8 zL9oS%&J~yc@CbLQl)_#5D=c*WEpm&+9IG|{obxoJ*#3<65HTM`6ideTZNDClCLXv= zU&8>?ML#aFu9=cfX{nf6S{tuDRsX!c4?fP!uavF`R62B;J16*nrc~Eywq;kahU5VB z1Kl*46?`wi%#XG!^cKHW!N$~>HcN1ufqrG))hs?;f{Qo+We9M(9__2x39TIHm4n>H zh76+}HY68^adi5G$rUHs!akEXD)3R>n0tkL%h00aYh)?_B~K-C-v{fO>Od8Ysb-Y% zY->@XeP7j972hR0mnxX-tlFGsze*sSH^#fr!Wr}Ws9(%OC2F4y)TNuh&cY+M93td( zlMa&?!-TL(fmP`E%4Hz4nZi0N(?C<1pItq{^~9|Y+?PRy4|;)4pldqdk=r^z&e&6i zt#$)Zz&cMI_HDY!!~@^}2<(eA@tuBBM_fMzm}MS3N|b(1xA|&ui&x3VrKQ2zxZ{;= zTM-0_X1&(Y-_(AG-cziA?$nc&>tK3H+~&ins+%pCWgMNem)TZzoBFo10fuym#rm5C z>Fn4mH)tiwR4L;yPU4AD9R}8iQg}U&GU>wU$kJn5rY(*EjBgAG-fx@S43Na|a*NjWK3*VO zchR*)ejeZyPB~*~zTM|E-S=_c_gO7-I%ARgPMw6J3Ko+;(q`&JX3KPwl!{EPbx9Ht zcV`AK+%KM=3ERiuXs49mSjIg_1XEE+Ge;KDb|!pJd#38*XF$@YD#G4fs)acNA4 zPZR$Dw8|-P-4;+BEwSoLpRKiuq_M(|Y`BZE6Ip>NHUESu;nrV?Ln>V08dNt;kPK+}cki)tt5>m6bb)8R^yv*fAbyyoUu3Ey)ttN7x*A9Gt3x zipOh%7wEY{;SyasfEgz}@26PjMmqFm6xNBr zK!L|}h-0h?*2t`4(1?)X&0ZtkXB|hUx`@iJzNsc^v4?E@2d~u}Z7(Q^zc>8_XnX!ruH`$Tapr#)i!8Q>jz2Ke|R%SmG zoX`L(?N^E2qlo+JTmdoHct8 zr-tZSZ;U+cHp=eNQf=fe5%uxSd485@=;fdngnAM)x)D3CPYR56P4a}$s*xp!)*i;Z zUf`~R4a5ILe|P$iE9Ob|NDN4wIp@q6>(nuJ^J8PR?Xw~Dh;AthTfc59Gl8}P0QLr7 zMu)I%EVG={gq)5rlPGJe>4Lu+w5Pnt%9iTZ$oF=r9k)xvjn|(1NOeNluQ&cA>zKJ> zMk;A+4B^s&0HALb!RD(4;Sf%4@no_>QCn?+W-pH2h2L4NJdb%CODi$3>b_?Dd>s3Y zWP|~wLRvO&BG?rJR^RBH7}dDsjj9g%0_W*_Es*ASSko=6P5bzi;#VXA<;vlxUg=Yy z>Zy-ljT0e=EPfjF$dmH`aTyut=gV|q=?xo<&a2mkS4@*0v<*0+&=e!ZCoIU^27!Ss ztUp`t(#6f+@s1C3X8-W*Nl#fJg`ROiPRI|=e(x(@A~++3`V;ng719KlE33nsTvq7L zHe5EbkK~$`)zlw{Ep3ZVVnyD)4;A>yfr#{~nXsUDWTr?hXI<)^3S2_Hl}6Pe^j$vRRJy%0XnszNB3QJsncMLh30}o4iq3v!6x5L%KIu z1X+piiE^!59`l^M;@LNYjbhV+p#@$PNhiL0fCb;sV%I`fbrGYb)bynM2Zt#8vUG&Ih zm^Dbo=;xOLPq{jQXI)qIlkCz%RHc~rpGQp>AQ^0h`=PEc7=wH>tK%}267?ZHp3L~K zpDY^?uevNMn0jy1t?v8P2bpvob}YNG_#r-6a}c(jEewm@S8OF-89yW?Gfv4>aXNwS zFo$}CV9tH90x;FSgn&QQa;UR0$1#1FJ0$T^yF@7UR0BLX_GDE7iPU}1hwaS>G-FMm ztmZv-In*sq;}35fe(j34ZA7D;JgX{F-Kv%5p%zu}y;k09ZutY_N92MVA8jFx6FgTI z+ooEV;BdIA0d3w;{-Jw8^S6ZBTO0jNy9}AO5dxn%WjmH8p6llXt4=~5=XWUuO;&BH zx{3_G(x|eH{8TKj{?4_A!{DTIEnq!HqGt5IRk#f(Te=)FFjTdyPrcF=@y>}YU8t`r zPh`(!?b)<(n)qw^^Imqw326!Kn4?|v zG9FBN(1p05XcCnLX_#FX){c4z8QdvrQw{xGJ!^%GN2w9k72FA;#Gow^N-HM9_wEUo z#8hez-=spvULk`A6&K_@@f>6%qX<(TWJ&Z^sVOkA{9U9&;DOW^373E*fj~LW9tvmz zT(~Jws>6T};2%H%fB^*m;Ny}*Cp+!evEL4wiGU`Fjvt(G)7HNeaR1orD?0evVAnfZ zmr%+foBgzl$PKWFsiC#b{|Fcb*G{|ar)#%dAoXQnRK`CjvfiZ^H^}0yVs{w9W;j+= zpJIDp4iL4mA4Ta&^oFjIGrhz@8fwpNXx^*^t=ExlGJBf{aMW@$Zdb?k$Jzu?+aVfZ zn3QC52d;akM}$1e2BG8tAfmqMlF;c&Bs`w4Zj@&z?+;(U2_p=@WDle*jbyAfsyb1! z;ouKp{yJx+LdKO35z6?J(R#OOXw2I~V}hyh&S{C!6>TcjRqJry%iT~90VISK;z*&~ z%yUkiQv90O4wEFoFLfuD%C>Nw-rt7gFGieJA#u$q96IxZ2pRffNb|ix6j6ykp_w*Z zgaXxlleGv6mPN-6#xEkCaT>_MPJwB!^QC#7r!t(t51Q+ZvmFz=rzA8H2<~VVyTl3y zh&#eaAne85&we`IYtY!${KF(-{^%28$IJ zxCXis`x^3y*7@k}VymoyrmKBfJ@=kgJv2Q-} zP|b>wB`uw~&{5UDe{K}cPB+~JP^$#3N9;!Uqt^tN*!G^uqShxiy^VPGtM^(auaR<= zla|{s#!L68T?%w@<_^TZw-S-YGrHchqTDQgxNtz z>I_Yr3^2BBkJ6U@T9}GkgLPyI+_1NNFA3Q(8~xn*ATQk6x4e{>BmMU0;OzJ=*%SlAu<>fXQ$)*0Ih2X~#8*8?muTR#}-QEt6YF(4M6DCt5E>Av+Y;Pj4G67 zF=vKfgCb0a)!#7onSo zo>rn6UvCrp+f2M zC&@UJ(nwS{=vK(UoRR{63=?5ot#wK11d0OzP(R1vsD8O|IJnxz3nqLdp|tUcM`7_FjFXw|A_+UZRYsiXA?<|&Oxf?D z^_%B%dC&;fsJ?4xfCM7Ny*;8~W+=F-5cTRZ+1f@2M=nLLs0`m%bf{y<%j$Xu?>B&> z6*9=NGBn)d`?l&SbP(n~Bah#PAWRC^I%k|H&Q>V*yHr~NcI{er9jf}cnp&~dTOMe1 z=M7F-8g@$(zf?rKpE1}62Z08q5yd-YTFG5Q`8d??Yb+yW3`Nr4V=4JA&Q`KK2K^A<}35x3=}QuN}K z{cPmtS1;a0eEaE@7mTS6ecP3?_+4RE|6Del5Fx6%CcX`Yu7IJPS^-0T7hEM$KZ&L4 zKjsNR_W4*=xKB>m9-1DRQCgo86&MFCbqsZ_TJM@XZIGJ{x--2Bi)X?ja8`X64^0q0 z#O&~aOg7l|ElG6)+G|BUi!7scc=J^Y7L}8ssMonzTRbfw@vrE0=OU0SsiDow z2vMBNK|@%e1&Nvb^B`yM{MP2M;C=unn; zyaned&nw|&oI@P;WtjKg>y3fI0khl-B*=wuW;w!$r&l(oBNm0MMuy>N$4-`j=LHg8 zwd`AStHyTt=~84Wb67L*#@z*nAt1j4YZe#OP%${R%)});3e#c-V@5hY?$h1+R3uP_ zQmH+(Nop$~?daq(z@2&wth|PsAw(yd5{vpcyjv#eH+B~Q$fo}i&EHwa!c{m~vWsPj z`OuK4FkG_U(dLz%dfd5~PbBLYb%C~}5qX_)sKAf&3kICw8fEXlK|+Q3y;fs3Lp|kV zOr{%(Uoe|(fscsIVJJ=h#mW`jqwo8?Y%PabD0JVy$I?w_+N>H+>T}9nm3U8L zDBHYITp=^1h+6V6K*0W?bR@E};VU2iL{hS^C3O|vul%H=` zK(g8a3BhSAfUwn?-^Cr*p6#>bOn4c$`nUDW4K3SJnXajCh>FI1XRiev*eZXM3E{jWZ2%O<=;G5SBsy_?qks*fM}BdWe27 z&Vc(^7Ep?z;;AOiu-NZ3OH9Sve}XvR-}}mHBiI?j&3mW5)}=-4?7owYpJ0`FgWWiq zTLw~u+uA1&t0>{e^Qic`-wqavfP}SMn(}Pv1PRfk`JxzoS{$T)CbFWsAUFSsZC?iZ zdi4^L^n?Hyqe2s5({3f-@u!dLXkfo4Pc>Z#td6`p?C$Z&uUtcoUv09909MAk6uTW& z6eQc1!WHYR5>s&(WUvlfRjd>$TXvS^WCpkCv!<<2v#pf>8}rrn0?+z9qn?A2IgWZ5@pn|ePrje#xpR(^*VdyG6R);CYaAf?8YR?R&+YRa=N(7SO5}&umDf_TwO)&*8w5qF z?;4_W7^d3B7|3P8N=SZ_`@%qt=q|In3KtGMxU(w!#yh26H&2{iW!1eUce z=C#qbZkfw3Ziw1i2=Xx%-->2n zwXwmz%maBW#`LW>YOs=tyPI{LpR*+IY+P99lSGldAp!-!ofd#8?1xdAd$DfGDqrdhhRL}{)HZ&1y_&Z36xeYYwHi|{|e zd+D$<1Rj4JL4pk(!^m_mz<`G)R)pqmOihK(47_autHEMM;RhCxYot{|?pzd~vblin zKeNPX0`BiSyMi0* zF{3Wr+R4b1Kufpy8qTUg%wr&p%ibB@e~+Vfr!Z#nAnVmSc0qCroXmt~;r9cI&=pLC zIg8hEkJ)Od$aL!h?Jq>TjK|Rn$Pf-K`5|V~4>2A{u#E{PJC++gYD+k5><#fl%P{8y;tS4sfpeXLxH$=%q`jW3%_tR0mYAWXD4!Kq0?u|d z@d#dg=SheIe%6);(Q*CQE!He9$jT~xpRvRRQ&epvQV@IGwK*NNJy50_@sOP^t4DM@ zxH`=htiU8nb))3tx104?h`P{5Dt%%n^eA>B7UZ0z89pmhcf)}`BW(`_7 z_%QH7Wd6$hLDmh4^N9yC(1T2~h?>7SU(Z z?wuJFw&|q;N(cQgFvfHPntlZ2jK1!;qqd$($ItNObGK{aHugN=($EQ7JcSlrJXO@# z1eNO+tv90Rp+tS^#x{rj1ycYRvOm=F9oET|YSVDWz+T9V1ZI{+JyI2}v4au&7H1Ur zryVe7hOb~xvG#$`kaPG4}-@w!typR*53j}qDri=Oj{Kz(A0 zc0k`P?S3K0iaIkg$rYhv8CP3_ysIOL_j%KW=$wD^bVV45$FeXcebN>wk69dtt zC;ELtZAj-#N_X+HK08=z_)+3Oy#)9qdmyH<$FHpO-9uz=5N}JZg)59LXpBB!p^dxZfZl%K{GkdT`<$m=WK0QI+TEH>+_#Mk2ZEIzgMH*rFXo^0N|>zn zrCDOwjDp4k6k%0h4K4*6OVV6Q5wZ+%lJ&GsOj`4ZHd=o6q>$lUC|r-an8mO?;|)3_ zOe2!|1><0@z=81`)|hfh7T5q$c7r==1ott|tcwL|73DTD(z|LsZFmZVzEGD~5!8;> zx?^)-y}OFCEeu;I6OrYra=yehS6tHCp^L-(c1HAASfKnx-u(4&m8 zyA5hqRKc-6szL*Gz5MEvg|JC*$Bs_O;#ay+pmVRlNvt3YAxe84H%G@FIjg4Vm7j}4 zd3;O98<|4yAH2n94$bf04|ASY7EJo0)_SzwdDXQZ+u>&lc7v*E?AbuYASU$CgKA?( zW4F|G_LCNI{S+8evKxXtw^RNDe!%R;*32|(wB(Ajfwr3ln_E9J7IWT-%HYe&@!2lw zOQzR+qU#wQpl=R1Nz1!}Ixp$11RYf;C7)BW%BOuT;@kX`B4a02?})SQ5q`LHvrY3~ zpviE?Sus>ZzwlJe)^8-R5i=~eQQiy9A+k)Cx=Aczox@hJkr^0P! zL<1=&kC3xK=Phf<^2ewnvyHQeUohN(pYpUMGA^~Zh$K4jS01UV?U5X@soTlPk*m)g4dR_!yYrZOq$T7u{hGW(ARm^t?3}vy?}a zMG^p5m$%qNJRjxKvEG)4^f>A6wbnCzjagLg3p`b5<2bZ18|^fB{qZgibcEcpQJ0C7 zomsu#&V<{$+S|=qut#|=7#1Y|b{zGF5;%SZfexjL#GkL&D2=iF$TJsN9!n2uN|f~( z)R94eO%{ORMCgxjM)8!}-;-566r_cTiCg^uexq7F{!s5L+BmS0AK)B4R<~G38 z6MAftjt~#T@C&9fgIV3d%g=GY0l9~yFc7;1=JS;GgQB_2S(}xBm^C-c0f}C*IqUgq z_JFW4t`slomHHz3xmTiKyLp28Z26`E?RupToUwbdaDw?8Gf;m`F7k-9wRm3f0XE9c zbz(7Lg)s1t1k_aN;h>tjm|@l^B*lI~>MYvlvdfv@NGqxUV@iT?N3k;Jwa1G62}+RS zSWc-jX8rJO#i;rScvb?fv^%iu1n;t6J=kD=q=2ljExt@QGUO@5JZ#HZ7VD{w{DmM% z2BR^a=!IAPjvo3$O!p`67p+4LryGsqQ=ykUOBc@R(y320&0YKM908*B(>|+6fpVjC z4h5i=-YjFaGeW&uTFDi+S#^TToM6M<*VR1e9j&t%PE$DDz0Tsy(xQF(bC8Io1y5|r z%Qs7`u}vZdW6;E!>I(SjTbA+HsWc}z-wyNo4;;BwB===gjCTSuU-06F_qwu4I z((#s7!x^Iv8lRz(*_wQ4vRf~q($(r`ohg6ah~wRBL>Qsj7wEB0in$aK?tE1DA?BnU zT7*M(;ToD%S7?E+A<=^zSSJ&T=7d9>!FRh-ukX@0ZEVXzqtR*nXGJEc@6yU2qMd6w z4a7@KK+o%F0f5mTd$|@ka~hz%dvc2&&P}ATS8YA7eUX2D&+J(GyjuC0NR)c|gew@Y zjCJhsr5-KzPufEMGHBA%fUST!$2ydfWx}_Hv(l_YYdd^Iu}yo7Kq4`gYC?`zicH_^ zL+(y@3Q5h*)=;XowXm2rBTDqVG?%rzL_YwH24IKp8YLwCHx@nj2i|faWyv7s*;I6P zYhfqv5IRen=^*y{rhkTzmsKErxSD;D{B3b!$Q4Cf79HDS?TQ{XHN1WTSM2j73d`OJ z%MRNzqz@|$m`a802n~y72Zv7}J?`C8$Z&luYLDj&d4)VZmK<;W_ECdd>D*I8Ku;?6 zYoWBZz$X610nhm!)OkU~d}oTw?d5nvs>ljm4#hn^BsL=RVG!xt2x4D{Xv+^#Eqj$B zR@Fq9GgdW^;&8_Dru3MNTo4;g>?AByFJM)18V*rNCcBB&;Z~jskIv$+p+ujHc^f4N zX0gBYB!tm}0Jqf)TnR8ECJ=Z_Y3|~!n4Lu>$9uSTbAjlFHIwwTR)Yq?d>>7iKHHx% zkrUK*+qjF1lHX-qlkJCV>*@f2!*Ti5q;Vwnxg_J7JwFjOo3kL*z#M@soC}Aa3NNSM zpuy*4L0-0{whON6#A|ac=lDqm3K$2@sdu7&p{Jc|?0uoIc8AkEsG3lHD_4DMF|m>b%1%vW5Rb?)PFH zSyJx;KTiRWU!bSI+C3i-bACwi#FKicMrc>pt{TM5yr15IHw*x+IW8el5Z# z!w`gNu%K`gjJ2J!&V;3hyNuOtlo7T-8|D-)8yC z4Q3U`(FO0E$fyi?nY=$Mg}2h&37(V;6SeBOx%wV|EAP<>YmhJ@4cd^pL&3|H)js$a zoXF`PtUbMBlHhIhc$6JM2z-6trT6tuE%sh$G#(nQ#3N8|+6kojf#wf4rZd4Hzb56H zoqIm-pSUtG)k;Fd_GVn4D3-D{C)2t1(>>Hbkb=|)jg$)j4L&!Dycq@(_N^9dnnH9g zUX}t+HU+$+^`IY$lO)2*19QyF7XyA@T=@k;e^z%$ZM)3=P+P)LdMl{7(}_|ncxkD7 z!Ko7jpT}2zDbzZ=K*;VCMujO3rh0LKbb|Q~lcQ#ret-gJr?Y=5viv&-D|$bN9f#YH z(^S+HWNPn=O#cC&g&>jU z0TlL=t}A6#BU?yiTsM^~@ObIr%_2V|&APF*&UR;Banvr%ENgHs{frumk?Ch!o6uh{ z2c%)wFMY|5Sjr*C_|GNx(Fb|Du{vKOaYh&onKwOBH?LY3A!>*H zP{x`1c^~((R;?}(okR32wHTG8X?C2!2m(#J4y{Am_;F6Lhbf&@qFsyY)ncixDkU%& z8H-W^-20#sCR{+)EuY9yQ*Z|;OF=5cocBozW-@BC3rjOUkgOKHGEj*kM;>nbls4ZO z8z3eDK@Lc2^`QEWiAUi?)<2F>?v5pPS7Xo?_*0ncDH%Uve`D-WYnns=RHmL#S}K%j zQz+FM>1w^i64THB5FpOtIS?pYGuUR-;jg+9c^M+u#t#(}*RaOCu6MkXc8ZK@U^M)0{%R)T%PGStp`n4+d3rLT za?(Iu!1@6v&#UOgA5PT!`}Csw6&o}t;(G|)kzswC!}PpQOC}>qo6+O*?!+W6-k>ES z-;h~-Bl!gJO&arhxVECg5zheudI4wd4J~k#0>5&Jyjc@-qpCA#pZ`2fZDZTYIQ-iw z)~hp&fmbaZSMo+l#{o&_rp6~oy+|tutSiVq2$bTXQzCNYLA}7VU06=eS&@=4f4L=> z68(dQ-4HBrp}YJ#Qh@<(#ta$9g@h+2gLi>}cq>2<^I7J@(m_Ydff#7?R5nGd{7wqr z<;V=Czt$SnU0i^Cle6|440Z}2oqlbKv?MU%5Gm0;fASa1mlfJ(k&Zx48VJ^WzoAZKQT5$gk$ zhGVtx)qU3Rb#Rg9H2?UEDf^!DBfL&_cIvh&|OwKO3GDyPyJ7~Q#Z@D8h;Kw8$dLA&N15}yS z+DBVM8yn)Pv=~SCWlKky{BpEe%zEX}C=K=RgVoa1c7(O6sz>b!$7=vuwtb)aOX(9o zT>^X%P*f?!p;K$50*N}G$d)5aMp;*^n!;m=^jkj2Hy`rIlCi5KfK+dBil)eB@FSpL z7=7nMD+MwJ`~l{9vhf{D2KzKL9#0Ec`}~%P&HSZ1Ylr1)=gc%>N}Ne-uaIQ!aV`SJ za05cPwiQp=UH7&@;l3nHGs=lh#D;27<3@PxKuH0r#g!#R3Qo4RgUHrrOSR}iN@zh{ zSZ2w7=kjm2l3M;1BWt>JIRk4bTD`S6TSd3R@>ANXG~_ulT_$g92Nexo@y<%locGil z+Hz_~HDT|Jy(GskV$ns04#wAM&Au0mWHP55NW?gW#+s)0G-grFE@Q`JnhJ8hiUdB9 zO$MVjhCn2qT5LBL!)rVTw47PIwJ)Wv9I)@PKA_F@(Tsa(E-DZgQI6R^O1LT9$!U{qlX|DSOF_HvpzK;fF|8_10vi)Tg({V` zXyFN@|68gj^GLY+ZN}zri{^qL?PE?s1GZijm3U`n=97mca56r?^=bM()hZZKuE{AI z?HodV*^)S&n3DFatm)6ik6H)n1wiOt)x04~|E`+XF!qIu4dA82&SA?dXC}=xR*_8s z=9|23)t@7TUnip#o@SQHje;+~u&D0)SGeeFT}xNQ*%ev&w#EnlSb#)3D}T<~WY2Cm zLdSc)vSrW3ataLv+dwPR5q&ZW$G}6gLnr^T4H^mI{gT%?SiJ9@f%WZe;Y09XvOwml zx}kuPC6c?=kiAO-g7E-TTxZ|3$<^p+jJIq!E=+HcmZ*mCE~%3uMy&;~J8XOr{(wbP zBPWWI;?RV^-;=S4L}dI%e8MXe5gK^T@MSDQz;%i~ZDpb)E4VHSF?b(T`8j@*ALimn zt=Hv)B0&;A4=Pfy4h_xG<}=_9Fqe7e0Cz>U5$w=$YTbpl%H|0S`QDrdn0ssY#`Zh$ zN9;IYIzl@g7G)SxK|oM2>+GG>sM_jqrndT{Li+7~K-zb|oLGoMe%z`_zxD)bs zt3sm;zrf4YZgr@K;cDwmODW)09EdJsJExK@N-6D!OmuA8@<2oIsa__lAUk?DF-6vh zKHNh8E0*S`L=HP@`Y?h3I+w(Z3&!d@L|i?inRWfw4%jBbpkDoItfKZtKjqY+fXl~I zYfDM(^aWAmdf6T7_-6}A^EJyB>=hhHnQJLEk~7BoC*{O>lh|`?om$6YFQIj({r#gj z8B5gZryb^Yez`OP%rQ3o(3Z?GjnAX$iJ+s;O{=xx#qzMRQ*16?U%8Pi$?!QT{YL^r znyO`3$Waxu$9IXdqBU`j+Yy{NI#%GMs=_*Zermp(@$JTb>kQWg91ZQ$J}i>vA6gT4 zH8oJ&BX{d{x6YUjnDkP0N3 zw6iqv@pZMF77>t!MShBmoi$51UMcJ=6I zgy9wcetnMtr!Dd^+yON<#(g7o>&HEo`8^9d4y3pKi_@pT9fHvyUc)*xyIWgILS_Ci zav3+zXca29Ehp5^oTX!ZV;B`3z1}LX6?1D{n);)_kRp4z_JO)F!gO~g+H(1U3N>nA zd}-*r_ivmDNEGrlaJF9!saIA;e5V$swzIj7Ihf+c!#Nmjg$q^>3M*#QZIkV&P%reC z=)6`ReenUEFr985V$j7ZOT)mtwkgiy9jak$A!`)O#{sT1{kcqq4JFZO4qE;Hs`9{T|Y&05a#*}IG_7E9{V zff#&x+*{Q^eEtPt==q9y*(}@c(_fzbB%{Dn@@9wf$=aVs4a}8P}e}!Ct z;xMzecD3qn;iEzWPMd~+0vo##UJ>48EQLRdPn6|Q?@ILEDYVWvp+D1Sic+LoAa^YT zB>b`9vwl8mdIg_DfMtxOs6N+NMMj1bF?GT=1C9z;&p4Us99>@T~m zB_|bK<+ad(t@JOqP)F(0mY#9Jh7jna>i4n8Fk6a8lPoq(raXnQEYB3w>~v51V!Yfq zbEq5VJB%eWO@(bYa!uUvD#$NHWLtVT+Jkz#m9f+!u~6d`KP8E;D|tf~HFk*j1~+LM zus_9w<>fRJMjC{!OW#moErzQEda_>hML%|YUd}3SRJsnOno+PW?mbq&lum|MYnuKZ z&eo|t6OQ)`Oi<+yeb}BaQ;@9l^gD>c@o1Y-%s(EK-w*_0>C+gW(&-G7q+bc|^2XXN zF-M?&&73Hq!yLD!gj+6stv8LJP$!g*@e8J3ijk|LiGF1br>>if#T-@BOZ^ zNs6CgN%0O0Xy_y3s21T8^cG>#l2F3r%JOdekT{QJR00gsGlsf-F|VlAwL^?+uN+$| zn#7P~Qd>$J4ek3C0$y{8TJ3aR?YKJ{y$a)?GC9B)&21y@*p z$Sg42B2wt6dwyfIP=t==?T+`>qTIjD`TgF0tu#~uniapr;YH*~p?d}pf&ed}7Sn5) zG>kN(e{#ar6U?MtARYm@jz6VDH!yG{`%1$+m{q6B%zZc8#X3Rc(Lb<@eprMi+wS*V zJRg!R(#i1l*cN%Aq4fcxooOipiEC16B@(^DM9{4AP>nbf+C%H&2xHjTmw9(Rvz+!@ z;Zq)gmbm3#oopiag> z;*O}#ZS5P`Lz^dWm=%^GtzwF#GJCzv&LcshN4jxkCC)uMFF$|K@B{>(0Rgw`iCQ0(58@ z<-g|A8e=-c@{+2Z&4@yC>)JK{w1Un|XR<2(sa`CrA|Pzz1qx%nUgTZ)tRP^o%Xh=V zCkVRE7RqXdD40!@w5y2KJDmvd`%V&bfzxk=vKtPPtLZBPvZEnHR?&{K?a<*fE1|3x zKm7&**us*+UV-kez7uv}K_J<+B0a!n(s*niAXyKhgR4Py$HkAy7$|$4Q%)L=&1C6t zmlgyWBP36x_7iPb1A2l1hRS|)-5f( zb9OI|!c5%{oYSC*VD@XjtJfG;oI?gY-gx3KrJ=uAX<@;L@&Y&8Sf_;-bBK7Mf&U?n zVum=4<$Nsg_?ALf=Tc1GkfM6PI0V|sSiLR8!?1tT|9kHujR}E50|L6mN!TE_6wKJj zc&cy=NMn99wI_+w4uwauOxO=LiaM6jFRr+P0pEce(M{hzA*}LZbn<6PafHg=|318S zGrM=qHZD7kb0O@!Z+3N%l_T)P2(i_#usH>gjS54h0(ej`cPs(I4NhatU7Xqw=FpV{ zA!UjvXxWki)0n5#OBCG3ydaa_46Y29AottM1NL5U)=BW1+}sn~Zz8pef76Pv-{w#@ zd?YeZ+zhpoiU1V5mNug_=6UEA3_kNrC+h-qIvvEo()HFiLPS@cy+G`3g9ah^s>VX& zAb_k7sof0_2qBZOd08y#&-{A5aAR-U{gc{og^>kzMMBv?o1?P`GZ?DVf_XHPa_>xM zom@zpE$L{^^lY0@4T{YLWYhyF6!2m3A1ybww9NjO6;x_-b<59ED7Lh8aBacxfzx(4 zzhD2uLi#N@%acjFL=qbM1V$!LgVRKDfCl%-x+HRwsU#}+Ue{$RX15}F>-u}jTUQF^ z=z_&mfvH~5!)f4dr0#;*d!uj-gacf$r?Ou#I2dyIgg3IKaEYU4s^FjVDejOea9NSh zY^`Kvjj=%bNXFRVG_&R*e~hayoPO&l)I4kd9~(_$(k~74{Ig+(5_k*T#>Ls6b?SLTT zOn=x#`NCCZuw(jQl5zkoE@C=KLq3kiqel zr)~XDXb|t$%UnGCPiRo4DPZU}Q~M9(Am%E!U)ZVpA0P-P!ZwqN{|8*8lg-i(7wG*5 z2rRiipWsh${vJW>C&a6xWZ>^@QjYrv#e3_3q^ZBB0bRzI(`}J~;I9$n=;I%puA0BA z|1Cmo&4cDenx6Du8v}LXY~BIlQ&i_)BcO}{SeJ0#D~tU#0!>06x$jD(+0x%4NRG$} z3I?rZ|GhD2@9~7By@q}J*NRA@60V9!8}$1Fz^ReSZfG+e&<^ork0Setv`FA=0*^h23VY(H1m z|E(Ml-(U{NXj)3_jQpiRCUN4ntYfI|@z4IH7-@r%EVtydc+m;S{}y2tg*NGRECPe> z->ULA?^u#KClA7Zsfgc{Q(~978b<%67@^Na_2PlG?tC-yw+PDe-4>GGww^m;B(vdUjO@9Ttu~pWn#izKFeP#;(NQ-7ZwI0*>``7K#5O)Ci4>` zpZ#wYA&x5w>{BT?>x$Ui`H&$h-{*c?b&%;{9t?8qaRI=SYb8T>dS> zhaU0#+dMp6oxfECZO9WW23uyS8Qxzb*xU*E_F;HXeEM$)694CVp&C04_UwB1`1!vz z3B?2dH^6@Y>;7L6DAkk2lWhL=&Y!=_iHg6G$qvfy{MV<*vB)%i%qRMD ztAG7xMX)uX>D%}Z;(xuVv?!M`+!0Ls0pf|8}VZCDUSR4}Fc8-WnBandW-wW#&+jq&ck z%IAOh4ghEOp^V%(|D;X6cw0q%4R-)VpxYD+tTj=~cvIOr$E`T>8}rW>0_}n#tawp| zj@OEgx5Co~n&Z0^d6=&ni&=zt&0>MMRhozY3xZuit+{t1Ha=cJk5e)xcL?n!I7Kei zD0<>_y*z2FbzCaNJx_mARwO`hBk$S*SlZHe3Wc3@cWlf zqL=?3Apj+?Z6)pDv7iZEG@efqsk50?T2@MKt`?CmsODAc#58R%C zjajeiq&f7NQ;=lOkK;H|U;VP}3;LE5aw>Aex9xwA5Hxz@*vQ5$wtb0GC03IdOM1(_ zJ)8VyGe#XfoBjDpSV|PwVRxuB`)Yv+EJq|SwDzV*qKSl(?)F4rdDQ> ztmvBlFPfln&M&KY9+mPwBIONj&Z4LZUdMJ5Ogm zsTWlmugn&oAN)p$;kL@2s?{qssh5ZTzr^7qYgfP2pooR{9nc4)K3vf+y_E%wK<(@ZcPXT_z<;I+MO_xh)Qi- znfM`8+NFXv6v?r_bB*D#@}YqdN`vAqh?-$nU{Sn1Z9-tIiE|lKpJ}R+E>ont6wl* z&ro^D<&oheW)Nfz(B(0-mp;+#*c<$D)%Ldz8ZkQS6tegOsBr(s3t?Sdp2=gy;IgvN$qL)tcnhDqDv%*XrjJq{rcs{0 zRX)p7jveaQi~paSLowxd8nlY2Z`fbu6=^w}eys;}-@|ykOGce+l(cy-Pvs*gd?^=~ zEPIRdCj?pDAv@dEm#P@D&f&>httE+GAngfu+DJM>*BJCfdHQDgmoE6U*V#WV|Ac^B zKYNr_l2Vx|53-3y80Q#T@6UQEPpus9F(`DohBa_1kARg$`)28n<7d((kigPoh+ZwF ztjzz`Kz}Fvo5yXv{CMh_&^(|s3~t;(&dnD329fmpgBWRJ5Hx>IyfE7H2ki96en|!H zs6njxQ{LQ;m=6>df2y;3*(|T>@+bQLxesdsdPpq1cb`l#h(SsK|AMKGrJnIfv4Pi9 z{<6un8*g5~0M>l_Zy}nr$mTsbNGVVJF(seVKDO@brSHOBZAoltFC2(Rkly%{5P#p7^SJty@2Hxg*fFIHz*~~e zc+dZ?{(0pgZ;@E^o7oT5mGIb@r#~w4H-h@X<<#L(ml8u&*ikdF=+DJnY zRcGo3<9^#~kc!Kve@BBF)m;ouu6VgQE(sk%y^8e1ED$$tF6C;KAvvin_w(I%E%Q^6 z#(#s5E%zW5j3kCnrEtVYE;6tzl4H8%cC$kX6ZI*|Wh(bP;!Jc47%*S|XGu!1k7!5F zm@$f)h6+V%aq08xBL9LhI_#e#AEAw2{x(a#J4^}9fL3nwM+j;lXi@mEP}MEP#umLq z8)wG;-T=*H@Jv)vo)#ce`E+Wcvn>Hm8;JNL0-d4kHYA)Hi-K}%Z=r4NCTHzElePuR z>2J>8<0KsbdDE#$?MhbE|AZiS&YrXKFwOSql(>D=gmkBI5?TJXvAT5JnoFKmb^a#F z$bK;=iy=${3iv-?GIcmPWxG$6G|>Q~Jq1EGUgJ})hsSNrGs+ZsfY>kSB;rHkY|_Y^ z&_7!Qio4dUl5XM#Y}^x)Rb*p@Nz$(_jo)j{Lsg*=cPO-Qr>?o*fNwbeXc5V(qH1Es z=En?KOL?DdRAjz8;KI_2KST3zpr^<|aO7!IjoC4S1!YP8zdTTe$UzCE4WjoOQ*@hW zO3uwLJ&sC`<9_Y4mHYjEoZ*Z%1r6GYS}QzNZzaG#>%So+p|1FM-Kar%l&8&etEN=D zEurapN1N+H(1Yt9yTn0xRYV!NPWxf#6Lhrhwqm+~%kuw!*RG1# z2zg3JZ`u^`;lO?B4dI%+19+J+Y4DLbPdS&{f{_7bnmMN`Ovz*P1H0>JkcE-s)d}UCrF|4_ zD3n3jIrE(F<}KQ6vwHNXvCQo6)k;;qlOByE3?{vwyg}q!$~tOJ)u~|lSh46DEEkDG zY+st&)Et*{0}GR6jQ|7n{E#Av5;Pv)6k=SMy=>lUFR7h#PT8y)e99k+-k5oke!WmK zTxBmUVQDKZXvKb(F8{9Kz5*fIOkelr7mR`(LK2h+HHU^g@j6X$z&i%5Lb%g|kKXf- z!!YKq96@EQ_%7TP*fLqKAS+GnbCD|EiINC8?@;!_PC}Yz+zUnDM>a!^;$`iuUF>XkBwX^!$1(>T3q9A7zc`J81K-d?(#z?|m% zUog)vzu?Hz9xAGN)VU$3)%b3CG8R3W>Pt{DT1XVr2beZzw7qvRX_MiJXUi42@3^$!d|jvBwnmA)OM?-%O{=yO7}I<~-`KD=2NyjGwlz=RM0R@e-a zS^H{jk@!GKB#GeiNt3oY{a=cp<=*^NZ!|`WhZgIrjt-Q66it`J(R?8}yuGF&u)|p7 z4UUbRMOpC{l+Xn#1^#Z0+ikK!!bv4Q`l{K2B`c~gf_6W4lDN;870Ma)5a(niYNh7pS8B^UiyrDAe!PnJl zr|=Tv#1vjax6I`kUEik&py|6W6V+?CB#>p$b(aJc{sI30vXLaoP62-8?8zU=Xta_@ zjIad+@x#pnBTmsR4d00{(=TQn?T>;2`uRbqAb_4ya-`I56)cPtE- zrI;+f&Ah5io(oJyUew%~J@GDkrvZiWqIyTp%nZklt z>-^I}1n` z)bst!+HJ5tMS6pn5h7$o#uvcI>e(D?<&s39)F)+~HW>lfY?@5E{{a60!8Vdf1n>6P zSV$=jCL+<<8D!kG0gX??$+te2smnXCPTGR~wW|oyGWp~oB+kJnx8Q)j{>!e)&6o<4 zWYTP&{=k%gl1T@BiA~N38^qx**o(fiQ>tl;5;}Pywvs~6^24M03CC{P5^p=%Vz~B+ zC-n`W5rF>yiS4bn0A>q3&RoF%082y!l1pWmxxJgg(WDwF<>>mmZIuK#R8#3CldVvz z+3n$;#7vtnGs%G9N#MdjDH&Vd9!}S8jqQSCir&*{8aL`%03?z({{a1k4{xEyZKa9g z;6dxrQ`-t8mB}IbKBvB}Z<(RH*&;vRM2NqCX)F%l1p(gj{i%!5Ef_TWcA99A2oMqh zB$6-=)3w~ob}U3ok`?qMc*xwM`Tv=}MIT`5s*0b$@x(Mz}o zwn%Im4Wh~a0Q+{pB!WRCh?*xyQCT$J8*#aqDJfRk^$YHCB#z;1sJ+wgkKb#@XnlB( z0txAe@b!x{84)rAZ7}>5v|!!0&D;LlHUT==2_)G+&|t+n?8~wv7aLAwD?2HIwYu^Rw-oauC}72e*8m zmz({(GOeApeWbqphq<)8-L^y&l1Ox;Ti&=6ywCnlW- z$K}LChOa1*zws@Nbc6kzl5Mi@5=|>)_O|Wqwf4z7BqWkZ0{8y=AG5_I^HErxWX2Bg z1-S1bJSb)Y3AaTk|E$`w||?P`=y`)NhFC``+&Qx9&5pHGi`%S7XiF^8O#$p;0`(c zs=xT+lJ^P5<^pBS^Hh6{eZx<-|hQ$^CSNNwX{M>BnJR4&MMbRSsz`f zMnviYkTZF_=B!JvdmvqciZKS*8xY&xY%{*qCI0~Y076ruHI2X90iaC-X+KQQ`b-|| zk`hTIJfBHk)1_M@x^bh6HQsXTB}(k0g+|>s_1W zY>^Ggo04>;zx}&p?QNuzNefLyv9ATI>iZ9?vTeMUZ8p{W{{Z(zB_xOhiKx9S@iLrQ zRl3K2gM1N*Aft=829yB|bUGQo`?DwCB6lDiVI-1BdZfMw74{}nGfYY$iFBiFwASq5 zVXA(WXQinjR*FXiaV%b9Dm*NIazP9{Y^SQJZ9V@0x?i^D-rFP%{{X<*0VI+|H?_6a z@%H_u1GPyP%YzlIL3V-=U2x)GoTQ|RZEV5pJ z3(aQBFiN|9!Zz)BrOmw6-+%QyGHvao+k0sVw6^~M=R}l}NhF79in_=&ANJj|cI%b{ zJ(uD%SY`hJ%EX`BENB94j?e@s0Ehno@Y4GnNpSoSv;iO+fLcxU{>xwN$v>yb3!ns& zNhC{vzr0ZxAA#AWKHmmF3r^=G#`+-ugFp~LB$GQpHp(Q7_V~A{2M|bXVA3b^;>BZ# zUfLUfNjGWBvQ+;7K_rq%CdkAVJ<0?QH{G^B*`mQl5R|2BaAeP(wmY4O~nLr67l1V;Yz@{b-0FE}@CTITuV7*UzmVeo0 zu=(K21{zCdxG0n_Uw#r_ZaDyyM__PvTSudy5O(dYB->={-=u-I!bv2ONcz}@H}dWT zo&Y(dC;tGfH zAm#4bTKyl`N8VO1H-C}t$P#y0P|S@6Nw`BIFph42!I-3fC(di+9&Ba z1g)3<0C-YsZ_gwE6(BZ%9q&Js1ocQ(fb}=BB<9&~SR^EpNhFj1!~iW30RRF50RjUE z0s{d7000000RRypF+mVfVR7&vFoBVwvBA+m;b3s_P=Np100;pC0RcY{{{ZF&^-&ZC zY(0yg>XB%vl=u^0o+e* z1|>Kr1OB5yqHe@Xh!qbx16IoY%GJ+C%)l^GqW2VdKh$Y@jT<3hPUi_>FiS#hcZgBA8Brc9P{%M!U+MPvozmb@A8>wUN|$RME-^SvZt>`VWdWox zxnd9zl_Q*ZKxuIXfF8R*)(e2Cm>=~53>P>r;o4NqSC%_`rla6$tHZp_IdXTqmJ4XB ztbHKFUVLGb8_ZP|`tJaYGkW#mKD56OWuyx?h~BwzxUGNb_K^*u2~4GGA{5>)C1b~! zC}=-k@2Z&RUtfexS|hpD{Go#X01*(C;r{?-`vM&smKG84orqw+^!}2$xoA-+*+F;1 z_D4F;*D}@Pi-5Ru{lp=T%6WYzl^k9*7|VO}@P-E_8zBqBh=wWy{+|KMEYuXW)CRSf zGlRxdES=26(A*_6T=+|D1ITN|QqhvDmR4tTaR zS5D))gU^q;CIQq;Bh?ZT-omka59l7H-6Do z+HMBLj4#K+U4JVJmt608Ua1ck+#mo(tZrr*{Jb zP9{R2BE=T-&2t4|%fv9!-yg3M`8&X&IhpWW&Q*SBGzomxA{(xGn2uP?ruFcMD7L-l zU_qMmEr8q#{{Tz^u!Luh()BD|37mMrff>4HokrXoLstzt#5?$29v>U}aR)+}?Cb0F z`pff!^PBbX@u_I69uP5~N{a9pjdy+fTn+(Szh9^e0hy|1B5+GgZ|x8}f2Qyu#@hvz ze+}=yI)pTD!VnI|rJ2c5ahYG2uSCy+S{?hs6j!xCu;$x%w;uzw`OZzfYq#1xwt0HY zuswJEK%1ZD9u9t&^x_t#+N0}tsMkQaD(|{>@%Rvt2=iyIGY~4z`?5Uc=fzTVG132z-$9}z_izq>v$}_<`rF7Nevz+tCKN(PLu-86& ze%=_F_iMi%(BaXtQzDjHkx&)0KnS;&{WFLvo#oSHxbO|~D45b7u@8W=Sug4KlqxGG zO08%6Jh_fqWmL=i-PP7Su?k{v*Y^oNwa1=6e=SA?*)j+oZW~ykK+$!XcD@Y*N}aEg z?zzM?9l77f#e+hxV&9&E3f-02gLLJptN7~@jGL8h69r+h`uhE%P^*8_bOlYWZj%Nq zFLK?G5z#3eKr1+}ujUed?7I5Pa?f`!&CkjtdNigk?a%LUr>8QSE{~t%!e5MiTFu>j zA>p$Er9H~8?i2$99kD13N>p8HKLMY_Tvz&OvjX=pELLi1By&(mjk9RV`*dhpx9J`h zCe@$CnC1*PD7$w`&34yvRN7FZg0YU?Sh%v26U0*g08=f@jIfzF1=CBDmolN6HDinO zaoYZ~JW9`y^lRqv6_p&gKY568Jf)dC{vuKSnnxd4M$j)Aga`(SQxfLkq11r38@}F9mDl#M6J~eeW5$r0%vBaXPs*U|B z{_|3M2AgQ7KQhTv{1!gGKOe_T@OS)1{{YiWti|mCjAkN)_{gMrL6WN!anBpSFS`tu zMUFDpnD5G45}3Dsw-9DQe*+&vSq%2|;|W21(o-zH5P-CH7g;hwhN7;<^SuXu2zr;l z9}eD7Hm@1{M92DTMrCwFl7+Dg`>Xp-TKNy=pqz=~*X})H9yb0+<(2XXMI-TJSu-d@ z&pMUF-;6M{9!_2^En7saK)T$W{{TcLT8`U*L6I@y_k+%9u*WyCPl3hDBv`PjqsM|K z`!kbVN2`RQ4d?wV!Km|Z^*3Y4e(rDI!LPKvJ7vOSt9Ki7E<#!~L3xZ+217r#A*TeO zMbe*M5rT!kFm$=_{>W&-V;qkUkH!L=jrm8VsO+2OxQnL+AL(OrHx|8+#v(9ObCOWU zFc)1^3Kk%6OMm)B2hM&mDHuZe45!?=?n1gS@9Lsr72P}Yi;r$%z)JhSi0Wq!d;b7Z zpgYI+<0__~>24)kd0o&a+FwW)z^ar4*00G84X2M*Ip1BioyFDL;UjeTH2q!yIE{;>kHW3Kn`jv&h(efi(+RSbF0+fx)Ta>&~W2U~gf zmpaE#GQEw~roWsw%kV17U9od?Y_B*Y>=(!T-)8X;t3FU2 zV*daUijGj)swtObAN0PA{r>PP2e{N3{9JtDaTg!d8?YW1<57TA;D=j#JD;y9gL6#c zwclCq1XdhfZT%Cu6#K?48hjoY;;6iF@t`PmJA2aY{mNWh4L5w>!Ypfm$CaNC z3y4+PTKjYOk4palQEW+tf`qGDFQ2zEjc!Jg#p%4?mzi@J`G!SqyfAaQS{pQC-Yxsp zUz9Wkg7{+b=jnw4Tfr|G?NBY~g$B{!&GOYU#>X{D_mmv-pTvLDNYJO)()=FFKAPM&J^#qg7hE_~(vl00TzQP#e1Xc>H3ZK8c^7%ZOuvYRWU)ADGK3mAg3R zuZaEdvD;)zc%pZ`HQN6Ga7^I&OX3&*08*P3`}o*2xWyzo5W!onuMl^b8wOe zl+m2`#rRBW;48m}@14Wk%|9CTP@_$IR1pS(?~4AQ1#F|dZvAKJh)~s3-_-bb@2H}< zFznv{01^KHO>BU(-TV@z>Rje94rU2yk9_$PW&C|Gs6qJp`a>>^`F)6)9lkl?Rx<*Q zfl>1C4-La$mD{7wm(}730Iwmh4=2K_>{lz@Q{j4iD~XcM76z#E=iwQHMfS&mvxtFp zU*jIT#s2_JEQGCV#vs~Ni-Wk$K++F4{!4oYuP@9l$saGh%7UxU)k+|1%MzKB;~kVh z7SR~ippk-+)ifz9Su#4~5o(mH0Bq8=t@%#j4Tt6iomKoUGOd_3^L~H1b4mb%^2(ox z!iruyLubZ+AL+iv*_wgdQ=9IYj%J*J@PG{!5iQgL*DzbAXn6HdGF(j&C=1xT`QpCu zZveP$z>kGw_)3^o1E!4U#Hzeu_+K_F!?r&V3l?DvF0u6aq*enQqP%(Dr6bt9r_VM0 zc+JN&{y)=woftzB;k87maJv~w1VSVgKuth)LHUm;7GQquA6Pn%jUPLs+<=Qs;bNG+?Y_4YJp>>&zO!t^4?iIMc1NjIXyXJ@P zH3~ep`X5FyXI+3R!7rtokLc*IC0 z7rr0Ff73}I6N@k9xUCBL5ID2VuiSNq=WFoM^OndT1J1~qE%k|t$kBctx8(fdn^oN4 z7%-6#3{t*oZ9E@%kU&}DA_drT`rM@G7}Zc;+cfjzx`=j>kt@ApjZ?KeCL@4r>5qhe z(@)`loAv8*`1_xy_n#?)qp{!j@adc4EVHmZzaI*eza(^>{66z@NIr7FSFJprBr>Z1wQmancwkuFT88!t8Z-`ZbN>Kv*Sb_W_YtgCSlWw-PygYyTaunX2Q-+%Pj zVuQ!an5b|WP(t88O8iYnL6x38H7q|&^b{PQd53;Idice^X>6gqf60$|biX|xC@yUX z3@AP?c(vKm_-e6Lj|pSA8_sX0Hszba^~=0Uma*UJ_2E3Dae9f|hVWW*GO6_-q3@__f_9nFuMA=?vfVfXRhql``0+Mq?vjw=GV$;DkNzl_=6P5+7+@%s z3p^#@zw-pnRryMw#|5@?tSwsocMw@^CDW2Tod z@~leTKrDNI%DyH*zp;FyoWk%)dz36fz`nQ8%Lp$o!d(|GYrMH-tM2}#ETZec&Hn&! zb0vY5RS-beuQ-_Nrz_U?dGW=%h?Rwr(dR#i{{Z4x<|Q){+lQNM4OFQHbu1LcE`o&) zV5V(}WIswzTEyJ{{V&*Y97dfn67mbco1F3Y@s@;mFc;Jn86Dw6!(~6 z!3P(|MvrS##Qy*xwihp7ILuBzXeG=8;6pO4h)EpEj3aEt3ZwX+O#P#agX`KaY7=1T0@D<}3KaQr?XhJaG+n`SFz#=MICk70~tC z5w4&rcPwm&BgoXsLon0q51M39Twa7p(5J&+diYu$M7W3Lj4>8QLRYeD?#lRwg)toI)27)F{`o8(9H|e;7d(Uh!yn4(F@?03KHP<%>p(Fek<(wZ-h(`|4Iy zt!L(CFC#XL1t5AjNfyG{WmfOaE9^?*XwO7+yjIQysvMHHM zP`|u+25uyNNkhUTOk8xH_;-vWY#P){Y_WM~?HffyPy;bW(E&W-p>Sd_EgX{7Yz@zk z;LOx)`uEo9J zGDK+&DTk_#J?;V~Ekm+qAUK=t_&s76)IcD1g;;e&8I__6+^!%RVZBO+pGH-Z7>#9> zcU=DfPyz2dHO#2K5#yj>;dh6R-_xKQRSN#3TbX*|AkKeq0pMa}K``U|ROW5<;Zq(H zSoY4OMN(qAKYf-DdP;U`7 z#ArY%aZDNTk6{TQWR?>xVa$KJD)9syokLUz9wRo{_WAq7(l%~T-Nuoh)PJZCa#4g+ z7377PmlQ#YQFwvGw0H?jca~Mb(@Kb3J4H$w)X&66B{Ix+EPhPHcf$d7ebH#PF>VeC zQpP;R#4cDqmxyC*kpk%7l&sFb#Q+K;(3c#|Oz6Hpf^E-`{nQb!nEnIvA4lXLwVTV~ zkF`dv+by@FyiP2hvD}=(`JQ)A~2VVXCv;&-E#xL_qiizePj59?{m- zLviEdIm#u}(1xL@LjW+Aj7N@O28UA{iOOzKzDY*Xha61fN4bfRRQWQPQ{(Pju8ggW z#_b26s*_Elh{eWJz7+?;L0GGa+5iJb9m+LhIVb8pjTo)bwgJSZ zqqyP~xyPZR=C#vCz_MfK(ckqlSD205Rc4?XOW0U&mm1ux8{DBbu&3Mi@`3`pAD`4} z7jZClictw#s$(67qK*fB!=Qtx>Is%79@5aR{{Top)jpPaDE|NxEWz9Qhl_!cFpqJ8 zc`ONs!2VCeE7$4q8ISJAiTnHZnabSwpR?`Hc+EtzBGfG0Ex1<_vlfeiErh?Cr!TI4 z&_U2jqcg@ciJQb}f>+i&X2(;HfnRt*CE<*~{h|PI7d4N+ubgP6Qr8e;P5q@o@kL5; z9o)aI63Do?nbgh1Vi#~RIfP+}%nO%|n2b0%Ji6lqw!?HpE){h%Y>gb5LzAHaWUa{{ zv2i#d>&9N2W&7wu#wb;|L|!{U#%7`h_Y$?2+rR2|kox(`6h{?q&3_+h5lyIY9n27) zAYUwX*g?d*E;ncdVX9}LNq17E^AaUTQm+$ZCqN`>1d59oQ|;QgG298CYUa`pVH+bd z-0#s4DHS&~OP*?gQJYM;h`C^3_M52J=tMap8AH!6+`@Ey{{Y1j?_{_`)x_cxK12vR z32X3SF32`oF6}X*O{>fE8>2ih6$?Fa0mfn%hG4Q8GwZwphS&A@oX+B4CZmSupF_04 zh%F3pdTszk9Pw}bq6IGXGRYF`C5Co)xl&aZ`nv#u@iCJT`N*+2NJhAOhZtwNyxOyK+R&=EeJADjy29KP;yafXTzn-@;ro+xQ5FF2Z`aNo#IR~Pv@4mpLC;7eXnGU2<&Gfh z<$~8IHu-iw@aT|=;rA+qjar#`8E6`mR$w$3g7f|fk&VFms3qbsQN%*0pg=3g{h$mV zyh8wiH7?l?9-Gvt?rQNJ79bL#NNbKUZxrjEnio8uqjLmeeV$%t7s3x}?o>HcG{IRCk zp71dch%rYaGQGQIu?9zK`jA+|W5pODFPn-!5NtSz=Q8muGWdm`mL*~(lVnt_8t2E; zK2ATsRWALFeqx~e3q`TCH|2*w#YJY|tP5nIJ~6ne#0O9CM1@?)t;%67UZOC10t}+| zm5fbF^A8l7!Sc851|lCCKP&Wrqx#>$^ov4>=8g6tOgm)~;! zJI>#h3sHo_WVv4HRL%w20LY2F$`CgVPWJi0vN^wLY?0QZtDBum>|4F~!CMISV2q_M zQ{&MlY)Fp1f(FFV>|D|fM+@%*a@(lArI|osxmeESoRBH6@Ib7>Q5zYSY(#A;huDO6 z0|cUcRrD|KFNO~TKU@1l>7Nw)Q7CR&?Uyu{5pK5k~`uWcNA82OH$2TfF;fVOy--NY!den0nu7|O)8rjo` z)m*X8-OBHEs!+Y+-SDVVmJ)=>2;gz!8Pqh`2H=RRY`wzaOY`mCQj2geAA}`kpTnA~@@F zC!vCgODJK3Au7Ib`C9JFp%r2)jK9BOj z6*!wCzhy&x09!CwH5F!E;F$*pc;kO~iq}0nU~T{aCx~J=;LQLNVG65yW<`M@wDvDk zQwT(?F)O9a1~W%m-sM{|g@hoL#EeR_0<|$r%ZOyN5ZCw`GGnWH=rfz2#5GT12P_lm z476WA)k0{#S^B~D6rU+`uISl3zBs^zimHOipHQp`A^S56c}- zIie*Gu-_8pGbFhtVqmzl0J^v78@22)I2Y+0U!Fab1u=2!ao2=09YESxry~K(a#;rw zkO&k9TEUMY3_u2Ev~@7V2)QFwAd4kkkN73+^YEF|4=enV@YvOuKC+4eJ>mE4Ju<92 z2R|59pqIk~T}3lmhWVd|-W5v+k&4ur;Qs)zDqg#&et!~y3$8O+e^S&4abp(n%I;jw zGyC=91BNqQ7H(xKh}A>_GSKez>xoJi*}?mQYH+DTMX0+{)*6Q8XG2_9%(7Xon3lm{ zXQR_pAxu1Do{Gc6^7I3~Iama$J&K#gVsJ~xxB*OG3Jy)4%9$im{{RCw)D1>-$qjKE zq#Y(J*_F%Pfof$c1r-%8W@b}cjrW$)GaTuFg)G1DIv8TB1X`(e1lv-rRJ5z>=_p}7 zc$MV?;{LyIdqMC&Hx3RL-tY1Bisfmq`H6|XD}o0n_qdwfW-~0%eGuau#k{4_6*zJ8 z{@}4S7_>~X$9Rj{U6lo@Dc+;#73<*|xB>8jn`C9#9pYq;q}gX_p28K^%Z8rDY8jd6 z%~QfubBJ0)%h>$I&IvWomofM~{dV?Syhj|ywK8F%2Y8h)u%Wm%nd46y6^J<7A)jU| z&5#ux$2{K7vkXGS@t3a7w#=o2m_#^-3{~lUBI7W|8CaYo8kzn{r}!Fc$`%*Cy>488 zSMF+Q?Z2<;IktUs#8ZIp7PQKq%y>i5sy3Zgvg`VT9)NEE+cJie+9 zYJYK3I?ns}G1k+S#-LIskFN;89p6t`myAp$8`L}V#}2yhuEeO5AnFYMIQage$F-Cu{>PkNu6ch4gj9abKy;dx zyg<#|!dn85iu)62mm_k3ZK-6de$mh-cOGtcaDw+T*M8BsyyB|eRLnc)*-OI%ut{j0 zZ5@*K`1Tlz$qcnTCDvhvcpw1t5AZ#B`}7Hzhn`|eb-w=qe}~ozJf0rBrOm7Ml~a;T zs}GS6uza)jffjJHI{oG%pbYxrCapwX-N!-Q!j|>-f(I~poFOSYef=|UHnF+X?DGd%~-$X3i;S4O?B(EK%vi|_` z5vQ|d&Lsk#9W@nur3a6*xT9t#nu$0{txe0qXut3>ULwa#l_)&W`=qF&$RD)C+~CLV zb4=y}TNW=L%r?MfS>Y5l7_XYow8*)cm6j-CVqcFeM=Wue>NtiX z;tjFruoT>Sj~!e#5W|vj4u^OZ*)=>rKNs;gf*2ieJN}QnuRj7?wBYta+KFOu0P{2b zK&{Fo%ZLG07c4%t+A{2O((Qw0IFDWv7-jDn1v3#_jDv|O0>ic;>>*uByWGJHk;+4p zm6IW_S(_Am+x8F?z_Tb>cs#yv*W#M@Dr}4K71IKW{{RC)g!6ChP!a>+e(q;?nY()u z{@w}CpMSJ_MF_hO$+$2;;FmX9B|_pRvC-Jnswz>^WOl$m7Kxti3r7m719o9 zz5-!=7?D;;6~bs&2;1~CFvj0t2wIpCvB~S{*3om5*e5a-d?lYG9-H;VS}voyTg&ZQ z-Qm`=3H;xW-&zJ`sc~~pPZl9b3@3yLgHr=Uq+$v%Eis_s2(Z#hN^=LY7vuVc8y}zQ zbL;??WsYlz7i~`8U(=tYvi3BlSxHC6OGU@s{{Rsa3J?4Ams*9<`SX9Nlwg%Fr)v-? z9IhCYM8gz@aLS_Co)I)+I46 zqte29#55#M<^HCvT}(i}ngY@V5XPkdh#}+mmaBml8B3-#RAaqITwKI$(+L#2JNzQ* z3kv8`$TjCNLgQN{MP|q@qC2Qfvpi|O+#3>_%PHD75o__8YT%B)!}(mB@;wk(oJ45} z*s|R&9+VZ5InJf%%(W7&Od27Af?g*z#0c;vO|tm$h!0#$@4JN83Fp(sEnE`vdwTT! zVSLN_p?oQ$Bc2Pbjqlq22p`P}uMImO%%a5l_V#`AZg- zX%%JL1`T!)2EXLw#{k?|9{$6q7Kw~Xsm>vx;Tw&+z7_$K=GU zN{cY1-Rt{~6hoojJF6}NI1bD+DO#zjBD8$tLWonv8sc6qDj_I7KkhmPjr}FXbY>%n zW0ESZj3cowTE)Dj(TH73#r5q`FL8Va+o+#G3=<60OONB<)S|c78R#)67yomdx{YVmXNqr%oxsK zv$8p<`IM!0<}#dqlQAQ3XP-_WLzqfCM%FLz(XA2H?t1yf%LsB3#fxwsgg}a81tNi& zv5S>P<72JFtTkDjoH_Y^;;?vyFN$DUFoY>7L&5o#dBmYkXOBgtv3LjHtrNfCMX24& z#84~5c3k^NPYuPCu_G$utyjAHO(Y>F$j1%=s^j7EgyuH}PgwDXt_(Wp!5UyI1XOZL zS=^U50A^lYlE^hKW+QeDdRdcli~?;3N!Wtb!$F8y#1{7${Qc#XZ4gJ4Wlyc?tLb0FmZQ=QS#LL1+jn00eBo8Xxf9VH3*wKiz!bA%&QULd^ip-?3*S>P%K;wfu@;2{Qe39)VQ%o>Dp043OU0=r6X z8OtusW%Ae77~13E4Y*J)S9w?s%P>Kb;hjoNU*WVOeK#1`T*43&nKG3wx&o#Ft+85# zRZ2@Cmph58W!Z@L%um!`_3S=;rYt& z=pCR@X!^ln#9K;SF{rG#mQ=xV^NmVv)qOXwo+qyDkK93PsF~B3t&aL`hHB*$?H`Za z;-v{tL$pX9Fc^3s1RNQLNsxcTc6cJSC`(^U`hx{b3Mqtx#K>k`1M%JuIY!=Yt~Qj) zWiF*$&XmD(;BvWNpRfBYR^GUSa?CS4Qw`aQ+!)%nFy?tppflbZLUD4;L2X1ye$oO& zAtf~P)ogc`pqEIIEELA#%Z00rtj4PU05b6Od|-ob5SvP0M9Ua_BTSVR)3#UyZxxX% z7>mV5yI>BP;!vke!rNg1+CE33Ink)BAR-t<6?`zXGY$U$vL#LK0tPSX4u-l%D<0&? zNCSd+oXmEZM6f}_sa>GOYX}w0QlVerc+2kv8<(_pdqEewzwUA>y~%%r>+-9JYM#YD zztj})grQ?&FcriwRD2`jC|X3X80O`$VZAwhede%;vg%ttBjFv7k6t1n6T}#7)#?u2 zFu=a9X3@ggcM`p!rsf;86oRbvE(QoT(=y4hYE`@=+X|x?f^c1{*5-ImH|;x*(&K=$ z@_l(rl3nEVjM?wz~0M!tMe%k4~{>m)*v~-h`pojv-*H4gOfkpM8p0O zaD~i;$DwxDl}sR_4^5AsLzbbALtmbn!w&NABrkHE%DhfO5ST02%QO4qL-J{shl-KqXJtg^dhSWW((e;sfkl}xMKtei*!b@ydMC+y9RX_5WL1}Yl`pX zu}4eWLt|_hOX!|Zacu9unf1Gv z*B^=N&Z1jk`TZM%w>O7>4)MU!e}g9}%NVN_rD_h^@a6^TVga(e;VSlF6`FCB-=53Iy4(0-!`!xfJfjVH?hJU1~8k(L`l}dqIi0&7H37E4Ar-|V-GR53#UFIc2 zJDzsJf-OfM4{$Wx0I~wr#1{@G)%*UXhlIm%_xi%YUz|UQ7XDpG)s*zIi{g)E0QRcx4*>H?*9P8;Wq*` z{t9S~J-)E360X=|@c@P4lq%miBu?2`WOEG4NL9t&3QOV)rE@N55J^9O?j#$I^BiI| z8z6^)Dw>Y^8JzTdXX8_5$9T61cmvb%7J|3Tp~NdXe*U}1D9qG)lJRHPu3}Lu#yIHa zUZYGJmv?hya!E_*MGJUhR${shL@;JM1XwE>i%Ts|hBaFU*Vl|iLcPGwnc%|WBI5>m ziBgetI3*rscf&XFeR;~&(jvE^K;^F*BiOdL@XQLtF_`FqZaBm)QOpaMOM;7p9?^3i zg3DC8)V!O3Fl;_Q;I{Lg+#e}&Q_2crCwPt$kf6+HD1u}ouo~z?{xkCxqTX{o3XQtg z>R$&lVAp~NWZ&*uZaIg9+;t5h=wC;?;#Cv$f2jSR+E7@*c#NPpmcYi{%mg7$yZaVy zx$=y0Dw^rOmJwFw43tBfgmPS?fD9>Uw5A^?nP$j+zA~Fp$(Z($JU0ndK5z8~AUo8x zx`^oJWJ3_uMSA=A!Sjc|y5zj^Up!4@Tgl90uz7s-EepUk@ntl@;T7yIT++)=g_@g( zv_*50O)g@ag4Q6s&Ms>+p0#*^-d=7l6HR*VK=A(nxA-Z5D^o3o5H}tplF6E=1`CZk zmnq6CZUh>3Vqd0OTGdJ~q99o)h13fvMZT_S^ju0iKEL*3jmHH`saT9)IU@}a8^jdi zRMXM$m!1Crc&7(w0!>6T!!5+-WXvN;iOMIiv;fBYY7Hf$!I{|Z2QQKPiH#N`y$V@l zZ%U4%6jz3R9#MjK(Z`4N0`sz5(=Q~Z**{*h15n1}G9MU?c{eo%04>X2-)&PoYhSsQ z3-y_wUIzp^xH}q(zR@evwtWio?cQv-ww(Fv=^V#%v`cdkY}70ucVlgUI3w1fE*R7h z7P==hknLQ*nW*+Z!9lc2%~Z^7KRAk4)ci}-c^SzH3Y`yrxOvYgTyI@HuLrAmSBUJP{Da43o~R= zh?h*~G3^otF7Xo265=)SB?kWSG!u~({UWy9;%`$aEa=VjHVI56t8v9~+lh4Bv?0xR z1ObrvN~GKwjT_ULDc=6!PwBk+_`xhku41paybuMo!~6Zulrv9@`+-_lb0^dDEhE!` zIgl=0O-I->DJ=(-nURKjJcz?%&&C1rA7lI%I^2E!ScxSvdhaO!mMA9(IY;M@<)NBCk|WfIv$SS%WVYsB$K=4k^f zTS#QNm=T(W!9hofLz9Vh%(m4kK+8P3J0@VvJ>_?tOo8VUlFLb>GVwehj$%q@oUOpP zLRMpNRB>=GP|bu_T;PuW{{Y-k<2z&(po3KzqhcK2Zmt-~9KPm;SiS_l*6`%@O<8x#(vih=3*L$hHo0@x11Y8ztmkyo5V)3^F#9} zt`9Z)5c{7a{>L)AoWBkTV+LR(0&X#(y#D}#w;=O>vSf;zvp)kJV5z66SIcmoqm=9x!E481@dks_>l}QVW_kVDg#B&Tm zrU-D%(Nf^7MSc>LzJ_IiIDiAFg7SmBkwbM7_Z9Yo3aWs^IhU9Tsa8u%?Sl6K+EfPQ zX&5#`Y@oCk1f9^qhylK5a11h+c!4n~Ul~k@hF6#x<&o_?YG3@Cl`2%O zmHcX|4lTv_=Rc#yX2Ir{!ZWgD}^rFirdnEFU$03?M4}~o%9Scqsb2hs(+b!PBJ)$kirP5GMRY`1j)9iu1PY6Q zO!=dHmo_sMq1?6r(%t=_oAQ3;Dm4cOhu&d6czed1_6C`xiM!jRKq`zk-gB4gL4Rar zTn$5sd{ZWOe(~)XP?k1C@~bmxoBTlqlIi{BH$#u#Krb?nEOYt`;lr~V%t0V+_Ni=Unr<$8<}n)cRVjozF>6#mC}Hz zgTuxXRr~Py@8J@?*!x%TEaG@G!RTMS^U8H9c9eVDi7Hg7UiJ5=v@*ymxVM>kl`FIx zh;e`!kB1uLose%43(Q>v%qy5!4k1x+VXV29qHUBHQpQKFS#xr;f7K9V$I?%BTK+vkt%kY01~x>JE?0gYb`QN`;OE~L@q%Fk<6}yuwF7t zY6S9`p)*x2nCI|77CX-q8)J=4!A$ngcsm{=y* z@BM4*7^i0k60yVP`+j3rk7Ai=X>O1fM~&0)Wjsn8dkk3b+PQM&%aZ z$=VqO3`0;6s?4}ssaJ5Ypx5eF*)cGObQ^(dbV|X`JFHt(%DpA+I^^ZY}$pKIv;9e8M@TmVSJ_0yK`s{9Q<%whYq40*`!H!t_P50tEAu!Mx;rKh{F%fF}c{Ojl1&pW5q%xR4g?A4AHHb9(_>J7dgjAWCyRR95! zX!yks$%5#rnu5HSq04WLIT}?Bip_*t!kJTKA}{mtPS%x}1L1ZL@6cD|r;HaZ&R@S8 z*|fZC3IBI%Q)elRvAe;9*k97Q1U>+6ZKSnjES?AU5^E3j5+u-N!Lkxwb%xLLv?UW> zOwZ{_@&+gGGP-&pnVoCl_#95Cd&TBmL&5jysq1iTmO^7zWUbF4DU;abw?LD!`t8d%oBOjZX1w!5L3t(kJ8ck?BtJ@u41vGX$IAN( z-x%J&AQEGP^8d!XUqTMw*U^l+N0X`{Zb?y6z*h@pa2YtqeW5>kwikQ_UHMr z=0pe0St->+hN`*8mUi(`XWg9kv5Os=0a>j8@w8s7r@QF_25l%QR!Y*#xkZo%q4eov zVVB21(}K?{=N2Du-9i{!MrtK*+y4v-j`uLYSQ|3al@NtoNaXnBA(Azn$cd&tlPdwh zT5?cT8&*=1rgVtD_oC@KxvIEt31wo;bq7CcwEbkM(7&J-+q>17?#J(!W}nqeEG(ij zmMLlZ*mne3k0*=mu<6s!<{l#~oHgA0;BN`D9SXBc=h4}@f+}m)EJx^dj^2#i?_~cDA~#xUk@%@pn_K%T31BQFg#P-q*zm9%Sq(V`d<)Q< z_&0(eNd%^siUL`L#`Ro0hp$mZQ&l#FNM}?#hZs2eyOy#thI4p}ZdtjwN(e+&Aja)t zhXjqGYUj}R78e5>jP<;~@IT0k{$_jTW@yO&o>{FtLDSvco|Sb~C*RMgj4(+FC?NVd zyHx$%{ZP9f>Bj+okmjetA4HEnq(^-bvhJk(bwpA1rwQiO?GE1&9STGW|Gr7eCB0^s zO3ETwOL|8Kz@xw}DAk+M05fJSYkUD2ahmZc62GmE{xkvVyoBqP&(msWMF6iVwFdKxQ=6){@%)66Jd= zErmbyY*SLmhrbGF38S|%-_RV~RQT8~KJEUZj6-O&m@WXX<`WYaQ4bvB0;o^yBV;$_ z*oI=RjH~1qzEze66EVO+fkRgk{od2qxsk|<76^D+Hjp>9%N>&pgo!*2`)k(z>ytJ1 z7-(cnY-S&rwIFD@ra=lsi#EyhZ_?mw8L}Duc;4Zcn9|lG0_>;rBaH1y($HN*{O-me zd)qS-y$zv8k>`JsKiB5QM7wRgH7KJYz$`TETe3H(6eFXtS41Z@sVpZ|F3D2~$HSeR z*VucyYHox`+qZE3%@XPcZK$?W@OtU*In zrXdW(=7)8g7GLTvU}P*Qtl*4(2Vtqxz9*Hruw7R}A>WT^K{;ZKMP9o)KGHykry!TG zpyOdIhsuyTkj8MYVpHT>tVfc8cb|?o7OLJjn*TisKSq1XGC=*inaAbDme6pB;GGJE zejeg7-%GHt&gbZjzYa40nbu%_kliW&nzmfXLADOJEG7el-`@WBZQj++!avh^FK)(R z1X+9prG%Gut73U*;|T;3g&oOUIMQE&`+qTw2(L}0w^HNlqI`8@R!n%x0P{atSKZ=z zC6H%dV!wf&%=?kF5BNp@Ii_O##`mBTZ8`Z`;q$z#=p46B*YoNGO2AB`D751qh5#E+ zZ@)EAGaPtsVQ`=RXnWr*z_{m(xsY0e_OCU1YpphhBUG3HQ~spk+^~FC+m=q`D)?qh+z65W11g~*iEvdfLaz0%IIMu@XW7 zPMZc-sLOy634>&+x2i$1aUJ4&T?T zo79A9B5%iNt2v5T)TvJ5ez6;%Qn;*n607}SatKqsW=ex7@DC5a)^|v=VZd@Tsrs>j z6+&Z);DWVwIIIXFmKn_m<@u*x=%KiyY$6S5LeZ*N6U9l1Sd3z!yhn%eRe#n-llreV zRzqg$*A@Tm&x!Vs`M2B(#+RP5)aKJ1$O;N@RjV~Ww@4GMUe7+L*IzxQocLFNb(t0& zrggkWUDU-AwvYFti`q1f{pXiSdTAX7XH5a$J&>X~rKdr`yJABu3tdN8JsZK3fkI#vx5?;`PSPGRpwNBxWj%`8XlU%Jpf5V*lWekznX%8j>@8L{2^UHB2Dxfz*`UG? zks$M0#Cj(XvHm;M3+hEIY&ycZ%PrI1Oq9HM{fiosR#i}kj zfZwlL1MKsql}hiHi+Kk+E|+ryaEb zs_E*4hSBl!LGE>+BFl<@rALgVjYe~@@xM7bOiGaEAFjd2}-?MKM4Z`d#gl(*)qM*cN|*M=SN zAdVHx*-F&L=j7=(I3c`pq}&2KNw%GhQNWh$gt9?mqOz2bhpjz z8Fe~q^vN6kTT}u}N>0C;j8idTf#ukV|MuYGaz}i$A;(NrX>zm1WD#8!gHriH5 z_&vKA$SN>){>#Y7@TkCL#JRI{3|zOm)q-MK)~-#S^$zJ55tY@b=A1cRs4zNxbE~1L z8xCqH#cO`9TXsfS5xs>+Ub@2Z=7g8}I(@t7d>Pn~hdzOL4}7Xs?}fK<_`!ox8|mx@ z$u5?IzuX>_ppLY^S*#S-mF~f|$JgSwgn>Wrq#1ghuQ|=aoEAFPd%5{BAuJK$L^5cp zgnNi}EUJ1Ie*HZrn&mvtE zX5xvA@tQjg(!nv_)Qnxa+F9V0O>^>7GwM3k6sNA|@jRZ)sDA%&7?`#KksOt%mHk9Q zwHE+l_k0?OFZBCN;v%dv-ynl9B+b)Rd?3X+tC4}>O}2~S*nAnORzpv?A?;0A>v>ib zQpJNNz?eGzMZ4=v0f_9*jQUfi=$Cc**}=#SqkYq21D)N`=l2@pcWOq*rDM>Ut+A_D zcH6BO!?%vuN6F4hOk4w4hELIW3j*D;q=+h)r6Jfz0af!i(D1~7R37(IJK6r&5Y?6_ zcw(*5S%s%7^-n)(4(E!F&D2RIV^-iCTc1$?dsFS9ld>uPjLAwF+3UdYX+cjT1OL_n zGI84tx1g|&kH2ZMJrA7goZB}jp5N({+n2uaGGFp4nd_CZB*Pp~lbW@! zWybuw6-Hfgn4~%9@2lmkDIDEFoeH9C&p@j)mYKS}%kh8(J@2LbavP{>3!h{?fc>S+ z)&`y7()Y(RWg_X2jX3)y@1*Eg7WTpiHmhYnl^zl;=u47TugVzfoZpK=Aj=Vke^;7M zQVg3cAwSiC=UNyZ7y_|v4|b*m6nWS_#D1F0XL$GQO~KCMoEFVsMz}F+3C1Olhbwg~ zxo$t`t}R;!6H8hmdj5y+1eUw5Eulf1z{}*ZXvN)P?MU50?o3C9uI?1p(SGu?welkk zYZV>v=?l%Yu{QRT?qVxXI>W%EWLSn1qtvg~z&mD_c_+Wz?gwt`Fh;UeL*{C3x`gV7 zr+dai{i5JI2DD3T<%^sC!)dSpq3>XCtJtA>4mXnLeHUocPto zkVQvssAEd^pU#JDs7^q1PgjKRRSHyWj7Ec*R3rVXRt^r{PwE0?vFyq0~LJ@9*|Me1l+>eqkKiA|TUQeVy19+ogK_{T=X3-hS^`GA5Kgr#RL zKSLK%ymF;>hLi$f$}GORToxb!Yg40B!=Y$_ZyOe4A`K;D+Md`g2ruy`auj5>*v6Wr z#OVMJ=X!DetUK(Mw1E%ro(*lhP{gp+Ca2EwuntcjbomH-ZKf~BciFu5*8+rpby_0O zVuv4Y|AJ&&FO$f^FH($M< z#vuKMR;c)_-Pm8hzn(6b168WMe|MWTrmVlY+_knKxchIQXtYZd(>Qj>()BM6T79Mu z7DTM&q>m^IT0YQ`*!EZS7lYO6&)E7(dPr2a{3}zYyZCNu^10S;BAPFxE(1pyo zREK*IHq{7OPc9`+{K$TQH^aRKtPv$uHm7P!HAX0WIG?laoA(1wc~GwL(5nA8kzAXM zi9G~k0@}0g|FsZ>?X^~yTYSQ@`Iaz!{_kV-qk)I^os|M`bAeKQyxH&CS?cWdqr}Um z^3UA3ooGCHQ|+^QvKVi~xAqx1gt1Rzz<-d&mVbtdqB-pfO}5t;AgDfSah8N8#D{KloVWBz9Ild5lDdtW zkh_y#Vzc5x+}AiK)=#JOXRJCXr>BRcpNH1THjj5!H~-$~x-RbvW$C_Yc~iNG7us^| zvz2kfukPA0#FWm|nWsj5Y!F+|=QndU8UWEJFzqi^5Vn;1t72eQy)7F_M@kYE4gFO~ zN*^nc_(A|k+nu~2jfno)uS5)^WOnGs*QIu+f3|3rpW%bGFoUYg@G~~r`VSVdEaupB zeL^I{fCBCRav=n#AIn3t15-^=`qBb_2sa4zw1+fFD^Nml>c^8)VHk;v*seEYB#bE( zsn)9)gk=yP*z=UVaq5yM*X2yQI8ZgzMJ6+0v0(!QLgU%!nA5qlllu_I6(&z#r<+ut zOl+l>YTzt@ENMv`R@ey#$#t+ZvlrJ{T*M4gkPtds{3pmOPzTkE*IYD-{nWiy^r#LA z&h;hR(g1Z&yQ;HTUk2BWRWf zs+{lBz74WB3CWglutoM-Xp#!LV$%{Po$dm#*E;ckeAaK4FQcSrHvv|6Qi69ZSdih`@Ygpc1;MmU0A%sfjz>#rH>hQ!$~91xZa z9PPCU?v*%|=fg6r2xF_!-h1W7Q#^HuSye)55S53WF^ty8_&hb0(bb!!bkD@r)%-5I z=M}Tu!Gvi=k78QUUF-jgc9462#(0rLG!>xgV@TxNlhx0E-A$_0j4dJFTGZ92VZ$9z z-tDJjw-I*JH%SdA_n%G~{W5&&XdMJ~mEM5He#W#r)Em`{^#*oZgg>$tC8xLZFkqY> z+$fR=bA{%-h(?RFgSP9XInFOGB5k#tkwXM0e`ZkRQx8a@xm0;7XT zpxIZ@@QK3J&KBR>jJAjrTk(D!%<|4~4KPXQ{h#i6d!DC{pKs$=zxK@E=q^b=HuU?Q z!)qyGM7L^q#3t-3p9O)NC%_XnX6=d!<#P7=6re(Ss0iVHpn(Pw^D%T=@Hn7fWRlh; zZC@vUTupu1_|fKU(S<6FCJ=A9QW5A({9duscM)Y4JwME}c7Job{Cw@Szw^g!*yi;k zrR>ABwJ;EtyzKGDdyrETfSOcvU9=3NFBY;1$Rt%WBCQ&f=`FsrTLV+QYc3>lq)%!$ zMqeohap&$u(NFwf_O!@cZD;!5kYpvJHLU!%Ni{~VOsmOi=(V|j<`=UV<^vC#7B5OW z`~;A5eWJ^3V_?Q0_X1zw4*}}6@-GjvK)WajSyk^7JrLinx^#{zk&a_nEu%68-^(Jb z-X}uoJoVy~oiH*-24mLpypi{e!jaz>)+IOh9~~K#{~?l7{wax*Dc{tsFY!6)u=R`i zSMzMu8?}R6T>X-)X)8Cl-x{uixU2N?@K=Vvs_YG&Egk1!FjUOibk*&&PSoNs60O% ztzE&~*e38-oL=iaZjC16qgAmHuxv+Mw4ZbPvT*74&iwF5+{ScD)ij1T2zT7X2P#__J7Y+9$4O z{33i&VM36Vr;xOCwpH{Gy6j$&QAgnnij~ckAl-9uCW|;f`CHc{hfz6Co=I%xpZ$7u zA0LgX=)xW!yym;S!Y7@4@WtKk2#r_jC(0b5{9PH-bRY4*kf_(Vl#2ZqG|=5^U~0F? zlfNk<9&vAd*x?*@igJ0Gowz1mO_+*H;P#=9=mx)@^qw@V@|ae!#Csv&JO?_;yqe{r z;lL)A_A=l{Bsn`ob4{3Nk6W&os1NIq@0TOF?u;yE%EflL(9dYMv%>AdB{N5g^*$Tw zr{iRhg*5a{5R?L#fo7!u^-@UuB?1?0MDBY^Plq_P3%vkaTmOqDA3RU-Qy5o_R)i8o zSJvBW8p($K*xO_Fa}9=yD@RI#f}>`NY0dojE8U;-X#*wV{_TgsiamIwVIz+V`~1pt1@G9 zZh6hyWpyTE{P0f57WG2)ullS9woX6Q48E0--!w-1TouYF4NM=8*&-X%Nb7vt`&KKq z>1Zo&;E8?cl>=hN1_J`bPVRmnEY(xwxHZmL1pr`Cy)giF7RS5#=RGz!%?v$)gQA{A zbRsBn9}?2Bz3}xBT}4&MHHfo% zboosCS>t7TEtC9|vjd70072jHY*?b#-fo_xLGpPJm2%Ko$=0RqvD( zf`=PbuEt3oNi0Qyhv3sVfDcYv$^^;odB%JC$g)^=`ULJS5M9Indnb$bhkiC zE(MG~olm0eLv=1izK&DzajK;x%vdqG=S0hc=a!Cm6Yq=Vl|2iV}1=`_S&jfK#(&~js ziM|mt0=aPELPuwkfwgVZw2NtgpLsYi6GcfTYxvjYj$r?%HcuzjvR)aLMli#TN<;Kd zj!kEFN@-4ZNs9%pFh{L<5#5&Au5-b!u zBCgxHCPhg*P??_1zEU`Fb^hOWqQFf<-OO*@0DfUvfO!}hVc)gs-&JcUAxZD36fK>% zYIU)ij{wI)&Ax?YVj>pEz`uTRQu`nslh5j+-r@BLpgp7n7KTnnIt%@10jH96*E2q2 zIlZ2Cy~vcH;I!Abj0k78x?7Vl40+1DKB6}w5yU@JG@Z70t*bqBaxho7(C2kz4z~=&O?fHj~UYg`PHqWtUreY!A2Is3Up5 z0*W(A*JG18;3EX-)BS-4_ps#uc?v2ku0hs-x<0b#{!^WSM>2B8Z#$&cA9B`-iYU{2 za!Z`A2hW{7`}1?dh7~JACv#_YuGw&n{>MZtMYTJh=TrAW6L;U8Mx(N@Je}+u2b=Dv zE&hy98;1l@P~%6vFQRI?dN>`e;1Ig|;JvTx)5=w>9_rRt%r7Nn1N*)sgY9cEAH=Td z6mO@0XRQ7P&b~_?n^;VMIf=@Xm1rsODCB7W|H^Mt9S2m;?=!r<%*YB5wlElWztObK zBfGOu^Cxc5olx;18VK;5J3<&^S^nK_{#Wp4fnPvCP8f1EQ^tJ{D0%u^9O9)rfb)yN zV<0AGp~CLAG$fQtMcuX|8S-}yS+j1mFPW+*qES3=`qoJ<>}U+rK+K&j{Pjxhw@sbB z(E^5slDlYSjYi?op3}dKm5vPK!mIJIo6n|BYUY0mzGxD?MO*^R8;vmag0AlSmheA9 zQNu(28jK+GdZVr^USr_bU#w;+kdpAnjim$6asQVKSWrQz4^$}ouKvdU|5weL-O=a& z6|+A1|EgKz{GXcj)_GlFLruJtaFK0SU{V}~YtQiUgKXgo$Lgu!AnR0-ZRBiC-N#%bx129^T;smA5URmCj z?u32CVz%PmYoJHbhRGxca)vs`|apv3(RRDv>1Cd8jGC?IZ%(@>peF}$c zb_#19{`;W6p_skS24Iu_e&{wmp@?Gf7-k)r{m+&6!>^zl?Uc!+;L`hdupz)>EIT&S zcoZw@<@g`+KU5QbsKq&tyZaJ?1BHiKDC>W)sK1g^N~%35PMM66ZBMLw+i~?k_dz)r zL|r@e`^1;b_LLt@nzN%Awj8nWGPSO-oBM|zz660J!2pULr+0P0#LFyiFCui^Q|9(| zFv}h@nUX(P3*3n3i=n9ZC zL5_Osq3L0#(PMu0d}^jXEb(bARYTeYKl1Y*T_S+VPXmP>R;i+%#cgvdtR_-=j9o^_ z4%zSBW=bDo=A+uv)w}M(0f`**huFeFV{DK_Z0wo@w~qq${Mk#=x8{M=h3~(Ih5b9z zKD_OjLlseDj( zzI>|*$OU4JM>?}bhsBw9%Rv68C7Z(E^cD2VLtlI$D-q(7IH%G?q6D2`Q%HS z)|6sx_y|*DAR2n^Gr8#K zBwWq&34a3{{=rL$4QvO9TAloDujpXl=fvezWO@vFirvn1J*q~bB(P10y}i-}-2GX7 ze{+qhH(f2iKv{hub3bU?S;DP=bJ@M$w=Gb5N!NB3p7FKRT7-{tr=TlC_L!+wf+bxk zC`r30%ZqF4F&Ee1+i!3+FV$_QfdmTJh{*Pvi)D7nJp58Ob2#VV72>+vDAM;VzNaEpl#@ZjG5cQvb| z{K?{F=g+fj<>^({%4Z#0#Ktu%(<%dH`Jq+WPYApSMw93npmy=q^pW5*xxO6x^Pe{A zZ@<*cxXkuDbS2Cf`0&XcoPY&rn)1anQvZFQBn(xnJDu?T+@NRg^~x1Vsd@Fs^?;$- zQ$Himn~t>QP95B08DN?-QIJup-HMy8Zx`bF3peA1-*<&BPrEnX4sTL6MW2#PZWi20 zPjn3(4n{Ukmb>Y_2ELsZTk%5P_C@yeP4asAd)!c*k7T@xj5|xU#@G#JW|rk2g&QHU zDi;u2vY;hnrw}wd>NINm=h{ur)VTfCac)kJQc&ulRVuEXD$u1Y!h)m5x#P0+yWi4f z$5e^ea>$w;aH-%IGwr`1rOrLIitx|Yif7`-8?;N?$@tZWOf^9QZxl;t-p>$*9RO6GpM)Ft&n*q&VKJa{3L2BIIYH))$6peo=5=ZQn z%F0T96gK0AJNcKG;z|KpY0W;7>vE^NpvUs14mVZxyw>A0y}phC#!jqKZ9ykWj+u@-TnZQ$(&!S z)2^#6DM>Rnc1s_!AXXK>lo>%DbLEPSm>@nUYPLJ0T=gpvzS+1t*O3eVV*0$S(;f2n zzUzKDo40RJ(2IU`6dA}N3b_pH5|_5?k*PDEj`{1*wA*7PyDV^?v%K39mD(& zu-}6yqAWHXMPL|)(ON4O#V58EW_^NLyefna5i!B4%Gvgkc%~jQR`Y0ocy#OK+jZ96 z7);p_CsQ|sqY+PB*_3o;*(CFgrTO39L31!V)4>z$EZ4+A*(PJfumAMD3%Et~+6~Ez zTXN}Nbft4?%%Q`9Pl}d)j~$~cqP697Y6`^L65~j-y>U@PEs-z&-gj3YH<(y2M06oz zz3?s1OB&pM6`VKDDu6Gl&aK#wl&c1|=`2+IHR>bCXEQqGi-dqZw8Xhr<5+A02cfqn z%;v&!VXg#$xBU%4|G^r0sX!s5+1A#a@zqVMrS);m)T8q+kqJvg8PEr#ZIrh`2h(|R z7yTgod_4U;%=$+A>C$0NR$(R&j(uO}yio!raC-7tycB&!ry>%g)zSXtApfUfsqg09 zvcnUB=s$7VtC?gytu2up*_ES(nO;&4q9y4CsUv2=B$ow-CSjKS7f&82+LtS*!hR8Z zA(TL6sTVb!n;k@c_!&eb5Lnlw?{l#ma+LESnW}M(QY=^%R2eRXw9DyjMw(+AO6R9JfiydiAw%JnIuZtp^*7q`Yq zCN=;LPZ&i#CFu%YWlD|NqpL2zsrS_CCAotSb&mTBzuSU8>_yr%4rNgo$TP#b>J0;GCkD?lk!JM%kUn zMeKYiLU`pXIDVIKp7f^sBHQ|SBz-Y~AS&ur%?FNYm%#|M)yKGU-lKJ8ZrpV4CSiJs zN-*Xy;pbYp)wENx(s_Bh{R%xQ1DDQWCX}W>Ph2KVveuJLA50G`UbgUjK_=X~Sqq-L znM|b!XvHPIJI!;r>9N4&hCT(=&Q*DA7sSiF_r6X3Mvqyh-Bce>Ahtd{-KNZD_LvhD zkE+!@8<-QV=1g7fI(yOE{y?ELuBzQMSbT_0J@g>)1%7xX6J_fz)GG%Hp71nxbC*Wd z<-jXGqH2*lc!B7(t;dJc5{8@z?ei;T4X8p}=k5aSEhccSaDrfz0#X)Tyh=e$UXnG6 zIV3i%UeagmSP~IsEoFlGA}INCAenYQdc-)ObC;*Qf+I_-EQ03wWZ%_}aG1@5nWM!` z$S!0ITio70T!H&G;nLBm=9hgc{#kQO_;u;$jF-i9-%lTNe~O4*GF8@;xmeUxvvW{B zoacQ%e{f}0thu_34$MEk5jI}S^?Y#38Z{v)R2fd}*g0TM{yS(d%ze_>cYC#5?Uyh~ zJ=xfC8>D8Lda?QNf-wie-gy^kSP^TVsi8V*Gpu@jk<4dP3wx}-3nGKd4^JYnI*1<{V0~ilcD1|c{CzIn=8>qg?osA3L`Q!$e`o`%D;1+UtThHnAhq~S`7#={uML7#E5N~*oB>D0) zC;%RzY23BJsXK;^$svD?$Uj6!Th@&7ehuBhH~BCMeiO20nzQ%bsM=4k<@L9;9*JK{ zui8~t8LneJ;y(wUX9*LU3jW4mCya9426Wparujnr-v7ghjZC`54F*h5ox=ix;HgGGaD>taiH~ z$kcaF;_>mL9JdclQjd$0eA=~waD}vSJA7`20}manu*v;=EKpI4hvW2X+s4I7(jo4z zJM&*pV3w7K!dWGl-L10zi#%5Pj=~F!_*Pd7f@7F!qEtouFeoUTyGRZGH;hvUS!q}h z>#H#~Jw%5vKPg?m1C;1VhXy6^7AzJ0 zTsW7NP7CIeD_LcUF%yVxg6xFXMN!{vKI>}BHanOk1d()?g3b>3(ha5&rq9l2>bJ1G zr1nQW-7lOZCODA5&a*>Ys>LA1PsL~a9iK`Vr6vD8pt|^t-vxc?M0UOW($}VlQku2r zz5)XS(s@kJg5`i5zaj9nh;QKK8^Rd_jYFCWKj%ObjisRb`>oo(@PO-dgDUdQk1xQm zhpXP7?M06{rFMpA5pEeSVIOSAjS$E)LI$$t&%5JvWKy-~DMo9KWslF?7~dL|2}(@z zvbJ0#*hEb-wkDdq{SQ{^Gda0yA$Cm*L%8Xq1K~6e_>WS!0d|x5>yyE4#J&@}O4Dgu zS4H*Y*-IIl0S%FO=2U5ww{#iyN;2Kdib`$(RP|i~b&Oxa?0>N6cuYLvDtXZRWO~#- zyFA6pCxpkH_&<^jYQAFC-+wjjNYa0gPo~mmF27dGWc+D|0xlpaK@O=vks)(N3~_|o zPemAC_puOEn$}>P89w%m2i}G&Q8nykYYi(0t0hHfP@^5m1yP0md(|B8Vtd5H1l<(dS4C5K_ zV_-|7c5y0?&X!K#J^0qiu91{`?Z_VK$Ijvc{*aTt;WI0b47iEJ-e@cM$7;RdVAtiA zf~dcUmBt9Tc;OYnD}HhI{rV8Yw?KrlD}^z!$1tqeJ8JFC?J9hi8&gVk1WNt~i{62N z$Wy$X2);<%lx$k~1C;8HOCXmNBS~$zf(j&EVu8Gf&$j=-Io)x5{rHJ@Tb`}!jb*WH zc^+2}mYLwTp>9_RsQkw`+;N}uCh#7(~Fn}-*HKatFTXKk-t%k zC@3q0&3CpKZG!Gv=htEUPPZJ6Rvqp$AZH{?;rdO#k|@}V(A=rA7pbUv-Zt(eC;i-n zR5EHOZsF`72AFP^sU*(#(Sj8dRs@xGw*F#_jgeDXKb{mj@X42{*iXDMAXX8e-fU$j z@H1T2FdkdL?I)p89}B}8jP9lnanIfMlBE9Z_gwV#>eFb-Tw%c99(rZFcyP2vJ?xlj z?fmY7?mVsfJ-r|&J(_NV0;P=`^cZf;yE?sjx`u9sJJp;92*p=X;S(ND$ffB^`Oq~5 ztF=jy(m4Nv?}Zhw<9#(9l8JX5`Ky(H%6I+_TnA74$uL83j%=$Hnw-(^mP4xWHv9Mf|U?^G02L^-YT!#q%bGb;LU+#|5@4?mPd=i5MnFVfjso6pkyR=pz`b&=8G* zU8w3(E|6uL2cl03M0ic2{)0tpx?H7iaU}TH)jbk?t#UwEd5vt0AcepcYc|UAZXXETO*IDFKW-v+0C^OUs&8I4A$LNuFURXwBsF8g1@JmMTvHDy9|e0 z59+L(1{q}z`KDJ{_I&ZJPt-5q%bPSGiMv1Bc|`=w%_2;US{^*# zRqSOPF$i(bbjlAKiCnVP5md3db)FNdB9zmdXsQO%it)gzyLJnUGRP zsjs1U_x#faC9bD^SBOoz4F2K&mPg*6h69jSI}xhzeLa63(vi@ zQWRD<8!A0IR8Xo;CAyG~hzJbQA^`gVo@VcarFZ?Ullgnx7m2C|YKhFk;o?|+Q{Ek0 z`3~7{VNdh=sCJ|bN=0^KKXnGoj!mu;u@bcY`V(5{(WeoohNQ~^L|A#T)hv3?M7HSo zR%$xELJX9w?bBjyym;Qqs53o-x$ZB~XvTLphX*%_%)V-QzTBCv4gcWa*N&{pd3xJY z)76{`OXu03HkPiA?Il7yMhL)6cA00cVc_?R+~`;mOYh7o)ZcBwPrIe3Lcjg?_&t3D z-9?fvWxaq-F#i_~pSli3HoMWRMJBtPvVn1`r;6$fV&ZfRnOD15HiF_Uur~JUomT#r z?JR6vjYN(WiBJ}0kxss>B&IaS{suqHqZ}To>DoLKuChDAo3HmrN;3xFt;}E1@N@CK zJLW@XP`G}2=v>_h>N5`^327g}ZP-A83uZdeH4Cg)j9H5ijSoC~Hjf0nfHBE?KF}pb00P8=%%|Co6y-!dk#dMz=x9Z5zg& zoA=%iXtZyZj3W5pc(GqGHZlB}uNTjRh3n*T&8@~CjGfV?HuYqq@YLnL3t4Re3WzYi zM({;`$nYyEnrXa1DEG94_ARdjSeC(OytB>o4G;jF@2GK!N#bmJp(-unMyD_vuv84 zNP&un0hSE9=8(}?u+Iy8c`3m@zqG&>#8eV>XUZrA@J5oHXijlQDd zV${(kUe@6pZ0a-)PPOb;KkTnraan^*|I6NfTT%Ku%_7>PpXoz+3pp1)C!7Vd|Z&vSSXEEoLR=lBKQozSa z`pa4igUPs*KvOXeISHIDeJ0Whq_D1(&n?I@;IpPAPDfa_CQwmfm}=Gb8LY~`G*teO zuYzF4JP=Ytr%>Hh<@7CCcKPnL4QeNT9|QTaO#~jqB12VvsG)7FtMXpe1MotFi+cz; zxA;!4ZcG-G4^DT4Q2L_N$zdDR+K90ZJ>27DT)o?8Fszb$1Nzs;OW!IS?7RzAx-83! zr*$9xB^Mc17}jEC^+>q-{O-8*BacsftAL|WIOU>qjNPwz5n)sXvC2NOBWbi-5zq;xjr9Y{m(vb~-yJqvZXqP7gxxva zd5e&eaw@lVgM{KPj)~9~q`tl4M_471Wj1H4QE&0heeck5xWWoLg*Wg5Aq0IS`RqmpA@@psa(ojN}j zr&npf_leR;GGJ70UZD$hREtha*J@Q||F3pZ?IIR`pp=r|@FlWy1C5NrkOp}wkMUmU zA0^A)i#vzt(sUiq7&@koZQ%LpHUs9&$)V?t=vH@h==zp*RDB;}T{K=Qg zCe6O_)c3}K+K3q9&~YF!>uS}|FCHPT1o14yM(9UbUNG$-jY~^9k~l7N3ezLLyVxmo z@td^;l&Q2UQKu2=Mg>2VBz_!j7AeF@L1e!tA^&;h;3xcMuZ+e*N^&;omQAa%Ym_{) zYNC*ik38cJmv=fIjfW%GFL`&8L4#Epl_@#h5?#`~O`g0>&@A=+0j(>y;T>-OH9$|~(w_S9QW+v& z7)Xf2P=^Agu7&>JY=1n4&30Pi@2>rIaR--~_(&-@N+C!JQP?3~SEKk^7T20begegV zB(k=>yqX!3&;36gf$p81_H3VodUrxtc9r>^Sc!?zGCnS}BK zh~{Io=&@d!bvpdiSgH}3T@|r&Jvjsfy_ThIe=5>lXwBjl>M}Jd0B-W3JVXqo($B-|tC~8US-~l9t z{}hDmS0AJ3V~Wc(9`0vjlFaR2H0M+Qv~5F~zAr#5VUMvHU=YU$7#`()^d9w2^Ud1` z5)aB=6)C@F?L+VgAOD0p?odVj%V@h!2i+D7=y6_A$9f^eiW&mokggZN33W})67k3m zeamWy0M*o30ZLuzEMIs|Ck1j9+za)-tUfe}DONqpTgv9^&3<*u(y>`BdT} zs4F>kDu0(1A4*C&nPuVPpyiO$y8Qf2besk~y=vq)P^sBJ7^8C>UhS8H6OBN40^={a zE{jM0iZqXD4vsZX$T}#6(haZGlixYX z<_J)ibNELX>^sbDk+KpJs?{?#$S3ol(k=Iu5+gIZlq{TSSsADZ4f#)u(|J?~&IoqI zzP>g#H&M<((IuH}6AuCLhb>`^h7%jh?u_X`#kYr#1kglU-QLPi)+_2aQIdnj3nn`8 z7Ta>44S~)tQ6a4Cp<9bgX0m@$uL~<(@{7+Tw*B~F0eL#mX=~PPwsb}bqFx=X|A(fx zjB2a--oJx81lOR&HMq7ol;G~}?pA1#5}Z;9kN~B)m*NB|E(HQb0>!m>Y0*L{?fvBY z`>!Xj^5U$O$vJ2C%-*xF&xK05DO23seY;C(dKmIjTHZa{?oh(wHh~(r00!^ShITRN z&*?Mf2EI8To!;mIn;R7O$L#*AqWtpG;Z<@1Z`v?-2`)12GgN?7K(;epBaD0S%ryj= z8a%wH$>_hgRRg4#%MeT*yeryzwG%3vNs9#rOuA4D{7yFtC=M4ocLoPTH)p_Nx%+%> z6frfwvRNbW$6PwiAYcLB;+Ov}=@|TFCm?T4;O^}H?DE!b>v7^#) z%%+Lw0sRsGbN)V235Vt@(@=bjDCAF10@siu2n);d^&U|4RXbERaBJP{+&vC!K6S`4eo$}UPZi=)tHBy7m z1zLM<9XnzYZTSFM<+O7IW zOU&4?Sz*v^=>_9YLGxI5k~`6Fk6OFW7u9){q#?)7l3;l7fG1~}#GP*V#p27+Zl?J7 zETR|mda4!c!{zx=Z8NV|srm#ebU}UmHXIDk55xloKZ&!9(0tXX8zo&8v%+K4Nu`#c zAHjR^A7IB1nN`h0MThLP!~u6;6FXG4zHZ7(;1?o-c;R2J2_FxI4|_<+Ig$0E-NGe8 zmWgzApr-m!5!k{9ac0Wug_9mem3wwipOlTf^ti?B|BTBdo#uPYuF^{~r+@5kU&P@j z*cGE&MjPzel)hBz6o&kMDuXY2Eg4oYRPfd^g`nu6HN$9*R@)z3?fmO-!AbbthhRt17_9%Z60;&(W_$dIN8`|+CK=v*qy3Lr@@4pJ4S{)6$s0CzZp%( z62+kW$AP-k?#9qCY-$C2?#+_>sqHJ>qP#doc_^dgGXAh+Pbx!nGR?ws zfHskImh?+G2tE<8>{dPJx8;~nW+L_lWAah}#Lp4URH6Dp)NN-QnN5>BwO5>4NOfKi zPfe!G^+EoyOS9dLU!dTf9cQD?uEl?EbbW`s$Z>qwJNd{qsNK+@$a_| z)wOMO_`~nPSx1gI-qE^f*DG{w^qBl>ID;M)drR zY@NDlrquQR5$+Fz_s^bTF$6qnoXMp;X2v*F_Uh5yy@+OsiAp3QZTnL0KWT_jFsg>I zi6kBZ#fCbCcKI!guRC1quoz?$?2p~9nfHt^)%JshgiN^YB3amriQ%efwx{xESOPqQ zQuCw8;~r$+bIm=CE2_^JA`4}FI{X8g9x-t7>nov> z@xPx_m?T7%P&Xko%ek8y>7HwcQ>I>GvJBKeK23cSg4hTFkgDCHf)=MpYK30%U3wm; zz^&y?Sf5;FG@ON2i$BifhQQ;t)b5V>Ru;-$zP6TD^uffN3gfsqs&d=4oLi%vl6Y}m z?nu)%(LUzUn7uY}f2Fbm2CLMBo-h(9Zu*4yIN^tB+OoP5?OWb{uPa@j99n84!-1&u z!U8K21j3*E7+^|o&h0E>fsg5iBp0!}&kl!4`}8UJ3da65_@qoJqSO;W%1HDw`f?%R zj-%JDJChNHO!aa5()*|;;a`m}25S~ITE2lxG153QfCc5UFeLS8W7({~Q43#lf$yHk zQwzVTb`EWxY8{mS0x6i#tK`S^!Lx1G8Xgi_XUfy$X=i*fIOBdp^))poHIQ9417|Kn zY?V9M;|U~W%_+;hW>x%_A@}{1IW)kPBV*>&{nRJ;E^|1+mg^sr{R-~Y;-8BIPsJ1HTGkjxNcu*((@*mQB9l-Gx?6*UuzA=S~?Hzxg33$k$(5ekslPdUy2Y|_7}&$)ti$w&P-LPb3g~_FG%?o5zxPS zsgdA6m~@U^0jI13dp3g(en!;}pXDWjHc^I&brcwy&`F70#k&E!gpp4o4(zfPeu@op zgeFhKun+QdvABEXx;%r`Zj9T%ee>FSIhdgy&ec@-VZt@9PE~}iu#YK9+o zquCxmvv3Bj6p{z+=bWrOE5*a+ zUhD4e%bqup`<_47!N-2PPU%oBqNG|%g)ct`;}JzjZxWhx%1&-AUq_7hAsKtq{5$$D z-A6}9DCJ2Xc!RU0Oz>Fo9$_P~TztWroodbmuWkaRa#|xp%4tQhjwm(nMoDREAeNS< zu{ivg6zO?luY~b?$qz#N1g|)X9QYVtaM%ef_?iT!^QY7wYOG5`ZZm>$h~cAn4a9m> zCn)+_;T976Ja$Dy=+eYdS^hk(_kJ&vu*tqqKt8}Nv$Z7xt8%n+<+v!MosR2w=f9_c zo*YNG%ozxeX<;wQP!#+RB+fw{j8Ay>D5f*|r7Sq`A1B;wjpYgXmpw+eeh2H!Jo1~D zZyntaduX^ekJWle^09hSDu8s}Q>uBhCi zQ(77L759`%>8Q$NK@JnKw{yaglh_Nl^!RU7XL~|pC@^erX-F<3Jw8B;6lbtO4Nyo} z5SJR#Rxm+Z>CLmor743ZNvxeN`TaZzau3 z@31%`eWnP9sVFoL6}_%8ISw#{owXuio$0Rtz2Bk%1U~^;n_eVC7O~ub&_>p~( zIuAsbCRhN2asO_@3ppC}mAho%8J(Vbpc1KO#OQ(I#WipZKY?ZGytTIkJ0dU{O3}3`JF%X*}qb)MY*RbtAj;MBy!-T*p|Kuc-O{ z)s$Aa@?NvCp(dSU_JSm5S{&VT7s;KS_TO2{s|O=eCGT^l92abO)KaqMb++7h`yiQP z=L9M98Dgi7II+@{4tQkhLtwP^J8B+Nkk6Oqt`1wl6`iWoDL(BvHhpM*2&HPus;&`} zshZKvC$@pgt**SaJC|f0s}y{I=6CL)J$w-}e@cH}_(w5-yd?tGsIgCvS5d-aFK)A{ zpv+P8NC$nNVV1w(ZAPq+u}QsY*q?TRTiyJ;^GXDrYWo%>XqaYzA%$Y%T z`G9+t`~rJo1@}I72Rjv$8h%S6hhVCJKTO#*w5 z)5J2}VHxdB6_+@&J7=0h{KGG1TUJr^2k zeekIwn^FVn-B6BR8I2cVBvOB4=R!VQ?8zqY2j_|fiRX=O_{gMi^TYktUkw=Wmrky) zY#G|%hdFGonZcGBULE!`$IZO2eE?1kU|qcS8GNrIqUF_H>!wMc5-8EhP#@RhQE((B zliF4VscmgBjtdDizQwpl_0N+kB*-PZyTE&e^n3`x1uWFq1ILdF*bCZytBGARXVhK~o6^Hbr7wugC&W`sdkZr* zXK#*F**B;X4a=kS-VQpZ4n4%qp4wQwPu3iBZ^^HHwnqHE+ooq?M#(OJ+XHEktM-?fwz*s&ibUUJ7 zQyU&>1dV(w7qAaCQmuZfMn1ilX3k?T^o_rTw5Ck4%c^UVBolKKlAkBeRUkW(YZMIEhQe^#n;b_4U$;?ciO;hCu*892?cq;$mSv*IM*U4$^t5E1 zJ2Dr{oEez!4)NzOt*Xw4k~aJBVp!|Gn1&{=<1_7#D>NU4V_tbj4T&axW+#0CNOPeO z4HylGy5^za^(-J97o~G!&iIHI_9^;*;MAWf(geb&Q|aDHD9aSEJTM=k#M+)?&l-CP|L=c)eO^c?na}O`sAHg3BS^X zaUSkaX2xUOP)-0PRzM(xc@;Mc%vW2{9R=&QqcpGTolaTG9CF(bVV9Qc|I zRfe}f0ZLg~BP?1WI!Xnkb74fPN$f1k9tC&H#}9z1BX2Sr(oZtqy{SB^CYzdI;;fNb zG(La7N-%OwD!BKzmRlVx!KiS}*bu<>OYFzHdTuT8pHKchVgzkcibtonm*N!!EvD-% z3JQbJ5Egg=H9b%}J{M@}T~U`gZsu^HF<$?b-w9gKq-z*U7O)hRuZNOeR#8Npm_T0Nk8YrqV>vH z@<8K=l-e1+sST2o()_a5R(B}(04U}L*Qk!yJCq$7h}&R#+g(V(-R_(Wshs=agr7Rd zy($&C?4=B)6M>`Di)Soa;oEBg z6?1*5+1;21D(?seK_l$Fv}S*Y4K}HNW$rC2>-gBU=YpV^a?_ia_q5dnc&> znXC{Bi#q(!?YW3a-*pd7N$PR_3IBGBA}xk};1+6HjwQHep#z)xAN$u~=*jG%p`rjY zT%#Coj1-8G$=u`_Uy?=RPTo}j*kpGzISnk4qju({Mhpq5rBnZ?|6JxVX4NO=o)8XK zy(7!!ge{~eDDTPoId4*Bw0?j6<02yiBxS@hBeLF*r!|5dXUSpJC7Lcz*FM5sg^nOXqPr4jL<$OL=@DG9_3nGu&dn$ z7Q0IY%A@P-$7lX1aNl$X?;3QDVo~x{?9QpiuH(ohd z?xc)FzCCNs$0x&9%nTU6f>TgojtPU=c60@V!i1Zs9_)6!#$Lhh%bIrMKV>Dj$0TX4E759{{dwV zS(oBAmhPNw6Z)r!I+u_`b4@BSU+AppHI_#3XgAI(3cTR8#t95_E8lKWVXv9j6~M7+G(^kC{@n z@BZiTbxX{>fki#b8rXasQB+unT13n`byq)_6KQ#7NC90oN!%8tdgC>;M4Va(`OjjN z0(fY2P+R+L5<&)6%2OK<|A6j{#cI~ky9~*5s~eb@&S!X#gkU$dkUWUlWaao=Pv^c; zH}oQFv0cqyPHRHK5M#0R9uX_0*hf!TN>WZ%Kv$8lFW2-Ys$1o?mX{NL>IuJVD^8BX z2laBJ?+g2H4*n-Hd!e=Jj1eP;L_?+UFG2I7Dds7FPS&8P%#HcLjlP2c{fqi;^>S$g z?W5qYioL1~c^Z&D&7`;1(Y*d0qTjb0{d}sVz#%sAR&Hy=dm&=6(Y`lNL4D5+-qbou zX~Ua%^f;^^`z!s=sv|^{4j?ZetZqp)4llD##7|vTFVbGAh8(vEvpsVh@>CTctTTTx zrUCw*90jYccpmZ``Hw$=fU1bgZWnVD#HfuvTG^<1ndin^Zf$REbAAGw4#Py@qoYlt z#6mQQKQrRFdY!4M4F*XPA+XvVcbiJ8@z6VDI2vdoQwy)96oF?a%ZQH-f%-TLa?hA` zczh&uk;>C-e7Fkm1bZtprsKsr8S><~m5VpC3IbdyDYP>74#w`dy%%xOjD|%CjawxMD|MFV5Oa_D$s~GA?IjQ;QMj&z* ze`BOwXA}pDr|CMnemb=$QBp)(y*JurwA2RQj8HwJCa;JPY9J)j4bYfT)JjAcTn#|o zzf!|GVfm02a+g$Ry-@7CR4uUpxu@AgqGHeZzR-s_^na2fy}2rUljw_9P=29o$W2g; z?sjD?tUUsw>o%#TI)e9xnbOvOdr@bx}PI<*xW zN;zQokT9nsL~UrPQ(lJr1()MyN}2f~6#;ZldAD17?L5ro6(|^Ze({$TQI-#LJm2Vg zj=!d+F)iF}Y6jPE$vpw7=1>q}9`P+fl-885F6>&wRB`)xdkCps=x_aecepmq-5wyV zRT@1icpuA|G4bV6CjPhH;+@Bdz;HixvuXF5sMDhA|v)Ewo3EvJC7rw^dv?%x8KPh*oPkk-V=34EEVNgY?{yF;!#iV?3NIH7cJ} z1t(RXY@C@WVt~+A0r)+%?{id@!mw!&rDdM|R+SFsHR^u#MZQEDncrOd+cBxzN=7RE zCgE7{h-v}q&OF*9V(tP`{)rzo6a;dq3Za(Es_+GRa;78PO}Tn+OG1iuw_#S%(a*Fy z0EdJVvmE$MjtxPA!QF61m^iRtnM0xbF5+=#SPB2-Df0N3g0cS22rXt=_m#PuY|I&`aI1U#zh#gto&S_fd~ zS9lmEHiiip@m*pRk9$fKOmgmyC}1N=z@BBCPDA17m7}}APdTQkQJ(t))yyitWU7IR zlmKs(p(EPtsnhM5$!xT*yZZLepVW~bpTCue%8PW<5*lNf6)CWWu-SGjg!dFcCcIT4TKG z+jUQ;qocvLhsKZ=zFsJcqd%qqT&N~!1m! z_u9YGHc;8d88VA3)7p@aaZl}pU}@Ux9e=AyZ98q5M;Uawppw}kM-_`4;9CZ$e@HCG z9&BP@QSxRB6QM=dZCi~^K6rU~1$5Qv)(i?*Tu^xa%1eWKaeGHY&iNzewVG?E)Tpvj z7`3=5W#Rc7-ly^*J)APMUGH^{noK?Z01IRht0G-8-RZ}rBP^k$Dg?iFJpnHzIs?Yq zw-egBzPtbE!7j?{1iA=m;qp(1QQ-T+2TLQv#`5jCxw)P2(9J07nd42=0K6t3txrk! zMt)Us@<>M~)E+ZD8Hyb=77V8QiX3wjB`EkIEC+e9qH9)Ksd}bZzdja2D)X!hC0GWl zUD7nd@S^|9p87qr;_U41XSeN}0DjPXH=fVv^iIn%Wgb<2ojmdYm6tx7(CYy)9uq(0 zN}1RJIw0TCb5!@7qGFLkMW@WTW@u|0$ql4C(;3E|4Skiq556d2O7kdpsEQDub^921 z{EFx2%KtH@E*vhq&iyg5>o8qxti62Z6H^wv&Q}i%e|TqQJocR}5|_~e0m(`koSEVz zC$dW9m&#`^Fs!fHf72d#1Jc%yk?9JpQ4yUK)y~@4Xkv5^#Ntz}>IcxkX_5&>>dDmX zi3?*n28^JeT6UX~uYB(RH$O4Kv0#s5zdKgMp~FumjkZzmI|V4=Ho&WO=j)HuJWu98@5vn9|n^? zAPSy6zsRb72f8;`6ksKoDGmj+zcs%@eM#IMF?6*VZ{{9^W|gWCLCe3rwvOP~nu<6E z)zVX?xQy8Ay}&kEi?S0mFvYEGtno~wRO-;l!+;C_11v=d9u)KDH1rnLf9y1!J zT+|U~)B-8Lzli*0;sW+%TT^Eb`Z+QZ8F8pzXYhQ{$Kc|$w9215fOiyEJD>w}57daj z=x=Y5PSzLuu$nL4dE2zJuz_Jz1%}whMuIiYGSo$HbdK-Ai-C+Dl)Y4ccaM(E0DCxH z?T}Qv|K&TFT=TmLMzi?Fg#-t;H+k3w7DMFba={t?5_g{Mb=lV)-N-*JH~DpttkR9} z+tlaJJ;e4x_`shuURH?G(+SEJ82xwvcF`I-Zm1|YY6!_L;$kLclZ`h~$LiDn052OW z<{upI`*YeP<`2%cXd@JNzEcxB%)P1|n)pP}M4M!T4}J5c0a1%6OedW=Wv}e`0xq4C^Uae{iSk zf42Xp(3I8qn9X)dNb@?e?LBlS(F$drKl`O)!s#gW7H{zLPS>kWnESu)M>It2h(mCJRj&~6q(YHEOX`c!c z&Yymj=-O&h=jG))u!9M!7|vrT$J{S7Fc>p4VrgXLeBk?Lcd630%WfA_i7Eb1uH)P= zTuU21oq6r06!oY9D_GyuhZ!lNpAJ^#B0Nm#1&hIK)3YRcO5mHcwf^FX8tTAa&+mV$ z+^~L_T-BOAP~0kv9sLbBU{U(0H5# zZz!R;&u$Sea_Md>pPlhNPU!fyXTt!Yr6kkBx?oo>;egl_v*%b(mY}s9`T-<@YD2TF zdsvydxuci!^QZsOI%r^CAp^>DV}C5q%kpLK=no&`{|+U>l@3>a&**8*27%Qp|M%gd zVSF$D*M0SQe+I8yJll`M7&Qv(dr0xbNd2h;%S(5A>i1;2t^AWAlEV)fz0p9ONmO#l zzn1T+>y)b1FF0@HK_XWCgnlkk-6b(?zIaA-zEDF|LOJf7-0Aor0Smn$Aa0vIKwQO1 zSXlTU2s0)rng0OsMqaTZwn!N~UaDm&8j7&T*b2T{fIB7k-T{#4L`gpy^E65~L)ZXa zGfyS(U$Sqa-IGSAsjwAU#j-6Y6y6;upIE*Y49tRD-HpE#j*bkG8w%*7KCPb6S*e?ws?y%l`=2X8_cjMNm z&+WE#bw!f2E_8m5(MFoPwpX@5fiF-U?s(RJ;zKTp)oVQ`9xW|OjItNrt=rGB* zL`+UfNRw(2t!vO6%Y#U|q?d(8&}s$4qo!vaADx9I?^8~kup*rgiWt?gEs_daM{#f{ zi{K|m0uov2d2n8jIA2@U7jH*MMA)s$ZJ2)otjZ}h_qCLXC7;EVwH6#mJpofPwAV~m zK$o1u?HnR;?CHTCWTVz;8Rka986&oJ0a2aXM9UA@r_84k`rM_=@s;?SAYy(VpGMRd z@H-`f8F{mB#|ffN#tRGcm30ndn0x(4rcCaai=o|<5!hY$0MUvVSp%th#D?Ul!+BPVNp{MU|==}QMEjI4qy`b2!?Jopo&LUnY-;ahr z1q;7V1xek%W#QUWA+Ef7Ph~T)r^fE@R&QGy{$*IHyqJ19Mxn~KW)<=tag+(b#gM9)=4_Nk`8CNL>uqFcMUMn;6;9TCnS+>|Gh_!j=3-%|I~`X9Zj^h>d9vT<=K{_!@6M&?x!j^wcYQVs%r z&`VBTywCtdRPk}1w1G%RT44-j=WeKgy*t;z{CJr-+MPug>W1;XOm+_tKSnH)*KZIt zUpTbJU@ze>QEm=WFn^Ex3Z_+(u|Cc>VI1Cnq@9+>MBCVwM}=b)l6LPp(LDQ*Vmn45 z?Os_ShD%d$SJ>$(Wq0Z^+lzv(sOgtNPgZY>X`}Vhp8B#54;y3g_2z*^zRuM}%pX_l zYQo=(DGu!vTe+%x5l%RGnP^e+>*u9L7@-x;AEwMxP^Ad@u31pE)BIIp8n?TA;ky+J z@m%`7QlhP9pO~S@c+q`j?vIN@!H=$A(~+;m$d!`r*&MlMiG8a3vx%JrqVYyQ;!Sfa zVlQm(p)nqJgNc}Gm;mXGf{_)p{2B7Mw||!`Hrbjdk$o7he5kebREQ8qDe4Ku6IFXI z6YnXQ4jkrctpMi!D4tdEwuMfkFezyaNi&LjfibuX-fI>rblXry``6Ps%ZO=);GVh` z_>0K7anh)K-(Y|H1HrsG^g-v>LtL#PN}S;z*J9S`7v&lCdXI3M1Z$f|`8>f@hm3zX zjgbNtx)|8gaw*9Vn(Xk*<}1o=$l8=#A=jWFe)+&li5z_pO%T06)MZzYMQ|U7+ps`M zylWHPzpwagY>~QCuhLm9s9EgmGWF>@Udr(z7 z3c6ILq485{0!c&Fk^qcZ)1xm+(A-rv@%EFLg6I`)fAS%Sa21)FT*hxdK5+5HRmGd` zST0Y%NT6I_nn5;S_UXyNMHc-}SjXGjQ7!t)AN;l0;W1twMrwwpL%zLEA|ZSNq>kyG zjL0%GDG|I?;k6qt{vrfr*_!VqRryBq?#O_Vu%QpVOM9LX2vvB?7O3!ELrQoj@7e9QY1j-dS&?nW~ z%5JZ6F&mg)T1m-m-ABi!;tra4Xcp!;Pg`l%44!o)i-r`<`SC4viXycSbvbAr0@G2@ zAz)oTKqTXem?3GV0)robvZnZSV)j($r}XfJ@v1Z2zTn|+!XTEEZZoWD!DMEx50(0y z>v`V=OzTmL;!B-^KV@k7UEt2lY1LF65v&@bW3PsFOz7t^K*^bRvUUL$=iZoIJt*S4 zAKtt+Ef@)2wUb2ZWrq+r^R*Jy7t|{itGAC?;b{+^BUyO{<4#T8WXIS3@xw+Ll`fH* z6M?8`e~!ZdwmNIZX!NJc0Ry;itBdRfnm>M98@Hf05o^YaUQst>=k zxFD~&5UHB3GrVb*rvg!Uosj1(KzUPNx&_gMk|b~?Ly|Lxxbps%Hwc!W;Cck&RNXR~ z?0>`y?KYu$;Hu4%pJk`vq{q)!R&RvRzoucSgu45GsyeOOxL#=A^ISa)B`XK|4v@EU zO6^R6ra^2T!3R@$k9seB3MBR%qeV?hU@vS+V7LF<=EB4?b(j(fy=5U^As0_l=%frj zuHpHc-2fQ45_WoBU@zP{b|#=zVf}f#9ah3|q>&#-^wh1|TW0zu#{$jLDQ&3=m8wTy_+8y(4?7wcd1Uwf2`D_cR=SV%$eB;-K@3Wxarr9ZM_iF=D?V-V+g;?i@9z z&r7CQ=ZCJw98A_Z0cxGEn4HzX(8WRGl^gDL{f2+QipTvQnobE9?K-0=dZLaQoE41u6fw-%vc;qY`>^mh zjk~2y$#erJ01uN750aIy6rlMW2@>tGi)e1PApNj!r4>joP=3Z4?+h~`9gSs z+vx;#(v9(E0{#b>tJ7^CNY~pNh>yiZc65n}^bxNoC{6ydz|^Dt$p+;dC4Uu&j=UN+ z+>n={e;FS%84ZnX+GQ=IQ127}24;Ri?50GEu_qaQ#a>x%5l5IeZ|I08epbGu_lM+i zmrlHlaeYU#Y+V@2jRCD4Okc`orQ*6X zP&w|uH2@*z3an?CKlMAdNETpb^W{18#7`KFWhm3y&}d;n&?^cc^6TAm_z#c{+aYj& z5WVNOCMr=rh1yXKToqp#n>>a^a^rT7#7}ieg{t%wTD|^k*hl1rh;-Iy=G&!2+PLni z#!-7aKaMht3THP5+7O3y9{ly)8*v$dY*)L~Rv8})e9ik0fYa+r;}uTuAK(c!%^NR! zG7A~(wInDnOW}ymH4}FHnLbCPpx}g6N?{lg_DFsr8OSM5bh zjoS_7^QRAYjxs5K`9HuI1u~~(N+6BAt3Dy@){VH27?34~Y2Y#t{&$-zoasiDb0~>@ zwV_vn5bSEh%cb8s48CRq#wG18i&(u1lE9zkyB&eFis7j_GLbdnj1^PmFfH}BTJ@a$ zv+-NT(l=n)qh~Lb2Bhn<51wXN=F$hBRMZ9#l$~Lib?mVGi1=0F+uExJ?54F@!e;^k zLA_XVbl5SDhYXU znkct5EgW-H_z8nunOEbgxfBN=Y8RB)gzXzASobaakE^GcgIEhhPILbG# z_>|N=f+w)O^|sN>)K8i`Ze^HNhU&1>WkPbdi1w3goN1lL7xy8K;8HXbvr{%f)~1%D zp61>%p8Pv4DdvPU&wN`37MAPxk1^oq7n-%=^(SZesa86Jv#*oZ4x1=M>T`DJ!w>sD zxn$ry)mBaMWoeJoi6_el5IxAB6;;jSMUQCXW5)-;T0i#+9$9kb3wUL811RySQj%#3JL@H%Ghk^Hldkw?vNB1HeGu1$<~%$i z1u$o9#>!)l< z-0nE}W=pylz=z{VA33U`%0~#$Hy1ds5H_vIEFZ=)q*<`cijox_6wKg(Ym=pOinYFp z?G~$F3qniyvyzIBqquQ3e5(Xks;a?WHnicI zv%6}lnfSh>oFY?eggQ%8@>#R(t9C{fpS#{w8LkkU&}mmMOF5^GgCAw-n&S!iJCH)A z)g7hZM=~#&)Z^lF&CT$ZZleb;HZbyUQ@~*_GF_u6o37DgI^R;*Q}v@Y=zFPHn{Qg3 zn)ZGGdCBFtTxTOep5aLPIQv_!We(?8`=hVz(o%i!^NSx=jnWhZRW#Q9Xc!SQ+Qv=P zg@*OSw$0Ck$W*0V`O}V30Ku;D3Sw2*zTA{fP$|1)YA^>K)`>(c zx-$P-_VEm@G=t~zcGmbbjtgKNHKK2uVP2mj)8#qsy*B;kP71`+UPcMHH!OwP6l?tG z>2uXI9JGq;G}IL2_BEup;f%K`)OoDtiIzm4g z^YoGEmcA)uR{XMzI$b)P8c$EzG-Gq6@|d->blnd=XHFv|r}-fzhg!&!1lw-UsnR`x z8;VusU%$$|s@M3~Wjxel+tpJb`}uenE7*`iUf55BA6H#@P~g0A>9(@v4XnZMfXSR0 zo5q<*B-{7wb?}tQ}uxbBihdSNWp&$CjOEmk$xTF1{)CH~SD`+AybGWdRu# zA11KV`#dkQL70${MeU$h*5+qoF>4=1R4;Og-f~VfBRDLc9hdntcYJw~5oz|dGiRJ2 zds?8GF?RL+#W6H)ojlK|Y%7~iTOeEiv4fSWT?fl~0;y7aU0aW(`F6r~m#bD+(Z)iV zXdrg*nTDAdjzTwZDLteTh7B=dn&CU*A}w%Xu0J&NZ1f3=sf%eKHqWk7WBJiMP%8YI z=(HoEwJg;BcXFj^E&dXMKhA5H!xBQznGxx@>OOEeLW-k9RcZWTQg6!$1|;9LN^|zV z+QRKTw#F*mHY=5Xhv|ghp{c)G>1s$zousicyUMp)7VpcjFzQsE%w@p;5?)Ptvb95} z(n2QEtmEKY#%RbudeG1+kCsU-RsFD8_ZDg%GRH==S|f~cN+A>m9g?h8`FG9G*)0*- zC#0qA(N0~zT?h`!St5eei|RS!-<=WWCHeZ-54Z1>*T}S{(h60bZIQ@k7Wpa&e^m+r z(Wxo(@;(s@8Pvn6Rc>yOMMVADF|)7g;|NPj`OQ%0rO~?3)H-m#HCE^DPz}WLr12f( zKux$%0kAZ7%?iQ3Lc@5SNRq-ny9-s*nC$TqNoH=o}=BeOw`sHW{JKG*$YpKuE=Wc zd+}{;dQNC&0i(0#Gp=rzLNlIjnOa{Mznk@|@f<^m`7ya>64g}Y(&jqipDx_-G2GB4 znP(BOQ5(DM;RI=9it5XdOnt|71qW9#uD~k^A);PdcfoFx-yIo^`p!CDXa39{ao;OAFZPAxSgGUx^)Q>9I15 zBkd&SYfU!d9Ns!?mCwr{(qY4nmCZ!U*9k4T0{~LA$qWzbkB?D=etn)rEXyHZ{{t|K zv)m4P^>+n6+uu^JHn6oXiqk3}9)o@uar>2-7doY(mcAt8!M*3otfoko(hQyofKL@L zSXRl4iZF$4G%yrs=txB9f$rdtT64w)NlM9CQ86L=4Q)vp=1$41DoLpY(K;>uP|0N} zDmT+#o#zdN|*^GCK(`yfV<$!G-Z5i zuqg-W24>@^F1uyV%at`^mKOb0rM!cd$+P}%!D+!2pGmyi^ka9L2(7bA@oY@z|ERi4 zYt&8h8Pd>lw6o(6GJ`;iTDB@0%>{95ODW#n=Zu%cYqSmCohAMzH6u{swc(lO)#%It z$~f~4b~}KT4d0+z7*_Rsnf!|x4ufCdYmy{WXn^wrm-p58xg~MQOW~CU&BF|`6V};USgbAYzzmB&9Y?g2g{)O!ZuUGy~p{p zz#Ifz&#)vY^RS#Ly`5D>S#Bbo%RG2r%p?mi#gPB6W^*VlQvqTH%B1=xRDl9MHBN#|5;UH%jAXJx&O1R;x?g=%qqz0>@Vk)M#@ zC=0!1-ZXQZ_b9DTL+2%sw~WC^^|Vn0x?qbnbCyjIEn>gqWHxu<*t1V*N860Dl&jG9 zTO$1>yKM{hnJEB(1+|}D7Kh2wcooKcckv$a&vei?D=Y=z@z`&ssIsnIMfBjWT?R(r zS$082Y)`M*9LcUuWblEVVgUlPnwLIXl9S&{1wn!hMi5y-o{^7OUTe2zD<5{}h#`IpSB=SGNc)gBFB)Ja78|@++670Bd6VEzCrWe(!Z|7frr{zu}UHB{7 z{P&8HKlPMhOlPbJV8)o(rsE4p-IzOYKFih*P%f~*ydrcB-RB4z{ zS2>>%ihN!>Z%Hj(_4RN+S4o-}^0sL1E-$Lf6|hh!=RwHis=+rr_rh6>Uv! zU!OY*<1qic&n%yZA_4w?9T_?j_@;|*_wRU`5?_eg+5bML8G4%v5I7z2?+K!3X`~Rh z=ASlQ3NR72!NdRhZ?oJ9=RLf$asJ{EZz&MjlK3e`ty@xp_($FOPjYsmRzL@+ku@2Z zdQuR-SgFa5FM$brH2mBKtt+_PX3_0fmXp=a8lzqF^1^{{_~T$8iRpIw(+x}oTYudXtAb1 z=CrN*hTl+M!1tHLm$J(Wy9f3oy!t=I!57pnLS`I;`2@3v!%Cb>OozmeUNK}czp zHaGo@xWRX!49}G$vhfFYeg;lH!84Cl%}a>$SlQT{!h|a!QCz*01{wv~6agWcM$@p! zp}y)L5oJkds>qrC<|!H$YKKSHX>obZF8k=Q`EJJE5RV*g9J~}adqGs=_!(tQ2U-e4 zEwKrgn)v?!dq9N0O5!>ZVC9VLqy5F}GN7+|J301>E>z*+8Wrgo*scK>t=0Row^rCy zIK|YYE;N>RMTt^Qmtlh_F7eE&P>&_mg+TW85yWx?QWeMmQT$E;>E<2T1B%Zu#i(UP zD`OK&x--NtL!Z1@n8I1taV~or*c+${ET;)v(CM@;d)!*dkp_U8hAbrnFP7IhADO$J z9IEX()kX=kOAny;i(g9xw5$eL`^?)3VtF6@TH5>p^OSIw#_P0acXZ}0pa291Y7v+` zU-ub6ymge}yEuT=nW$`Ms}KWuU6B9-Z#^Xq%d$ml*H_KOs-ZQo$SXWEyzph77zWf4 zg=WKLj;allU3?rD7PcI8GbsiYVd$Ykik?|vKKkvIs}*RwOyU-N5h#oVM$1KAv#q>{ zLKJXd_k<0U2m#4$2`n!zvi|^W8c=u~tls*?fyWa_Wj9Yz8aOE{i&M(O@e;z=)3XdT zR51ulqV6DF8(Kwvg=rut~P3-p}MY{fZAHsb&6?N`Ia=n_k(rX z1qhkk1yU#{ds*hC3WZEbL57#FYNqf>$SHt!z}8Z*M<#8J6dNqyXfG7iOnC)$+^C^I zd~}M?05aB-p*!sMKkU}gEjHFz0%FXy4OI>hD1;`%i?M~v!l>&PW5H2hAfa-Ez8|L$ zsi+rdT9{l7UF5j*Cd6LeZc+=3QdA3Hb!;;|jowgtMx{gblI3orHP0!S!%Y(94U<_p6{Czw&P?}@eS<%JmxN@&lRsIgfx8!WWo#jsOa zqK;TBu8#W@*-%++X?s^_;}a>!f)7;X&zp|9D=Y%YaiOc|hkCm!8)!6BBG`^d5BkA+ zUP>I6Te}k^GE^#sy`@^K%2?_g;Dp_-SDc42xfO6ss+<>v@OGBxWiq&V3w(`qj-rEd zgksUY8t#pQ+K>|N=r7Xiw6~LK*U?TYXqaK+20!s<7IJeGzr4`*f+eq{)m3X!(zj$8 zFHbQgO@%*Ww0TKEgzam3LR;QaS0sxjW=xyCsqCfZbc3DnwV~Wtgg{dxi$fsYQL4)T zEGVj@LYQ|Ps0xWKDXQ7i;D;LCjd>NS1?j_rG--@-2;C?FYz|jOfB>YN3jvh69cd~8 zs~U`G7b;YG%LqU*C{DsGUkTD65P%Bp71wq{(TWflHV~zo3er+jYD{UN&p?1#pz^Aj zHu4I$pF?KdZ~p)oMuRrdM%kGfG^d*VBQsowj<|YCIShix9BVb!I}8B5i*pmtvRy5v zs2aDF?-alw7ee0S!*b^Vk0GY5Jr0mlF9yeLp8TZoFM{@ zN_TJ`a*klP5?$D9H4K4t<+z(=YRIL6J7o3h%M*^*&T*hnZ{h-D=Qdg3D>bU(P?!`; z?ySIKv?%W}KSQpoU0pVyBXe}(T?SQc-c{d~DYo`WEdUnHU&a3b;`|csDz$;58adHe?|nI(AWSY- zfTr`-9O*9SH$di_NJqw%t?OSg^h1>uOclHe_gKzUwcpW-?NESL)9-p90)md;UA+_A zWfg;AT40%=))KfGg;8pP%h_kqhS(?&P#zDMmB6OyvaOh|{Rj;wjA|&^;Xt7BS~FmZ z?KFh#X8j=4gRk5gTs4zLXd~JA3XzME%IQq|lE@MiGj2sUZubz<&9DOy9W(Km#*8Z2 zDMd^RunivGumIS_rQ53z-mwSk@q@YmIP5sr{x7c0>-YnL0NtU(pacE}15m(i2nTi; zP1MSlMLg>DV+y7~xFc{y>zkB+_&$Xu}FTM}Ky9 zs36=Z3${u`w6$s$4ih2(TVTV4;1U*88rgb+%m+Y?!O&$?pxrhQCs{^_D?Ga>(ZNv; z!y2Lkc(^XCuEHQ6NfbiDuyCr^dC*%7VGfiE{9w|e9*73YIq_Ibb-Z@zs~Ueb;#Ig7 z3Z{=+SkM<`=jnDvU25p1hyFqVPzNj#v9~y`SMd?)2CqW~g+qVd5}~p~LRUwIk<8SC zn1WG2&{)~Ji?Z=k#Hyl=qUVkx_n25VErdBlc~O9Or)V$*Hsv*ac#G$WfFMI)BN)yt zD=vEykO*%zVR4$=IFF#G0XD{$J>Vt)tP4zhP(HC=2mUpr#GGFyH1_(UKr*XA6v=Xr zwBN)$yh{#-_6N)dD?>qPct31bue&YkgW_RXQu7&X4?TE}OF`BOQoUH0@kSdhv)d4a z31buueUJ>Gqu_&O+Nfn!aHZ1q00ao7SaW&99FJMCfVP3PT3VElAerj8-5Iptu54zr z$JGVKnc2%#iIcI{V7BBL*pE!XV<#I?T6DGTfpstTfQDMNYO+=vCDV@MTG@`Lr+Go< zu`Eu%_||YDvJ#ppu`h&9YGfo#(r&s*$DyDa^Ov107mj&lxCM|^9NWAbf`z(-tT^*g z-LJIK>+ubS!4r_*#Sm4?W>;9i^xU~Lrs(O4`$eZgsC)RsuF};8)Fo#{_9Z$hT3W4p z9+%n`#)jE4*M-RX#$D805)~++g;>D{1vjj7fRW_6+jlQk!8T~4zWJ4qy>_$<3~?8Gq%Uc1A1g#UE=Bjv*>`J z_CN8f5T>NnHP1BX_=I!~O1lRgsV6W^7*_1eTb$vViJ>bUr40a{s!c;a74|_|7<#YbD`BBkGVWRo>CRyHI{yIU zTZ|BQl>|pOZ;i@`Ndud2*U~&TxmQTu8(WAH4an)RpFFV(CqVkDv!@(K!p!6AcBvh8 zi2!qEiHwdx&AoRmI0)IZX_bZ1KyB0=;8IquTT<_%@hfh!mZ+>LGU{j?QY#$R&MTH| z4<^apR`q{9q15=>d&ix|cT%x=JHGhi&xuxo!=xc%wUK8Lz_p?PbERslo;aAVxWTFd zWm+vYo@F7)x~3|HTCbl$ngcz>8+HY>HlwVhQNV8oM>)y&BCBPZafJ^iVZYD*G+{Mu z$iYBfUSr@e@dYbjo3`{pN;D5?Vt_ZDdPN9%i0^12z~BW2sB(C0;+XEkq(AH;w-Q2+Ql?R!ZJxB+O$V10GVV zjwUj1R19Yan4U0dAgMOS8mKo1v5JIlo5`SZ^rbb6p#bos$kvxbgAmJwMpz0r-N`CR z)FO?x;9B_1bzoZF`dq%P_JsrhNZWOr=~At|Kk=oag$&XHzWDA$i)2toU3|ndV76G} z`%ix}GNlrYCbtlo7bXLBe=K&8%Et7Wt??c)i={8w(lX#Jndm=vh=f!uJT-@e`i5+W61RAPf%@X}+-r=~F;-7kuQ)0R&KEv}r(1)iE14qB_8La~4O% zjH6XiVR7FWf_dA|SOHd2i*#v2E)Wn%*eyVCR8w#^D_;=Fc1o(nWT-P5f#4Rb(lV+_ z&nn_&MgZB@e$zo~)&Bs-l0{dw;B$^U%%{yb1>W(}p+_)B05w_r$GI5{Qc!$kjfyA+ z)qND4z(H^ZXnf;|d`Bp?Gk~FatJxd?y_m(3z&y-kilnbv3u9L{D$79Vv}>r4w+wi* zpn>8b8FX#>u%H&^>C_G7w?WbxLN=`Qjuw|jkc@o+D>6eUUi!f8-Jps$14V91=bQBX z4WO@}8l&YH)zt#EflA`pW3>niv5oGEA68PXfAOn;+aPEcI9M&ly33DXkp`-|U1s4z zU>YrH=`7cTf*Ml&uSr=oC4%r8s;pcHAbSDY}NQ|;CV zcoe$cYZ9UKKr}@whXrBDRRFsD!7H9RRHw4lA?(G~fO-Sll_)aQqsp?u%*! z$0n;!6a^HPHi9->3%eAgEFv~;`oS#i;Yy*E@bWRAQbV>@O%)A}VgY7|=-H=*Q>-RZ zfl^}7sZVZ_+zb;I0@H(-a7jgnxamAi6o^<5!`4-X(A)w;j2u7+C#4QS#(iS9%fSFx zSOudQ=#T}&_$8RsNt}oMr>ojUU`hWtme5-kIY)u zDrljmvJQUm01QQWEVe9+tD8L)Id>J|wy5?D>YkfUz4Bul_V3!Edcl ztFG!Ik8SE(c+U4zC^Bj&1$Krn^7WL3LaLqTFT)dXSUBxpFpRczdCB|f1!Mxt#l1dR zd$V6njCjAiz!EJk(Ek8%hjekL80SBDd)7Gfow?K&tHY^5wbn|#&F#?4w1hs+$hswjlwfD3;31+07<&C z^8+lyv}C1^%tN9k+ZaCt2tjjoY_9Dxx5hmY0E~wVyl6YTL}Vptmsce*XXw?urLJ@$x|S^RhI3 zbM5~Cji+s8#LXF!lF>R8S;nims ze$d0!C{%O&@7hvS43n3awPscsPz#rSBiO;_$-j?yhqzf;gtKcJ!-*rxvt1OqrO!14CsywY4T{(FdIrsG^h!k*rls;0gV9i&p5%$asdV zjhV%M<`U+tmUWLZf(C$L`NuJClq`+bQ^g+D5d|sB=Cj0W))aRC0E>uuUf89i9FOEM zg9ontB8r7r0V_k(Qt2#u%XSC@<}s~;S$e*6%*8T1G*r0Ftk@8?436l?5YH3R!jW-l zK*qkwlSsGay$vr~*c7eLF{{Y1hmXe3pgRslnb0joPX++A7bIJnzQdqXz z2HZot$4~^zLV;TC<`NB<4eOVr8g5b)FKAeIxJw=%`-WimQ@et3N{ySn{xKWCb zS$+@bc`6+*cA>F>vcT_e(mA~aM}AO+-wru}>_7-QMBn|S)U@Ek zy=`)@W4rqxG+hPrm~qW<=Fj&ieGo9a%j+^*KXxMo!9+R9h&I}h*s_qWb73eYCBtP^ zR1t6oFrwT1Oq0Q+ZH}7b=34-BgA2aShpY%`3ey3fhT_}LHGJ`Ye=@`XWsk5*rLBv= zmyRs+1B|s9(FPu#wQE7_+R=ZU~_Y6Be+Q!c}}QS_QbU zE#Fo1ESA6cX^E&%1*-Ufu5X2IRw!H66K@XXlu=#aDr`hn7BS-=wHYT=ttTe2Ux=bJ zo8BIOd%;i^1X`~$p7QXL3yUd>&A}LH(-iHHrxdlifzx0tJ2NCE+m`p@ zWhT_KmO0`w(qV8lutSmU4kT=)$#+?gT_q@DihAA5PQ2g$01l5U1I>y%-ZS?U7Ersp zy!hs1sStvn10M30e(h}+LtfIdT9tv4mC54w03o4Fn!9c73}6Uz(xHhLgb{7;jfEG+?h2>$?xQwt0{tPb!9wR#<0phSBBwQnc=g4R)%UV(Db9Y>9tjx|Sn z$thlr71tsIgN`^6P2+`S8jkb*8~0Cou69dud~E;2%r!V1#q z4!nBKj#cX-*GymO4Aq)R7XpSlL9ba-5NZ6x*+h$>d3yRn=coyH!Ij36G-j)g3aaCa zmt9F&ZJU+=peU@~-l>Qak(}x--9FiX%K@>=#IRJrtRnRN>o>ZknK6LY0qOn>#~}4n zu9uv<(JZFcvNU)HUW-;>G(?+l`;1&vw#bS)I6a6V{7pN6F zH#%ae^sCda#76ts2@$*cN78G}~jL znRy3*w$xHQXn1U)^br^?XbD3u9Qvi+2gNY;?btp?^9CRR7N&q@UecB_UP4_kd1+dC zEcCI57*W@?#-GhlI^q8S@EdlufOS?@7ig>-v;$nrhwLZ-T{|({6h@ZJemU!LBBVPc zujkX&SK+NFtC4&eEBS=zVhh`(PHxBwSfHeAIaYnsHFFR*m%eL1XcnvRVwy3twZ(3j zVTB%jSkM`HnjU`t05DQ(HEO4)?x7aJZL+<8pEBIWMP%}Lzr3Kjn6EU?+v-W9c3M0c zUc^-cZMAhv&}y_rsBjKz%{cMR#bDi5=)5=A_Tf4>6dTS{kM}i@IB965oA1Z1%NI+g zQEs41H$iYfBV(lh0Is{xwauxD9+kyKuld<1Q?6HsTby`O)i}*${{Uz(G=YuK93Ah7 zC=Wg2aJ@IVY*t#bYap%Rb$j)ihtM3-+gi5}8>KP40}Zd9YaQZrQaH=D$hNdiOadB+et3J>*RV$TWJ#kDp8F(>#Foz?!y_*-t zkSYXk4f6)kHd?Ed0Y#WQYuEED7}niViEJzpX22J4`5HNsEiHyJ%n%6J{{YH3J~*mn z92SP2afpDK(|6XFomO()R;An+Z<|qmAdR|QjTUd-YL3w4H(KTVLK-WH$737KcD}N= z2Lmg6tkfMQUhBRIeeN@`>N7_~#aG$_&H`wBK9%nSmZhk!T7t8%s>S9Zfb0XO`*#^8 zN~u^YiCqgIu&e$bNZ1Q%bbNe47!VrD2RF`F>SdEk%a#*Wk5U8)tro1!RBo*|aBRcZ zCs_JM*F7|A)^afhoW$?xEC5TQlbdVE%Kvr4RcC!4;1L?spgXZ7A(43A zo7@;rZjrTbU-fbxMQlYDDXPzm%%%;sH^3|XAn%f{nKld2T zjdyj|wVS~jmWUcV88cVw=6|g2MphXiDLm_YpZ0XaC6T{03lHnH;;*%V+VGre$ne1DOOXCW4m;oWnr!> zKdhm_FA+y$s*5tAfUXBvI&L=H0ZjU9);Q9UWn{LGSPk^@2L}HDFw!VnI(PicV701j zyx+uCP>z(?h4fFLGzqg*n0mBFrnuB^cDv>p&A{6>fA z8Ma=*>)%m*ZRvUwIOfamaHQe17QI`ht1VXGi?~jtg{B;Hp3v!@8&%QO#*DEDa#mf8 zBaP(xMV;E&>5hS`$KE{`U}$RJ82hjRc_{2%S1Q~tbhe3JHkDd&F#CAj(}49pKkBEo zONEVCg~5!*(di68)`T)dL?V}6t3E0q6^j9biv$dOX5y}H4V0>A*%+rv>;1kmQOxqBlq zd96KeFKhgKO3Ysd*@DHSK=%*CKo(yrkzFw3fzvrqYf>evjp&&&JVqE5tH#sT9>673 zrLPe|Ngdd4wqc;_2M(Uz6=Nq_ht|CIS#5<-dlgA#irK7gz|KN zWKx08k=vN!6eU$sxv$<~D!pNWp|6wD4UN|}@5>O31VFIKRrBmi$!gkcAGPxxvF^D+ zf594(X1fr#v5zEnO5pSWeZGi4WHV0l+RP}KfGyjMKCGc66gOCM*IdB^lUUyNg?h?c zYieB05E}TRy&T1*6GgU{!2@0f z^1J3@T|7l7(ZfO4uUW)pJyTSbe!kL>k73fcb>g{#8HlYeOe@y7n3#=}8h4)&O*zHG z!s{3BtB)|aqJh*nM+w*dsEOHhixmEMak9B}ZImnX0>A))T{r8$Xw=noIyIxLxsz-T z6^>b1H6g3Le)WwIkf869<^ASw1Q2FxV*Em(V+vq$THALYQUvUGY;yqB01;?9NMw@A z4>ensS2>CGWh@EnWZ9|BHvvV0xWThCbT+M9MudGOYR_<2N5cy(S%9t=@2ZtW-|67h zKML681hhi@7QYgbD$zOlyZMU+A#Eyq!2?6cM<41^qTpf5QI~Ed8Z#{j8mik>(gd_t z!s*tcZLSct?FYy;Qs4z$0nEbSZG$q;m$c%&;Sgy8Ax$86CoefbLc0!ezYx0cgQ=H6 zboxBTns}}v7M2085mU7-=PkFrT;G5dZLl4)_<{sX$$r#CNtI%*+@A2{OJ6kdK+hT? zf5UAfP_p%WLYr(Z)*9EeK|w(|C%oCNx`2cJ>|7by-jD{piMSx3%Y+b3Iu>C4IA}w+B?;EX!mRG?JgOxJvGhl z`cy}OU|(MF;`pOo;uLYK(^{B<2v|J1Uz|h+bktg+`4Q8*DGP%++)FsI1P3-}980tV z%p=eP9v}gyw4Ds!)Jtap%?)w#<@a<-vwv;q(jOA$n?Lc&Iy1)!b z*&`L*R_wb-2AXP0mFh9TXD)g}vpWRHSM^@8nQbyv4gQ&lU@a6ldQ2Bt9cOV+41;V4 zwKKD_I8QRaG&xh>hmz(_lo=mW{Er9)uuur0z@z7z!vMJjqkw^F=pMBKg4SD6b#8BJ za{5Dxv_`1I>eYL|I;gD|GhgQ%UTt^s3qTI*|35>+@}c0C^#8tRIm6_uW2V!XQvE8?f^O$3l5=RH;n#$VQxmE%D%4=gB%*uE3y6WxNMmz)f#+{-Zm-%4!~jV zzx6c25Z_gRWqNPUYYwR?4D@+BIAidVso67x^Wm9}^dnYk&ZahDh6fq@LZVc%yThK4 zu;~qAIu3sF#-WTOg{FjCw+%qA;$;y}47g&VP_njKyq)v=nNY<>7pnNj?qMOpT!9CA z%hPaFr1OD=i|6kcD0DZ7myI|JbcK<2VCwTP16Dx1k#Yosx{isqo^umsK~>w$LQn=o z=acUS&Vvx4URhWU8OEWiQFzP>+=HsuCxZQ8Zg>hS%{?0t)7_0)xu%0DZCYyuj6j(B^463ZWkd#7CP5MRp%mKGE06gGWge^TK*Ik@$t~h(kA`SuRbnpH>y`P0|;yM;A?LTo2lp~FH9>(7l))iT)0bBe> zC`BCb!TZuHLcD~g;kUH2^|qQXJ+5Lh#lDM`0mFJbwJSRjUgi+Qn zBAXTHynBblTh$i=rDHeim@mLrj>{4{mX8tZt>v0H-$*dmJhN@HcNPLN%1Rj@Pl(7}nB955O8d)3%nD#L z_=GWeu#dUZt~*dZ7b8o5LiO)50{||ojXs)*T3Za2;CYq|`g#(YuiZjP9=ZpA9?nFgv|lhvtZ zLh;2r`tr{*flOKqDw*UUt14#rzc5 zTy}_<&Tp)z;bkkWe=MSe^y>xPtMs#;Uc?gQ7P?j#IOlIiv_9K8+TRskVntPc^i|_8 zZF%Cw!WkDs+tymUl%NG(_5R^e>D;2P*KjH)K7%u1H4dy--G~#172+Xw7C>Yo>Vo?? zWCGTtbdE@DRc#Sx{CA3~+wdy%VmVWq&uFS#R#(TQNaM*3EK@Y>mJUo(o*}`WhA|ld zHgbNGY)%zp>%+Wze}bB@$w6BW8<^k~6biev<27eaW3+K)%`Yu;*5O{W&_(Ba$ILXo z7m?!l$i!9&fzT-Q>nQr#O&_N*)@&oeN>|Uv((7m-8VOPM_m>(e7WXT%#}#j&oikB4 zqhteizA5&HuO=F?cDeD-7$Xaffc1d68?_B8xqKFYpeB=M6|vtk@jwkzfkoIdVQEgy2_Z>u4jevA4)2u-*r~oyx z_1g0V14Dd4Z16E%vwK`?pC9!-g01>8$15^&x}kB1X>#3hW_(L~PI zpu^(SIa~)m9u$vFJ?YLi^)U8Tm-{ZqkYkV>R~bebcYh2VtjiY!J47Kzc}}1M8_n@Q zvKFT#M05v5Vc;f7#0q6K(e1vh;xEBA8eFZm=d8j>wRMSgZK}>-7TT(LF+w+HTI(AY zFGH>(45(T;VY-}6bYM5>buJ*x+W;%=9C|Az05oZU3*NcA-@F6q^#iNm@9hgH(^A>C zxp}r9hLJg5YXGBJ+#`$#R?&{R+yf-0X?dsBJ>wf!x(mp0-s%;g2D~Zvzji(40i#37 z;{N~=>f2`ASNe!Tj@r0rGvN7(1$D!X)xfyu&U(bI2OT4#j+I`O7QEP4Dp!oh=7c*f zM^ih3g(|*LakE%bTEg7tJV4T2a@4AMYGJOe$c}g2nZ^)lEWT z(?kVB*fM%daGi~W6Qj2f?a^7t1Vj*3&I;xq!hxVPL+vqvQ%}1(d3I5B#cxDV+jhr1 zh>9@DnM@GNq2cR`hB+vQ8RqlWzF>@^@a=c5--%WlRSaaq`^*Bha*11M_PEfNy(PA2 zQuCX7b;S-wDO6*;E{siwBHvd~7|}&bSG>OFMZ`u0jxOOCeI5Et!L8_v!q*v`)%em z`#}|NemH$1k42%i=zGN37K{g*_3;sfj6ejUoiSGclspzUdEaTxkP1RCRP~U#t$h(dckhDAV;p=cz<+G~$ zMLMjjOThEf%m5KnV@5dbErY6G3za{BE?{y?2-N^V6sDY90o79G)D_)NMmwUU8dO8m z$5^*6#b)v{;01SCs5d66F55XFDouq>?@_u%tgNMlt*!#9=JHHh*^{vn;JLA6491!e<|S$sUJbj^l^%5olZ{3V zJmdXQ^`!$FLfhDK4_8YRAJj{gWvw^O*@~2?FKxDBvBiDnY$;cCxMKYvdJB{r+nCrF zHP`^HdfNB7OSOYXw^+&{YdYSD+K?45-|WNsGL^xrr`8m5BHJ~2eQH<Y8xpikn)7p+E-c^=CEj0^K=puSOerQ@fLww7;UF*aFkcsze;oTA_Qs z7`Q2l54mWS#G`1UQk<8}Z5<|kTqgP|!fymKj8W0uXLpWXkzy+&Qk7F~urXVLs;*tQ zHBL0IFw9_Uu-cA{9B?BDfx5IHL29+s={E|sseoas(_F>2j2)}^g-ZnoF22zKYIkzw z^py&^cyo=!3W2n-{mdXICi!XCCa?L7iv=t8K4C<1fX&*g!m-*=U8`YgtvSWfIV~+cJhaK&K4nXO5)Gs-Ol(JYCrD^9=DW+D9L)F zuaS`FC7Sb?1N>>1;zZW!q*ChMup;FbFlyWM=d4|mpeRy}ocWaupCZm)x%4{03avKz z^L+Z9CK6(j!QQ+j=@(;x_V!x;;Entc(+fa!3DLM!KC?_rb%cQfCqjm z7oa+4f3emi1$Q!R5bsQ9jKC`!HPNHeAVo}$wum?K*Xw_PDo zr(mxIdYPBYg$2JSfq3mK8RI6K#uu}hXR(9GD9KvWL(%|3lxi$&w)Hy2 zvbY+qLM7TaT`~vyjVPrT&LXu67hJsG-YgMTLX(!_CkE7p-mw}bfzjc9BNSdX?2_Go zxYcA37GYwz#}KhPQL}j99+MwSfjBqAE9azW;V8jTt`0xkZ>T5{ujlyU1!cELF2^lv z$qJePcU7!int01c@jQ z@PjEetSkS6D`(WyZxzT2o0^b{-YOq45xJc+@&r`;M@z?kJ{B zdAjv@j{sW@0vdI!W(-71rM3dEvzX)wC_zC_d; z>kwU`Y^xgkN;GUxI0)25$yZuAh{R(fEgghQ5y@r-wj4rQMus?BywDXNQ+AYXO<^$5 zXJocqG2t`$W zCyT(JPn6eiYq#Qe8=~BS5)TLX?4jVPVQ?q<(P*uvD5}rl16D1na zk=7%2vkuN>2EJ^iTA|L24n6+>=C!qv8_AX9s3a(2w$ygphU?uZ6eo*x-PJdWa}YHz zkV%?ekF;vKTaO^$A50`8H*9}oCFZWWU*hKx(JJ28)p{?aW58LsS9Y%Up3#a{Y!X?$ zCzzRFSgyLKtfgY&9kD~Iv^3XkY9b@4G1_!{KwDXh19$N;Wl$^918b@_HuO1OxbGV% zBWn_lB~cqI8X6)vwQwf~zcEyrqK6pt{@_}atvvO8D@TX4p{*+r;1db|04}xTu^4^= z4QRPdUgzMIDk{=e;B0$8^kH2CMYDJsDD;OAyqnQ;Af|P!e%vdJh6l7PV3|RK@BGHF z(Zp!w--x-QEvSVq`RAT_h^GjNLqIEzeWE~ykA?mCshappd5wek#eJ))`87&o>3cMGOZNbmJMVMxYCYX-Xe&iAdus z%e!KdG@c8`oRN*a5)RigHZ66Io=IM#8o!BjTP&wV#!j->l!CH#-^34*D{3nb$ilFd zp;t;Rh*d(8gr%#$TK0)^wJNd(yo2Iqiy*fV1}rRdc3sN<{=g8a>c3IDK=J7vlDQj06jx-nvdU5KTsz~Y`;&K$GS{{ZN^-id=E-(n*uMc_5W zMGCCyG+h!kSOwvU!E%)}87tt35y(E_bUf-91D4g;T`x|sb(YZ}29_1N=8uS|0uqI` zY`53qGey%qDi_IX1(?c1%Ug z3)oGy%ZGhPs|*^+N2`Zd6=cmDO!;Lxt>AS!fHKnz$nS+k7r#huA!K)VUul)MfmqYU zOd%z^85nWt{KRO(dP{3DYLuOZ0?+0-Y_U96e=%5g00Mfq16rVRT4OJ{uKl5qZ>SZR z`{UxPKt?6XEt&O_a%xJ+gX8yRY ze89jMDEW%X3Oy3#6%(9QdRO{TaT`=BfO7I}?Q)?)7OXqR+>Y=z7_5OrMGWlc7I9v( z;;<>jj2_XjO|aHUSOE(Hl#D{Kv5G(3e~^%}gAN|40ZWwBPz!g`w-w;5^LKypiP4=n z4Y9>%aCYJp>3K7E{6$@mK>VM)FjW9Eeg6QT5vTy5PVZqBkhmskYyC|}(qL%!TnJ8a zH0Ga(fP*qLp@ZU50m~#dJyqhpW$XzTfXwUU@hF@BQZ)v6Px8NTFf zS|J92d4n?a58L#Ho<#wNIr09bwx5Z4UnVcf^bXF6h=F`q;vIu>g&x7{EDdyoW#RxW zcW$*Dpu)kqG+R|xH$zgGR#jr_x9{Rr6c-9>d+jKl32Umldwt@Of}#OR-iijb&OhLC z>bRif&huF2G}gSO%3j-;06n+B*Y2XJ(_RtJiml9i!ky(LV zcKzuQNSUU?uwRsyjukInp4BcFAQQ01zTrj<>;kI?;P`}&YwqDo>%s?qS{no~PshZd zsv`{I=2ql{!wqDdKh&cDR+Qou^4?8YGeC!zJv>7}8CmA8&ZpW`#ki*#q7{6Hmy!M; z*lHcducQ?kqLs<~!XW!-N~^#Z79_WU%uiKasR?QuCfhy(shN5Mgp+FG{ypVaN+sS! zU3rX$MwRPX{6Q!#jH=bBhS&>@U+>Ii`ysQGGpR&W1Xx!vyp*QQP7Mil;w=jct0z;o zQvQG#Em{T50^@;!c&%EBds#3>IzQt}N~KIDD}GOzW3@3j6CS_nQe`$Cl# zTn_sZ`UiSo4t;7g6Oi*=qKIui7fmaXJi%C~17(EAaE??4ZUw$f`G5s2qc~6*ty|5& zZ#H35q3awpTof{5`Iqs7nM_-5GFEzO8UFz0!B$h7$qs7)ageS3;BAp>RiaoG*#ej2Iw=7c!+g~FCU>mheb1RV1#g-a?0eqb<>HA#ElxoJAyq=rx zOyeObGiU7+5d!LpivIe}x!;N$I`VX%3*rGj{{ZwnoA`@L1g}Wi2)h?34=l9`$}3h6 z>EbiYIPoi(q!Xth%(V&~^zubaO`T z)S1f>VcIEyI%(&aV(4I)M(z={r$bl9{J;uWT;#mhc;u?6&on=JKp+9Fm#DR5z`M=h->k@sV*tZxy+xT_NWYjZs3|=0 zPg4FNic+v9-g@iKC0^-nmFVZz=VYj_N(=aa^l)+7@E#yFI{Qeow=H=EV$n${UqR8w zL$+L0q!j}JR8hhFOm1x54hL~A<>SHP`*ZCG6RD#&oqFNh5Ya$bz4oZAqP#g>Tx9Kf zG1grTJ6jJDr>ZE~-1Lb;t;Na=@D+j#?a~t2z$>S3sD8je9dXFJVGLwNv!`fmP9Dsu zefvN0Q-NnaG`)T!17v_XHGY?8YQ(z2QAMDf*JyjJ)c{mXe)N`t!2;hyJ$H`M{D3?3 zP;LHL1+{Ag2SAAn6`2V9tTPNq1+0qn*v#w;oEciz8a?1;1S6@;R&535+D}PgZWIw_ z`T;Ql*Actawv(qwn{Id117SuhCApWuM%GZet$B5jIU3aR8Y#U z&eicTZD62rt$n@be4wePCOKPCjREKZ_0$@QP?VojA)U9-TUr#u_V&4%1xt4`Re!o= z738Y$<`s2eSjM>N{lG`HDp|ds61Pel68`sbYm*8t9X#9(nFWp6pUekdn`SAzPd#aU6+lIYn-01P}##1uReZzlTjFRjX<&EHpElMpKfnh!h5ZW=5`&r_-I z05UoznjSi_$OP&WOd2Zf`GqX)4VQ;rAW~Aaw>U~?`sN6ru(f#w9ks=pffU!Iv{{Hi zrE9_}QFsx^k+-As;5GYTW(aTBmXY0c+~1n0v5XYB@b7Xvl;UHmdkt_*TegVwCx zt$Y6f5P_;3p`-i!%Bt#9(~ExI(Ny58cXNqL%!dl5sxsO@y!gWb3ZQVNDwKVo+Or|u zf&qe(mDBMoG61>Uvq+;t+b@AJp2>pdbN=lD!hGTgr09GqQVZo_t z_0`w@Bok)fjcW7}j%kH+YgU_prsxzlT|Rd&CiQ9}hZOn%i9mM0MOLj#C>w7T-X@~# z_xD}zh;g!83l&}*JTz%#9IF&(NUlQYbY+8D1*TgUmwD!(mx)7Q4p-I!<4ahr;$mb7 zk#~gU$3vtrsp%zOu-Kv+ydq9TzP~@&u(~XMB3bt&SKCnH$ zirASO##$A=a?mkdP*M)X{{V4x0tNEw`+G%%Og&Fu-mq<~1-?***=_Z{dqZ%AN*hZU zs8M(nd)#8Nq;CcTKT$ZVDQsam5c)$J4X{-=cjr9AVysKc*UonRu=r_5L`RK*eV+Uh+Q^A4mE8yAaUQ0W=?6e35zG9`^3Tw-XCsZsL8Y{ zv;9gqxkBrOK-OMsyAzpsmj^@7+IJUgH=M;2OlYiQtjgso37=1hW?Yu_w%?DuPYK&3 zBr5h4XHKG`FCc5Re(EJL!hplQUb>_7`(;uV7coH9zKynnc*jY3{rdTs(kg4dh6my)d&FKxWU zB+4e^eP^D~R%3S%e`;`M2Zsv|((Di`N;S6{eGf{kifhitF73j&q^j|KWoSxt0v%mlbDbyF%NH<;QOJxe zS}3i;-89X04$P>aBFR^gi>qRQyKXK^1^}5i#BYcVQc~^x^BqGh>nbMSyi1@|G-B7U zZF|CEh~9>MM1HvQa-4+0&<|Oac)SNU+uv~r08GFf*Ipn3$DYP~({UHlaRoqDR~YXI zjl^hLqjX*d`*kKF9IIag+WD37t1Gm=E5@L!1`v&hy~OnDqKz z&G8c4=dEtL{{W$-wW-qz-12`j4TmFtzGkaBMM5P@2ZP|_#7nSMrb|e_#4^Z=0Ii)^ zKuF$JQJ^)45L=}{Wyj}mMWFB;HT+xw8mMS7(^dS$H71^{W7`nWflI;P@dm}QRlBTQ zQZgP5lsp)?a)q*3bDxixkWeTA%D8U=|pEfi|2nDeo{^ZRtoO(5Gi&SMCu3y06|5|J1+T$bq( zfG9A*E8$|L%VKRh%GMQh3#gHeD7v*&bV^Ri9nPTBkFe?DI@&Z3Bc!Pf#Zi5$B*B$( z>)BY(tQJ_aYpJFV#J-WCvVAeQv5OVAK8`CKF_uml!!1sa>UOge*@g_?0dx zE!w}|-V~~sr2qm2AxauB5`;wsDZ1d?0YkNTS6ND#rGTfR%HFXDN1KIG0l@sn1T9Tj z1Rh5G$B|x4pE2fad_j$m+hDgj40AK3(=|$N&bY@P5R3z04HxCwZPLD&U1(PPS*Hbd|Gc^*VO)w<#)?vrPwK`MO1#CxM$Lf0% z0+B6o&Ua%QaKxkp`|Z?IOS|;<{7zi{?9Z&}3g|g)Xc*N~h=IWQ`@fnic!! z{)Pf@(%W=k3%KaGqK{UCS+3Cyh)o19HIJ0P+TCa^&&5HVRXYG20`>D4%|ad(va_|P zX=6z=^181Fh$XUg(iLgi;uZy99lZF-@h&g5*>KN#lubcAZn7@>LqRK;Cd>d`3x>Yp zj31}wD%-!FDjkJ%v}cPiA;i=;2)V3Z-aFE;XG;Bh%L)}-4`1HWmI$$9J70gaC75d9 z*xquy!vby2>0tw)FA$XshCBI+92sXA{{V3geRa2%UmSbF_dqNf&^Y*kqHP729N)ai z+*00OXqToFMssJhpc({q<@ofQ2Pw$8JMwf$t+*ahfZB1B)M^}|R;L^&YcST1{1lfs zD0_5@=Al_bU3f2Uuz93(7$52cY~76S`i~E7Tw~H4X_st|hHg`|R)Pz0Z$F868%q|> zEB8=RyL1$u9(Keomke++!gM*UTNF|aaOIBv(PdWZBLH9NELb)MwR%5%M*=Ho)o1vb zhzUtuOB928w88tA!l!1rX!IUX132G_JFQw%>B}ca@(ARWo6Hd&UxlP^QlQzXY+BqQ(tl@!Jyj&}o!BJmb@}Qna(O z!jmi35@IOU4v_8dfAl^^f)H)#@O#9Nbf~7&{dbBPR*kOS1Fj!5s{AX&VeRY%p&Ij-);${mH6puqrfZ6L4>U!}sQ zf?eAowC6u*RTUW0TZ0xEGjK2l4jEfkpW7qgg_!IvuO%=E9gRZuZ!iuLzzA0J;F_^E z(^f4ts@KeBe)KN9tLM^C*^^TAUMq+9h>TR}OY`d$M%)Xs`1C|&Yyu9q&+lmX=xr3y z+q`IuRRWab(sSiF-GYomFyym?S6{rq&@?R@tNtSsV2*!U^@z$uTd>8q>cH?wMic|) zBKu)dy4T;*8U_Mlm*4l89RiX7L6=q5DwaA63v3SWPQ(iphEcv=w%$5KO4LQwKh(LC zzx2dgPzZI2IhsbZ1v))oH`aFO}N$dPClmH3?Vk1QMzUN~bFr3aq^$5Kt%%Kf=L7EEfrkZ##iSi<$#v z@6U1r>F}`bq0j>O9Us4lY$_`@CA#c$7UJJuBChK2*R%k!m5GArI888KO_FY+VfyDL z!Ut7EX(2Xmn8h0BtTNP8q_cFDb;oY7rQ|G*RYJAr@6uBU6am~`m4P`Pw3z`Zp;se< z?|B2#Du5TPEtoa2tcdgeHLY)8U8^fsTj>P0(l15FAKWqY*i==m&!>MU_y9x^!aT|c zlsd~E*UyqM4rI(H6j`j(O>qVdZnRbozSTP5eT%;ZdwogclZ7o~!1%(%Ev*<{>pJfq z@J$$DLCV_sgpg~&27{A}-`ZNFIB?bB$ouq|8;Y$1TRXk54;|oxN1!%vbiTcyS?GeD zxf|=j>jSMsAS!_317USgSTJdz72wy|EN6e>HN2aa7+i637Z&*3qT9)z?kH zb3|C|bA2*>pvJV~vvPG^sytOv#!&CuA8BJi5mU2bT@N^nfVUnBfqUv6@n{2xIuU?3 z2Go|jzV!PM8W))^^#Eepmt=~98B>RV26EayOKW3!)$U=_;+QIoOGGr34G zGck&Z%G?XPIxy>Ff!j(DwyURTX$2ga&O6_>VwKKxIF&0iTQtiY09!1t(iSJIW}|e< z#-|J^Zk(D(+dLgs<-;wDuB=^9S%L4>UV+*7i)q$ zuLZs)VFm|4dR<40Rl>$musX>Cug-z9RkdPj>B%3L@Iu382LqMjg_Yjm#cd^^TERq7 zDnQcY6ZlG_7M(_0_lCP(Lq;m>-k8LNFvZ=eLBse6dyI6TF9vGtc2a3cuWY-k=p+tf znzA_NCy`~F9?$rQBbe@a0O;LQR6a7s@fd6w9PEOSX<#yBxN9d5Wd8sbmUAy*5yLMC zPd1Rv1qOFrAeq3j6amXc^{e`;*C%b-4iLC7A2&!JLGk*m5F-OwA>d{O1(86ujgYyn zfR>{{ZpDr>OF_L}PPsZv09BNnr$z62?Fy%qCPim8x`5@APacz+=KCDSrZ;7B<3B#p3W_urPfGm2f$G3J20GMOMMzfZt^TtD zs0@>{XbVmn^q3d{76S74{{T=yk*j7X)nBZ1_@dDTt+jaOXN_98b9)J%>A6HEAZ9Ct z=P^|#EP)7QH<&GJ=j5vUgd@Y!I>W+%@0V+66G+01lN6=DfhGOpEFeSLUt?%KlRU z<9P27^e&@Tyk(5nChqps8L~5MyJ~cfN`i#;lfC%+Tr3bXo4ok-h_$G+((v)b5S6T) zsLnrnL?MQv@t#BN9XK~zVmQmtL?05Ot^p}of)NYH3= zg<)4mXphK)CF2!}?*z`|XtKpSxAuTTVuB@6R9~YlDMJ7Qc<%V-2PTCvN6UMR#H7v6 zEAd{Eq(ORVuj-)|v9qbil8L?Lff~I%bJABw)Bp+yVd-`X;x$7W9LuJcULi+zs|)D# zdqf3L467L4ma@*GU$G6Z&_asYSuV@>xE9(-+HZjd>F5_J1kGxSwN?v#YFD6=4@y>( z5BSxjP&dp3B5D>w8UoqD-fjb(LV&C6MZhI>rmwIV&_MpFjHa(c?tjN^(KG0k z9;OAQi*|=x(2=wqtYB@d9B5xLR3BI6}-j`^)7uAy2<69^;o|`VZJGpvu$(W)WQ&83|DCAi=@RsWM3%N zL~8LbPA`e8qVWwEUGIq8mpoG(jjIyjoE$wO8MG74ld(-|US(D$Ky2I`ONSv+c@m(r zXGn14!80^U0QDcWF17J?PVsqMrFQK3x9*i8-LS9P$eh6SH$5CI#l(ePJH9 zT`+fi7{xt<&a=5x4cH(CY?e02@u{0x0+qbF&~4S!52lI%Ekz!xoKm#~RhAJozO5Cx zq0xf^w!HmYy;-5bGj#D=Eo; zq`b%>OOVRCt1q-Ig_eW?>>uzTl$K3^WrX#qN4?FI^$$18lo+1ws`upin2Vs*3f0EH z=xvpdfV6ZSoU?JeIPrEs>t$tP-jPJtHn3>Hg?WJ)YQ=Rk!9+_yv#a;KRmb;0 z1UajwWI>WJfh)RGk4ul0ebff=z90!s1qs4N^^Oyy0;8_Ip?qy-EQRW9KGE~3rHc*h z@eP=uWjSB2`@rPUEvFS;j(ZUrgebX-;C;jUxv)z`1o403K_A&uGZx zI5ro1J!6Ov9<1{Ev8+=E()l{$aqeK^)?aWGJi1Qlm2woybH8{rYQYNN{^D$_F&07; zJs^TLT45ks&E^u$IckC5q`u}DvFIle+FC0;c1I6NsbQ9{Dr_0W6$p%dN_)4ZS+ zSS^6C#Xc8wzmuP~eoMGdT^#+wGM5%q$vCaX$>=Q;MVDj?^=16Eb@?<<}x zDtcAzhfuWHXhRiQp}#N&2@=|`e1B5N!i6u$b@q$&IJJWIJj%f4qfI>?VseStksBU7 zpAP^5W}q8gKpPZ|OSjVOY!WWcIic4-hwCl<9X1W*-#t3aiV}$Gr=i=-7QXVcLEU({ zenXrxcbsqHP|F9pN6qeldwaa;`Tqa|UC#AaL}|4YXlfksu{vF{V@g`(XT&VKw{U?PW(V@hVn+=9xY{?hCzt=Qw^ z?>LUNvg??KiI{CxX9RFI#gW4r#h%?_v0I@@wQt*)R~jKi z%?)Gk8qHo6X1tXL(`-jBpSy&)Y^5qt4F2;u=eoLx``l7AqH8MXUfrC+MxIW$%Mso6 zmq{9<&QRAR1;{dr3RgI?#$y2&Yid!Rl-`{;FJUM&bSs-!?F3asdIBwVmAO`U7OC8+ z>cdRI26+2*)E>@#<#KB& zGtrK5&NzosmzPRk81dR!Zbl5_pIpSHB_V^cJ4}eq2hZ)m)42w62;NzR-Q>q;pdPt; zLcqLSzVvqiZ`J$ssbHW6M%r)hxp)8u?i^?H9)gJkZ=18h?!c`OrDCZ-?FEv^2MWjX z$G3C}IsjJzN2Fri1V{sBo`f@L0_8CCnmxKo$RLfBJ&(WJmO%xZ!0J_?>(4V9JH#D? z7Zw7nIbOOp-j*c=2HT+Ouk8}7Y+o;qfwR?Z<}4bo0JnYI9xX zaOp6v?Ee6B1*$cWC3B~l%mW*3sIn4RB3-iLAUnZJR1mV;F;!}Ii?1`3SJqw7q6}{f z$`M<4%b2d+XrP*?d$62ClB^GK!jM|QIiNl2s03F4cyA4UB_{J#P#%;VHNhn`|uH z&3rSsb@rE`+pUr8;uO%(!|`Q1U6Nr)Op;zQ2rVvd6?OV-na9#6)!+ zFa;jWq;xqhoM%x9v%+$q01n4$n3Gs*I~(sP6|R0(cE=R!(2Qf!LG+f?r&L z!ALI$-QETZA#h$#t|3x6IO~7hq;jH@ykHnBeIYHKlaarlv?mj^sI><1;^Tn1#+P#c z08N!*m%9+QFnKMDv)lKJB^js`vaQ}D79@HRVy(J3Aw3;#w_qh}3%J5+^g6G+5SH8o z<4bccljSMAK&Gjpuf5C#%Xt}ZdowKPr#OX*dd7zPb(H6r$`wT!ccNieLJG_yl4NlQ zVMILDFH2Q>ne*Cpk?uZ&QODB40C4MgwCX^6U{M>sHV1tny`#^v$OCnU9ms_3OsQ5= z`|lJ0C^D6m{MV#T`W||wx2}$`)0(V&q4s@3c*<}`(q5NcAF7&Rz3G{n2sUZIJ@Xs?^ARYwvA+! z7K94ZIs5DQl>w#HQW?%@q7`KsM;mo~OQTV*A)^b@S5#)scaEk_L6Y@ghf`VCUv7Ay zR^)U$dPX=Es--l2hP%WEV{7S%DOlQXTz+F&dYJ50`RfR=dR6B6`!lG?V9LkZVPKXm zywZCoq*#_?M*H8)ORjXwhzDVR^xu+T^+Xp7ySHX%NnHtLXaR>D^~yr1?bO{X%u%qQ zHI0-$V~9$CJW%3ca}bXU=JV=zf&oRlq!qr-ec~yFtKBM$beNKb6NFtpDlL$4?wC~F z{o)gKT7V6T?C%}I-mgzER%(H)#J=hw^p=)_2w?8h>o+x2KM7DHKrR3m^8#~-(cNmt zuKdB5bS72q`G(dFF|kJ-$GZ*0+ZbdX_fZT-GQ37F5MIot>QMpf)r@RY2P>6MknJCS ztRDG^n9WKB%_~0@?#3a5uGy)o;fX3{olBAs4l>}Hj~46R8v1KLTW`Es63Ve5Sp*HP z*PO=s?pH^X-{|kOenyja4r{oNsftA)j5Ux;%{kxVQ5JWWgZ;yBwrC+m>!=1<qF%yu(d0RzcaJ5a_ls~GFbR4T3#b<(99CK>T8Oldw2IW|#RvF7(W0WG4 zQa?;GIK57Y@>5DO@;&o#WxQ_{>DzxFONuU$UV0hLJTG{7AxetjP2o%#zY%zQB|@Jj z-)VnKUZXj0f23p*b8zLm>-L2tHi%obK4k-P2q(#ne8;3Ku!-4g>kV=M2M>{DUw&oK zf(#=T0^T*_G0Dq8MoRtWT><>#U@E#0*Fk`J;V0*3mA>&T?o)$yww+^az%lEQmd$iH z@hIE2ISt+XQy6t6UoG9s+Z4vBA&$zz!jM_WW7%Q?go0MfKNksaX{5&QKQIE!Qoo{c zUWOPn`$bi)jXTt?-MO>~XFt44Rv>b%<#D`M&fuBJH@o|>=+Qc5d?Kg`<`n??i_`v^ zw~d@Y@u|%mp8{dt4Rk547h$S!#3T{*kM>}~5wLFVyOmv^QiOI_j|DpB?3VV7r4*va z&a1T8A*y7guJ|GL3$v>(`pP6KfpiyF=lP3BAUf}xat0hOGZc9pc9srY(2tdkrPNmFYd&Dat(J%H5=SV&VQ#y`6mGXJ4Yo43 zpdXupWHv@Hz5y~g-E+7>nHRa&`S+AN&LD>8 zLt8i1xbU)pq7^pF>Q$UrUwjy~r7TVB!qZ%I=>cNRWq$OivNFx&9IgbfPjcNr7j^8Y z^|)z!sh#^^%?Ceus@TvPOwjy8zQR&c;+x!%u^7-A%sEl zOJ0zIasz~GHD+DMg3Hvn8F>aw(!wIdP)0!aI?dpuLKG2HfeYghSR-qhTUC{yFR2%z zEdXlHmv}+8J%PzGi`t6?YJ!yr16ITq`~CMRlc8v6W27n9ZAVsH1x05Hov2QgpQBIM z?Rkh1ns=a`yi znHhFl3U$LPHlafZmh`6w-e%OrmQSB2v>_L z#B@6VBwTuDlehgeAd2pbs9!NltKJ`ZQ-$9}m27W!9CsmEU156kxsdIqwV`$4MiXO0 zCFBE(q6bm2W3w+#p3p@v7lRq}%(R9g6GWlDITg`Rr$4LCqG^1@F zyOafB(MVpa)@&@GbQhoFta$cpE~?w}h^$2!TrYX&qZ7BRhK{ui z0-)HZ-#z7B0rds971C7E);HEc*a6<9GKRo~wN~<5y4xC$e36&N>hx0_m&Ah-MibN2=KQdqY+9Kz{Z58yXbK1Mod1 zL=g)_;aWL;rfQ(8Fkg`Kj$=uRJUCx9)}=L@yyp%pKgC6_19H3zW$T2Ga4-d3Q>t%2 zXlfY6&<2197lNGASy)>_uytf=tKK3DS*X|(RIkSgQiHSo>G1%VlOdyb=Hk}K0b3b8 zT=C<)6EQScE@-*?^Ojepm%vQ?qU%V4j zZ*sEhJ$lP*k+HW1x@tWG3E_cUnB%NLfO4I3d~w^+^EC)Dw+b#O+uYEqj0oIDH?70g{EzAYsp1i}L zIAz{Yg<5kIiz+x+K2k9)+12eF3?sJXh%`9f;3q|ujfQ^`-ijLudh|+P_|-#8As(gT zV0}Y*<~^YB7XIMaXMaIOb~=*@*(H*jK*&pZOs=iDAd1mza;kIE{_xwSv|GDZy`u%`k3)+;C|0l?|*M2v#nG#c&1cPK0icwW4)!obNa3(c=NiGz{~YOp-Z zdNL20f4Ias0C`xp0xZl+GtN}(QLNYomu{3cE1hDda9S$nuYh3XbBUFT{Incp&k7N| z<}1L`TceE#_45ZYgG%i~y=#u}6cOueHNLCAF$5|bLf|o;&Z2{Qt}1kHXAu@cHB?+a zM6{rr0az*-&P6TH($$rk;N?7N9)vBHUHoa8(OByE$WcVo*W6zQcJ?8;w@d><9EJ67 zu@v4$6NnsVtIR2~`{X&k_UX(701Bo`dc<$LfdtvL3s zrc6T%4B+b2a#NF?oseWiQ3R4)Ag01-eg zjkLkQddzc!lGNTKP|B%VP4B5QT?rO7j3u7{+~14U7NPuSiF3@Z>2Wo>^Fz(On+lD=T;j?k{ceCLT(bD$~G7o4}& zJT8c3Tou#AHI%2-qwx+%ZMA;l6Qye`S7~-og7EJP6>{Y0Z~4p?K%TA_{lL7ml-w&S z6`Ob4k6(C)4JG)uuUMk=3D^Ty`*5sK*sus)W}cjPfQ%(eigQm&ejZ}dixxOv67onC z=qv0`q`k%+c!Nl~;OPXV3cHvldR(aj<-KhU0I&gkYt}m^cnNcc3I^Edvq5XGSTeS& zxoK|>YFHyLMp1&b1AMErp@*!Om{~H+0)g9z){O+bm+g1*o~S3GBluj?Snm%1=~NSI>Pb=#5v)sm6oJOAhTh2 z=N|B*Ig;K&_p?ki=zusFd9F!Hu~h{(#~ouDG3v}VKG7!t25Ag&&S2c3fjm=V&f?!? zt7~ArZAr!srh^j$RpJmKM(OQx?9Hg2B9B)kfj!0iWE= zGO0u__-}fb4HrNZt4h~c$U%cbyK>#IdxtRK8^E`h=6PB14cpf^^nwVYY%e*!IG3U| zi9%gpAL>2?L(!8{sI~ksdLC~IcE$sJ zNN6E-4hK1}Xy605H@sJU#S{Px0P_&pa0p%U^NDsU8KtVn4tvc^hTg7noc{nMC5J4n z%Y0mGn#Ig3r|%G$0)qw6%ZRu`vSBlPZWm@t0_$BXED&jHpmG8}pvsh0)~?Ij8FvAh z@+FV`AY4}<fz%)BxNpA8wlw-}Xf)Qw`X zx1Z>gfEEL$5e<`77h~V=`%>6h9(vE5G^`flzRt=VrkIi zJY1zg;9UOHv_@eE$kUVw}54!bT|mOYcVLsd(1A-lnq_H0o6mic$4wMg3M~yrSw`J zwG%K)j~B=JlPwdSlZ~#G)2wtoV$|ERD{K;wd6)Qe)>k#CHBbl9?#+DDU>uy@u<;aw zJRszw<8V|i?Ho1tAp!uR_A0kkc!I-jFy#S^du$jbUJlO&%bL6LG43 z`bQXe1==OKA2TUtAkG~7T*QDB(xU4A@~Rn&kBQbJtFt$H{$eg+MJyP~GSv_ba;;v3 z9QP&K0eG&Ml*}R>I{cS&g)|F+F->EQ)C2^=1arNQH4;(MMew;0=WXf{3bH}jKj^~D zA!Jq72a}lKjJpQEL=m3@7HVYB4Hn~$&c84vT4XQ28cvz#mJ%gsmIq4na2!NSaPKd? zwChn|?;8vki{}t@LzSqZYswkk{p%oj1Bxp(-!LcvV#j&hceo9QPXpov#6gp{j~RqL zPV&VzR5f6v*CL}3Xcab99+9-;-CccwKt^Z~ngO+PzL9Jal}0+1^Bp0+4v$5|6#&q% zbgp@+Qf;S}WF8CYj@(QYa?1A2QeH~Qd5I|f6-Ei>2MDH|8iIW0Y~xmQ6QJVNUlH9K zRewoSlK!tp!t(5VXbQxVjFLe7=>gX0#?gat|xYpvqtJ-Snx7n1>WOWEH^X z`GKom&=MK#T@6cIxdj%Wa5g`gP0%g6#V{$1evpZY6Ja!8FA~-wHYx{rdVRGq-6HNB zi@vo4puh!~Y&;{77d&F*Sg!V7Dx*d=M2ca3eSmRk|A&+^wE`~GIpuI;3 zVGdZk)h)22WNqqj{Z6nY0GCaT-sU!O@*v`?$oH2SQA#<6>Qh2!uiU^`M!G!@NIh_+ zE2{qhcLaW5EMdGoIhc~57MF-U^%)y>>aD*`7nvf?jMiM_#_o{z#6mn?#9oH?`{xd> z=W~=Q%KSnBR?_+{oZPpC;8#}fMts&|UkS@fs}h|z85ey_~aV}}Ln z?Y~A=jl5RUux8KQz!5vxFN8wy=kpHDa7dcw{T?sUuxJswIl)ca{*mh{4JtUl-R2^s zGC0-%-~cLMvZw$oFlXLoBt+iy(#xBnUGbE0tZY*HwJ3lxCfwKJ6?CRe<#&%-m6Non zM)+Fm9kd|WYO#w?WDzbgI}5GEvfC}hYXHe_t=EQFm9$zFS6Qzf(2trR>0ABpGL6_f zQR@L!<*JWR)A(L7DCgCOB?oe~G6wl(BJp=(H)E5V;Fvisf+4MCzR@ThQ17F zro8x@>!ScNj{?4Hl! z3La6j&q=Z_ew@U=gK5fY{VpqYMwIUtTuyDMkS-DCE3nlP!~jrro*|@e2BOD!aNZM} zn2gZT2C2~G!x0ljIrd#I%xbI!O$FO;k1VUorG>BG`iN2hl&WQP{y)?mLftaFA9$d( zHB{Nkcp>IY4yTdMi&ei^MX<%9fM6*1SFn8A2@n{$NXn>!v4s3;VF7lg7r9Hd$^weS z4F&_y=>@QATDQ*>XNZrPiaK$eBb~sk!e#;z9#8lSq`)vMCDO2*(GAaw1W*Bh4kAcF zjEy5-3~L8;6{>pi?*O_QA(7_4e$t~|T|C%hJYoCFTELxxojO~u*AX!^vCSAey>khp z1rI`&0=To>l*js@t8Z2|!zK;|A4?80(<+$ml`wcyR+pDfL-8wGQj2w)`>dmFdPk?8 z^0bhm(iOzejf2KSjeqo z`k2@UA=0lroWN8^1q2eW^83qNS1>Lfxs;V#*95O@l8Ay7GVQIE+xVB1B_P>tGVDVY zig$92GNWXx27zwwERm7REenw3mR>qc5qgp=YD=A5lce0-H2Dbv8Ph|!LmUS z=a3YDUkv0{pd8h*i(99NS%?CVr%P(Kd%#~7(61T+;LUZ+p}c|w|=T{{RCJE1&^ttPh5)E`=MV6!Ujg1$Z3R0Sms*e#{beWz}K>MP6@t zhsei)fOtwwUO}TU>mH+A@Ke|xVVRQbmsAS%VIfh{=hqPdYg<*y{S}B>8tVcrm>t!t zt}z_4G`nLTkEW(U_A8ooWWW`_D_h(+$E+$MAgbO`!dFWrw5Z-hzMf(+iYcP6BkvWA zTASTwIk(^EJPyjw=U?N0MjW6Gj15#lc{%TC#xq#VcVzBbKyTmvin0I}_zK(R4NL-{ z0Y&-WJj%)2?+u>3M!Q0g$zQC-z@r*&+W2O8vBBtlE@upAQqOK%*1pg@64IUO@E_lZ zGT5LfM;y4;ekJHIdqzsd^x|TR3&^U&W%mvy31+ohw!7j4;&joVA1i+|2wz6iy`Q{G ziVE7_2x`Mqen&OVrX(CVIWP}z<{`OAjjeGj-4mik4rC4p*qZ_C7?uE1QqUlOp~ zz;hP!KGe(vvl(g{tli{>+s@JoJTIiW%HT5g`1?YHZcsb*^TfT!qQ#XR=AE@fU0zr1KbE?&NW9o_$5}uYS_W>bE-N-mNE{iyE~<~d!q?55yi7XLOmOLe9y9Gp^M-|KxNELOeSIzuPQ-N3q(P`fSfz+(Z=nc0|?Q2sZJiKo4h_g$=Tz>mglQt95f%dz^g|7+TREF(Czn zT<4+V{YsmomOQJNwvASp0oT**1XUe2oD!p=D$^5l2ht zuUORV;KJ*F^ioP%)Sz&P(XrPgx6bz3tyT-y7aqhpYg<`)y5E@6%v7j*w?O1FU&JL` z^m%JJB`R-?z+0~Ym@I1B9!t27O&VB&39;7&<7S{f)!3B9h3@Q_Z+um2Fv76IgJAN}e$1)l;uJDtlLjhgrcy1?JGkT81w*2yYY{vH zopfCu-!n`kqa_t*?z0ioL^fI9(k+E_mBp{tHDT*2?Dj9xT<2Eq4K{J-yusdEY-DI3 zIEc6~4^!R{w%;!jx`9Qt#20{Y^1473r*6`jm@D6L0k(Etu*O7bzB@q6qX&2!8Lzy& zyVGIbEBdlt0Cdf?RI$)35sRlK*J*Z`G}i|_-^65lTPUlto1PE$nAt=qZ*-yPMk|3g z2W{CBw{XD6&_(IZF1}{^tE@`HFfq&0Rl`jD&XUWaQQ*A%TnX4t)}Luu3}U=5f1ii| zR?%2)BT@HX@HSh+-cg#dpQww{|-TvxgAQZb5Px>jRJy^KL zW$H?#@HXHxu=?tzqY~ibA>GlH*(g*+opGDvjdU4XMBrCnLTz2{4GCUs92yF9o>;bo zt=(Fyqj6c+vcXPm;%4m;p?2F{c*Fok+|O%kygj(I@%L*KG@hl`2mz)#!h$NPwl6+wQ08j!A1G4NC?@U@0?Zj10Eh(54 zeX9p?Vo{6E00pD1HlC&|9Ly%`v-dLS8FaiL#G^@0upkR@ohX0~iFZTL`+PyLz>$}D z)L8{+iNiMOI~;eFkpl8sKNEmeoSV({WsJ=M(IF6=Q{e&5Ibbo++1gwvW~sr|A#5m= z#n+@1*6&r)DN7V|%FVlOp=(n4MV#)N*VPd9A=@y&nLx)mZG%n4ry7|IV&KIdJwAov zA>u3>;uwVe*&y2Bez=+v%5cU@!$eKGj zyhi|KTD5t^${h{{U)qY;5o~BrSS1h+v(o#o5c(HA>27*NSxN!ZbYC?cv1ozNwmWP5 z&@%_K2sD`(!kY5}kN5!!M*@NX`Wz&Pg$iG)3RN?w-cxq z0?=vV&v|g4a>dq9FyD2x8W&k^<>+d)Y3PT{t(*Wna^-t;iy(Dw8^)FBB8b)y&EnvA zLIB{kSbOKRHDhuI4S!HJf#}j(zn`D}nugL-!`^mNzwtbiJ|~1N2LAx!V7RJIcU4Qap`LSBSU=LyDeS7`)5Z;_+qA1)v3l2 zmV-WAgd_m2@u1J`&}co+U!%N1nw57J+{@3Txn^oCxp;^ITPJueiD`Cg#6?L-v6zD@ zi^f;+o+VT)b`|5}<`86r381@rY?eyHLr4LR{{Y{KhJy9V$JwYB-2|l%4;r?kG^cni zMJJQ(IA^dNuKv>tu`u>gjSvt`k*z+m&@fuVT|Oc(mN%uBN=2?e$XX+LwHy%t0E8#N zfV2uew06G{I4YFueF#*@EtxB%E$1xd#-_XreO)XbyMzmZyiJu=e$d4YTVOHB_c(!7 znYS@?w9jqAEC(R@6{cB;c?i3@PPv(lAOM>{WWNE*G^ZFb)8TL_+QhYiZQz;c0pK-* z@d~MX;5zGMr~sNZh_xVTdU&_F5TfA6Jv>J{hd`q{Pj}{1iMonWzlDgZu@tU{w_E$c zprq4UD6Xgf03U2#S+w>M9xs82X+9y~UqU<&)rx2ySgwQ8S-|i``T9;{dco|h7(?hV zgcv{ZP?cLEiVY5A+RRnB`C#qM3!QE%I6Im30K*5s)B~kNkXy3u-(xX;WDIQZADw7r`B2E zCEH9EzW)F+n51(J5YK&e>nt=78_KrdFb1W;YK}|KHPSqDVW~i3mGY8)DR-qN~7 zb5!pWI?nUXwq<1_#BnIF0_Aw@6E{(ojj#8phQOmfE~+yXdnv4aqh~-a)~Kie3zpe6 zZ_KFoxo5a|;vl^Mb|ePeFH9gJkAiH&em|)PKk+r zOpr_ffCn4_+AJYL*Dfvb8wDwJ*)Rk$<-r>@J2t>3d<5oVYjaAD66Zf%zzvSMdP+dD z8&`2bHB4h(vqT4aH_ktG1PpB~vX*71t;-azLq!FA9`TsLVUg%UEh6n~QCNr<2OzUY zt;Kds1+5o#*F-S7rFlF2%Qfbac3J2?BCwW0#?`L4h#h4>X3M>GGTa3m z+gPZ!R^gEANfEg=j>><_NmUbbCUAekSp~R|FgR=8qMkTF1ra?Bb(%1yfPLMu9uFiC zQ+!HjUQoQ#)-vLB>K{C6G*>Hd2FmV0O>6*u^m7&I_Eg+`(EXt=Xo>Z)vzw@wrLnuLPdAWWF0{o*4nOs>Jg%UH;j zMG525KIlusyY*wz;u3gE6fXq~yyChGfe@^&qyGTvx|(z3O_!x;j|af9Jw6C{7tKWS zK4Ef}Fwu0ucHd{{V!iCfdX} z1+`FS;*<-g7uIs1Sho(RXwsOyd_a}YE53M{HU`GvFcP|Sb>Y+&>;*;TOclsi@i7;c z3dlu50@N)^VxGO?FL_RoD4bO?&Un9RXFYnaYe(-{n?E>6bAji?Mk16|7&!KdkfBIL zP3*inmJ5j~AQftJjdqD^0Zc0v>HeXFMWCYd+NX9G%F=;e#;d$U6%29z<>hl{wj1gw0( zlfD6VU-bw;kWi>-^@q_%SVqWv%{H50CD;Piw_AnV}QNhKJbIJB{E@n{-o(}I@hCE z-LWVD6@htYlJhIRA^?=TKGLzacwM=F$<%i+TbJI6VgCRDxLA~spot(@6q#El8M>u5 ze7eDc4p!TGj=A@gb3(Aax0oXX5|qo=;ygY}x#J&*GjVHCSB&)`n&=TV?%pHhCbsNS z>bZ%q>B+%1a4ZgA+`t3}8wy_Xf)ci@XF7_z7NXYc#2{yZXHGBXRck_lMmj?*TS}#M zs3?rXN->4?V;&{OxS#+B0=TzN`O&f-XUd_QZ%WguJTKx4UW5xx=7=B5{bC#sD#wlB z{?nm658^xii&5JiR94Ep;QbAf^9GNg*U;C{U^>BDLE3VX51)hq%MSDx5a>WU5QorU z{Rly?p{PIcn3ljWvY)$CDvB*oPOro{@H89GKR;<{sFXYD5UQa~@Wfe{u>SxOu$Z|Q za*Bzit!J|O%2qmrdZlc!QFYdLt{oStQM7; z%raGV^BNHa*TH&zV3xx)8aR9LxGM~46|gB@pD_VoERbxvJ!NTH1)>b8>wgmX7FKA( zntpiVVir{cRh*ArJlA=H5dfuL4`Yo=>edVi&F;UsU$q>(wr%7*R-48b^F-ch_lpaX zFxqP|6eWv3O#0uv0kk+&=Yj|Y0|%#W@R`d}?uPtmeV{Vy#1#v!s6=*)ygqn}I*8Xt zwX%ll&mlI05WMYP%()V=qlC+fO7)kXvuw3=E{Dvf7WWy)9WL`xCW%NKoC?N%{7r66 zx1;0QWU)$}4d=(CyW`Ndx%HwS5GdG((yD04W}o3&QU_!$}5@ zBoVti3g)r*hyVj9ICb&;!bRCC+>5v-*tqKRDJWY5yW3uuGjOH=q1JE6#ARb>7h`{D zTuTKGIzJFtg<0Et2e-tnE;tWI?KU7%_L|pd6x*Z7Vhggm(dqn4+aOAeTvY7K!plo* zc~4*ST|S4r-?#iMV=SP~cYU&G%_lP8Tf?u3aNGvO>vbIgxkqj1KNAO-AjR3anA1aS z^-Ei|xJtJVh_=C3IrPU_$=gl?U%jD20@Y^10P9AMN`PQkb{pF{B^V|Y-TLA#5_G*1 z^Xb+SSnQSf)^oR*F#u&n6vx@|9d$4bn;IPK&oIf`o5~{Rz5PP5`vkGW@DI%1ubcKw z2kbj1!-9R-7ubXOgb1ds{*nIxHE-rMhr|5l&YlDD9sdASKGA=4Y|5>2~?<(dNZsmKx^qw;B1QfqnYTE^Vii-5Xx*B-ML+_`VTn8GX!7WsVq zL`vTBd}qvbr_tkB#3g8;J+eZExSo}A zq*m-4H^W}B^@(_8jQYTWSX!5-W>uy5=41dZK?ijF`oQJh=@n-M3SLK9kwm1G8DB&!u9p-Ld>wj9{Wpgh zYLG(M4pFE}0Tn5?JvR#E9_>|RKY5Bs4uQ=l`j&>!9Q6|u$_m2&01hSSCeoX(speWZ zw4ehEotF{TD-Ab9Jy3YWdvax#1&o$=;-&!_yKDE%OyaC6t%|-A4OR~R(^49y?kLhG z{ZHKcLbkwF;cUb2EGmGN#$IdIB!dcZqn|x{FzcyG)?A$;AyQJd*T&e<$ZT%)owf5V zNVKvFyb#>TZSI-`Yuq}@6<1hRG*(frvyePvU*zffttgZ~;a3jDMW0~-DquP$$!7Cy z5s*=FOfl}Z7ZTVqBZaDMS(3#?N?o59D+y3#Z!YlwilM!uUZ{>;RFRdXPo-RMT;G;S~_DsAyzpJD`wv>6O0(D!IKZA<4nl8 zBwsLVFwi3D_CgHBcR^mvv!mwc^ENj9;Ms|Jg^ScP)%c0H5pe9&FaH2%kuO+=`oN7; z59(IBPGA&gP*L1+d4^qP9hjE}TX63$Y}~%QK`IOxaA3@`>u7m^pOO<&ZT6Y8z?%6> za6MtrARJ-o1`p7L8S=+U8>I11=q6=0a{U_-^Hn)5&GU_LTueA=4;DZ7)ZY)67D4tBv;4(kBD5Y_lz& zxSY8l+RvpKi`&TL8!6LvVkE%BOSu+T_KZc@DiGNk%T^RyEgA zQ)=x@6reLlIOe5*Vlb)(7x(#=pcB2Yq>Fe><0d1fqKM(XY6&HovkP^H!2z`ece}jh z<0L?Aa&~`n8-f>0TKS3ajLOv2f}TrWux>R#Uco+PaTFIYr-22ag{o+3ubRy*>)L_F z%RbXC0+(%hb((}@0nAr6{{RsMV6&`cGm zc`lqG@XfOH`xFBDu3y4b7K{-pR&=A%S51o=2lR+!Y%FXX6~t#Uq6Y)Y^o0En0lHD{ z@!l(ID^cSKdUr3nk-6B**AP`jdXroIxnw8{YF|q6a;z2{k8be5moS`-X(d^gv=3v_ z7+pakcF#1O`^_cT5F*!JnrNgrkAt-^A1KYx57Y;0SWp$Uli>eP#U0@O83qm)(W^1&aC&7cYmbat)kI z&B44ww5gOlu^sy<%pWZ2C(=IZ&b2yC^_g^f%{md{Ytjz`@7|WRZNa>K3Yc*QD0KQ0 zcP+!dvYkms2~oM+WgfFGK49xmU7-5Gb%OPS1`uGu#6RFSXyot+FWE& zO@$oWeIThrAzo^sPz{tc<%l3SHXG@`w4w%Z$Vj{Cl^GSh)EL2lAI5yZwXKqY>1Jib zAhyP{zg(wp}9l%ObpU8?r<+@}Le8V3dUsO%hDF4`I|)>umoyAYt6SPjyX7k%|B z*@mws119hHh~TJ%z`DcJ{Yrg#dlG>5&%_~`CQ_|6i^^`~>1~4=Pyw^l@DWJP5g54T zvgu8&Z?wA-;Vg^zf-M6Ozt;l-S&d*}dN3X34X_Li7kYZi3kMZ3$&qOI({J>)g;uKeucN$>Rf(_}Tyr`B3dFuZ69j$1wI`IMo%qhlcJ>_ysk-VAa z=1iu=((2*HRE&x%p1o!u2q{qYh)6Y6-!rR3G*4$RSUd>(5ccZ#9Ig_ zIh;Qb(2&=7G~BYf{$<_4&M^lBG8}rxFI+C8vFHo-h-<`AJvX3!Vme+_{7!&*Zd9sG zV1JmKL!1cYFVhpOeNx*M?!zs?!3R)zi!h5YdAK$Z%ia=_onSipK$w9c+YcFNh(UFO zaY2I!Fkr#VK7t=WLJT0o{L2y1aYV6ge<*;sa9ce4&PEpGYVoKGQzSKu>fdNhvu@L# z7an+mHfsthpWk@i48>uZ8WR3UE6hX$wm_8uR$sn*ClgR`u4=wF?E8=M_!fdGfG>Q5xHN!d&DDXqUOI{ zHyeOQC?KT04}v7rv2xj;n4F@PPIG>;k#9y#QO95IRiT6{J8CMh4Q%GA%j+~L()mBA z^~Wy<1%TvX^mvGD2GBm@QYH}+8onc_u&*RAVzYPX8rpv?wmk5)rD*Q zY6r+U4!`Q=RhsU`{?S0n3NRZTdc*@^G^}~;9tAGwH=_Rl64#Esc$^Y>QFYIFjPLIA z?!o|7>5|9&)Hns13hPgAGV~T%Wzzb)z;EawzK_hMVuP{g8ki-0`Evd)EXJTlfTgH( z+)8+>e%z@+E1u81!JunS-?sx` z8?%QH@_=k!d;Cg;X-(T5P})Uy?&|YiyYzt+q8%6;`B-B?{Ro72TOBovxpjj@)Vd4X zv{3~Dxy)Pif-rCx0F-P!WkyeGfUCB8Fm57+$@QCKcz@zy&wIh7$Zt4igypmf0zmD-}<)$QO%o+I9Z`Qt}9CccagRA{=oJ z8>-Z%!m0!@`<}dA=wctt^ zh*s^;8@}eer<>)+nkTdm4s_0L?RfeWfO>7UW~38gGu?*A!$NmR`Q`GY}=<-|ip@5KyxwFY_0= zZ7+({0ggZ&8pqmIqLvD#n*2kZ3g$wA!?uwkE^%K0Q9E@11sJ5f+(~{EE?Ol zjv%xHx(=(gO3}awCIC4 zyX#f+FVziV0JmpqiZ!C3jMtlmeYka&eYw5R=ofS~eY?RBbTNu(zY?G^S~#n9`^2fp zySEir7k0W8ySyPSs!*%ytNHkg!sJ`NvF|kK%Ep}^F)BiUV*=hgZs2C-sdr89nHWv=%Us zpuT5%myfhOLynO_is34^*)$2@i2Rs{-91RYN37%@LI+p0-EnKzD%xp$Gi-Db3EE=i*@KZMxqd-?vE8t4!MVJZH>Ns;jEU z20ri{1y=wYKG8A;5n*QFp@gtDUpa-N%5e{3dWw&?cRcvzfjgM2+g}{O6=(~TaMY=RaQjAgmdY#piIrla40Y9K;9H6Fwk;q$@iDX^Es`->@b#}JqBvY&%XY;stsYRVHoXRuE zwgaDdny9E)8rQG$F@oZjq2jNdZdfH87(%kX-!TAPtwBc2o&F|Z7cOsxTpeh>k&3q2 z9RRI3<``L2jee}VUn}DAAIj;nLQ> zuM-9xO7#8A-eoLVoo|U|x{m(UMP9}j5hfHc=;YOA(KU){kKI+m+m^%0<@w70$f?j2aV>Ggp_Ja{6%tz!n| zl0e0Mo+d?-!d<+-z2R4q-6Y{F%sFHtgy4Gw>PQ|wDjcQoL|7pN!GBp*1M1Dz71~}_ zoq}T`^u!x=d7Lu}Dx$v-Zg)Ywz{i<&-Z{kIh$fTZiF7^6g$-}2M{b^3hk{$bj10>3 zg`E4q{{XZFW9=+p2Z%xto6H}f2uk`7cy~ZRLP-U6ULn$ebb;IGLLWj58u}3b06bP@ z)kcEgNo7lRG0+{&6s6Ilc)p*+2~bwmn=w%trqoudXLBiND06Y36uDiVeNUK_0{)+f z)vgBwa8v*zr4Ag+xmdK_8P!7B4r^Dp<|`GBtJB|zp|Wuns?F9*ub2x5E;~gTQaAcJ zi9xwRMp*R6#4W%9qOlt`;OI_m{{`r`Z zo2>Oea}2O#X?2VBjJa?CR?N5C&q&I{4b9tQKkkyNjY74ps`Gy`?F#U1YjM(Eup-sP zZX?JFw7x0>W*Kg{zlLrgY>nd?`T1aoI8Zh)@aQ9Y_Qx>>3-+u4Ft*En~a2%8>1lR{PF(cA;Q^M{cbu+yUy$OrD7gHi@O%Kl*Fgy>Gy%}M?i%%pG7DV+R;cg%$C6a6ygIpQnC2m% z$~Dd|99q>}1p#trJj%BY!M@U!-Ck;5IL*OJz;daVJ7F8@7awnQ>vVC&#poZZwyNtI zAw>hTPi#xcsdVMI+yDdBEm+7eWx@R@a1&RKg+Zc=RV(3?Xk@XQ%2MO!!P5VcJh z_UHSElQO>{+F)Nm+A;7~(lZHKI$}`f9FI)ZKt--gl#c%ZF-N-LbyM5Y;L1U1Oy4yu zEP&yB`P3E?#WFap{^}7e3$V3(e0;;aYOA2>u5ohSkh|PmV+dS2UCss!=HpO6fMSDw zrF+YUQK8yt$2kdsp;N@ly=lJ;$=w?cmoyW6PQg-JZ#>IKBbXoAC}4`|0m>e;!ggS9 zhUI;Ip>~<0hnR5$2+H)kBZ9$-Zs1`-=>oJKlP8F`H17<~E)w+u572=KMC}hKWvSXh zOTpgdyc=jxdOS-?`6C^md*_q}PtmB)dg2#sz-5fzwL;))TX($w03OoGrigRBwfUBXh9T#pFb7QaPSDdz7jNgp zd4;u7=9vEX3QWRY+KEOtY}HF$O&Q|lSx%q41hF$z$3^M(={RidQ32jgB4zUhuBkMT z;*wRJ%}b@)6vZJ}e8A8|90wfx!GHyZy?>b0Qo^BB*Iw`eA;RN4EL{sA14&i+isZhR zN0R$}rXUKW=DU2#)C+al9)02g(ExFa_J~Td%NBn9pdf%l46Wz)wA`V>`?|+sEa$cK z`HG;tCAf{h1VBr}Ba6lGtLp^yF-o>j^{;71Xe=dN6UDzhB@7E2K6%7z8EDmQskANO z)&c@p*Sx!IUPw9O{{Wd)3=z=ym(j@-jhZO-V%-qUH^J8t5wfPiZQ<5}4SW<(RM#gj zXnKg=t>XO3TEf`OSc)jRv3Mh|i2y44IhhTc4(NH1*(v=klEi3i4 zE*lC1HyBt}_Ym6YH0 z?GrT%FI4Hi+krT1R4k;6@Ox$L%DNkeV(%8$hA-roC4~jGL_4CuwP(T_FzR6hY;VNq3&|^3PfXMskomcWs)QRt2Vjrf`SUQCm z+{zY-kYxl^feA4 zC~bi{d(PSg)%1r!o-+L<`$0K_>o4;NeMo%>eGl^}wJB?~zyVjBaUEz%1^@$M|D)Udn_=pArZkiW&>r(Cx zGi4a?Y9K@>9E}#aTKQ#>xQ7mFo-r!~$XuN`7 zQYMZjQVxMZwl9l`&=R@zm5P>d;yA1E<`mwX!y|7-CC5z8VtX=AF}0SBc1_psGUurE z!;BBfDu4i`OdMalWk3$aww}?&XoVWPr_z`VD@r^ogoApp@r$f@in6BgWrtfDP6$knKT}9R1 z<&dhdIsQp(tfE!Y71uk|NzH+2)zhcEQX+Kd@%+KAfvIUo<;^{1nd%W;DyFJy=e0F8 z;1_m83{!#>v#y2q%o{69V@=mjf0ncJDu}Z(@w<}w6!p?K)+89wJ6}K4| zQj!C~MYC6_wl_|v6=#j}?{B@D9;L#ha#Sm|GnE-F<(VKoJ(I#dOXy?JK~_S7Nqx z0{l!+i~)WB05vi)rEd7fxQQyDR&CkUxnLEGR+6>nFtuE(MWI`m;!reR`V49WR}PQd z&0^BaQF!&txzsg03O{jD@}NS0U+O)bz}rqsBL$nHGIftT`Gl2cIP-`i{qqq^$Iu98 zQC}E}uDneS(zDtYzlb^Hk&Tt?k!~JG^AUIAVzv?5*jMnM-T=$^q6dmj@tmhiRs79& zsu&J{I~4~cyMw|TsnPTt<`oEizJ*Xx)OLa%2ANoV8 z_m+07B7_)15MdN28vt@j^?`wemV^ri8;1V?$u@Gg+8Q0xRuL!xAROiB=3!n|IN;Cg z$9Yj>K$tAA%+)HVK5IUm<5zUEjbhn;g`?6pzNj4 zInOLw1=t+>^8*xP)L`59nQMU(taDY)W#M)nqEH#5S$z15j58^#)cS5Sbi_|#j2)wq zMNpa0Vj_-$fJ|9Yvm@nlp5D<5v4Y`lp7Gs<^iuO*aw!O9u*R+Z_lTef!f0IY_bj4l zgR;Iy$GlZ&s=-58ed#_WP@C&wYsF5O=2hNsdco|`tZa^e$QM=1{9+V%5y9RC&c>6x zb|$5UK+l)gT*BdXGqYt?O((I5kh1$k1X{!G9Tl#u0>60HjTwbKdqCR2?9O86iq)3+ zetsf|Py(}5gYHVqje)lnw(noAQCR_kw|c+aQ<=jhFc4xm3V!6 z_Jw2Y+qU?dL}#fm&7+JykttOhYP{TAi50P{=hrcI*a#@2kKU0E!ZI6gP#xT@ZEHoJ zchrRsyKOx^pcgq&hXS1c0I0NKngL~QxVs-neL-Tn@IxEU^ti?DCm_hypi9ea7T=f> z%eo@Mk$biLP62*T%vdRP0SU|TrG20_*LV1V;-2>X

    E8HG}HSiFAqUM4S+0s>s#4oW3#qS8NEc0{ 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 Date: Wed, 4 Jun 2025 21:09:35 +0200 Subject: [PATCH 28/96] Allow adjusting lighter and darker as well in theme files --- novelwriter/gui/theme.py | 59 +++++++++++++++++--------------- tests/test_gui/test_gui_theme.py | 41 ++++++++++++++-------- 2 files changed, 58 insertions(+), 42 deletions(-) diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 46adebbb..89d3fecd 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -244,32 +244,6 @@ class GuiTheme: window = palette.window().color() return text.lightnessF() > window.lightnessF() - def parseColor(self, value: str, default: QColor = QtBlack) -> QColor: - """Parse a string as a colour value.""" - if value in self._qColors: - # Named colour - return self._qColors[value] - elif value.startswith("#") and len(value) == 7: - # Assume #RRGGBB - return QColor.fromString(value) - elif value.startswith("#") and len(value) == 9: - # Assume #RRGGBBAA and convert to #AARRGGBB - return QColor.fromString(f"#{value[7:9]}{value[1:7]}") - elif ":" in value: - # Colour name and alpha - name, _, alpha = value.partition(":") - color = QColor(self._qColors.get(name.strip(), default)) - color.setAlpha(checkInt(alpha, 255)) - return color - elif "," in value: - # Integer red, green, blue, alpha - data = value.split(",") - result = [0, 0, 0, 255] - for i in range(min(len(data), 4)): - result[i] = checkInt(data[i].strip(), result[i]) - return QColor(*result) - return default - def loadTheme(self, force: bool = False) -> bool: """Load the currently specified GUI theme. The boolean return can be used to determine if the GUI needs refreshing. @@ -489,6 +463,37 @@ class GuiTheme: # Internal Functions ## + def _parseColor(self, value: str, default: QColor = QtBlack) -> QColor: + """Parse a string as a colour value.""" + if value in self._qColors: + # Named colour + return self._qColors[value] + elif value.startswith("#") and len(value) == 7: + # Assume #RRGGBB + return QColor.fromString(value) + elif value.startswith("#") and len(value) == 9: + # Assume #RRGGBBAA and convert to #AARRGGBB + return QColor.fromString(f"#{value[7:9]}{value[1:7]}") + elif ":" in value: + # Colour name and alpha + name, _, adjust = value.partition(":") + color = QColor(self._qColors.get(name.strip(), default)) + if adjust.startswith("L"): + color = color.lighter(checkInt(adjust[1:], 100)) + elif adjust.startswith("D"): + color = color.darker(checkInt(adjust[1:], 100)) + else: + color.setAlpha(checkInt(adjust, 255)) + return color + elif "," in value: + # Integer red, green, blue, alpha + data = value.split(",") + result = [0, 0, 0, 255] + for i in range(min(len(data), 4)): + result[i] = checkInt(data[i].strip(), result[i]) + return QColor(*result) + return default + def _setBaseColor(self, key: str, color: QColor) -> None: """Set the colour for a named colour.""" self._qColors[key] = QColor(color) @@ -544,7 +549,7 @@ class GuiTheme: def _readColor(self, parser: ConfigParser, section: str, name: str) -> QColor: """Parse a colour value from a config string.""" - return self.parseColor(parser.get(section, name, fallback="default")) + return self._parseColor(parser.get(section, name, fallback="default")) def _setPalette( self, parser: ConfigParser, section: str, name: str, value: QPalette.ColorRole diff --git a/tests/test_gui/test_gui_theme.py b/tests/test_gui/test_gui_theme.py index d14304d1..4c834d38 100644 --- a/tests/test_gui/test_gui_theme.py +++ b/tests/test_gui/test_gui_theme.py @@ -52,29 +52,40 @@ def testGuiTheme_ParseColor(): theme._qColors["red"] = QColor(255, 0, 0) theme._qColors["green"] = QColor(0, 255, 0) theme._qColors["blue"] = QColor(0, 0, 255) + theme._qColors["grey"] = QColor(127, 127, 127) # By Name - assert theme.parseColor("red").getRgb() == (255, 0, 0, 255) - assert theme.parseColor("green").getRgb() == (0, 255, 0, 255) - assert theme.parseColor("blue").getRgb() == (0, 0, 255, 255) - assert theme.parseColor("bob").getRgb() == (0, 0, 0, 255) + assert theme._parseColor("red").getRgb() == (255, 0, 0, 255) + assert theme._parseColor("green").getRgb() == (0, 255, 0, 255) + assert theme._parseColor("blue").getRgb() == (0, 0, 255, 255) + assert theme._parseColor("bob").getRgb() == (0, 0, 0, 255) # CSS Format - assert theme.parseColor("#ff0000").getRgb() == (255, 0, 0, 255) - assert theme.parseColor("#ff00007f").getRgb() == (255, 0, 0, 127) - assert theme.parseColor("#ff00").getRgb() == (0, 0, 0, 255) # Too short -> ignored - assert theme.parseColor("#ff00007f15").getRgb() == (0, 0, 0, 255) # Too long -> ignored + assert theme._parseColor("#ff0000").getRgb() == (255, 0, 0, 255) + assert theme._parseColor("#ff00007f").getRgb() == (255, 0, 0, 127) + assert theme._parseColor("#ff00").getRgb() == (0, 0, 0, 255) # Too short -> ignored + assert theme._parseColor("#ff00007f15").getRgb() == (0, 0, 0, 255) # Too long -> ignored # Name + Alpha - assert theme.parseColor("red:255").getRgb() == (255, 0, 0, 255) - assert theme.parseColor("red:127").getRgb() == (255, 0, 0, 127) - assert theme.parseColor("red:512").getRgb() == (255, 0, 0, 255) # Value truncated + assert theme._parseColor("red:255").getRgb() == (255, 0, 0, 255) + assert theme._parseColor("red:127").getRgb() == (255, 0, 0, 127) + assert theme._parseColor("red:512").getRgb() == (255, 0, 0, 255) # Value truncated + + # Name + Lighter + assert theme._parseColor("grey:L100").getRgb() == (127, 127, 127, 255) + assert theme._parseColor("grey:L150").getRgb() == (190, 190, 190, 255) + assert theme._parseColor("grey:L50").getRgb() == (63, 63, 63, 255) + + # Name + Darker + assert theme._parseColor("grey:D100").getRgb() == (127, 127, 127, 255) + assert theme._parseColor("grey:D150").getRgb() == (85, 85, 85, 255) + assert theme._parseColor("grey:D50").getRgb() == (254, 254, 254, 255) # Values - assert theme.parseColor("255, 0, 0").getRgb() == (255, 0, 0, 255) - assert theme.parseColor("255, 0, 0, 255").getRgb() == (255, 0, 0, 255) - assert theme.parseColor("255, 0, 0, 127").getRgb() == (255, 0, 0, 127) - assert theme.parseColor("255, 0, 0, 127, 42").getRgb() == (255, 0, 0, 127) # Truncated + assert theme._parseColor("255, 0, 0").getRgb() == (255, 0, 0, 255) + assert theme._parseColor("255, 0, 0, 255").getRgb() == (255, 0, 0, 255) + assert theme._parseColor("255, 0, 0, 127").getRgb() == (255, 0, 0, 127) + assert theme._parseColor("255, 0, 0, 127, 42").getRgb() == (255, 0, 0, 127) # Truncated @pytest.mark.gui From 57b6b92e04f3fecaab7ab136ed7d06fc27354f7b Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 4 Jun 2025 22:01:12 +0200 Subject: [PATCH 29/96] Update themes --- novelwriter/assets/themes/default_dark.conf | 2 +- novelwriter/assets/themes/default_light.conf | 2 +- novelwriter/assets/themes/dracula.conf | 4 +-- novelwriter/assets/themes/grey_dark.conf | 34 +++++++++---------- novelwriter/assets/themes/grey_light.conf | 34 +++++++++---------- novelwriter/assets/themes/light_owl.conf | 2 +- novelwriter/assets/themes/night_owl.conf | 4 +-- novelwriter/assets/themes/snazzy.conf | 8 ++--- novelwriter/assets/themes/solarized_dark.conf | 12 +++---- .../assets/themes/solarized_light.conf | 12 +++---- novelwriter/assets/themes/tango_dark.conf | 8 ++--- novelwriter/assets/themes/tango_light.conf | 6 ++-- novelwriter/assets/themes/tomorrow.conf | 2 +- novelwriter/assets/themes/tomorrow_night.conf | 2 +- .../assets/themes/tomorrow_night_blue.conf | 2 +- .../assets/themes/tomorrow_night_bright.conf | 2 +- .../themes/tomorrow_night_eighties.conf | 2 +- 17 files changed, 69 insertions(+), 69 deletions(-) diff --git a/novelwriter/assets/themes/default_dark.conf b/novelwriter/assets/themes/default_dark.conf index e2e41efb..267fbcb0 100644 --- a/novelwriter/assets/themes/default_dark.conf +++ b/novelwriter/assets/themes/default_dark.conf @@ -54,7 +54,7 @@ background = #363636 text = default link = blue headertext = green -headertag = green:160 +headertag = green:D150 emphasis = orange dialog = blue altdialog = blue diff --git a/novelwriter/assets/themes/default_light.conf b/novelwriter/assets/themes/default_light.conf index ad38e0e7..e08de69f 100644 --- a/novelwriter/assets/themes/default_light.conf +++ b/novelwriter/assets/themes/default_light.conf @@ -54,7 +54,7 @@ background = #ffffff text = #000000 link = blue headertext = green -headertag = green:160 +headertag = green:L135 emphasis = orange dialog = blue altdialog = blue diff --git a/novelwriter/assets/themes/dracula.conf b/novelwriter/assets/themes/dracula.conf index 0d5dd373..ed1f1e92 100644 --- a/novelwriter/assets/themes/dracula.conf +++ b/novelwriter/assets/themes/dracula.conf @@ -70,7 +70,7 @@ background = #282a36 text = #f8f8f2 link = #ff79c6 headertext = purple -headertag = #bd93f9a0 +headertag = purple:D150 emphasis = orange dialog = green altdialog = yellow @@ -85,4 +85,4 @@ spellcheckline = red errorline = green replacetag = yellow modifier = cyan -texthighlight = #f1fa8c60 +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/grey_dark.conf b/novelwriter/assets/themes/grey_dark.conf index c51879a3..de9a1f35 100644 --- a/novelwriter/assets/themes/grey_dark.conf +++ b/novelwriter/assets/themes/grey_dark.conf @@ -8,7 +8,7 @@ license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] -default = #cccccc +default = #c8c8c8 faded = #949494 red = #f2777a orange = #f99139 @@ -44,28 +44,28 @@ link = blue linkvisited = blue [GUI] -helptext = #a4a4a4 +helptext = default:D120 fadedtext = faded errortext = red [Syntax] background = #363636 -text = #c8c8c8 -link = #c8c8c8 -headertext = #e1e1e1 -headertag = #e1e1e1a0 -emphasis = #c8c8c8 -dialog = #c8c8c8 -altdialog = #c8c8c8 -note = #c8c8c8 +text = default +link = default +headertext = default:L115 +headertag = default:D125 +emphasis = default +dialog = default +altdialog = default +note = default hidden = faded -shortcode = #e1e1e1 -keyword = #e1e1e1 -tag = #c8c8c8 -value = #c8c8c8 -optional = #e1e1e1 +shortcode = default:L115 +keyword = default:L115 +tag = default +value = default +optional = default:L115 spellcheckline = red errorline = green -replacetag = #e1e1e1 -modifier = #e1e1e1 +replacetag = default:L115 +modifier = default:L115 texthighlight = #ffffff40 diff --git a/novelwriter/assets/themes/grey_light.conf b/novelwriter/assets/themes/grey_light.conf index 3bd22238..ace40f8c 100644 --- a/novelwriter/assets/themes/grey_light.conf +++ b/novelwriter/assets/themes/grey_light.conf @@ -8,7 +8,7 @@ license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] -default = #303030 +default = #282828 faded = #6c6c6c red = #a62a2d orange = #b36829 @@ -44,28 +44,28 @@ link = blue linkvisited = blue [GUI] -helptext = #5c5c5c +helptext = default:L225 fadedtext = faded errortext = red [Syntax] background = #ffffff -text = #141414 -link = #141414 -headertext = #000000 -headertag = #000000a0 -emphasis = #141414 -dialog = #141414 -altdialog = #141414 -note = #141414 +text = default +link = default +headertext = default:D200 +headertag = default:L400 +emphasis = default +dialog = default +altdialog = default +note = default hidden = faded -shortcode = #000000 -keyword = #000000 -tag = #141414 -value = #141414 -optional = #000000 +shortcode = default:D200 +keyword = default:D200 +tag = default +value = default +optional = default:D200 spellcheckline = red errorline = green -replacetag = #000000 -modifier = #000000 +replacetag = default:D200 +modifier = default:D200 texthighlight = #00000040 diff --git a/novelwriter/assets/themes/light_owl.conf b/novelwriter/assets/themes/light_owl.conf index 8851b0d2..512f4019 100644 --- a/novelwriter/assets/themes/light_owl.conf +++ b/novelwriter/assets/themes/light_owl.conf @@ -77,7 +77,7 @@ headertag = blue:160 emphasis = orange dialog = green altdialog = yellow -note = #80764b +note = yellow:D175 hidden = faded shortcode = blue keyword = red diff --git a/novelwriter/assets/themes/night_owl.conf b/novelwriter/assets/themes/night_owl.conf index 3e0a5aca..2fbf7d60 100644 --- a/novelwriter/assets/themes/night_owl.conf +++ b/novelwriter/assets/themes/night_owl.conf @@ -32,7 +32,7 @@ default = #d6deeb faded = #637777 red = #f78c6c orange = #ecc48d -yellow = #addb67 +yellow = #ffeb95 green = #addb67 cyan = #7fdbca blue = #82aaff @@ -77,7 +77,7 @@ headertag = blue:160 emphasis = orange dialog = green altdialog = yellow -note = #fff9ca +note = yellow:L115 hidden = faded shortcode = blue keyword = red diff --git a/novelwriter/assets/themes/snazzy.conf b/novelwriter/assets/themes/snazzy.conf index 737107e7..f2fa7785 100644 --- a/novelwriter/assets/themes/snazzy.conf +++ b/novelwriter/assets/themes/snazzy.conf @@ -66,12 +66,12 @@ background = #fafbfc text = default link = blue headertext = green -headertag = #2dae58a0 +headertag = green:D125 emphasis = purple dialog = blue altdialog = yellow -note = #78bbb9 -hidden = #9194a2 +note = cyan +hidden = purple:D150 shortcode = purple keyword = blue tag = green @@ -81,4 +81,4 @@ spellcheckline = red errorline = green replacetag = cyan modifier = purple -texthighlight = #cf9c0060 +texthighlight = yellow:96 diff --git a/novelwriter/assets/themes/solarized_dark.conf b/novelwriter/assets/themes/solarized_dark.conf index 495d68eb..8b07003a 100644 --- a/novelwriter/assets/themes/solarized_dark.conf +++ b/novelwriter/assets/themes/solarized_dark.conf @@ -58,12 +58,12 @@ button = #073642 buttontext = default brighttext = #073642 highlight = cyan -highlightedtext = #002b36 +highlightedtext = default link = blue linkvisited = blue [GUI] -helptext = purple +helptext = cyan fadedtext = faded errortext = red @@ -71,18 +71,18 @@ errortext = red background = #073642 text = default link = blue -headertext = default:196 +headertext = default:D125 headertag = cyan emphasis = blue dialog = cyan altdialog = cyan -note = cyan:196 -hidden = default:196 +note = cyan:L115 +hidden = default:D150 shortcode = yellow keyword = green tag = orange value = orange -optional = cyan:196 +optional = cyan:L115 spellcheckline = orange errorline = red replacetag = green diff --git a/novelwriter/assets/themes/solarized_light.conf b/novelwriter/assets/themes/solarized_light.conf index bfdcdad1..22b165b9 100644 --- a/novelwriter/assets/themes/solarized_light.conf +++ b/novelwriter/assets/themes/solarized_light.conf @@ -59,12 +59,12 @@ button = #eee8d5 buttontext = default brighttext = #eee8d5 highlight = cyan -highlightedtext = #fdf6e3 +highlightedtext = default link = blue linkvisited = blue [GUI] -helptext = purple +helptext = cyan fadedtext = faded errortext = red @@ -72,18 +72,18 @@ errortext = red background = #eee8d5 text = default link = blue -headertext = default:196 +headertext = default:L125 headertag = cyan emphasis = blue dialog = cyan altdialog = cyan -note = cyan:196 -hidden = default:196 +note = cyan:D125 +hidden = default:L200 shortcode = yellow keyword = green tag = orange value = orange -optional = cyan:196 +optional = cyan:D125 spellcheckline = orange errorline = red replacetag = green diff --git a/novelwriter/assets/themes/tango_dark.conf b/novelwriter/assets/themes/tango_dark.conf index dd0b9746..252bce4d 100644 --- a/novelwriter/assets/themes/tango_dark.conf +++ b/novelwriter/assets/themes/tango_dark.conf @@ -41,20 +41,20 @@ note = yellow window = #555753 windowtext = default base = #2e3436 -alternatebase = #888a85 +alternatebase = #454e51 text = default tooltipbase = #ffffc0 tooltiptext = #15150d button = #555753 buttontext = default brighttext = #555753 -highlight = #2c98f7 +highlight = blue highlightedtext = #ffffff link = blue linkvisited = blue [GUI] -helptext = #e9b96e +helptext = orange fadedtext = faded errortext = red @@ -67,7 +67,7 @@ headertag = blue:160 emphasis = orange dialog = green altdialog = yellow -note = #fcf2a4 +note = yellow:L115 hidden = faded shortcode = blue keyword = red diff --git a/novelwriter/assets/themes/tango_light.conf b/novelwriter/assets/themes/tango_light.conf index 047be605..c702de8d 100644 --- a/novelwriter/assets/themes/tango_light.conf +++ b/novelwriter/assets/themes/tango_light.conf @@ -48,13 +48,13 @@ tooltiptext = #15150d button = #d3d7cf buttontext = default brighttext = #d3d7cf -highlight = #3087c6 +highlight = blue:L200 highlightedtext = #ffffff link = blue linkvisited = blue [GUI] -helptext = #8f5902 +helptext = orange fadedtext = faded errortext = red @@ -67,7 +67,7 @@ headertag = blue:160 emphasis = orange dialog = green altdialog = yellow -note = #a78800 +note = yellow:D125 hidden = faded shortcode = blue keyword = red diff --git a/novelwriter/assets/themes/tomorrow.conf b/novelwriter/assets/themes/tomorrow.conf index b37ab4be..2736fdae 100644 --- a/novelwriter/assets/themes/tomorrow.conf +++ b/novelwriter/assets/themes/tomorrow.conf @@ -73,7 +73,7 @@ background = #ffffff text = #4d4d4c link = blue headertext = blue -headertag = blue:160 +headertag = blue:L135 emphasis = orange dialog = green altdialog = yellow diff --git a/novelwriter/assets/themes/tomorrow_night.conf b/novelwriter/assets/themes/tomorrow_night.conf index ea94cdec..c266b31d 100644 --- a/novelwriter/assets/themes/tomorrow_night.conf +++ b/novelwriter/assets/themes/tomorrow_night.conf @@ -73,7 +73,7 @@ background = #1d1f21 text = default link = blue headertext = blue -headertag = blue:160 +headertag = blue:D150 emphasis = orange dialog = green altdialog = yellow diff --git a/novelwriter/assets/themes/tomorrow_night_blue.conf b/novelwriter/assets/themes/tomorrow_night_blue.conf index 8ac01e1e..f96448af 100644 --- a/novelwriter/assets/themes/tomorrow_night_blue.conf +++ b/novelwriter/assets/themes/tomorrow_night_blue.conf @@ -73,7 +73,7 @@ background = #002451 text = default link = blue headertext = blue -headertag = blue:160 +headertag = blue:D150 emphasis = orange dialog = green altdialog = yellow diff --git a/novelwriter/assets/themes/tomorrow_night_bright.conf b/novelwriter/assets/themes/tomorrow_night_bright.conf index 4a0bbd9c..82cac1d0 100644 --- a/novelwriter/assets/themes/tomorrow_night_bright.conf +++ b/novelwriter/assets/themes/tomorrow_night_bright.conf @@ -73,7 +73,7 @@ background = #000000 text = default link = blue headertext = blue -headertag = blue:160 +headertag = blue:D150 emphasis = orange dialog = green altdialog = yellow diff --git a/novelwriter/assets/themes/tomorrow_night_eighties.conf b/novelwriter/assets/themes/tomorrow_night_eighties.conf index 8f9850fa..e14b0dac 100644 --- a/novelwriter/assets/themes/tomorrow_night_eighties.conf +++ b/novelwriter/assets/themes/tomorrow_night_eighties.conf @@ -73,7 +73,7 @@ background = #2d2d2d text = default link = blue headertext = blue -headertag = blue:160 +headertag = blue:D150 emphasis = orange dialog = green altdialog = yellow From a92f9d7a6f336c57d9ce81cf96af7a7f5b4194a4 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 4 Jun 2025 22:23:26 +0200 Subject: [PATCH 30/96] Update docs --- docs/source/more/customise.rst | 83 ++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 40 deletions(-) diff --git a/docs/source/more/customise.rst b/docs/source/more/customise.rst index 8f3d2f60..7b56197a 100644 --- a/docs/source/more/customise.rst +++ b/docs/source/more/customise.rst @@ -59,24 +59,24 @@ A colour theme ``.conf`` file consists of the following settings: licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] - default = #303030 - faded = #6c6c6c - red = #a62a2d - orange = #b36829 - yellow = #a68542 - green = #296629 - cyan = #269999 - blue = #3a70a6 - purple = #b35ab3 + default = #303030 + faded = #6c6c6c + red = #a62a2d + orange = #b36829 + yellow = #a68542 + green = #296629 + cyan = #269999 + blue = #3a70a6 + purple = #b35ab3 [Project] - root = blue - folder = yellow - file = default - title = green - chapter = red - scene = blue - note = yellow + root = blue + folder = yellow + file = default + title = green + chapter = red + scene = blue + note = yellow [Palette] window = #efefef @@ -95,31 +95,31 @@ A colour theme ``.conf`` file consists of the following settings: linkvisited = blue [GUI] - helptext = #5c5c5c - fadedtext = #6c6c6c - errortext = red + helptext = #5c5c5c + fadedtext = #6c6c6c + errortext = red [Syntax] - background = #ffffff - text = #000000 - link = blue - headertext = green - headertag = green:160 - emphasis = orange - dialog = blue - altdialog = blue - note = yellow - hidden = faded - shortcode = green - keyword = red - tag = green - value = blue - optional = green - spellcheckline = red - errorline = green - replacetag = green - modifier = green - texthighlight = #c8c80060 + background = #ffffff + text = #000000 + link = blue + headertext = green + headertag = green:L135 + emphasis = orange + dialog = blue + altdialog = blue + note = yellow + hidden = faded + shortcode = green + keyword = red + tag = green + value = blue + optional = green + spellcheckline = red + errorline = green + replacetag = green + modifier = green + texthighlight = #c8c80060 Theme Sections @@ -149,12 +149,15 @@ There are several ways to enter colour values: .. csv-table:: Colour Formats :header: "Syntax", "Description" + :widths: 15, 85 :class: "tight-table" "``#RRGGBB``", "A CSS style hexadecimal values, like ``#ff0000`` for red." "``#RRGGBBAA``", "A CSS style hexadecimal values with transparency, like ``#ff00007f`` for half-transparent red." "``name``", "A name referring to one of the colours already specified under the ``[Base]`` section, like ``red``. Note that you should not use named colours in the ``[Base]`` section itself as that may have unintended results." - "``name:alpha``", "A name referring to one of the colours already specified under the ``[Base]`` section, with a transparency value added. The alpha value must be in the range ``0`` to ``255``, like ``red:127`` for half-transparent red." + "``name:255``", "A name referring to one of the colours already specified under the ``[Base]`` section, with a transparency value added. The value must be in the range ``0`` to ``255``, like ``red:127`` for half-transparent red." + "``name:L100``", "A name referring to one of the colours already specified under the ``[Base]`` section, where the L-number is a percentage value that makes it lighter. The value must be greater than ``0``. ``L100`` means no change." + "``name:D100``", "A name referring to one of the colours already specified under the ``[Base]`` section, where the D-number is a percentage value that makes it darker. The value must be greater than ``0``. ``D100`` means no change." "``r, g, b``", "A set of red, green and blue numbers in the range ``0`` to ``255``, like ``255, 0, 0`` for red." "``r, g, b, a``", "A set of red, green, blue and alpha numbers in the range ``0`` to ``255``, like ``255, 0, 0, 127`` for half-transparent red." From 550cba2f43b3471d4f4cc6d6827ed07892054d01 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 5 Jun 2025 18:15:31 +0200 Subject: [PATCH 31/96] Add theme settings for active icons, a base colour, and accent palette colour (#2382) --- novelwriter/constants.py | 1 + novelwriter/core/item.py | 8 ++-- novelwriter/extensions/switch.py | 7 +++- novelwriter/gui/itemdetails.py | 10 +---- novelwriter/gui/theme.py | 65 +++++++++++++++++++------------- tests/test_gui/test_gui_theme.py | 7 ++-- 6 files changed, 54 insertions(+), 44 deletions(-) diff --git a/novelwriter/constants.py b/novelwriter/constants.py index 5b7b260d..8c9da88e 100644 --- a/novelwriter/constants.py +++ b/novelwriter/constants.py @@ -445,6 +445,7 @@ class nwLabels: THEME_COLORS: Final[dict[str, str]] = { "theme": QT_TRANSLATE_NOOP("Constant", "Theme Colours"), "default": QT_TRANSLATE_NOOP("Constant", "Foreground Colour"), + "base": QT_TRANSLATE_NOOP("Constant", "Background Colour"), "faded": QT_TRANSLATE_NOOP("Constant", "Faded Colour"), "red": QT_TRANSLATE_NOOP("Constant", "Red"), "orange": QT_TRANSLATE_NOOP("Constant", "Orange"), diff --git a/novelwriter/core/item.py b/novelwriter/core/item.py index a8f2fbbd..367fa446 100644 --- a/novelwriter/core/item.py +++ b/novelwriter/core/item.py @@ -363,13 +363,13 @@ class NWItem: """ if self.isFileType(): key = "checked" if self._active else "unchecked" - color = "green" if self._active else "red" + color = "active" if self._active else "inactive" text = trConst(nwLabels.ACTIVE_NAME[key]) - icon = SHARED.theme.getIcon(key, color) else: + key = "noncheckable" + color = "disabled" text = "" - icon = SHARED.theme.getIcon("noncheckable", "faded") - return text, icon + return text, SHARED.theme.getIcon(key, color) ## # Checker Methods diff --git a/novelwriter/extensions/switch.py b/novelwriter/extensions/switch.py index 4699d50a..0a11f52f 100644 --- a/novelwriter/extensions/switch.py +++ b/novelwriter/extensions/switch.py @@ -33,7 +33,7 @@ from novelwriter.types import QtNoPen, QtPaintAntiAlias, QtSizeFixed class NSwitch(QAbstractButton): - __slots__ = ("_offset", "_rH", "_rR", "_xH", "_xR", "_xW") + __slots__ = ("_cOff", "_cOn", "_offset", "_rH", "_rR", "_xH", "_xR", "_xW") def __init__(self, parent: QWidget, height: int = 0) -> None: super().__init__(parent=parent) @@ -44,6 +44,9 @@ class NSwitch(QAbstractButton): self._rH = self._xH - 4 self._rR = self._xR - 2 + self._cOn = SHARED.theme.accentCol + self._cOff = self.palette().alternateBase() + self.setCheckable(True) self.setSizePolicy(QtSizeFixed, QtSizeFixed) self.setFixedWidth(self._xW) @@ -97,7 +100,7 @@ class NSwitch(QAbstractButton): painter.setOpacity(1.0 if self.isEnabled() else 0.5) painter.setPen(palette.highlight().color() if self.hasFocus() else palette.mid().color()) - painter.setBrush(palette.highlight() if self.isChecked() else palette.alternateBase()) + painter.setBrush(self._cOn if self.isChecked() else self._cOff) painter.drawRoundedRect(0, 0, self._xW, self._xH, self._xR, self._xR) painter.setPen(QtNoPen) diff --git a/novelwriter/gui/itemdetails.py b/novelwriter/gui/itemdetails.py index 9bece183..7bffb923 100644 --- a/novelwriter/gui/itemdetails.py +++ b/novelwriter/gui/itemdetails.py @@ -233,14 +233,8 @@ class GuiItemDetails(QWidget): # Label # ===== - if nwItem.isFileType(): - if nwItem.isActive: - self.labelIcon.setPixmap(SHARED.theme.getPixmap("checked", (iPx, iPx), "green")) - else: - self.labelIcon.setPixmap(SHARED.theme.getPixmap("unchecked", (iPx, iPx), "red")) - else: - self.labelIcon.setPixmap(SHARED.theme.getPixmap("noncheckable", (iPx, iPx), "faded")) - + _, icon = nwItem.getActiveStatus() + self.labelIcon.setPixmap(icon.pixmap(iPx, iPx)) self.labelData.setText(elide(nwItem.itemName, 100)) # Status diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 89d3fecd..154802d5 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -108,7 +108,7 @@ class GuiTheme: __slots__ = ( "_allThemes", "_currentTheme", "_darkThemes", "_guiPalette", "_lightThemes", "_meta", - "_qColors", "_styleSheets", "_svgColors", "_syntaxList", "baseButtonHeight", + "_qColors", "_styleSheets", "_svgColors", "_syntaxList", "accentCol", "baseButtonHeight", "baseIconHeight", "baseIconSize", "buttonIconSize", "errorText", "fadedText", "fontPixelSize", "fontPointSize", "getDecoration", "getHeaderDecoration", "getHeaderDecorationNarrow", "getIcon", "getItemIcon", "getPixmap", "getToggleIcon", @@ -123,10 +123,11 @@ class GuiTheme: self.syntaxTheme = SyntaxColors() self.isDarkTheme = False - # Special Text Colours + # Special Colours self.helpText = QColor(0, 0, 0) self.fadedText = QColor(0, 0, 0) self.errorText = QColor(255, 0, 0) + self.accentCol = QColor(255, 0, 255) # Needed until we move to Qt 6.6 # Theme Data self._meta = ThemeMeta() @@ -306,6 +307,7 @@ class GuiTheme: # Base sec = "Base" if parser.has_section(sec): + self._setBaseColor("base", self._readColor(parser, sec, "base")) self._setBaseColor("default", self._readColor(parser, sec, "default")) self._setBaseColor("faded", self._readColor(parser, sec, "faded")) self._setBaseColor("red", self._readColor(parser, sec, "red")) @@ -319,13 +321,16 @@ class GuiTheme: # Project sec = "Project" if parser.has_section(sec): - self._setBaseColor("root", self._readColor(parser, sec, "root")) - self._setBaseColor("folder", self._readColor(parser, sec, "folder")) - self._setBaseColor("file", self._readColor(parser, sec, "file")) - self._setBaseColor("title", self._readColor(parser, sec, "title")) - self._setBaseColor("chapter", self._readColor(parser, sec, "chapter")) - self._setBaseColor("scene", self._readColor(parser, sec, "scene")) - self._setBaseColor("note", self._readColor(parser, sec, "note")) + self._setBaseColor("root", self._readColor(parser, sec, "root")) + self._setBaseColor("folder", self._readColor(parser, sec, "folder")) + self._setBaseColor("file", self._readColor(parser, sec, "file")) + self._setBaseColor("title", self._readColor(parser, sec, "title")) + self._setBaseColor("chapter", self._readColor(parser, sec, "chapter")) + self._setBaseColor("scene", self._readColor(parser, sec, "scene")) + self._setBaseColor("note", self._readColor(parser, sec, "note")) + self._setBaseColor("active", self._readColor(parser, sec, "active")) + self._setBaseColor("inactive", self._readColor(parser, sec, "inactive")) + self._setBaseColor("disabled", self._readColor(parser, sec, "disabled")) # Palette sec = "Palette" @@ -344,6 +349,7 @@ class GuiTheme: self._setPalette(parser, sec, "highlightedtext", QPalette.ColorRole.HighlightedText) self._setPalette(parser, sec, "link", QPalette.ColorRole.Link) self._setPalette(parser, sec, "linkvisited", QPalette.ColorRole.LinkVisited) + self.accentCol = self._readColor(parser, sec, "accent") # Special handling 'til Qt 6.6 # GUI sec = "GUI" @@ -427,8 +433,8 @@ class GuiTheme: self._guiPalette.setBrush(QtColDisabled, QPalette.ColorRole.Highlight, grey) if CONFIG.verQtValue >= 0x060600: - self._guiPalette.setBrush(QtColActive, QPalette.ColorRole.Accent, highlight) - self._guiPalette.setBrush(QtColInactive, QPalette.ColorRole.Accent, highlight) + self._guiPalette.setBrush(QtColActive, QPalette.ColorRole.Accent, self.accentCol) + self._guiPalette.setBrush(QtColInactive, QPalette.ColorRole.Accent, self.accentCol) self._guiPalette.setBrush(QtColDisabled, QPalette.ColorRole.Accent, grey) # Set project override colours @@ -506,6 +512,7 @@ class GuiTheme: isDark = self.isDesktopDarkMode() # Reset GUI Palette + base = palette.color(QPalette.ColorRole.Base) default = palette.color(QPalette.ColorRole.Text) faded = QColor(128, 128, 128) dimmed = QColor(130, 130, 130) if isDark else QColor(190, 190, 190) @@ -528,22 +535,26 @@ class GuiTheme: self.iconCache.clear() self._svgColors = {} self._qColors = {} - self._setBaseColor("default", default) - self._setBaseColor("faded", faded) - self._setBaseColor("red", red) - self._setBaseColor("orange", orange) - self._setBaseColor("yellow", yellow) - self._setBaseColor("green", green) - self._setBaseColor("cyan", cyan) - self._setBaseColor("blue", blue) - self._setBaseColor("purple", purple) - self._setBaseColor("root", blue) - self._setBaseColor("folder", yellow) - self._setBaseColor("file", default) - self._setBaseColor("title", green) - self._setBaseColor("chapter", red) - self._setBaseColor("scene", blue) - self._setBaseColor("note", yellow) + self._setBaseColor("base", base) + self._setBaseColor("default", default) + self._setBaseColor("faded", faded) + self._setBaseColor("red", red) + self._setBaseColor("orange", orange) + self._setBaseColor("yellow", yellow) + self._setBaseColor("green", green) + self._setBaseColor("cyan", cyan) + self._setBaseColor("blue", blue) + self._setBaseColor("purple", purple) + self._setBaseColor("root", blue) + self._setBaseColor("folder", yellow) + self._setBaseColor("file", default) + self._setBaseColor("title", green) + self._setBaseColor("chapter", red) + self._setBaseColor("scene", blue) + self._setBaseColor("note", yellow) + self._setBaseColor("active", green) + self._setBaseColor("inactive", red) + self._setBaseColor("disabled", faded) return diff --git a/tests/test_gui/test_gui_theme.py b/tests/test_gui/test_gui_theme.py index 4c834d38..27e5915d 100644 --- a/tests/test_gui/test_gui_theme.py +++ b/tests/test_gui/test_gui_theme.py @@ -616,16 +616,17 @@ def testGuiTheme_CheckTheme(theme): "name", "mode", # The rest are not required ], "Base": [ - "default", "faded", "red", "orange", "yellow", "green", "cyan", - "blue", "purple", + "base", "default", "faded", "red", "orange", "yellow", "green", + "cyan", "blue", "purple", ], "Project": [ "root", "folder", "file", "title", "chapter", "scene", "note", + "active", "inactive", "disabled", ], "Palette": [ "window", "windowtext", "base", "alternatebase", "text", "tooltipbase", "tooltiptext", "button", "buttontext", "brighttext", - "highlight", "highlightedtext", "link", "linkvisited", + "highlight", "highlightedtext", "link", "linkvisited", "accent", ], "GUI": [ "helptext", "fadedtext", "errortext", From 8c0f3b037ae79e663a73e14aafd1f56a47130acf Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 5 Jun 2025 21:55:08 +0200 Subject: [PATCH 32/96] Update themes --- .../assets/themes/cyberpunk_night.conf | 25 +++++--- novelwriter/assets/themes/default_dark.conf | 33 +++++----- novelwriter/assets/themes/default_light.conf | 41 ++++++------ novelwriter/assets/themes/dracula.conf | 27 ++++---- novelwriter/assets/themes/grey_dark.conf | 25 +++++--- novelwriter/assets/themes/grey_light.conf | 27 ++++---- novelwriter/assets/themes/light_owl.conf | 27 ++++---- novelwriter/assets/themes/night_owl.conf | 27 ++++---- novelwriter/assets/themes/primer_dark.conf | 63 ++++++++++--------- novelwriter/assets/themes/primer_light.conf | 61 +++++++++--------- novelwriter/assets/themes/snazzy.conf | 27 ++++---- novelwriter/assets/themes/solarized_dark.conf | 27 ++++---- .../assets/themes/solarized_light.conf | 28 +++++---- novelwriter/assets/themes/tango_dark.conf | 23 ++++--- novelwriter/assets/themes/tango_light.conf | 23 ++++--- novelwriter/assets/themes/tomorrow.conf | 25 +++++--- novelwriter/assets/themes/tomorrow_night.conf | 27 ++++---- .../assets/themes/tomorrow_night_blue.conf | 27 ++++---- .../assets/themes/tomorrow_night_bright.conf | 27 ++++---- .../themes/tomorrow_night_eighties.conf | 27 ++++---- 20 files changed, 358 insertions(+), 259 deletions(-) diff --git a/novelwriter/assets/themes/cyberpunk_night.conf b/novelwriter/assets/themes/cyberpunk_night.conf index 66c3932c..70996a22 100644 --- a/novelwriter/assets/themes/cyberpunk_night.conf +++ b/novelwriter/assets/themes/cyberpunk_night.conf @@ -8,6 +8,7 @@ license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] +base = #000000 default = #888888 faded = #616161 red = #f24817 @@ -19,18 +20,21 @@ blue = #4d4dff purple = #320064 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] -window = #000000 +window = base windowtext = #969696 -base = #000000 +base = base alternatebase = #282828 text = #969696 tooltipbase = #281446 @@ -42,6 +46,7 @@ highlight = #321e50 highlightedtext = #ffffff link = blue linkvisited = #320050 +accent = #321e50 [GUI] helptext = faded @@ -49,7 +54,7 @@ fadedtext = faded errortext = red [Syntax] -background = #000000 +background = base text = #969696 link = blue headertext = #ffffff diff --git a/novelwriter/assets/themes/default_dark.conf b/novelwriter/assets/themes/default_dark.conf index 267fbcb0..a82f4adb 100644 --- a/novelwriter/assets/themes/default_dark.conf +++ b/novelwriter/assets/themes/default_dark.conf @@ -9,10 +9,11 @@ license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] +base = #373737 default = #cccccc faded = #949494 -red = #f2777a -orange = #f99139 +red = #ff6666 +orange = #ff9966 yellow = #ffcc66 green = #99cc99 cyan = #66cccc @@ -20,29 +21,33 @@ blue = #6699cc purple = #cc99cc [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] -window = #363636 +window = #303030 windowtext = default -base = #3e3e3e +base = base alternatebase = #4e4e4e text = default tooltipbase = #ffffc0 tooltiptext = #15150d -button = #3e3e3e +button = base buttontext = default -brighttext = #3e3e3e +brighttext = base highlight = #2c98f7 highlightedtext = #ffffff link = blue linkvisited = blue +accent = #2c98f7 [GUI] helptext = #a4a4a4 @@ -50,7 +55,7 @@ fadedtext = faded errortext = red [Syntax] -background = #363636 +background = base text = default link = blue headertext = green diff --git a/novelwriter/assets/themes/default_light.conf b/novelwriter/assets/themes/default_light.conf index e08de69f..52c12d10 100644 --- a/novelwriter/assets/themes/default_light.conf +++ b/novelwriter/assets/themes/default_light.conf @@ -9,40 +9,45 @@ license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] +base = #fcfcfc default = #303030 faded = #6c6c6c red = #a62a2d orange = #b36829 -yellow = #a68542 +yellow = #a39c34 green = #296629 cyan = #269999 blue = #3a70a6 purple = #b35ab3 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #efefef -windowtext = #000000 -base = #ffffff +windowtext = default +base = base alternatebase = #e0e0e0 -text = #000000 +text = default tooltipbase = #ffffc0 tooltiptext = #15150d button = #efefef -buttontext = #000000 -brighttext = #ffffff +buttontext = default +brighttext = base highlight = #3087c6 -highlightedtext = #ffffff +highlightedtext = base link = blue linkvisited = blue +accent = #3087c6 [GUI] helptext = #5c5c5c @@ -50,15 +55,15 @@ fadedtext = #6c6c6c errortext = red [Syntax] -background = #ffffff -text = #000000 +background = base +text = default link = blue headertext = green headertag = green:L135 emphasis = orange dialog = blue altdialog = blue -note = yellow +note = yellow:D125 hidden = faded shortcode = green keyword = red @@ -69,4 +74,4 @@ spellcheckline = red errorline = green replacetag = green modifier = green -texthighlight = #c8c80060 +texthighlight = yellow:72 diff --git a/novelwriter/assets/themes/dracula.conf b/novelwriter/assets/themes/dracula.conf index ed1f1e92..8e0d0133 100644 --- a/novelwriter/assets/themes/dracula.conf +++ b/novelwriter/assets/themes/dracula.conf @@ -25,6 +25,7 @@ licenseurl = https://github.com/dracula/dracula-theme/blob/main/LICENSE ## [Base] +base = #282a36 default = #e6e6e0 faded = #6272a4 red = #ff5555 @@ -36,29 +37,33 @@ blue = #93cff9 purple = #bd93f9 [Project] -root = purple -folder = yellow -file = default -title = green -chapter = red -scene = cyan -note = yellow +root = purple +folder = yellow +file = default +title = green +chapter = red +scene = cyan +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #44475a windowtext = #f8f8f2 -base = #282a36 +base = base alternatebase = #333645 text = #f8f8f2 tooltipbase = yellow -tooltiptext = #282a36 +tooltiptext = base button = #505369 buttontext = #f8f8f2 -brighttext = #44475a +brighttext = base highlight = #a681da highlightedtext = #f8f8f2 link = cyan linkvisited = cyan +accent = #a681da [GUI] helptext = #ccacf9 @@ -66,7 +71,7 @@ fadedtext = faded errortext = red [Syntax] -background = #282a36 +background = base text = #f8f8f2 link = #ff79c6 headertext = purple diff --git a/novelwriter/assets/themes/grey_dark.conf b/novelwriter/assets/themes/grey_dark.conf index de9a1f35..862caaf3 100644 --- a/novelwriter/assets/themes/grey_dark.conf +++ b/novelwriter/assets/themes/grey_dark.conf @@ -8,6 +8,7 @@ license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] +base = #3e3e3e default = #c8c8c8 faded = #949494 red = #f2777a @@ -19,29 +20,33 @@ blue = #6699cc purple = #cc99cc [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #363636 windowtext = default -base = #3e3e3e +base = base alternatebase = #4e4e4e text = default tooltipbase = #ffffc0 tooltiptext = #15150d -button = #3e3e3e +button = base buttontext = default -brighttext = #3e3e3e +brighttext = base highlight = #2c98f7 highlightedtext = #ffffff link = blue linkvisited = blue +accent = #2c98f7 [GUI] helptext = default:D120 diff --git a/novelwriter/assets/themes/grey_light.conf b/novelwriter/assets/themes/grey_light.conf index ace40f8c..2da58171 100644 --- a/novelwriter/assets/themes/grey_light.conf +++ b/novelwriter/assets/themes/grey_light.conf @@ -8,6 +8,7 @@ license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] +base = #ffffff default = #282828 faded = #6c6c6c red = #a62a2d @@ -19,29 +20,33 @@ blue = #3a70a6 purple = #b35ab3 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #efefef windowtext = default -base = #ffffff +base = base alternatebase = #e0e0e0 text = default tooltipbase = #ffffc0 tooltiptext = #15150d button = #efefef buttontext = default -brighttext = #ffffff +brighttext = base highlight = #3087c6 -highlightedtext = #ffffff +highlightedtext = base link = blue linkvisited = blue +accent = #3087c6 [GUI] helptext = default:L225 @@ -49,7 +54,7 @@ fadedtext = faded errortext = red [Syntax] -background = #ffffff +background = base text = default link = default headertext = default:D200 diff --git a/novelwriter/assets/themes/light_owl.conf b/novelwriter/assets/themes/light_owl.conf index 512f4019..208cb459 100644 --- a/novelwriter/assets/themes/light_owl.conf +++ b/novelwriter/assets/themes/light_owl.conf @@ -28,6 +28,7 @@ licenseurl = https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE ## [Base] +base = #fbfbfb default = #403f52 faded = #989fb1 red = #de3d3a @@ -39,29 +40,33 @@ blue = #288ed7 purple = #964ac1 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #eaeaea windowtext = default -base = #fbfbfb +base = base alternatebase = #e0e0e0 text = default tooltipbase = #ffffc0 tooltiptext = #15150d -button = #eaeaea +button = base buttontext = default -brighttext = #eaeaea +brighttext = base highlight = #3087c6 highlightedtext = #ffffff link = blue linkvisited = blue +accent = #3087c6 [GUI] helptext = blue @@ -69,7 +74,7 @@ fadedtext = faded errortext = red [Syntax] -background = #fbfbfb +background = base text = default link = blue headertext = blue diff --git a/novelwriter/assets/themes/night_owl.conf b/novelwriter/assets/themes/night_owl.conf index 2fbf7d60..422b7374 100644 --- a/novelwriter/assets/themes/night_owl.conf +++ b/novelwriter/assets/themes/night_owl.conf @@ -28,6 +28,7 @@ licenseurl = https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE ## [Base] +base = #011627 default = #d6deeb faded = #637777 red = #f78c6c @@ -39,29 +40,33 @@ blue = #82aaff purple = #c792ea [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #434652 windowtext = default -base = #011627 +base = base alternatebase = #32374d text = default tooltipbase = #ffffc0 tooltiptext = #15150d -button = #434652 +button = base buttontext = default -brighttext = #434652 +brighttext = base highlight = #2c98f7 highlightedtext = #ffffff link = blue linkvisited = blue +accent = #2c98f7 [GUI] helptext = blue @@ -69,7 +74,7 @@ fadedtext = faded errortext = red [Syntax] -background = #011627 +background = base text = default link = blue headertext = blue diff --git a/novelwriter/assets/themes/primer_dark.conf b/novelwriter/assets/themes/primer_dark.conf index d8d334c0..8c26ce67 100644 --- a/novelwriter/assets/themes/primer_dark.conf +++ b/novelwriter/assets/themes/primer_dark.conf @@ -1,40 +1,44 @@ [Main] -name = Primer Dark -mode = dark -author = Myian (adaptation) -credit = GitHub Inc. -url = https://github.com/primer -license = MIT License -licenseurl = https://github.com/primer/brand/blob/main/LICENSE +name = Primer Dark +mode = dark +author = Myian (adaptation) +credit = GitHub Inc. +url = https://github.com/primer +license = MIT License +licenseurl = https://github.com/primer/brand/blob/main/LICENSE [Base] -default = #f0f6fc -faded = #a3b0be -red = #ff7b72 -orange = #ffa657 -yellow = #f8e3a1 -green = #7ee787 -cyan = #57CCC5 -blue = #79c0ff -purple = #bc8cff +base = #0c1117 +default = #f0f6fc +faded = #a3b0be +red = #ff7b72 +orange = #ffa657 +yellow = #f8e3a1 +green = #7ee787 +cyan = #57CCC5 +blue = #79c0ff +purple = #bc8cff [Project] -root = purple -folder = orange -file = default -title = green -chapter = red -scene = blue -note = yellow +root = purple +folder = orange +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #141b23 windowtext = default -base = #0c1117 +base = base alternatebase = #1e242a text = default tooltipbase = yellow -tooltiptext = #0c1117 +tooltiptext = base button = #212830 buttontext = default brighttext = default @@ -42,14 +46,15 @@ highlight = #104C35 highlightedtext = default link = blue linkvisited = blue +accent = #104C35 [GUI] -helptext = faded -fadedtext = faded:128 -errortext = #f85149 +helptext = faded +fadedtext = faded:128 +errortext = #f85149 [Syntax] -background = #0c1117 +background = base text = faded link = blue headertext = default diff --git a/novelwriter/assets/themes/primer_light.conf b/novelwriter/assets/themes/primer_light.conf index 3b6ba897..93e7a87b 100644 --- a/novelwriter/assets/themes/primer_light.conf +++ b/novelwriter/assets/themes/primer_light.conf @@ -1,36 +1,40 @@ [Main] -name = Primer Light -mode = light -author = Myian (adaptation) -credit = GitHub Inc. -url = https://github.com/primer -license = MIT License -licenseurl = https://github.com/primer/brand/blob/main/LICENSE +name = Primer Light +mode = light +author = Myian (adaptation) +credit = GitHub Inc. +url = https://github.com/primer +license = MIT License +licenseurl = https://github.com/primer/brand/blob/main/LICENSE [Base] -default = #1f2328 -faded = #59636e -red = #fa4549 -orange = #e16f24 -yellow = #d4a72c -green = #2da44e -cyan = #339D9B -blue = #0969da -purple = #a475f9 +base = #ffffff +default = #1f2328 +faded = #59636e +red = #fa4549 +orange = #e16f24 +yellow = #d4a72c +green = #2da44e +cyan = #339D9B +blue = #0969da +purple = #a475f9 [Project] -root = purple -folder = orange -file = faded -title = green -chapter = red -scene = blue -note = yellow +root = purple +folder = orange +file = faded +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #eaeef2 windowtext = default -base = #ffffff +base = base alternatebase = #dfe4e9 text = default tooltipbase = #fae17d @@ -42,14 +46,15 @@ highlight = #dafbe1 highlightedtext = #1a7f37 link = blue linkvisited = blue +accent = #dafbe1 [GUI] -helptext = faded -fadedtext = faded:128 -errortext = #cf222e +helptext = faded +fadedtext = faded:128 +errortext = #cf222e [Syntax] -background = #ffffff +background = base text = faded link = blue headertext = default diff --git a/novelwriter/assets/themes/snazzy.conf b/novelwriter/assets/themes/snazzy.conf index f2fa7785..0cec0326 100644 --- a/novelwriter/assets/themes/snazzy.conf +++ b/novelwriter/assets/themes/snazzy.conf @@ -21,6 +21,7 @@ licenseurl = https://github.com/loilo/vscode-snazzy-light/blob/master/LICENSE ## [Base] +base = #fafbfc default = #565869 faded = #545554 red = #ff5c57 @@ -32,29 +33,33 @@ blue = #09a1ed purple = #f767bb [Project] -root = blue -folder = yellow -file = faded -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = faded +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #f3f4f5 windowtext = default -base = #fafbfc +base = base alternatebase = #eaeaeb text = default tooltipbase = #f5e9c2 tooltiptext = default -button = #fafbfc +button = base buttontext = default -brighttext = #ffffff +brighttext = base highlight = blue highlightedtext = #ffffff link = blue linkvisited = blue +accent = blue [GUI] helptext = blue @@ -62,7 +67,7 @@ fadedtext = faded errortext = red [Syntax] -background = #fafbfc +background = base text = default link = blue headertext = green diff --git a/novelwriter/assets/themes/solarized_dark.conf b/novelwriter/assets/themes/solarized_dark.conf index 8b07003a..e3f146ba 100644 --- a/novelwriter/assets/themes/solarized_dark.conf +++ b/novelwriter/assets/themes/solarized_dark.conf @@ -27,6 +27,7 @@ licenseurl = https://github.com/altercation/solarized/blob/master/LICENSE ## [Base] +base = #073642 default = #fdf6e3 faded = #eee8d5 red = #dc322f @@ -38,29 +39,33 @@ blue = #268bd2 purple = #6c71c4 [Project] -root = cyan -folder = cyan -file = default -title = green -chapter = red -scene = blue -note = yellow +root = cyan +folder = cyan +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #002b36 windowtext = default -base = #073642 +base = base alternatebase = #586e75 text = default tooltipbase = yellow tooltiptext = #002b36 -button = #073642 +button = base buttontext = default -brighttext = #073642 +brighttext = base highlight = cyan highlightedtext = default link = blue linkvisited = blue +accent = cyan [GUI] helptext = cyan @@ -68,7 +73,7 @@ fadedtext = faded errortext = red [Syntax] -background = #073642 +background = base text = default link = blue headertext = default:D125 diff --git a/novelwriter/assets/themes/solarized_light.conf b/novelwriter/assets/themes/solarized_light.conf index 22b165b9..76c2eec2 100644 --- a/novelwriter/assets/themes/solarized_light.conf +++ b/novelwriter/assets/themes/solarized_light.conf @@ -27,6 +27,7 @@ licenseurl = https://github.com/altercation/solarized/blob/master/LICENSE ## [Base] +base = #eee8d5 default = #002b36 faded = #073642 red = #dc322f @@ -38,30 +39,33 @@ blue = #268bd2 purple = #6c71c4 [Project] -root = cyan -folder = cyan -file = default -title = green -chapter = red -scene = blue -note = yellow - +root = cyan +folder = cyan +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #fdf6e3 windowtext = default -base = #eee8d5 +base = base alternatebase = #93a1a1 text = default tooltipbase = yellow tooltiptext = #002b36 -button = #eee8d5 +button = base buttontext = default -brighttext = #eee8d5 +brighttext = base highlight = cyan highlightedtext = default link = blue linkvisited = blue +accent = cyan [GUI] helptext = cyan @@ -69,7 +73,7 @@ fadedtext = faded errortext = red [Syntax] -background = #eee8d5 +background = base text = default link = blue headertext = default:L125 diff --git a/novelwriter/assets/themes/tango_dark.conf b/novelwriter/assets/themes/tango_dark.conf index 252bce4d..f987e44e 100644 --- a/novelwriter/assets/themes/tango_dark.conf +++ b/novelwriter/assets/themes/tango_dark.conf @@ -18,6 +18,7 @@ author = Veronica Berglyd Olsen (adaptation) ## [Base] +base = #2e3436 default = #eeeeec faded = #babdb6 red = #ef2929 @@ -29,18 +30,21 @@ blue = #729fcf purple = #ad7fa8 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #555753 windowtext = default -base = #2e3436 +base = base alternatebase = #454e51 text = default tooltipbase = #ffffc0 @@ -52,6 +56,7 @@ highlight = blue highlightedtext = #ffffff link = blue linkvisited = blue +accent = blue [GUI] helptext = orange @@ -59,7 +64,7 @@ fadedtext = faded errortext = red [Syntax] -background = #2e3436 +background = base text = default link = blue headertext = blue diff --git a/novelwriter/assets/themes/tango_light.conf b/novelwriter/assets/themes/tango_light.conf index c702de8d..afc6e15a 100644 --- a/novelwriter/assets/themes/tango_light.conf +++ b/novelwriter/assets/themes/tango_light.conf @@ -18,6 +18,7 @@ author = Veronica Berglyd Olsen (adaptation) ## [Base] +base = #eeeeec default = #2e3436 faded = #888a85 red = #a40000 @@ -29,18 +30,21 @@ blue = #204a87 purple = #5c3566 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #d3d7cf windowtext = default -base = #eeeeec +base = base alternatebase = #e0e0e0 text = default tooltipbase = #ffffc0 @@ -52,6 +56,7 @@ highlight = blue:L200 highlightedtext = #ffffff link = blue linkvisited = blue +accent = blue:L150 [GUI] helptext = orange @@ -59,7 +64,7 @@ fadedtext = faded errortext = red [Syntax] -background = #eeeeec +background = base text = default link = blue headertext = blue diff --git a/novelwriter/assets/themes/tomorrow.conf b/novelwriter/assets/themes/tomorrow.conf index 2736fdae..3175e68b 100644 --- a/novelwriter/assets/themes/tomorrow.conf +++ b/novelwriter/assets/themes/tomorrow.conf @@ -28,6 +28,7 @@ licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE. ## [Base] +base = #ffffff default = #484848 faded = #6c6c6c red = #c82829 @@ -39,18 +40,21 @@ blue = #4271ae purple = #8959a8 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #efefef windowtext = #000000 -base = #ffffff +base = base alternatebase = #d6d6d6 text = #000000 tooltipbase = #ffffc0 @@ -59,9 +63,10 @@ button = #efefef buttontext = #000000 brighttext = #efefef highlight = blue -highlightedtext = #ffffff +highlightedtext = base link = blue linkvisited = blue +accent = blue [GUI] helptext = #5c5c5c @@ -69,7 +74,7 @@ fadedtext = faded errortext = red [Syntax] -background = #ffffff +background = base text = #4d4d4c link = blue headertext = blue diff --git a/novelwriter/assets/themes/tomorrow_night.conf b/novelwriter/assets/themes/tomorrow_night.conf index c266b31d..671d1a9c 100644 --- a/novelwriter/assets/themes/tomorrow_night.conf +++ b/novelwriter/assets/themes/tomorrow_night.conf @@ -28,6 +28,7 @@ licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE. ## [Base] +base = #1d1f21 default = #c5c8c6 faded = #969896 red = #cc6666 @@ -39,29 +40,33 @@ blue = #81a2be purple = #b294bb [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #282a2e windowtext = default -base = #1d1f21 +base = base alternatebase = #373b41 text = default tooltipbase = #ffffc0 tooltiptext = #15150d -button = #1d1f21 +button = base buttontext = default -brighttext = #1d1f21 +brighttext = base highlight = #2c98f7 highlightedtext = #ffffff link = blue linkvisited = blue +accent = #2c98f7 [GUI] helptext = #a4a4a4 @@ -69,7 +74,7 @@ fadedtext = #949494 errortext = red [Syntax] -background = #1d1f21 +background = base text = default link = blue headertext = blue diff --git a/novelwriter/assets/themes/tomorrow_night_blue.conf b/novelwriter/assets/themes/tomorrow_night_blue.conf index f96448af..326eb9d2 100644 --- a/novelwriter/assets/themes/tomorrow_night_blue.conf +++ b/novelwriter/assets/themes/tomorrow_night_blue.conf @@ -28,6 +28,7 @@ licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE. ## [Base] +base = #002451 default = #ffffff faded = #7285b7 red = #ff9da4 @@ -39,29 +40,33 @@ blue = #bbdaff purple = #ebbbff [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #00346e windowtext = default -base = #002451 +base = base alternatebase = #003f8e text = default tooltipbase = #ffffc0 tooltiptext = #15150d -button = #002451 +button = base buttontext = default -brighttext = #002451 +brighttext = base highlight = #2c98f7 highlightedtext = #ffffff link = blue linkvisited = blue +accent = #2c98f7 [GUI] helptext = #a4a4a4 @@ -69,7 +74,7 @@ fadedtext = #949494 errortext = red [Syntax] -background = #002451 +background = base text = default link = blue headertext = blue diff --git a/novelwriter/assets/themes/tomorrow_night_bright.conf b/novelwriter/assets/themes/tomorrow_night_bright.conf index 82cac1d0..311ee3f1 100644 --- a/novelwriter/assets/themes/tomorrow_night_bright.conf +++ b/novelwriter/assets/themes/tomorrow_night_bright.conf @@ -28,6 +28,7 @@ licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE. ## [Base] +base = #000000 default = #eaeaea faded = #969896 red = #d54e53 @@ -39,29 +40,33 @@ blue = #7aa6da purple = #c397d8 [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #2a2a2a windowtext = default -base = #000000 +base = base alternatebase = #424242 text = default tooltipbase = #ffffc0 tooltiptext = #15150d -button = #000000 +button = base buttontext = default -brighttext = #000000 +brighttext = base highlight = #2c98f7 highlightedtext = #ffffff link = blue linkvisited = blue +accent = #2c98f7 [GUI] helptext = #a4a4a4 @@ -69,7 +74,7 @@ fadedtext = #949494 errortext = red [Syntax] -background = #000000 +background = base text = default link = blue headertext = blue diff --git a/novelwriter/assets/themes/tomorrow_night_eighties.conf b/novelwriter/assets/themes/tomorrow_night_eighties.conf index e14b0dac..367e1968 100644 --- a/novelwriter/assets/themes/tomorrow_night_eighties.conf +++ b/novelwriter/assets/themes/tomorrow_night_eighties.conf @@ -28,6 +28,7 @@ licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE. ## [Base] +base = #2d2d2d default = #cccccc faded = #999999 red = #f2777a @@ -39,29 +40,33 @@ blue = #6699cc purple = #cc99cc [Project] -root = blue -folder = yellow -file = default -title = green -chapter = red -scene = blue -note = yellow +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded [Palette] window = #393939 windowtext = default -base = #2d2d2d +base = base alternatebase = #515151 text = default tooltipbase = #ffffc0 tooltiptext = #15150d -button = #2d2d2d +button = base buttontext = default -brighttext = #2d2d2d +brighttext = base highlight = #2c98f7 highlightedtext = #ffffff link = blue linkvisited = blue +accent = #2c98f7 [GUI] helptext = #a4a4a4 @@ -69,7 +74,7 @@ fadedtext = #949494 errortext = red [Syntax] -background = #2d2d2d +background = base text = default link = blue headertext = blue From c08771dc5685f810942fcb20fab077dfa5cc6e46 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 4 Jun 2025 23:36:20 +0200 Subject: [PATCH 33/96] Add blue streak initial theme --- .../assets/themes/blue_streak_dark.conf | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 novelwriter/assets/themes/blue_streak_dark.conf diff --git a/novelwriter/assets/themes/blue_streak_dark.conf b/novelwriter/assets/themes/blue_streak_dark.conf new file mode 100644 index 00000000..8d0d390e --- /dev/null +++ b/novelwriter/assets/themes/blue_streak_dark.conf @@ -0,0 +1,71 @@ +[Main] +name = Blue Streak Dark +mode = dark +author = Veronica Berglyd Olsen +credit = Veronica Berglyd Olsen +url = https://github.com/vkbo/novelWriter +license = CC BY-SA 4.0 +licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ + +[Base] +default = #cccccc +faded = #999999 +red = #ff6666 +orange = #ff9966 +yellow = #ffcc66 +green = #99cc99 +cyan = #66cccc +blue = #6699cc +purple = #cc99cc + +[Project] +root = blue +folder = default +file = default +title = blue:D150 +chapter = blue +scene = blue:L150 +note = yellow + +[Palette] +window = #393939 +windowtext = default +base = #2d2d2d +alternatebase = #515151 +text = default +tooltipbase = #ffffc0 +tooltiptext = #15150d +button = #2d2d2d +buttontext = default +brighttext = #2d2d2d +highlight = blue +highlightedtext = #ffffff +link = blue +linkvisited = blue + +[GUI] +helptext = blue +fadedtext = faded +errortext = red + +[Syntax] +background = #2d2d2d +text = default +link = blue +headertext = blue +headertag = blue:D150 +emphasis = blue:L150 +dialog = blue +altdialog = blue:L150 +note = blue:L150 +hidden = faded +shortcode = blue:D150 +keyword = blue:D125 +tag = blue +value = blue +optional = blue +spellcheckline = red +errorline = green +replacetag = blue:L150 +modifier = blue:D125 +texthighlight = blue:96 From d280cb510d5569edd866170e4683deee0c959948 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 5 Jun 2025 22:10:33 +0200 Subject: [PATCH 34/96] Update blue streak dark theme with new settings --- .../assets/themes/blue_streak_dark.conf | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/novelwriter/assets/themes/blue_streak_dark.conf b/novelwriter/assets/themes/blue_streak_dark.conf index 8d0d390e..00d9a747 100644 --- a/novelwriter/assets/themes/blue_streak_dark.conf +++ b/novelwriter/assets/themes/blue_streak_dark.conf @@ -8,6 +8,7 @@ license = CC BY-SA 4.0 licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] +base = #2d2d2d default = #cccccc faded = #999999 red = #ff6666 @@ -19,37 +20,41 @@ blue = #6699cc purple = #cc99cc [Project] -root = blue -folder = default -file = default -title = blue:D150 -chapter = blue -scene = blue:L150 -note = yellow +root = blue +folder = default +file = default +title = blue:D150 +chapter = blue +scene = blue:L150 +note = yellow +active = blue:L150 +inactive = blue:D150 +disabled = faded [Palette] -window = #393939 +window = base:L130 windowtext = default -base = #2d2d2d +base = base alternatebase = #515151 text = default tooltipbase = #ffffc0 tooltiptext = #15150d -button = #2d2d2d +button = base buttontext = default -brighttext = #2d2d2d +brighttext = base highlight = blue highlightedtext = #ffffff link = blue linkvisited = blue +accent = blue [GUI] -helptext = blue +helptext = blue:L125 fadedtext = faded errortext = red [Syntax] -background = #2d2d2d +background = base text = default link = blue headertext = blue @@ -59,7 +64,7 @@ dialog = blue altdialog = blue:L150 note = blue:L150 hidden = faded -shortcode = blue:D150 +shortcode = blue:D125 keyword = blue:D125 tag = blue value = blue From 0a37981251866aad9041105dee10f349e13a04c0 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 6 Jun 2025 18:25:45 +0200 Subject: [PATCH 35/96] Add Blue Streak Light, and update dark theme --- .../assets/themes/blue_streak_dark.conf | 10 +-- .../assets/themes/blue_streak_light.conf | 76 +++++++++++++++++++ novelwriter/gui/theme.py | 2 +- 3 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 novelwriter/assets/themes/blue_streak_light.conf diff --git a/novelwriter/assets/themes/blue_streak_dark.conf b/novelwriter/assets/themes/blue_streak_dark.conf index 00d9a747..ed0f912d 100644 --- a/novelwriter/assets/themes/blue_streak_dark.conf +++ b/novelwriter/assets/themes/blue_streak_dark.conf @@ -32,18 +32,18 @@ inactive = blue:D150 disabled = faded [Palette] -window = base:L130 +window = base:L125 windowtext = default base = base -alternatebase = #515151 +alternatebase = base:L150 text = default -tooltipbase = #ffffc0 -tooltiptext = #15150d +tooltipbase = yellow:L140 +tooltiptext = base:D150 button = base buttontext = default brighttext = base highlight = blue -highlightedtext = #ffffff +highlightedtext = default:L120 link = blue linkvisited = blue accent = blue diff --git a/novelwriter/assets/themes/blue_streak_light.conf b/novelwriter/assets/themes/blue_streak_light.conf new file mode 100644 index 00000000..0a3673b1 --- /dev/null +++ b/novelwriter/assets/themes/blue_streak_light.conf @@ -0,0 +1,76 @@ +[Main] +name = Blue Streak Light +mode = light +author = Veronica Berglyd Olsen +credit = Veronica Berglyd Olsen +url = https://github.com/vkbo/novelWriter +license = CC BY-SA 4.0 +licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ + +[Base] +base = #fcfcfc +default = #303030 +faded = #6c6c6c +red = #cc3939 +orange = #cc7239 +yellow = #cca339 +green = #72a372 +cyan = #39a3a3 +blue = #3972a3 +purple = #a372a3 + +[Project] +root = blue +folder = faded +file = faded +title = blue:D150 +chapter = blue +scene = blue:L125 +note = yellow +active = blue:L115 +inactive = blue:D150 +disabled = faded + +[Palette] +window = base:D105 +windowtext = default +base = base +alternatebase = base:D110 +text = default +tooltipbase = yellow:L150 +tooltiptext = default:D150 +button = base +buttontext = default +brighttext = base +highlight = blue:L110 +highlightedtext = base +link = blue +linkvisited = blue +accent = blue + +[GUI] +helptext = blue +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +link = blue +headertext = blue +headertag = blue:D150 +emphasis = blue:L125 +dialog = blue +altdialog = blue:L125 +note = blue:L125 +hidden = faded +shortcode = blue:D125 +keyword = blue:D125 +tag = blue +value = blue +optional = blue +spellcheckline = red +errorline = green +replacetag = blue:L125 +modifier = blue:D125 +texthighlight = blue:96 diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 154802d5..ee0e559f 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -481,7 +481,7 @@ class GuiTheme: # Assume #RRGGBBAA and convert to #AARRGGBB return QColor.fromString(f"#{value[7:9]}{value[1:7]}") elif ":" in value: - # Colour name and alpha + # Colour name and lighter, darker or alpha name, _, adjust = value.partition(":") color = QColor(self._qColors.get(name.strip(), default)) if adjust.startswith("L"): From bd3e23da334f18c950c4c112540c51ad2b2fa1c2 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 10 Jun 2025 23:16:10 +0200 Subject: [PATCH 36/96] Build index on new project creation --- novelwriter/core/coretools.py | 1 + 1 file changed, 1 insertion(+) diff --git a/novelwriter/core/coretools.py b/novelwriter/core/coretools.py index a4b2a0b1..5113d8e7 100644 --- a/novelwriter/core/coretools.py +++ b/novelwriter/core/coretools.py @@ -609,6 +609,7 @@ class ProjectBuilder: project.data.setSaveCount(0) project.data.setAutoCount(0) project.data.setEditTime(0) + project.index.rebuild() project.saveProject() project.closeProject() return From 4e02c8a63a4564766b25a63f3fc2be43b2bc4c8d Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 10 Jun 2025 23:28:58 +0200 Subject: [PATCH 37/96] Change a few defaults in config --- novelwriter/config.py | 6 +++--- tests/reference/baseConfig_novelwriter.conf | 9 +++++---- tests/test_dialogs/test_dlg_preferences.py | 12 ++++++------ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/novelwriter/config.py b/novelwriter/config.py index 404391b1..9258bcca 100644 --- a/novelwriter/config.py +++ b/novelwriter/config.py @@ -180,8 +180,8 @@ class Config: # Project Settings self.autoSaveProj = 60 # Interval for auto-saving project, in seconds self.autoSaveDoc = 30 # Interval for auto-saving document, in seconds - self.emphLabels = True # Add emphasis to H1 and H2 item labels - self.backupOnClose = False # Flag for running automatic backups + self.emphLabels = False # Add emphasis to H1 and H2 item labels + self.backupOnClose = True # Flag for running automatic backups self.askBeforeBackup = True # Flag for asking before running automatic backup self.askBeforeExit = True # Flag for asking before exiting the app @@ -208,7 +208,7 @@ class Config: self.doReplaceDash = True # Replace multiple hyphens with dashes self.doReplaceDots = True # Replace three dots with ellipsis - self.autoScroll = False # Typewriter-like scrolling + self.autoScroll = True # Typewriter-like scrolling self.autoScrollPos = 30 # Start point for typewriter-like scrolling self.scrollPastEnd = True # Scroll past end of document, and centre cursor diff --git a/tests/reference/baseConfig_novelwriter.conf b/tests/reference/baseConfig_novelwriter.conf index 8943a9b2..fa16b190 100644 --- a/tests/reference/baseConfig_novelwriter.conf +++ b/tests/reference/baseConfig_novelwriter.conf @@ -1,5 +1,5 @@ [Meta] -timestamp = 2025-06-02 16:21:38 +timestamp = 2025-06-10 23:18:12 [Main] font = @@ -27,9 +27,9 @@ outlinepane = 500, 150 [Project] autosaveproject = 60 autosavedoc = 30 -emphlabels = True +emphlabels = False backuppath = -backuponclose = False +backuponclose = True askbeforebackup = True askbeforeexit = True lastauthor = @@ -49,7 +49,7 @@ repsquotes = True repdquotes = True repdash = True repdots = True -autoscroll = False +autoscroll = True autoscrollpos = 30 scrollpastend = True fmtsquoteopen = ‘ @@ -91,3 +91,4 @@ searchmatchcap = False searchprojcase = False searchprojword = False searchprojregex = False + diff --git a/tests/test_dialogs/test_dlg_preferences.py b/tests/test_dialogs/test_dlg_preferences.py index 1c54da98..9add0573 100644 --- a/tests/test_dialogs/test_dlg_preferences.py +++ b/tests/test_dialogs/test_dlg_preferences.py @@ -196,11 +196,11 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): # Project View prefs.iconColTree.setCurrentData("faded", "default") prefs.iconColDocs.setChecked(True) - prefs.emphLabels.setChecked(False) + prefs.emphLabels.setChecked(True) assert CONFIG.iconColTree == "theme" assert CONFIG.iconColDocs is False - assert CONFIG.emphLabels is True + assert CONFIG.emphLabels is False # Behaviour prefs.autoSaveDoc.stepUp() @@ -261,11 +261,11 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): # Editor Scrolling prefs.scrollPastEnd.setChecked(False) - prefs.autoScroll.setChecked(True) + prefs.autoScroll.setChecked(False) prefs.autoScrollPos.stepUp() assert CONFIG.scrollPastEnd is True - assert CONFIG.autoScroll is False + assert CONFIG.autoScroll is True assert CONFIG.autoScrollPos == 30 # Text Highlighting @@ -362,7 +362,7 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): # Project View assert CONFIG.iconColTree == "faded" assert CONFIG.iconColDocs is True - assert CONFIG.emphLabels is False + assert CONFIG.emphLabels is True # Behaviour assert CONFIG.autoSaveDoc == 31 @@ -395,7 +395,7 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): # Editor Scrolling assert CONFIG.scrollPastEnd is False - assert CONFIG.autoScroll is True + assert CONFIG.autoScroll is False assert CONFIG.autoScrollPos == 31 # Text Highlighting From f7691f6909d2e91b20d2b985e93905382435cc42 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 10 Jun 2025 23:29:17 +0200 Subject: [PATCH 38/96] Make sure manual files exist for testing --- tests/conftest.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 33baa870..a2c3ad03 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -39,6 +39,7 @@ from tests.mocked import MockGuiMain, MockTheme from tests.tools import cleanProject _TST_ROOT = Path(__file__).parent +_SRC_ROOT = _TST_ROOT.parent _TMP_ROOT = _TST_ROOT / "temp" _TMP_CONF = _TMP_ROOT / "conf" @@ -75,6 +76,8 @@ def sessionFixture(): _TMP_ROOT.mkdir() _TMP_CONF.mkdir() (_TMP_ROOT / "manual.pdf").touch() + (_SRC_ROOT / "novelwriter" / "assets"/ "manual.pdf").touch() + (_SRC_ROOT / "novelwriter" / "assets"/ "manual_fr.pdf").touch() return From 6a9e268eb7f0172fd1313e436ab71adea320d4cd Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 11 Jun 2025 00:08:17 +0200 Subject: [PATCH 39/96] Update theme customisation documentation --- docs/source/more/customise.rst | 43 +++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/docs/source/more/customise.rst b/docs/source/more/customise.rst index 7b56197a..ef06f156 100644 --- a/docs/source/more/customise.rst +++ b/docs/source/more/customise.rst @@ -59,40 +59,45 @@ A colour theme ``.conf`` file consists of the following settings: licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] + base = #fcfcfc default = #303030 faded = #6c6c6c red = #a62a2d orange = #b36829 - yellow = #a68542 + yellow = #a39c34 green = #296629 cyan = #269999 blue = #3a70a6 purple = #b35ab3 [Project] - root = blue - folder = yellow - file = default - title = green - chapter = red - scene = blue - note = yellow + root = blue + folder = yellow + file = default + title = green + chapter = red + scene = blue + note = yellow + active = green + inactive = red + disabled = faded [Palette] - window = #efefef - windowtext = #000000 - base = #ffffff + window = base:D105 + windowtext = default + base = base alternatebase = #e0e0e0 - text = #000000 + text = default tooltipbase = #ffffc0 tooltiptext = #15150d button = #efefef - buttontext = #000000 - brighttext = #ffffff + buttontext = default + brighttext = base highlight = #3087c6 - highlightedtext = #ffffff + highlightedtext = base link = blue linkvisited = blue + accent = #3087c6 [GUI] helptext = #5c5c5c @@ -100,15 +105,15 @@ A colour theme ``.conf`` file consists of the following settings: errortext = red [Syntax] - background = #ffffff - text = #000000 + background = base + text = default link = blue headertext = green headertag = green:L135 emphasis = orange dialog = blue altdialog = blue - note = yellow + note = yellow:D125 hidden = faded shortcode = green keyword = red @@ -119,7 +124,7 @@ A colour theme ``.conf`` file consists of the following settings: errorline = green replacetag = green modifier = green - texthighlight = #c8c80060 + texthighlight = yellow:72 Theme Sections From aeac9840f1f09660d37adbd754112d2056472952 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 11 Jun 2025 00:09:06 +0200 Subject: [PATCH 40/96] Tweaks some theme colours --- novelwriter/assets/themes/default_dark.conf | 2 +- novelwriter/assets/themes/default_light.conf | 2 +- novelwriter/assets/themes/night_owl.conf | 2 +- novelwriter/assets/themes/tango_dark.conf | 2 +- novelwriter/assets/themes/tango_light.conf | 10 +++++----- novelwriter/assets/themes/tomorrow_night_blue.conf | 2 +- novelwriter/assets/themes/tomorrow_night_bright.conf | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/novelwriter/assets/themes/default_dark.conf b/novelwriter/assets/themes/default_dark.conf index a82f4adb..3d5436d7 100644 --- a/novelwriter/assets/themes/default_dark.conf +++ b/novelwriter/assets/themes/default_dark.conf @@ -33,7 +33,7 @@ inactive = red disabled = faded [Palette] -window = #303030 +window = base:L125 windowtext = default base = base alternatebase = #4e4e4e diff --git a/novelwriter/assets/themes/default_light.conf b/novelwriter/assets/themes/default_light.conf index 52c12d10..1fb2533d 100644 --- a/novelwriter/assets/themes/default_light.conf +++ b/novelwriter/assets/themes/default_light.conf @@ -33,7 +33,7 @@ inactive = red disabled = faded [Palette] -window = #efefef +window = base:D105 windowtext = default base = base alternatebase = #e0e0e0 diff --git a/novelwriter/assets/themes/night_owl.conf b/novelwriter/assets/themes/night_owl.conf index 422b7374..79f9a5a5 100644 --- a/novelwriter/assets/themes/night_owl.conf +++ b/novelwriter/assets/themes/night_owl.conf @@ -52,7 +52,7 @@ inactive = red disabled = faded [Palette] -window = #434652 +window = base:L140 windowtext = default base = base alternatebase = #32374d diff --git a/novelwriter/assets/themes/tango_dark.conf b/novelwriter/assets/themes/tango_dark.conf index f987e44e..8bd7d23c 100644 --- a/novelwriter/assets/themes/tango_dark.conf +++ b/novelwriter/assets/themes/tango_dark.conf @@ -42,7 +42,7 @@ inactive = red disabled = faded [Palette] -window = #555753 +window = base:L140 windowtext = default base = base alternatebase = #454e51 diff --git a/novelwriter/assets/themes/tango_light.conf b/novelwriter/assets/themes/tango_light.conf index afc6e15a..df4b0a1b 100644 --- a/novelwriter/assets/themes/tango_light.conf +++ b/novelwriter/assets/themes/tango_light.conf @@ -5,10 +5,10 @@ author = Veronica Berglyd Olsen (adaptation) ## # Colours: -# Background = #eeeeec -# Foreground = #2e3436 +# Background = #eeeeec +# Foreground = #2e3436 # Comment = #8f8f8d -# Red = #a40000 +# Red = #a40000 # Orange = #c4a000 # Yellow = #fce94f # Green = #8ae234 @@ -20,7 +20,7 @@ author = Veronica Berglyd Olsen (adaptation) [Base] base = #eeeeec default = #2e3436 -faded = #888a85 +faded = #888a85 red = #a40000 orange = #ce5c00 yellow = #c4a000 @@ -42,7 +42,7 @@ inactive = red disabled = faded [Palette] -window = #d3d7cf +window = base:D110 windowtext = default base = base alternatebase = #e0e0e0 diff --git a/novelwriter/assets/themes/tomorrow_night_blue.conf b/novelwriter/assets/themes/tomorrow_night_blue.conf index 326eb9d2..a9b48dcc 100644 --- a/novelwriter/assets/themes/tomorrow_night_blue.conf +++ b/novelwriter/assets/themes/tomorrow_night_blue.conf @@ -52,7 +52,7 @@ inactive = red disabled = faded [Palette] -window = #00346e +window = base:L125 windowtext = default base = base alternatebase = #003f8e diff --git a/novelwriter/assets/themes/tomorrow_night_bright.conf b/novelwriter/assets/themes/tomorrow_night_bright.conf index 311ee3f1..e2df7d59 100644 --- a/novelwriter/assets/themes/tomorrow_night_bright.conf +++ b/novelwriter/assets/themes/tomorrow_night_bright.conf @@ -52,7 +52,7 @@ inactive = red disabled = faded [Palette] -window = #2a2a2a +window = #181818 windowtext = default base = base alternatebase = #424242 From 98d9853c7ed660f5fd7f9b8d196a2f1ab91d472e Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 11 Jun 2025 00:14:46 +0200 Subject: [PATCH 41/96] Tweak the opacity of paged sidebar buttons and welcome dialog list --- novelwriter/extensions/pagedsidebar.py | 2 +- novelwriter/tools/welcome.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/novelwriter/extensions/pagedsidebar.py b/novelwriter/extensions/pagedsidebar.py index b1745816..89df0c7f 100644 --- a/novelwriter/extensions/pagedsidebar.py +++ b/novelwriter/extensions/pagedsidebar.py @@ -156,7 +156,7 @@ class _PagedToolButton(QToolButton): if self.isChecked(): painter.setBrush(palette.highlight()) - painter.setOpacity(0.35) + painter.setOpacity(0.8) painter.drawRoundedRect(0, 0, width, height, 4, 4) textCol = palette.highlightedText().color() else: diff --git a/novelwriter/tools/welcome.py b/novelwriter/tools/welcome.py index 9c3f5776..c462b9af 100644 --- a/novelwriter/tools/welcome.py +++ b/novelwriter/tools/welcome.py @@ -419,7 +419,7 @@ class _ProjectListItem(QStyledItemDelegate): painter.save() if opt.state & QtSelected == QtSelected: painter.setOpacity(0.25) - painter.fillRect(rect, QApplication.palette().highlight()) + painter.fillRect(rect, QApplication.palette().text()) painter.setOpacity(1.0) painter.drawPixmap(2, rect.top() + 6, self._icon) From 968bdbf12a33568c51fb8ef7f62739a8a4ff8a8a Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 11 Jun 2025 21:57:15 +0200 Subject: [PATCH 42/96] Add LCARS theme --- novelwriter/assets/themes/lcars.conf | 77 ++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 novelwriter/assets/themes/lcars.conf diff --git a/novelwriter/assets/themes/lcars.conf b/novelwriter/assets/themes/lcars.conf new file mode 100644 index 00000000..f6d7410b --- /dev/null +++ b/novelwriter/assets/themes/lcars.conf @@ -0,0 +1,77 @@ +[Main] +name = LCARS +mode = dark +description = The Next Generation of Star Trek colours +author = Veronica Berglyd Olsen +credit = Veronica Berglyd Olsen +url = https://github.com/vkbo/novelWriter +license = CC BY-SA 4.0 +licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ + +[Base] +base = #101010 +default = #c7c7c7 +faded = #757575 +red = #cd6667 +orange = #ff9902 +yellow = #efcb73 +green = #8cff7f +cyan = #7ffff2 +blue = #96a0ff +purple = #e6b0d4 + +[Project] +root = yellow +folder = yellow +file = default +title = orange +chapter = red +scene = blue +note = yellow +active = blue +inactive = red +disabled = faded + +[Palette] +window = base:L160 +windowtext = default +base = base +alternatebase = base:L300 +text = default +tooltipbase = yellow:L140 +tooltiptext = base +button = base:L140 +buttontext = default +brighttext = base +highlight = purple +highlightedtext = base +link = blue +linkvisited = blue +accent = blue + +[GUI] +helptext = blue +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +link = blue +headertext = orange +headertag = red +emphasis = orange +dialog = yellow +altdialog = purple +note = blue +hidden = faded +shortcode = blue +keyword = red +tag = orange +value = orange +optional = blue +spellcheckline = red +errorline = red +replacetag = blue +modifier = red +texthighlight = orange:96 From 5ab3736f051d81aa393ff1c93c8d04828249e635 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 12 Jun 2025 11:42:52 +0200 Subject: [PATCH 43/96] Tweak colours --- novelwriter/assets/themes/lcars.conf | 34 ++++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/novelwriter/assets/themes/lcars.conf b/novelwriter/assets/themes/lcars.conf index f6d7410b..e0130c59 100644 --- a/novelwriter/assets/themes/lcars.conf +++ b/novelwriter/assets/themes/lcars.conf @@ -12,19 +12,19 @@ licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ base = #101010 default = #c7c7c7 faded = #757575 -red = #cd6667 +red = #e24d5f orange = #ff9902 -yellow = #efcb73 -green = #8cff7f +yellow = #ffdc59 +green = #54e985 cyan = #7ffff2 -blue = #96a0ff -purple = #e6b0d4 +blue = #009cff +purple = #8aa5ff [Project] -root = yellow +root = orange folder = yellow file = default -title = orange +title = green chapter = red scene = blue note = yellow @@ -33,7 +33,7 @@ inactive = red disabled = faded [Palette] -window = base:L160 +window = base:L180 windowtext = default base = base alternatebase = base:L300 @@ -45,9 +45,9 @@ buttontext = default brighttext = base highlight = purple highlightedtext = base -link = blue -linkvisited = blue -accent = blue +link = purple +linkvisited = purple +accent = orange [GUI] helptext = blue @@ -57,21 +57,21 @@ errortext = red [Syntax] background = base text = default -link = blue +link = purple headertext = orange headertag = red emphasis = orange dialog = yellow -altdialog = purple -note = blue +altdialog = green +note = purple hidden = faded -shortcode = blue +shortcode = purple keyword = red tag = orange value = orange -optional = blue +optional = purple spellcheckline = red errorline = red -replacetag = blue +replacetag = purple modifier = red texthighlight = orange:96 From 67d49a8f2b78442d2f3562c4445287707591c942 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 12 Jun 2025 16:52:24 +0200 Subject: [PATCH 44/96] Remove theme key from theme colours list --- novelwriter/constants.py | 1 - novelwriter/dialogs/preferences.py | 1 + tests/test_dialogs/test_dlg_preferences.py | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/novelwriter/constants.py b/novelwriter/constants.py index cdb05546..701ac5a1 100644 --- a/novelwriter/constants.py +++ b/novelwriter/constants.py @@ -447,7 +447,6 @@ class nwLabels: "Custom": (-1.0, -1.0), } THEME_COLORS: Final[dict[str, str]] = { - "theme": QT_TRANSLATE_NOOP("Constant", "Theme Colours"), "default": QT_TRANSLATE_NOOP("Constant", "Foreground Colour"), "base": QT_TRANSLATE_NOOP("Constant", "Background Colour"), "faded": QT_TRANSLATE_NOOP("Constant", "Faded Colour"), diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index 3d284c2e..1a8645b3 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -294,6 +294,7 @@ class GuiPreferences(NDialog): # Tree Icon Colours self.iconColTree = NComboBox(self) self.iconColTree.setMinimumWidth(200) + self.iconColTree.addItem(self.tr("Theme Colours"), DEF_TREECOL) for key, label in nwLabels.THEME_COLORS.items(): self.iconColTree.addItem(trConst(label), key) self.iconColTree.setCurrentData(CONFIG.iconColTree, DEF_TREECOL) diff --git a/tests/test_dialogs/test_dlg_preferences.py b/tests/test_dialogs/test_dlg_preferences.py index 9add0573..a017585f 100644 --- a/tests/test_dialogs/test_dlg_preferences.py +++ b/tests/test_dialogs/test_dlg_preferences.py @@ -27,7 +27,7 @@ from PyQt6.QtGui import QAction, QFont, QFontDatabase, QKeyEvent from PyQt6.QtWidgets import QFileDialog, QFontDialog from novelwriter import CONFIG, SHARED -from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT +from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT, DEF_TREECOL from novelwriter.constants import nwUnicode from novelwriter.dialogs.preferences import GuiPreferences from novelwriter.dialogs.quotes import GuiQuoteSelect @@ -198,7 +198,7 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): prefs.iconColDocs.setChecked(True) prefs.emphLabels.setChecked(True) - assert CONFIG.iconColTree == "theme" + assert CONFIG.iconColTree == DEF_TREECOL assert CONFIG.iconColDocs is False assert CONFIG.emphLabels is False From fe46a82e63dd065b5ee0ce58bbcea6da9c7ef283 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 12 Jun 2025 16:55:12 +0200 Subject: [PATCH 45/96] Change how colours are stored for status labels to use theme colour or hex format --- novelwriter/core/projectxml.py | 15 ++++++++---- novelwriter/core/status.py | 28 ++++++++++++--------- novelwriter/gui/theme.py | 16 ++++++------ tests/test_gui/test_gui_theme.py | 42 ++++++++++++++++---------------- 4 files changed, 55 insertions(+), 46 deletions(-) diff --git a/novelwriter/core/projectxml.py b/novelwriter/core/projectxml.py index 1e0e146b..a20649d2 100644 --- a/novelwriter/core/projectxml.py +++ b/novelwriter/core/projectxml.py @@ -46,7 +46,7 @@ if TYPE_CHECKING: logger = logging.getLogger(__name__) FILE_VERSION = "1.5" # The current project file format version -FILE_REVISION = "5" # The current project file format revision +FILE_REVISION = "6" # The current project file format revision HEX_VERSION = 0x0105 NUM_VERSION = { @@ -111,6 +111,8 @@ class ProjectXMLReader: nodes. 2.5. Rev 5: Added novelChars and notesChars attributes to content node. 2.7 RC 1. + Rev 6: Replaced red, green and blue attributes with a single + color attribute. 2.8 Beta 1. """ def __init__(self, path: str | Path) -> None: @@ -439,12 +441,15 @@ class ProjectXMLReader: for xEntry in xItem: if xEntry.tag == "entry": key = xEntry.attrib.get("key", None) - red = checkInt(xEntry.attrib.get("red", 0), 0) - green = checkInt(xEntry.attrib.get("green", 0), 0) - blue = checkInt(xEntry.attrib.get("blue", 0), 0) + red = checkInt(xEntry.attrib.get("red", 0), 0) # Deprecated in 1.5 Rev 6 + green = checkInt(xEntry.attrib.get("green", 0), 0) # Deprecated in 1.5 Rev 6 + blue = checkInt(xEntry.attrib.get("blue", 0), 0) # Deprecated in 1.5 Rev 6 + color = xEntry.attrib.get("color") # Added in 1.5 Rev 6 count = checkInt(xEntry.attrib.get("count", 0), 0) shape = xEntry.attrib.get("shape", "") - sObject.add(key, xEntry.text or "", (red, green, blue), shape, count) + if color is None: + color = f"{red}, {green}, {blue}" + sObject.add(key, xEntry.text or "", color, shape, count) return def _parseDictKeyText(self, xItem: ET.Element) -> dict: diff --git a/novelwriter/core/status.py b/novelwriter/core/status.py index f7d9b584..1fdf5396 100644 --- a/novelwriter/core/status.py +++ b/novelwriter/core/status.py @@ -35,6 +35,7 @@ from PyQt6.QtGui import QColor, QIcon, QPainter, QPainterPath, QPixmap, QPolygon from novelwriter import SHARED from novelwriter.common import simplified +from novelwriter.constants import nwLabels from novelwriter.enum import nwStatusShape from novelwriter.types import QtPaintAntiAlias, QtTransparent @@ -43,12 +44,15 @@ if TYPE_CHECKING: logger = logging.getLogger(__name__) +CUSTOM_COL = "custom" + @dataclasses.dataclass class StatusEntry: name: str color: QColor + theme: str shape: nwStatusShape icon: QIcon count: int = 0 @@ -62,7 +66,7 @@ class StatusEntry: return status -NO_ENTRY = StatusEntry("", QColor(0, 0, 0), nwStatusShape.SQUARE, QIcon(), 0) +NO_ENTRY = StatusEntry("", QColor(0, 0, 0), CUSTOM_COL, nwStatusShape.SQUARE, QIcon(), 0) T_UpdateEntry = list[tuple[str | None, StatusEntry]] T_StatusKind = Literal["s", "i"] @@ -97,15 +101,12 @@ class NWStatus: # Methods ## - def add(self, key: str | None, name: str, color: tuple[int, int, int], - shape: str, count: int) -> str: + def add(self, key: str | None, name: str, color: str, shape: str, count: int) -> str: """Add or update a status entry. If the key is invalid, a new key is generated. """ - if isinstance(color, tuple) and len(color) == 3: - qColor = QColor(*color) - else: - qColor = QColor(100, 100, 100) + qColor = SHARED.theme.parseColor(color) + theme = color if color in nwLabels.THEME_COLORS else CUSTOM_COL try: iShape = nwStatusShape[shape] @@ -115,7 +116,7 @@ class NWStatus: key = self._checkKey(key) name = simplified(name) icon = self.createIcon(self._height, qColor, iShape) - self._store[key] = StatusEntry(name, qColor, iShape, icon, count) + self._store[key] = StatusEntry(name, qColor, theme, iShape, icon, count) if self._default is None: self._default = key @@ -157,12 +158,14 @@ class NWStatus: def pack(self) -> Iterable[tuple[str, dict]]: """Pack the status entries into a dictionary.""" for key, entry in self._store.items(): + if entry.theme == CUSTOM_COL: + color = entry.color.name(QColor.NameFormat.HexRgb) + else: + color = entry.theme yield (entry.name, { "key": key, "count": str(entry.count), - "red": str(entry.color.red()), - "green": str(entry.color.green()), - "blue": str(entry.color.blue()), + "color": color, "shape": entry.shape.name, }) return @@ -179,8 +182,9 @@ class NWStatus: try: shape = nwStatusShape[str(data[0])] color = QColor(str(data[1])) + theme = CUSTOM_COL if data[1].startswith("#") else data[1] icon = NWStatus.createIcon(self._height, color, shape) - return StatusEntry(simplified(data[2]), color, shape, icon) + return StatusEntry(simplified(data[2]), color, theme, shape, icon) except Exception: logger.error("Could not parse entry %s", str(data)) return None diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index ee0e559f..fbde3028 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -40,7 +40,7 @@ from PyQt6.QtWidgets import QApplication from novelwriter import CONFIG from novelwriter.common import checkInt, minmax -from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT, DEF_ICONS +from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT, DEF_ICONS, DEF_TREECOL from novelwriter.constants import nwLabels from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType, nwTheme from novelwriter.error import logException @@ -438,7 +438,7 @@ class GuiTheme: self._guiPalette.setBrush(QtColDisabled, QPalette.ColorRole.Accent, grey) # Set project override colours - if (override := CONFIG.iconColTree) != "theme": + if (override := CONFIG.iconColTree) != DEF_TREECOL: color = self._qColors.get(override, QtBlack) self._setBaseColor("root", color) self._setBaseColor("folder", color) @@ -465,11 +465,7 @@ class GuiTheme: """Load a standard style sheet.""" return self._styleSheets.get(name, "") - ## - # Internal Functions - ## - - def _parseColor(self, value: str, default: QColor = QtBlack) -> QColor: + def parseColor(self, value: str, default: QColor = QtBlack) -> QColor: """Parse a string as a colour value.""" if value in self._qColors: # Named colour @@ -500,6 +496,10 @@ class GuiTheme: return QColor(*result) return default + ## + # Internal Functions + ## + def _setBaseColor(self, key: str, color: QColor) -> None: """Set the colour for a named colour.""" self._qColors[key] = QColor(color) @@ -560,7 +560,7 @@ class GuiTheme: def _readColor(self, parser: ConfigParser, section: str, name: str) -> QColor: """Parse a colour value from a config string.""" - return self._parseColor(parser.get(section, name, fallback="default")) + return self.parseColor(parser.get(section, name, fallback="default")) def _setPalette( self, parser: ConfigParser, section: str, name: str, value: QPalette.ColorRole diff --git a/tests/test_gui/test_gui_theme.py b/tests/test_gui/test_gui_theme.py index 27e5915d..04e4c62b 100644 --- a/tests/test_gui/test_gui_theme.py +++ b/tests/test_gui/test_gui_theme.py @@ -55,37 +55,37 @@ def testGuiTheme_ParseColor(): theme._qColors["grey"] = QColor(127, 127, 127) # By Name - assert theme._parseColor("red").getRgb() == (255, 0, 0, 255) - assert theme._parseColor("green").getRgb() == (0, 255, 0, 255) - assert theme._parseColor("blue").getRgb() == (0, 0, 255, 255) - assert theme._parseColor("bob").getRgb() == (0, 0, 0, 255) + assert theme.parseColor("red").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("green").getRgb() == (0, 255, 0, 255) + assert theme.parseColor("blue").getRgb() == (0, 0, 255, 255) + assert theme.parseColor("bob").getRgb() == (0, 0, 0, 255) # CSS Format - assert theme._parseColor("#ff0000").getRgb() == (255, 0, 0, 255) - assert theme._parseColor("#ff00007f").getRgb() == (255, 0, 0, 127) - assert theme._parseColor("#ff00").getRgb() == (0, 0, 0, 255) # Too short -> ignored - assert theme._parseColor("#ff00007f15").getRgb() == (0, 0, 0, 255) # Too long -> ignored + assert theme.parseColor("#ff0000").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("#ff00007f").getRgb() == (255, 0, 0, 127) + assert theme.parseColor("#ff00").getRgb() == (0, 0, 0, 255) # Too short -> ignored + assert theme.parseColor("#ff00007f15").getRgb() == (0, 0, 0, 255) # Too long -> ignored # Name + Alpha - assert theme._parseColor("red:255").getRgb() == (255, 0, 0, 255) - assert theme._parseColor("red:127").getRgb() == (255, 0, 0, 127) - assert theme._parseColor("red:512").getRgb() == (255, 0, 0, 255) # Value truncated + assert theme.parseColor("red:255").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("red:127").getRgb() == (255, 0, 0, 127) + assert theme.parseColor("red:512").getRgb() == (255, 0, 0, 255) # Value truncated # Name + Lighter - assert theme._parseColor("grey:L100").getRgb() == (127, 127, 127, 255) - assert theme._parseColor("grey:L150").getRgb() == (190, 190, 190, 255) - assert theme._parseColor("grey:L50").getRgb() == (63, 63, 63, 255) + assert theme.parseColor("grey:L100").getRgb() == (127, 127, 127, 255) + assert theme.parseColor("grey:L150").getRgb() == (190, 190, 190, 255) + assert theme.parseColor("grey:L50").getRgb() == (63, 63, 63, 255) # Name + Darker - assert theme._parseColor("grey:D100").getRgb() == (127, 127, 127, 255) - assert theme._parseColor("grey:D150").getRgb() == (85, 85, 85, 255) - assert theme._parseColor("grey:D50").getRgb() == (254, 254, 254, 255) + assert theme.parseColor("grey:D100").getRgb() == (127, 127, 127, 255) + assert theme.parseColor("grey:D150").getRgb() == (85, 85, 85, 255) + assert theme.parseColor("grey:D50").getRgb() == (254, 254, 254, 255) # Values - assert theme._parseColor("255, 0, 0").getRgb() == (255, 0, 0, 255) - assert theme._parseColor("255, 0, 0, 255").getRgb() == (255, 0, 0, 255) - assert theme._parseColor("255, 0, 0, 127").getRgb() == (255, 0, 0, 127) - assert theme._parseColor("255, 0, 0, 127, 42").getRgb() == (255, 0, 0, 127) # Truncated + assert theme.parseColor("255, 0, 0").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("255, 0, 0, 255").getRgb() == (255, 0, 0, 255) + assert theme.parseColor("255, 0, 0, 127").getRgb() == (255, 0, 0, 127) + assert theme.parseColor("255, 0, 0, 127, 42").getRgb() == (255, 0, 0, 127) # Truncated @pytest.mark.gui From 2e0ee9b75ff3a3670d98c602ed401ad7e78cba98 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 12 Jun 2025 16:55:28 +0200 Subject: [PATCH 46/96] Update project settings for for status and importance colours --- novelwriter/dialogs/projectsettings.py | 88 ++++++++++++++++++++------ 1 file changed, 67 insertions(+), 21 deletions(-) diff --git a/novelwriter/dialogs/projectsettings.py b/novelwriter/dialogs/projectsettings.py index 623be345..071664fc 100644 --- a/novelwriter/dialogs/projectsettings.py +++ b/novelwriter/dialogs/projectsettings.py @@ -33,14 +33,14 @@ from PyQt6.QtCore import Qt, pyqtSignal, pyqtSlot from PyQt6.QtGui import QCloseEvent, QColor from PyQt6.QtWidgets import ( QAbstractItemView, QApplication, QColorDialog, QDialogButtonBox, - QFileDialog, QGridLayout, QHBoxLayout, QLineEdit, QMenu, QStackedWidget, - QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget + QFileDialog, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QMenu, + QStackedWidget, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget ) from novelwriter import CONFIG, SHARED from novelwriter.common import formatFileFilter, qtAddAction, qtLambda, simplified from novelwriter.constants import nwLabels, trConst -from novelwriter.core.status import NWStatus, StatusEntry +from novelwriter.core.status import CUSTOM_COL, NWStatus, StatusEntry from novelwriter.enum import nwStatusShape from novelwriter.extensions.configlayout import NColorLabel, NFixedPage, NScrollableForm from novelwriter.extensions.modified import NComboBox, NDialog, NIconToolButton @@ -326,6 +326,7 @@ class _StatusPage(NFixedPage): self._changed = False self._color = QColor(100, 100, 100) self._shape = nwStatusShape.SQUARE + self._theme = CUSTOM_COL self._icons = {} self._iPx = SHARED.theme.baseIconHeight @@ -384,11 +385,26 @@ class _StatusPage(NFixedPage): self.exportButton.clicked.connect(self._exportLabels) # Edit Form - self.labelText = QLineEdit(self) - self.labelText.setMaxLength(40) - self.labelText.setPlaceholderText(self.tr("Select item to edit")) - self.labelText.setEnabled(False) - self.labelText.textEdited.connect(self._onNameEdit) + self.editName = QLineEdit(self) + self.editName.setMaxLength(40) + self.editName.setPlaceholderText(self.tr("Select item to edit")) + self.editName.setEnabled(False) + self.editName.textEdited.connect(self._onNameEdit) + + self.labelName = QLabel(self.tr("Label"), self) + self.labelName.setBuddy(self.editName) + + # Icon Colours + self.iconColor = NComboBox(self) + self.iconColor.setMinimumWidth(200) + self.iconColor.setEnabled(False) + self.iconColor.addItem(self.tr("Custom"), CUSTOM_COL) + for key, label in nwLabels.THEME_COLORS.items(): + self.iconColor.addItem(trConst(label), key) + self.iconColor.currentIndexChanged.connect(self._onThemeSelect) + + self.labelColor = QLabel(self.tr("Colour"), self) + self.labelColor.setBuddy(self.iconColor) buttonStyle = ( "QToolButton {padding: 0 4px;} " @@ -425,6 +441,9 @@ class _StatusPage(NFixedPage): self.shapeButton.setStyleSheet(buttonStyle) self.shapeButton.setEnabled(False) + self.labelShape = QLabel(self.tr("Shape"), self) + self.labelShape.setBuddy(self.iconColor) + # Assemble self.listControls = QVBoxLayout() self.listControls.addWidget(self.addButton) @@ -435,10 +454,15 @@ class _StatusPage(NFixedPage): self.listControls.addWidget(self.importButton) self.listControls.addWidget(self.exportButton) - self.editBox = QHBoxLayout() - self.editBox.addWidget(self.labelText, 1) - self.editBox.addWidget(self.colorButton, 0) - self.editBox.addWidget(self.shapeButton, 0) + self.editBox = QGridLayout() + self.editBox.addWidget(self.labelName, 0, 0) + self.editBox.addWidget(self.editName, 0, 1, 1, 5) + self.editBox.addWidget(self.labelColor, 1, 0) + self.editBox.addWidget(self.iconColor, 1, 1) + self.editBox.addWidget(self.colorButton, 1, 2) + self.editBox.addWidget(self.labelShape, 1, 3) + self.editBox.addWidget(self.shapeButton, 1, 4) + self.editBox.setColumnStretch(5, 1) self.innerBox = QGridLayout() self.innerBox.addWidget(self.listBox, 0, 0) @@ -496,11 +520,20 @@ class _StatusPage(NFixedPage): self._changed = True return + @pyqtSlot(int) + def _onThemeSelect(self, index: int) -> None: + """Update the colour handling on theme selection change.""" + self._theme = str(self.iconColor.currentData()) + self._setButtonIcons() + self._updateIcon() + return + @pyqtSlot() def _onColorSelect(self) -> None: """Open a dialog to select the status icon colour.""" if (color := QColorDialog.getColor(self._color, self, self.trSelColor)).isValid(): self._color = color + self._theme = CUSTOM_COL self._setButtonIcons() self._updateIcon() return @@ -511,7 +544,8 @@ class _StatusPage(NFixedPage): color = QColor(100, 100, 100) shape = nwStatusShape.SQUARE icon = NWStatus.createIcon(self._iPx, color, shape) - self._addItem(None, StatusEntry(self.tr("New Item"), color, shape, icon, 0)) + theme = str(self.iconColor.currentData()) + self._addItem(None, StatusEntry(self.tr("New Item"), color, theme, shape, icon, 0)) self._changed = True return @@ -537,22 +571,26 @@ class _StatusPage(NFixedPage): entry: StatusEntry = item.data(self.C_DATA, self.D_ENTRY) self._color = entry.color self._shape = entry.shape + self._theme = entry.theme self._setButtonIcons() - self.labelText.setText(entry.name) - self.labelText.selectAll() - self.labelText.setFocus() + self.editName.setText(entry.name) + self.editName.selectAll() + self.editName.setFocus() - self.labelText.setEnabled(True) + self.editName.setEnabled(True) + self.iconColor.setEnabled(True) self.colorButton.setEnabled(True) self.shapeButton.setEnabled(True) else: self._color = QColor(100, 100, 100) self._shape = nwStatusShape.SQUARE + self._theme = CUSTOM_COL self._setButtonIcons() - self.labelText.setText("") + self.editName.setText("") - self.labelText.setEnabled(False) + self.editName.setEnabled(False) + self.iconColor.setEnabled(False) self.colorButton.setEnabled(False) self.shapeButton.setEnabled(False) return @@ -608,10 +646,11 @@ class _StatusPage(NFixedPage): def _updateIcon(self) -> None: """Apply changes made to a status icon.""" if item := self._getSelectedItem(): - icon = NWStatus.createIcon(self._iPx, self._color, self._shape) + icon = NWStatus.createIcon(self._iPx, self._pickColor(), self._shape) entry: StatusEntry = item.data(self.C_DATA, self.D_ENTRY) entry.color = self._color entry.shape = self._shape + entry.theme = self._theme entry.icon = icon item.setIcon(self.C_LABEL, icon) self._changed = True @@ -658,11 +697,18 @@ class _StatusPage(NFixedPage): def _setButtonIcons(self) -> None: """Set the colour of the colour button.""" - icon = NWStatus.createIcon(self._iPx, self._color, nwStatusShape.SQUARE) + icon = NWStatus.createIcon(self._iPx, self._pickColor(), nwStatusShape.SQUARE) + self.iconColor.setCurrentData(self._theme, CUSTOM_COL) self.colorButton.setIcon(icon) self.shapeButton.setIcon(self._icons[self._shape]) return + def _pickColor(self) -> QColor: + """Get the correct colour value based on selections.""" + if self._theme == CUSTOM_COL: + return self._color + return SHARED.theme.getBaseColor(self._theme) + class _ReplacePage(NFixedPage): From ff85c6688f1183a4f67c97de52a54db1a11ade18 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 12 Jun 2025 17:59:38 +0200 Subject: [PATCH 47/96] Add methods to refresh status icons on theme change --- novelwriter/core/project.py | 22 ++++++++++++++-------- novelwriter/core/status.py | 10 ++++++++++ novelwriter/guimain.py | 1 + 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/novelwriter/core/project.py b/novelwriter/core/project.py index ed5a8284..e86b744b 100644 --- a/novelwriter/core/project.py +++ b/novelwriter/core/project.py @@ -483,14 +483,14 @@ class NWProject: def setDefaultStatusImport(self) -> None: """Set the default status and importance values.""" - self._data.itemStatus.add(None, self.tr("New"), (120, 120, 120), "STAR", 0) - self._data.itemStatus.add(None, self.tr("Note"), (205, 171, 143), "TRIANGLE", 0) - self._data.itemStatus.add(None, self.tr("Draft"), (143, 240, 164), "CIRCLE_T", 0) - self._data.itemStatus.add(None, self.tr("Finished"), (249, 240, 107), "STAR", 0) - self._data.itemImport.add(None, self.tr("New"), (120, 120, 120), "SQUARE", 0) - self._data.itemImport.add(None, self.tr("Minor"), (220, 138, 221), "BLOCK_2", 0) - self._data.itemImport.add(None, self.tr("Major"), (220, 138, 221), "BLOCK_3", 0) - self._data.itemImport.add(None, self.tr("Main"), (220, 138, 221), "BLOCK_4", 0) + self._data.itemStatus.add(None, self.tr("New"), "faded", "STAR", 0) + self._data.itemStatus.add(None, self.tr("Note"), "red", "TRIANGLE", 0) + self._data.itemStatus.add(None, self.tr("Draft"), "yellow", "CIRCLE_T", 0) + self._data.itemStatus.add(None, self.tr("Finished"), "green", "STAR", 0) + self._data.itemImport.add(None, self.tr("New"), "purple", "SQUARE", 0) + self._data.itemImport.add(None, self.tr("Minor"), "purple", "BLOCK_2", 0) + self._data.itemImport.add(None, self.tr("Major"), "purple", "BLOCK_3", 0) + self._data.itemImport.add(None, self.tr("Main"), "purple", "BLOCK_4", 0) return def setProjectLang(self, language: str | None) -> None: @@ -547,6 +547,12 @@ class NWProject: self._tree.refreshAllItems() return + def updateTheme(self) -> None: + """Update theme elements.""" + self._data.itemStatus.refreshIcons() + self._data.itemImport.refreshIcons() + return + def localLookup(self, word: str | int) -> str: """Look up a word or number in the translation map for the project and return it. The variable is cast to a string before diff --git a/novelwriter/core/status.py b/novelwriter/core/status.py index 1fdf5396..bcee828c 100644 --- a/novelwriter/core/status.py +++ b/novelwriter/core/status.py @@ -189,6 +189,16 @@ class NWStatus: logger.error("Could not parse entry %s", str(data)) return None + def refreshIcons(self) -> None: + """Refresh all icons.""" + for entry in self._store.values(): + if entry.theme != CUSTOM_COL: + print("<", entry.color.name(QColor.NameFormat.HexRgb)) + entry.color = SHARED.theme.parseColor(entry.theme) + print(">", entry.color.name(QColor.NameFormat.HexRgb)) + entry.icon = NWStatus.createIcon(self._height, entry.color, entry.shape) + return + @staticmethod def createIcon(height: int, color: QColor, shape: nwStatusShape) -> QIcon: """Generate an icon for a status label.""" diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index 25f997f6..680f35d5 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -913,6 +913,7 @@ class GuiMain(QMainWindow): def refreshThemeColors(self, syntax: bool = False, force: bool = False) -> None: """Refresh the GUI theme.""" SHARED.theme.loadTheme(force=force) + SHARED.project.updateTheme() self.setPalette(QApplication.palette()) self.docEditor.updateTheme() self.docViewer.updateTheme() From e3eea2628a4b377931c92f79ba64b28a592895e0 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 12 Jun 2025 19:22:11 +0200 Subject: [PATCH 48/96] Fix current tests --- novelwriter/core/projectxml.py | 8 +- sample/nwProject.nwx | 30 +-- tests/conftest.py | 8 +- tests/files/nwProject-1.5.nwx | 26 +-- tests/lipsum/nwProject.nwx | 20 +- .../coreProject_NewFileFolder_nwProject.nwx | 18 +- .../coreProject_NewRoot_nwProject.nwx | 18 +- .../coreTools_DocDuplicator_nwProject.nwx | 18 +- .../coreTools_ProjectBuilderA_nwProject.nwx | 18 +- .../coreTools_ProjectBuilderB_nwProject.nwx | 18 +- .../reference/fmtToDocX_SaveDocument_core.xml | 6 +- .../guiEditor_Main_Final_nwProject.nwx | 18 +- .../guiEditor_Main_Initial_nwProject.nwx | 18 +- tests/reference/projectXML_ReadLegacy10.nwx | 24 +- tests/reference/projectXML_ReadLegacy11.nwx | 24 +- tests/reference/projectXML_ReadLegacy12.nwx | 24 +- tests/reference/projectXML_ReadLegacy13.nwx | 24 +- tests/reference/projectXML_ReadLegacy14.nwx | 24 +- tests/test_core/test_core_item.py | 4 +- tests/test_core/test_core_projectxml.py | 216 ++++++++++++------ tests/test_core/test_core_status.py | 93 ++++---- .../test_dialogs/test_dlg_projectsettings.py | 24 +- tests/test_gui/test_gui_docviewerpanel.py | 2 +- 23 files changed, 380 insertions(+), 303 deletions(-) diff --git a/novelwriter/core/projectxml.py b/novelwriter/core/projectxml.py index a20649d2..47ea748e 100644 --- a/novelwriter/core/projectxml.py +++ b/novelwriter/core/projectxml.py @@ -441,10 +441,10 @@ class ProjectXMLReader: for xEntry in xItem: if xEntry.tag == "entry": key = xEntry.attrib.get("key", None) - red = checkInt(xEntry.attrib.get("red", 0), 0) # Deprecated in 1.5 Rev 6 - green = checkInt(xEntry.attrib.get("green", 0), 0) # Deprecated in 1.5 Rev 6 - blue = checkInt(xEntry.attrib.get("blue", 0), 0) # Deprecated in 1.5 Rev 6 - color = xEntry.attrib.get("color") # Added in 1.5 Rev 6 + red = checkInt(xEntry.attrib.get("red", 0), 0) # Deprecated in 1.5 R6 + green = checkInt(xEntry.attrib.get("green", 0), 0) # Deprecated in 1.5 R6 + blue = checkInt(xEntry.attrib.get("blue", 0), 0) # Deprecated in 1.5 R6 + color = xEntry.attrib.get("color") # Added in 1.5 R6 count = checkInt(xEntry.attrib.get("count", 0), 0) shape = xEntry.attrib.get("shape", "") if color is None: diff --git a/sample/nwProject.nwx b/sample/nwProject.nwx index ae0fee4d..32ed2662 100644 --- a/sample/nwProject.nwx +++ b/sample/nwProject.nwx @@ -1,6 +1,6 @@ - - + + Sample Project Jane Smith @@ -20,20 +20,20 @@ D - New - Notes - Started - 1st Draft - 2nd Draft - 3rd Draft - Finished + New + Notes + Started + 1st Draft + 2nd Draft + 3rd Draft + Finished - None - Background - Minor - Major - Main + None + Background + Minor + Major + Main @@ -58,7 +58,7 @@ Chapter One - + Making a Scene diff --git a/tests/conftest.py b/tests/conftest.py index a2c3ad03..bd66447b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -35,7 +35,7 @@ sys.path.insert(1, str(Path(__file__).parent.parent.absolute())) from novelwriter import CONFIG, SHARED -from tests.mocked import MockGuiMain, MockTheme +from tests.mocked import MockGuiMain from tests.tools import cleanProject _TST_ROOT = Path(__file__).parent @@ -151,12 +151,16 @@ def projPath(fncPath): @pytest.fixture(scope="function") def mockGUI(qtbot, monkeypatch): """Create a mock instance of novelWriter's main GUI class.""" + from novelwriter.gui.theme import GuiTheme + monkeypatch.setattr(QMessageBox, "exec", lambda *a: None) monkeypatch.setattr(QMessageBox, "result", lambda *a: QMessageBox.StandardButton.Yes) gui = MockGuiMain() - theme = MockTheme() + theme = GuiTheme() + theme.loadTheme() monkeypatch.setattr(SHARED, "_gui", gui) monkeypatch.setattr(SHARED, "_theme", theme) + return gui diff --git a/tests/files/nwProject-1.5.nwx b/tests/files/nwProject-1.5.nwx index cd103d11..839b0876 100644 --- a/tests/files/nwProject-1.5.nwx +++ b/tests/files/nwProject-1.5.nwx @@ -1,5 +1,5 @@ - + Sample Project Jane Smith @@ -20,20 +20,20 @@ D - New - Notes - Started - 1st Draft - 2nd Draft - 3rd Draft - Finished + New + Notes + Started + 1st Draft + 2nd Draft + 3rd Draft + Finished - None - Background - Minor - Major - Main + None + Background + Minor + Major + Main diff --git a/tests/lipsum/nwProject.nwx b/tests/lipsum/nwProject.nwx index de32f1f6..f2c7e31c 100644 --- a/tests/lipsum/nwProject.nwx +++ b/tests/lipsum/nwProject.nwx @@ -1,6 +1,6 @@ - - + + Lorem Ipsum lipsum.com @@ -19,16 +19,16 @@ Replace Text 2 - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/coreProject_NewFileFolder_nwProject.nwx b/tests/reference/coreProject_NewFileFolder_nwProject.nwx index b244eeb6..d3eec6c6 100644 --- a/tests/reference/coreProject_NewFileFolder_nwProject.nwx +++ b/tests/reference/coreProject_NewFileFolder_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/coreProject_NewRoot_nwProject.nwx b/tests/reference/coreProject_NewRoot_nwProject.nwx index abcfdfb7..4c253097 100644 --- a/tests/reference/coreProject_NewRoot_nwProject.nwx +++ b/tests/reference/coreProject_NewRoot_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/coreTools_DocDuplicator_nwProject.nwx b/tests/reference/coreTools_DocDuplicator_nwProject.nwx index 9b0d2071..2fb52c05 100644 --- a/tests/reference/coreTools_DocDuplicator_nwProject.nwx +++ b/tests/reference/coreTools_DocDuplicator_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/coreTools_ProjectBuilderA_nwProject.nwx b/tests/reference/coreTools_ProjectBuilderA_nwProject.nwx index 296b8172..5b7cbbab 100644 --- a/tests/reference/coreTools_ProjectBuilderA_nwProject.nwx +++ b/tests/reference/coreTools_ProjectBuilderA_nwProject.nwx @@ -1,5 +1,5 @@ - + Test Project A Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/coreTools_ProjectBuilderB_nwProject.nwx b/tests/reference/coreTools_ProjectBuilderB_nwProject.nwx index 531aea22..83362eb3 100644 --- a/tests/reference/coreTools_ProjectBuilderB_nwProject.nwx +++ b/tests/reference/coreTools_ProjectBuilderB_nwProject.nwx @@ -1,5 +1,5 @@ - + Test Project B Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/fmtToDocX_SaveDocument_core.xml b/tests/reference/fmtToDocX_SaveDocument_core.xml index 3a0d34b6..25a58621 100644 --- a/tests/reference/fmtToDocX_SaveDocument_core.xml +++ b/tests/reference/fmtToDocX_SaveDocument_core.xml @@ -1,10 +1,10 @@ - 2025-04-29T22:46:36 - 2025-04-29T22:46:36 + 2025-06-12T19:20:06 + 2025-06-12T19:20:06 lipsum.com Lorem Ipsum en_GB - 52 + 54 lipsum.com diff --git a/tests/reference/guiEditor_Main_Final_nwProject.nwx b/tests/reference/guiEditor_Main_Final_nwProject.nwx index 21078178..d415b195 100644 --- a/tests/reference/guiEditor_Main_Final_nwProject.nwx +++ b/tests/reference/guiEditor_Main_Final_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/guiEditor_Main_Initial_nwProject.nwx b/tests/reference/guiEditor_Main_Initial_nwProject.nwx index 1f3260da..bb69bd02 100644 --- a/tests/reference/guiEditor_Main_Initial_nwProject.nwx +++ b/tests/reference/guiEditor_Main_Initial_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/projectXML_ReadLegacy10.nwx b/tests/reference/projectXML_ReadLegacy10.nwx index cc0c7d88..3a59d7e7 100644 --- a/tests/reference/projectXML_ReadLegacy10.nwx +++ b/tests/reference/projectXML_ReadLegacy10.nwx @@ -1,5 +1,5 @@ - + Sample Project Jay Doh @@ -20,19 +20,19 @@ D - New - Notes - Started - 1st Draft - 2nd Draft - 3rd Draft - Finished + New + Notes + Started + 1st Draft + 2nd Draft + 3rd Draft + Finished - None - Minor - Major - Main + None + Minor + Major + Main diff --git a/tests/reference/projectXML_ReadLegacy11.nwx b/tests/reference/projectXML_ReadLegacy11.nwx index 0ea370fb..bd4bc6f5 100644 --- a/tests/reference/projectXML_ReadLegacy11.nwx +++ b/tests/reference/projectXML_ReadLegacy11.nwx @@ -1,5 +1,5 @@ - + Sample Project Jay Doh @@ -20,19 +20,19 @@ D - New - Notes - Started - 1st Draft - 2nd Draft - 3rd Draft - Finished + New + Notes + Started + 1st Draft + 2nd Draft + 3rd Draft + Finished - None - Minor - Major - Main + None + Minor + Major + Main diff --git a/tests/reference/projectXML_ReadLegacy12.nwx b/tests/reference/projectXML_ReadLegacy12.nwx index bac7fb3a..7a949b06 100644 --- a/tests/reference/projectXML_ReadLegacy12.nwx +++ b/tests/reference/projectXML_ReadLegacy12.nwx @@ -1,5 +1,5 @@ - + Sample Project Jay Doh @@ -20,19 +20,19 @@ D - New - Notes - Started - 1st Draft - 2nd Draft - 3rd Draft - Finished + New + Notes + Started + 1st Draft + 2nd Draft + 3rd Draft + Finished - None - Minor - Major - Main + None + Minor + Major + Main diff --git a/tests/reference/projectXML_ReadLegacy13.nwx b/tests/reference/projectXML_ReadLegacy13.nwx index 1fb96f5e..c9fc13e6 100644 --- a/tests/reference/projectXML_ReadLegacy13.nwx +++ b/tests/reference/projectXML_ReadLegacy13.nwx @@ -1,5 +1,5 @@ - + Sample Project Jay Doh @@ -20,19 +20,19 @@ D - New - Notes - Started - 1st Draft - 2nd Draft - 3rd Draft - Finished + New + Notes + Started + 1st Draft + 2nd Draft + 3rd Draft + Finished - None - Minor - Major - Main + None + Minor + Major + Main diff --git a/tests/reference/projectXML_ReadLegacy14.nwx b/tests/reference/projectXML_ReadLegacy14.nwx index 3c763d27..b123a490 100644 --- a/tests/reference/projectXML_ReadLegacy14.nwx +++ b/tests/reference/projectXML_ReadLegacy14.nwx @@ -1,5 +1,5 @@ - + Sample Project Jay Doh @@ -20,19 +20,19 @@ D - New - Notes - Started - 1st Draft - 2nd Draft - 3rd Draft - Finished + New + Notes + Started + 1st Draft + 2nd Draft + 3rd Draft + Finished - None - Minor - Major - Main + None + Minor + Major + Main diff --git a/tests/test_core/test_core_item.py b/tests/test_core/test_core_item.py index ad93f7db..f6cd4278 100644 --- a/tests/test_core/test_core_item.py +++ b/tests/test_core/test_core_item.py @@ -547,8 +547,8 @@ def testCoreItem_ClassDefaults(mockGUI): def testCoreItem_PackUnpack(mockGUI, caplog, mockRnd): """Test packing and unpacking entries for the NWItem class.""" project = NWProject() - project.data.itemStatus.add(None, "New", (100, 100, 100), "SQUARE", 0) - project.data.itemImport.add(None, "New", (100, 100, 100), "SQUARE", 0) + project.data.itemStatus.add(None, "New", "#646464", "SQUARE", 0) + project.data.itemImport.add(None, "New", "#646464", "SQUARE", 0) # Invalid item = NWItem(project, "0000000000000") diff --git a/tests/test_core/test_core_projectxml.py b/tests/test_core/test_core_projectxml.py index 3021c7c4..ebccbbfa 100644 --- a/tests/test_core/test_core_projectxml.py +++ b/tests/test_core/test_core_projectxml.py @@ -27,12 +27,11 @@ from shutil import copyfile import pytest -from PyQt6.QtGui import QColor - from novelwriter.constants import nwFiles from novelwriter.core.item import NWItem from novelwriter.core.projectdata import NWProjectData from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState +from novelwriter.core.status import CUSTOM_COL from novelwriter.enum import nwStatusShape from tests.mocked import causeOSError @@ -137,7 +136,7 @@ def testCoreProjectXML_ReadCurrent(monkeypatch, mockGUI, tstPaths, fncPath): assert xmlReader.state == XMLReadState.PARSED_OK assert xmlReader.xmlRoot == "novelWriterXML" assert xmlReader.xmlVersion == 0x0105 - assert xmlReader.xmlRevision == 5 + assert xmlReader.xmlRevision == 6 assert xmlReader.appVersion == "2.7b1" assert xmlReader.hexVersion == 0x020700b1 @@ -173,19 +172,31 @@ def testCoreProjectXML_ReadCurrent(monkeypatch, mockGUI, tstPaths, fncPath): assert data.itemImport["i2d7a54"].name == "Major" assert data.itemImport["i56be10"].name == "Main" - assert data.itemStatus["sf12341"].color == QColor(100, 100, 100) - assert data.itemStatus["sf24ce6"].color == QColor(200, 50, 0) - assert data.itemStatus["sc24b8f"].color == QColor(182, 60, 0) - assert data.itemStatus["s90e6c9"].color == QColor(193, 129, 0) - assert data.itemStatus["sd51c5b"].color == QColor(193, 129, 0) - assert data.itemStatus["s8ae72a"].color == QColor(193, 129, 0) - assert data.itemStatus["s78ea90"].color == QColor(58, 180, 58) + assert data.itemStatus["sf12341"].color.getRgb() == (100, 100, 100, 255) + assert data.itemStatus["sf24ce6"].color.getRgb() == (200, 50, 0, 255) + assert data.itemStatus["sc24b8f"].color.getRgb() == (182, 60, 0, 255) + assert data.itemStatus["s90e6c9"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["sd51c5b"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s8ae72a"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s78ea90"].color.getRgb() == (58, 180, 58, 255) - assert data.itemImport["ia857f0"].color == QColor(100, 100, 100) - assert data.itemImport["i4a1d39"].color == QColor(220, 138, 221) - assert data.itemImport["icfb3a5"].color == QColor(220, 138, 221) - assert data.itemImport["i2d7a54"].color == QColor(220, 138, 221) - assert data.itemImport["i56be10"].color == QColor(220, 138, 221) + assert data.itemImport["ia857f0"].color.getRgb() == (100, 100, 100, 255) + assert data.itemImport["icfb3a5"].color.getRgb() == (220, 138, 221, 255) + assert data.itemImport["i2d7a54"].color.getRgb() == (220, 138, 221, 255) + assert data.itemImport["i56be10"].color.getRgb() == (220, 138, 221, 255) + + assert data.itemStatus["sf12341"].theme == CUSTOM_COL + assert data.itemStatus["sf24ce6"].theme == CUSTOM_COL + assert data.itemStatus["sc24b8f"].theme == CUSTOM_COL + assert data.itemStatus["s90e6c9"].theme == CUSTOM_COL + assert data.itemStatus["sd51c5b"].theme == CUSTOM_COL + assert data.itemStatus["s8ae72a"].theme == CUSTOM_COL + assert data.itemStatus["s78ea90"].theme == CUSTOM_COL + + assert data.itemImport["ia857f0"].theme == CUSTOM_COL + assert data.itemImport["icfb3a5"].theme == CUSTOM_COL + assert data.itemImport["i2d7a54"].theme == CUSTOM_COL + assert data.itemImport["i56be10"].theme == CUSTOM_COL assert data.itemStatus["sf12341"].shape == nwStatusShape.SQUARE assert data.itemStatus["sf24ce6"].shape == nwStatusShape.SQUARE @@ -305,18 +316,31 @@ def testCoreProjectXML_ReadLegacy10(tstPaths, fncPath, mockGUI, mockRnd): assert data.itemImport["i000009"].name == "Major" assert data.itemImport["i00000a"].name == "Main" - assert data.itemStatus["s000000"].color == QColor(100, 100, 100) - assert data.itemStatus["s000001"].color == QColor(200, 50, 0) - assert data.itemStatus["s000002"].color == QColor(182, 60, 0) - assert data.itemStatus["s000003"].color == QColor(193, 129, 0) - assert data.itemStatus["s000004"].color == QColor(193, 129, 0) - assert data.itemStatus["s000005"].color == QColor(193, 129, 0) - assert data.itemStatus["s000006"].color == QColor(58, 180, 58) + assert data.itemStatus["s000000"].color.getRgb() == (100, 100, 100, 255) + assert data.itemStatus["s000001"].color.getRgb() == (200, 50, 0, 255) + assert data.itemStatus["s000002"].color.getRgb() == (182, 60, 0, 255) + assert data.itemStatus["s000003"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s000004"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s000005"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s000006"].color.getRgb() == (58, 180, 58, 255) - assert data.itemImport["i000007"].color == QColor(100, 100, 100) - assert data.itemImport["i000008"].color == QColor(0, 122, 188) - assert data.itemImport["i000009"].color == QColor(21, 0, 180) - assert data.itemImport["i00000a"].color == QColor(117, 0, 175) + assert data.itemImport["i000007"].color.getRgb() == (100, 100, 100, 255) + assert data.itemImport["i000008"].color.getRgb() == (0, 122, 188, 255) + assert data.itemImport["i000009"].color.getRgb() == (21, 0, 180, 255) + assert data.itemImport["i00000a"].color.getRgb() == (117, 0, 175, 255) + + assert data.itemStatus["s000000"].theme == CUSTOM_COL + assert data.itemStatus["s000001"].theme == CUSTOM_COL + assert data.itemStatus["s000002"].theme == CUSTOM_COL + assert data.itemStatus["s000003"].theme == CUSTOM_COL + assert data.itemStatus["s000004"].theme == CUSTOM_COL + assert data.itemStatus["s000005"].theme == CUSTOM_COL + assert data.itemStatus["s000006"].theme == CUSTOM_COL + + assert data.itemImport["i000007"].theme == CUSTOM_COL + assert data.itemImport["i000008"].theme == CUSTOM_COL + assert data.itemImport["i000009"].theme == CUSTOM_COL + assert data.itemImport["i00000a"].theme == CUSTOM_COL assert data.itemStatus["s000000"].shape == nwStatusShape.SQUARE assert data.itemStatus["s000001"].shape == nwStatusShape.SQUARE @@ -450,18 +474,31 @@ def testCoreProjectXML_ReadLegacy11(tstPaths, fncPath, mockGUI, mockRnd): assert data.itemImport["i000009"].name == "Major" assert data.itemImport["i00000a"].name == "Main" - assert data.itemStatus["s000000"].color == QColor(100, 100, 100) - assert data.itemStatus["s000001"].color == QColor(200, 50, 0) - assert data.itemStatus["s000002"].color == QColor(182, 60, 0) - assert data.itemStatus["s000003"].color == QColor(193, 129, 0) - assert data.itemStatus["s000004"].color == QColor(193, 129, 0) - assert data.itemStatus["s000005"].color == QColor(193, 129, 0) - assert data.itemStatus["s000006"].color == QColor(58, 180, 58) + assert data.itemStatus["s000000"].color.getRgb() == (100, 100, 100, 255) + assert data.itemStatus["s000001"].color.getRgb() == (200, 50, 0, 255) + assert data.itemStatus["s000002"].color.getRgb() == (182, 60, 0, 255) + assert data.itemStatus["s000003"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s000004"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s000005"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s000006"].color.getRgb() == (58, 180, 58, 255) - assert data.itemImport["i000007"].color == QColor(100, 100, 100) - assert data.itemImport["i000008"].color == QColor(0, 122, 188) - assert data.itemImport["i000009"].color == QColor(21, 0, 180) - assert data.itemImport["i00000a"].color == QColor(117, 0, 175) + assert data.itemImport["i000007"].color.getRgb() == (100, 100, 100, 255) + assert data.itemImport["i000008"].color.getRgb() == (0, 122, 188, 255) + assert data.itemImport["i000009"].color.getRgb() == (21, 0, 180, 255) + assert data.itemImport["i00000a"].color.getRgb() == (117, 0, 175, 255) + + assert data.itemStatus["s000000"].theme == CUSTOM_COL + assert data.itemStatus["s000001"].theme == CUSTOM_COL + assert data.itemStatus["s000002"].theme == CUSTOM_COL + assert data.itemStatus["s000003"].theme == CUSTOM_COL + assert data.itemStatus["s000004"].theme == CUSTOM_COL + assert data.itemStatus["s000005"].theme == CUSTOM_COL + assert data.itemStatus["s000006"].theme == CUSTOM_COL + + assert data.itemImport["i000007"].theme == CUSTOM_COL + assert data.itemImport["i000008"].theme == CUSTOM_COL + assert data.itemImport["i000009"].theme == CUSTOM_COL + assert data.itemImport["i00000a"].theme == CUSTOM_COL assert data.itemStatus["s000000"].shape == nwStatusShape.SQUARE assert data.itemStatus["s000001"].shape == nwStatusShape.SQUARE @@ -595,18 +632,31 @@ def testCoreProjectXML_ReadLegacy12(tstPaths, fncPath, mockGUI, mockRnd): assert data.itemImport["i000009"].name == "Major" assert data.itemImport["i00000a"].name == "Main" - assert data.itemStatus["s000000"].color == QColor(100, 100, 100) - assert data.itemStatus["s000001"].color == QColor(200, 50, 0) - assert data.itemStatus["s000002"].color == QColor(182, 60, 0) - assert data.itemStatus["s000003"].color == QColor(193, 129, 0) - assert data.itemStatus["s000004"].color == QColor(193, 129, 0) - assert data.itemStatus["s000005"].color == QColor(193, 129, 0) - assert data.itemStatus["s000006"].color == QColor(58, 180, 58) + assert data.itemStatus["s000000"].color.getRgb() == (100, 100, 100, 255) + assert data.itemStatus["s000001"].color.getRgb() == (200, 50, 0, 255) + assert data.itemStatus["s000002"].color.getRgb() == (182, 60, 0, 255) + assert data.itemStatus["s000003"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s000004"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s000005"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s000006"].color.getRgb() == (58, 180, 58, 255) - assert data.itemImport["i000007"].color == QColor(100, 100, 100) - assert data.itemImport["i000008"].color == QColor(0, 122, 188) - assert data.itemImport["i000009"].color == QColor(21, 0, 180) - assert data.itemImport["i00000a"].color == QColor(117, 0, 175) + assert data.itemImport["i000007"].color.getRgb() == (100, 100, 100, 255) + assert data.itemImport["i000008"].color.getRgb() == (0, 122, 188, 255) + assert data.itemImport["i000009"].color.getRgb() == (21, 0, 180, 255) + assert data.itemImport["i00000a"].color.getRgb() == (117, 0, 175, 255) + + assert data.itemStatus["s000000"].theme == CUSTOM_COL + assert data.itemStatus["s000001"].theme == CUSTOM_COL + assert data.itemStatus["s000002"].theme == CUSTOM_COL + assert data.itemStatus["s000003"].theme == CUSTOM_COL + assert data.itemStatus["s000004"].theme == CUSTOM_COL + assert data.itemStatus["s000005"].theme == CUSTOM_COL + assert data.itemStatus["s000006"].theme == CUSTOM_COL + + assert data.itemImport["i000007"].theme == CUSTOM_COL + assert data.itemImport["i000008"].theme == CUSTOM_COL + assert data.itemImport["i000009"].theme == CUSTOM_COL + assert data.itemImport["i00000a"].theme == CUSTOM_COL assert data.itemStatus["s000000"].shape == nwStatusShape.SQUARE assert data.itemStatus["s000001"].shape == nwStatusShape.SQUARE @@ -743,18 +793,31 @@ def testCoreProjectXML_ReadLegacy13(tstPaths, fncPath, mockGUI, mockRnd): assert data.itemImport["i000009"].name == "Major" assert data.itemImport["i00000a"].name == "Main" - assert data.itemStatus["s000000"].color == QColor(100, 100, 100) - assert data.itemStatus["s000001"].color == QColor(200, 50, 0) - assert data.itemStatus["s000002"].color == QColor(182, 60, 0) - assert data.itemStatus["s000003"].color == QColor(193, 129, 0) - assert data.itemStatus["s000004"].color == QColor(193, 129, 0) - assert data.itemStatus["s000005"].color == QColor(193, 129, 0) - assert data.itemStatus["s000006"].color == QColor(58, 180, 58) + assert data.itemStatus["s000000"].color.getRgb() == (100, 100, 100, 255) + assert data.itemStatus["s000001"].color.getRgb() == (200, 50, 0, 255) + assert data.itemStatus["s000002"].color.getRgb() == (182, 60, 0, 255) + assert data.itemStatus["s000003"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s000004"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s000005"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s000006"].color.getRgb() == (58, 180, 58, 255) - assert data.itemImport["i000007"].color == QColor(100, 100, 100) - assert data.itemImport["i000008"].color == QColor(0, 122, 188) - assert data.itemImport["i000009"].color == QColor(21, 0, 180) - assert data.itemImport["i00000a"].color == QColor(117, 0, 175) + assert data.itemImport["i000007"].color.getRgb() == (100, 100, 100, 255) + assert data.itemImport["i000008"].color.getRgb() == (0, 122, 188, 255) + assert data.itemImport["i000009"].color.getRgb() == (21, 0, 180, 255) + assert data.itemImport["i00000a"].color.getRgb() == (117, 0, 175, 255) + + assert data.itemStatus["s000000"].theme == CUSTOM_COL + assert data.itemStatus["s000001"].theme == CUSTOM_COL + assert data.itemStatus["s000002"].theme == CUSTOM_COL + assert data.itemStatus["s000003"].theme == CUSTOM_COL + assert data.itemStatus["s000004"].theme == CUSTOM_COL + assert data.itemStatus["s000005"].theme == CUSTOM_COL + assert data.itemStatus["s000006"].theme == CUSTOM_COL + + assert data.itemImport["i000007"].theme == CUSTOM_COL + assert data.itemImport["i000008"].theme == CUSTOM_COL + assert data.itemImport["i000009"].theme == CUSTOM_COL + assert data.itemImport["i00000a"].theme == CUSTOM_COL assert data.itemStatus["s000000"].shape == nwStatusShape.SQUARE assert data.itemStatus["s000001"].shape == nwStatusShape.SQUARE @@ -891,18 +954,31 @@ def testCoreProjectXML_ReadLegacy14(tstPaths, fncPath, mockGUI, mockRnd): assert data.itemImport["i2d7a54"].name == "Major" assert data.itemImport["i56be10"].name == "Main" - assert data.itemStatus["sf12341"].color == QColor(100, 100, 100) - assert data.itemStatus["sf24ce6"].color == QColor(200, 50, 0) - assert data.itemStatus["sc24b8f"].color == QColor(182, 60, 0) - assert data.itemStatus["s90e6c9"].color == QColor(193, 129, 0) - assert data.itemStatus["sd51c5b"].color == QColor(193, 129, 0) - assert data.itemStatus["s8ae72a"].color == QColor(193, 129, 0) - assert data.itemStatus["s78ea90"].color == QColor(58, 180, 58) + assert data.itemStatus["sf12341"].color.getRgb() == (100, 100, 100, 255) + assert data.itemStatus["sf24ce6"].color.getRgb() == (200, 50, 0, 255) + assert data.itemStatus["sc24b8f"].color.getRgb() == (182, 60, 0, 255) + assert data.itemStatus["s90e6c9"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["sd51c5b"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s8ae72a"].color.getRgb() == (193, 129, 0, 255) + assert data.itemStatus["s78ea90"].color.getRgb() == (58, 180, 58, 255) - assert data.itemImport["ia857f0"].color == QColor(100, 100, 100) - assert data.itemImport["icfb3a5"].color == QColor(0, 122, 188) - assert data.itemImport["i2d7a54"].color == QColor(21, 0, 180) - assert data.itemImport["i56be10"].color == QColor(117, 0, 175) + assert data.itemImport["ia857f0"].color.getRgb() == (100, 100, 100, 255) + assert data.itemImport["icfb3a5"].color.getRgb() == (0, 122, 188, 255) + assert data.itemImport["i2d7a54"].color.getRgb() == (21, 0, 180, 255) + assert data.itemImport["i56be10"].color.getRgb() == (117, 0, 175, 255) + + assert data.itemStatus["sf12341"].theme == CUSTOM_COL + assert data.itemStatus["sf24ce6"].theme == CUSTOM_COL + assert data.itemStatus["sc24b8f"].theme == CUSTOM_COL + assert data.itemStatus["s90e6c9"].theme == CUSTOM_COL + assert data.itemStatus["sd51c5b"].theme == CUSTOM_COL + assert data.itemStatus["s8ae72a"].theme == CUSTOM_COL + assert data.itemStatus["s78ea90"].theme == CUSTOM_COL + + assert data.itemImport["ia857f0"].theme == CUSTOM_COL + assert data.itemImport["icfb3a5"].theme == CUSTOM_COL + assert data.itemImport["i2d7a54"].theme == CUSTOM_COL + assert data.itemImport["i56be10"].theme == CUSTOM_COL assert data.itemStatus["sf12341"].shape == nwStatusShape.SQUARE assert data.itemStatus["sf24ce6"].shape == nwStatusShape.SQUARE diff --git a/tests/test_core/test_core_status.py b/tests/test_core/test_core_status.py index dd6b18a5..3b5e80b8 100644 --- a/tests/test_core/test_core_status.py +++ b/tests/test_core/test_core_status.py @@ -24,7 +24,7 @@ import pytest from PyQt6.QtGui import QColor, QIcon -from novelwriter.core.status import NWStatus, StatusEntry, _ShapeCache +from novelwriter.core.status import CUSTOM_COL, NWStatus, StatusEntry, _ShapeCache from novelwriter.enum import nwStatusShape from tests.tools import C @@ -38,11 +38,12 @@ def testCoreStatus_StatusEntry(): """Test the StatusEntry class.""" color = QColor(255, 0, 0) icon = NWStatus.createIcon(24, color, nwStatusShape.CIRCLE) - entry = StatusEntry("Test", color, nwStatusShape.CIRCLE, icon, 42) + entry = StatusEntry("Test", color, CUSTOM_COL, nwStatusShape.CIRCLE, icon, 42) # Check values assert entry.name == "Test" assert entry.color is color + assert entry.theme == CUSTOM_COL assert entry.shape == nwStatusShape.CIRCLE assert entry.icon is icon assert entry.count == 42 @@ -55,6 +56,7 @@ def testCoreStatus_StatusEntry(): assert other.name == "Test" assert other.color is not color # Not the same object assert other.color == color # But same colours + assert entry.theme == CUSTOM_COL assert other.shape == nwStatusShape.CIRCLE assert other.icon is not icon # Not the same icon, but a copy assert other.count == 42 @@ -73,14 +75,14 @@ def testCoreStatus_Internal(mockGUI, mockRnd): assert nStatus._newKey() == statusKeys[1] # Key collision, should move to key 3 - nStatus.add(statusKeys[2], "Crash", (0, 0, 0), "SQUARE", 0) + nStatus.add(statusKeys[2], "Crash", "#000000", "SQUARE", 0) assert nStatus._newKey() == statusKeys[3] assert nImport._newKey() == importKeys[0] assert nImport._newKey() == importKeys[1] # Key collision, should move to key 3 - nImport.add(importKeys[2], "Crash", (0, 0, 0), "SQUARE", 0) + nImport.add(importKeys[2], "Crash", "#000000", "SQUARE", 0) assert nImport._newKey() == importKeys[3] # Check Key @@ -119,14 +121,14 @@ def testCoreStatus_Internal(mockGUI, mockRnd): def testCoreStatus_Iterator(mockGUI, mockRnd): """Test the iterator functions of the NWStatus class.""" nStatus = NWStatus(NWStatus.STATUS) - nStatus.add(None, "New", (100, 100, 100), "SQUARE", 0) - nStatus.add(None, "Note", (200, 50, 0), "CIRCLE", 1) - nStatus.add(None, "Draft", (200, 150, 0), "SQUARE", 2) - nStatus.add(None, "Finished", (50, 200, 0), "CIRCLE", 3) + nStatus.add(None, "New", "#646464", "SQUARE", 0) + nStatus.add(None, "Note", "#ff3f00", "CIRCLE", 1) + nStatus.add(None, "Draft", "#ffaf00", "SQUARE", 2) + nStatus.add(None, "Finished", "#3fff00", "CIRCLE", 3) # Direct access entry = nStatus[statusKeys[0]] - assert entry.color == QColor(100, 100, 100) + assert entry.color.getRgb() == (100, 100, 100, 255) assert entry.name == "New" assert entry.count == 0 assert isinstance(entry.icon, QIcon) @@ -146,8 +148,8 @@ def testCoreStatus_Iterator(mockGUI, mockRnd): ] # Content : Colours - assert [e.color for _, e in nStatus.iterItems()] == [ - QColor(100, 100, 100), QColor(200, 50, 0), QColor(200, 150, 0), QColor(50, 200, 0) + assert [e.color.getRgb() for _, e in nStatus.iterItems()] == [ + (100, 100, 100, 255), (255, 63, 0, 255), (255, 175, 0, 255), (63, 255, 0, 255) ] # Content : Shape @@ -168,27 +170,31 @@ def testCoreStatus_Entries(mockGUI, mockRnd): # === # Has a key - nStatus.add(statusKeys[0], "Entry 1", (200, 100, 50), "SQUARE", 0) + nStatus.add(statusKeys[0], "Entry 1", "200, 100, 50", "SQUARE", 0) assert nStatus[statusKeys[0]].name == "Entry 1" - assert nStatus[statusKeys[0]].color == QColor(200, 100, 50) + assert nStatus[statusKeys[0]].color.getRgb() == (200, 100, 50, 255) + assert nStatus[statusKeys[0]].theme == CUSTOM_COL assert nStatus[statusKeys[0]].shape == nwStatusShape.SQUARE # Doesn't have a key - nStatus.add(None, "Entry 2", (210, 110, 60), "SQUARE", 0) + nStatus.add(None, "Entry 2", "210, 110, 60", "SQUARE", 0) assert nStatus[statusKeys[1]].name == "Entry 2" - assert nStatus[statusKeys[1]].color == QColor(210, 110, 60) + assert nStatus[statusKeys[1]].color.getRgb() == (210, 110, 60, 255) + assert nStatus[statusKeys[1]].theme == CUSTOM_COL assert nStatus[statusKeys[1]].shape == nwStatusShape.SQUARE # Wrong colour spec, unknown shape - nStatus.add(None, "Entry 3", "what?", "", 0) # type: ignore + nStatus.add(None, "Entry 3", "what?", "", 0) assert nStatus[statusKeys[2]].name == "Entry 3" - assert nStatus[statusKeys[2]].color == QColor(100, 100, 100) + assert nStatus[statusKeys[2]].color.getRgb() == (0, 0, 0, 255) + assert nStatus[statusKeys[2]].theme == CUSTOM_COL assert nStatus[statusKeys[2]].shape == nwStatusShape.SQUARE - # Wrong colour count - nStatus.add(None, "Entry 4", (10, 20), "CIRCLE", 0) # type: ignore + # Wrong colour definition + nStatus.add(None, "Entry 4", "#stuff#", "CIRCLE", 0) assert nStatus[statusKeys[3]].name == "Entry 4" - assert nStatus[statusKeys[3]].color == QColor(100, 100, 100) + assert nStatus[statusKeys[3]].color.getRgb() == (0, 0, 0, 255) + assert nStatus[statusKeys[3]].theme == CUSTOM_COL assert nStatus[statusKeys[3]].shape == nwStatusShape.CIRCLE # Check @@ -202,8 +208,6 @@ def testCoreStatus_Entries(mockGUI, mockRnd): assert nStatus.check("s987654") == statusKeys[0] # Name Access - # =========== - assert nStatus[statusKeys[0]].name == "Entry 1" assert nStatus[statusKeys[1]].name == "Entry 2" assert nStatus[statusKeys[2]].name == "Entry 3" @@ -211,17 +215,20 @@ def testCoreStatus_Entries(mockGUI, mockRnd): assert nStatus["blablabla"].name == "Entry 1" # Colour Access - # ============= + assert nStatus[statusKeys[0]].color.getRgb() == (200, 100, 50, 255) + assert nStatus[statusKeys[1]].color.getRgb() == (210, 110, 60, 255) + assert nStatus[statusKeys[2]].color.getRgb() == (0, 0, 0, 255) + assert nStatus[statusKeys[3]].color.getRgb() == (0, 0, 0, 255) + assert nStatus["blablabla"].color.getRgb() == (200, 100, 50, 255) - assert nStatus[statusKeys[0]].color == QColor(200, 100, 50) - assert nStatus[statusKeys[1]].color == QColor(210, 110, 60) - assert nStatus[statusKeys[2]].color == QColor(100, 100, 100) - assert nStatus[statusKeys[3]].color == QColor(100, 100, 100) - assert nStatus["blablabla"].color == QColor(200, 100, 50) + # Theme Access + assert nStatus[statusKeys[0]].theme == CUSTOM_COL + assert nStatus[statusKeys[1]].theme == CUSTOM_COL + assert nStatus[statusKeys[2]].theme == CUSTOM_COL + assert nStatus[statusKeys[3]].theme == CUSTOM_COL + assert nStatus["blablabla"].theme == CUSTOM_COL # Icon Access - # =========== - assert isinstance(nStatus[statusKeys[0]].icon, QIcon) assert isinstance(nStatus[statusKeys[1]].icon, QIcon) assert isinstance(nStatus[statusKeys[2]].icon, QIcon) @@ -229,8 +236,6 @@ def testCoreStatus_Entries(mockGUI, mockRnd): assert isinstance(nStatus["blablabla"].icon, QIcon) # Shape Access - # ============ - assert nStatus[statusKeys[0]].shape == nwStatusShape.SQUARE assert nStatus[statusKeys[1]].shape == nwStatusShape.SQUARE assert nStatus[statusKeys[2]].shape == nwStatusShape.SQUARE @@ -322,10 +327,10 @@ def testCoreStatus_Entries(mockGUI, mockRnd): def testCoreStatus_Pack(mockGUI, mockRnd): """Test data packing of the NWStatus class.""" nStatus = NWStatus(NWStatus.STATUS) - nStatus.add(None, "New", (100, 100, 100), "SQUARE", 0) - nStatus.add(None, "Note", (200, 50, 0), "CIRCLE", 0) - nStatus.add(None, "Draft", (200, 150, 0), "SQUARE", 0) - nStatus.add(None, "Finished", (50, 200, 0), "SQUARE", 0) + nStatus.add(None, "New", "#646464", "SQUARE", 0) + nStatus.add(None, "Note", "#c83200", "CIRCLE", 0) + nStatus.add(None, "Draft", "#c89600", "SQUARE", 0) + nStatus.add(None, "Finished", "#32c800", "SQUARE", 0) countTo = [3, 5, 7, 9] for i, n in enumerate(countTo): @@ -337,33 +342,25 @@ def testCoreStatus_Pack(mockGUI, mockRnd): ("New", { "key": statusKeys[0], "count": "3", - "red": "100", - "green": "100", - "blue": "100", + "color": "#646464", "shape": "SQUARE", }), ("Note", { "key": statusKeys[1], "count": "5", - "red": "200", - "green": "50", - "blue": "0", + "color": "#c83200", "shape": "CIRCLE", }), ("Draft", { "key": statusKeys[2], "count": "7", - "red": "200", - "green": "150", - "blue": "0", + "color": "#c89600", "shape": "SQUARE", }), ("Finished", { "key": statusKeys[3], "count": "9", - "red": "50", - "green": "200", - "blue": "0", + "color": "#32c800", "shape": "SQUARE", }), ] diff --git a/tests/test_dialogs/test_dlg_projectsettings.py b/tests/test_dialogs/test_dlg_projectsettings.py index edd0cebe..c20382d1 100644 --- a/tests/test_dialogs/test_dlg_projectsettings.py +++ b/tests/test_dialogs/test_dlg_projectsettings.py @@ -214,22 +214,22 @@ def testDlgProjSettings_StatusImport(qtbot, monkeypatch, nwGUI, projPath, mockRn assert update[0][0] == C.sNew assert update[0][1].name == "New" - assert update[0][1].color == QColor(120, 120, 120) + assert update[0][1].color.getRgb() == (108, 108, 108, 255) assert update[0][1].shape == nwStatusShape.STAR assert update[1][0] == C.sDraft assert update[1][1].name == "Draft" - assert update[1][1].color == QColor(143, 240, 164) + assert update[1][1].color.getRgb() == (163, 156, 52, 255) assert update[1][1].shape == nwStatusShape.CIRCLE_T assert update[2][0] == C.sFinished assert update[2][1].name == "Finished" - assert update[2][1].color == QColor(249, 240, 107) + assert update[2][1].color.getRgb() == (41, 102, 41, 255) assert update[2][1].shape == nwStatusShape.STAR assert update[3][0] is None assert update[3][1].name == "Final" - assert update[3][1].color == QColor(20, 30, 40) + assert update[3][1].color.getRgb() == (20, 30, 40, 255) assert update[3][1].shape == nwStatusShape.CIRCLE # Move items, none selected -> no change @@ -289,22 +289,22 @@ def testDlgProjSettings_StatusImport(qtbot, monkeypatch, nwGUI, projPath, mockRn assert update[0][0] == C.iNew assert update[0][1].name == "New" - assert update[0][1].color == QColor(120, 120, 120) + assert update[0][1].color.getRgb() == (179, 90, 179, 255) assert update[0][1].shape == nwStatusShape.SQUARE assert update[1][0] == C.iMajor assert update[1][1].name == "Major" - assert update[1][1].color == QColor(220, 138, 221) + assert update[1][1].color.getRgb() == (179, 90, 179, 255) assert update[1][1].shape == nwStatusShape.BLOCK_3 assert update[2][0] == C.iMain assert update[2][1].name == "Main" - assert update[2][1].color == QColor(220, 138, 221) + assert update[2][1].color.getRgb() == (179, 90, 179, 255) assert update[2][1].shape == nwStatusShape.BLOCK_4 assert update[3][0] is None assert update[3][1].name == "Final" - assert update[3][1].color == QColor(20, 30, 40) + assert update[3][1].color.getRgb() == (20, 30, 40, 255) assert update[3][1].shape == nwStatusShape.TRIANGLE # Check Project @@ -354,10 +354,10 @@ def testDlgProjSettings_StatusImportExport(qtbot, monkeypatch, nwGUI, projPath, assert expFile.is_file() is True assert expFile.read_text().split() == [ - "STAR,#787878,New", - "TRIANGLE,#cdab8f,Note", - "CIRCLE_T,#8ff0a4,Draft", - "STAR,#f9f06b,Finished", + "STAR,#6c6c6c,New", + "TRIANGLE,#a62a2d,Note", + "CIRCLE_T,#a39c34,Draft", + "STAR,#296629,Finished", ] # Import Error diff --git a/tests/test_gui/test_gui_docviewerpanel.py b/tests/test_gui/test_gui_docviewerpanel.py index b0d02493..f51d9a81 100644 --- a/tests/test_gui/test_gui_docviewerpanel.py +++ b/tests/test_gui/test_gui_docviewerpanel.py @@ -224,7 +224,7 @@ def testGuiViewerPanel_Tags(qtbot, monkeypatch, caplog, nwGUI, projPath, mockRnd # Update Labels assert charTab.topLevelItem(0).text(charTab.C_IMPORT) == "New" - SHARED.project.data.itemImport.add(C.iNew, "Stuff", (100, 100, 100), "SQUARE", 0) + SHARED.project.data.itemImport.add(C.iNew, "Stuff", "#646464", "SQUARE", 0) viewPanel.updateStatusLabels("i") assert charTab.topLevelItem(0).text(charTab.C_IMPORT) == "Stuff" From 9384b8a6b9b3c1108de62c83962464a71f3aab6f Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 13 Jun 2025 21:37:31 +0200 Subject: [PATCH 49/96] Update test coverage --- novelwriter/core/status.py | 5 +---- tests/conftest.py | 16 +++++++++++++- tests/test_core/test_core_status.py | 25 +++++++++++++++++++--- tests/test_dialogs/test_dlg_preferences.py | 6 +++--- tests/test_gui/test_gui_guimain.py | 3 +-- 5 files changed, 42 insertions(+), 13 deletions(-) diff --git a/novelwriter/core/status.py b/novelwriter/core/status.py index bcee828c..c3e58b76 100644 --- a/novelwriter/core/status.py +++ b/novelwriter/core/status.py @@ -192,10 +192,7 @@ class NWStatus: def refreshIcons(self) -> None: """Refresh all icons.""" for entry in self._store.values(): - if entry.theme != CUSTOM_COL: - print("<", entry.color.name(QColor.NameFormat.HexRgb)) - entry.color = SHARED.theme.parseColor(entry.theme) - print(">", entry.color.name(QColor.NameFormat.HexRgb)) + entry.color = SHARED.theme.parseColor(entry.theme) entry.icon = NWStatus.createIcon(self._height, entry.color, entry.shape) return diff --git a/tests/conftest.py b/tests/conftest.py index bd66447b..4017bb9f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -34,6 +34,8 @@ from PyQt6.QtWidgets import QMessageBox sys.path.insert(1, str(Path(__file__).parent.parent.absolute())) from novelwriter import CONFIG, SHARED +from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT +from novelwriter.enum import nwTheme from tests.mocked import MockGuiMain from tests.tools import cleanProject @@ -60,6 +62,10 @@ def resetConfigVars(): CONFIG._dLocale = QLocale("en_GB") CONFIG._manuals = {"manual": _TMP_ROOT / "manual.pdf"} CONFIG.guiLocale = "en_GB" + CONFIG.darkTheme = DEF_GUI_DARK + CONFIG.lightTheme = DEF_GUI_LIGHT + CONFIG.themeMode = nwTheme.LIGHT + CONFIG.emphLabels = True # Ensures better coverage, off by default return @@ -157,13 +163,21 @@ def mockGUI(qtbot, monkeypatch): monkeypatch.setattr(QMessageBox, "result", lambda *a: QMessageBox.StandardButton.Yes) gui = MockGuiMain() theme = GuiTheme() - theme.loadTheme() monkeypatch.setattr(SHARED, "_gui", gui) monkeypatch.setattr(SHARED, "_theme", theme) return gui +@pytest.fixture(scope="function") +def mockGUIwithTheme(mockGUI): + """Create a mock instance of novelWriter's main GUI class with the + theme instance initialised. + """ + SHARED.theme.initThemes() + return mockGUI + + @pytest.fixture(scope="function") def nwGUI(qtbot, monkeypatch, functionFixture): """Create an instance of the novelWriter GUI.""" diff --git a/tests/test_core/test_core_status.py b/tests/test_core/test_core_status.py index 3b5e80b8..1ea0c09e 100644 --- a/tests/test_core/test_core_status.py +++ b/tests/test_core/test_core_status.py @@ -324,13 +324,32 @@ def testCoreStatus_Entries(mockGUI, mockRnd): @pytest.mark.core -def testCoreStatus_Pack(mockGUI, mockRnd): +def testCoreStatus_RefreshIcons(mockGUIwithTheme, mockRnd): + """Test refreshing the icons of the NWStatus class.""" + nStatus = NWStatus(NWStatus.STATUS) + nStatus.add(None, "New", "default", "SQUARE", 0) + nStatus.add(None, "Note", "red", "CIRCLE", 0) + nStatus.add(None, "Draft", "yellow", "SQUARE", 0) + nStatus.add(None, "Finished", "green", "SQUARE", 0) + + beforeIcons = [nStatus[statusKeys[i]].icon for i in range(4)] + + # Refreshing the icons should generate new ones + nStatus.refreshIcons() + afterIcons = [nStatus[statusKeys[i]].icon for i in range(4)] + + for before, after in zip(beforeIcons, afterIcons, strict=False): + assert before is not after + + +@pytest.mark.core +def testCoreStatus_Pack(mockGUIwithTheme, mockRnd): """Test data packing of the NWStatus class.""" nStatus = NWStatus(NWStatus.STATUS) nStatus.add(None, "New", "#646464", "SQUARE", 0) nStatus.add(None, "Note", "#c83200", "CIRCLE", 0) nStatus.add(None, "Draft", "#c89600", "SQUARE", 0) - nStatus.add(None, "Finished", "#32c800", "SQUARE", 0) + nStatus.add(None, "Finished", "default", "SQUARE", 0) countTo = [3, 5, 7, 9] for i, n in enumerate(countTo): @@ -360,7 +379,7 @@ def testCoreStatus_Pack(mockGUI, mockRnd): ("Finished", { "key": statusKeys[3], "count": "9", - "color": "#32c800", + "color": "default", "shape": "SQUARE", }), ] diff --git a/tests/test_dialogs/test_dlg_preferences.py b/tests/test_dialogs/test_dlg_preferences.py index a017585f..66d6183e 100644 --- a/tests/test_dialogs/test_dlg_preferences.py +++ b/tests/test_dialogs/test_dlg_preferences.py @@ -196,11 +196,11 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): # Project View prefs.iconColTree.setCurrentData("faded", "default") prefs.iconColDocs.setChecked(True) - prefs.emphLabels.setChecked(True) + prefs.emphLabels.setChecked(False) assert CONFIG.iconColTree == DEF_TREECOL assert CONFIG.iconColDocs is False - assert CONFIG.emphLabels is False + assert CONFIG.emphLabels is True # Behaviour prefs.autoSaveDoc.stepUp() @@ -362,7 +362,7 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): # Project View assert CONFIG.iconColTree == "faded" assert CONFIG.iconColDocs is True - assert CONFIG.emphLabels is True + assert CONFIG.emphLabels is False # Behaviour assert CONFIG.autoSaveDoc == 31 diff --git a/tests/test_gui/test_gui_guimain.py b/tests/test_gui/test_gui_guimain.py index 5010094d..3940cbba 100644 --- a/tests/test_gui/test_gui_guimain.py +++ b/tests/test_gui/test_gui_guimain.py @@ -267,8 +267,7 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, projPath, tstPaths, mockRnd): # Change some settings CONFIG.hideHScroll = True CONFIG.hideVScroll = True - CONFIG.autoScrollPos = 80 - CONFIG.autoScroll = True + CONFIG.autoScroll = False # Add a Character File nwGUI._changeView(nwView.PROJECT) From ad89a043c957eafc8bcb93cb1d98e1d89b37e5fb Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 13 Jun 2025 22:31:17 +0200 Subject: [PATCH 50/96] Update build files for 2.8 --- pyproject.toml | 3 +-- requirements-dev.txt | 1 + setup/debian/control | 20 ++++++++++++++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8375e9b8..9263eb81 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ authors = [ ] description = "A plain text editor for planning and writing novels" readme = {file = "setup/description_pypi.md", content-type = "text/markdown"} -license = "GPL-3.0" +license = {text = "GPL-3.0-or-later"} classifiers = [ "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", @@ -17,7 +17,6 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: Implementation :: CPython", - "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Development Status :: 5 - Production/Stable", "Operating System :: OS Independent", "Intended Audience :: End Users/Desktop", diff --git a/requirements-dev.txt b/requirements-dev.txt index 18c97a30..794644e0 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,3 +1,4 @@ +build isort pyright ruff diff --git a/setup/debian/control b/setup/debian/control index 75e94a20..24f0cd25 100644 --- a/setup/debian/control +++ b/setup/debian/control @@ -2,12 +2,28 @@ Source: novelwriter Maintainer: Veronica Berglyd Olsen Section: text Priority: optional -Build-Depends: dh-python, python3-setuptools, python3-all, debhelper (>= 9), python3 (>=3.10), python3-pyqt6 (>= 6.4), python3-pyqt6.qtsvg (>= 6.4), python3-enchant (>= 2.0) +Build-Depends: + dh-python, + python3-setuptools, + python3-all, + debhelper (>= 9), + python3 (>=3.10), + python3-pyqt6 (>= 6.4), + python3-pyqt6.qtsvg (>= 6.4), + python3-enchant (>= 2.0), + qt6-image-formats-plugins (>= 6.4) Standards-Version: 4.5.1 Homepage: https://novelwriter.io X-Python3-Version: >= 3.10 Package: novelwriter Architecture: all -Depends: ${misc:Depends}, ${python3:Depends}, python3 (>=3.10), python3-pyqt6 (>= 6.4), python3-pyqt6.qtsvg (>= 6.4), python3-enchant (>= 2.0) +Depends: + ${misc:Depends}, + ${python3:Depends}, + python3 (>=3.10), + python3-pyqt6 (>= 6.4), + python3-pyqt6.qtsvg (>= 6.4), + python3-enchant (>= 2.0), + qt6-image-formats-plugins (>= 6.4) Description: A plain text editor for planning and writing novels From 2bd298e6731912a8fde83c3f7c346f9e643ad8b0 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 13 Jun 2025 22:31:34 +0200 Subject: [PATCH 51/96] Bump version to 2.8 Alpha 1 --- novelwriter/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/novelwriter/__init__.py b/novelwriter/__init__.py index acc73ee6..488353b3 100644 --- a/novelwriter/__init__.py +++ b/novelwriter/__init__.py @@ -49,9 +49,9 @@ __license__ = "GPLv3" __author__ = "Veronica Berglyd Olsen" __maintainer__ = "Veronica Berglyd Olsen" __email__ = "code@vkbo.net" -__version__ = "2.8a0" -__hexversion__ = "0x020800a0" -__date__ = "2025-06-01" +__version__ = "2.8a1" +__hexversion__ = "0x020800a1" +__date__ = "2025-06-13" __status__ = "Stable" __domain__ = "novelwriter.io" From ff36d38f433cc2221c0cb41c120d7b1b660e6244 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 14 Jun 2025 14:22:14 +0200 Subject: [PATCH 52/96] Improve formatting of log messages made from message box content --- novelwriter/shared.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/novelwriter/shared.py b/novelwriter/shared.py index c5b7025c..7a276d02 100644 --- a/novelwriter/shared.py +++ b/novelwriter/shared.py @@ -25,6 +25,7 @@ along with this program. If not, see . from __future__ import annotations import logging +import re from enum import Enum from pathlib import Path @@ -41,6 +42,8 @@ from novelwriter.core.spellcheck import NWSpellEnchant from novelwriter.enum import nwChange, nwItemClass if TYPE_CHECKING: + from collections.abc import Callable + from novelwriter.core.project import NWProject from novelwriter.core.status import T_StatusKind from novelwriter.gui.theme import GuiTheme @@ -50,6 +53,8 @@ logger = logging.getLogger(__name__) NWWidget = TypeVar("NWWidget", bound=QWidget) +RX_HTML = re.compile(r"<.*?>") + class SharedData(QObject): @@ -382,7 +387,7 @@ class SharedData(QObject): alert.setAlertType(_GuiAlert.INFO, False) self._lastAlert = alert.logMessage if log: - logger.info(self._lastAlert, stacklevel=2) + self._logMessage(self._lastAlert, logger.info) alert.exec() return @@ -393,7 +398,7 @@ class SharedData(QObject): alert.setAlertType(_GuiAlert.WARN, False) self._lastAlert = alert.logMessage if log: - logger.warning(self._lastAlert, stacklevel=2) + self._logMessage(self._lastAlert, logger.warning) alert.exec() return @@ -407,7 +412,7 @@ class SharedData(QObject): alert.setException(exc) self._lastAlert = alert.logMessage if log: - logger.error(self._lastAlert, stacklevel=2) + self._logMessage(self._lastAlert, logger.error) alert.exec() return @@ -425,6 +430,12 @@ class SharedData(QObject): # Internal Functions ## + def _logMessage(self, message: str, log: Callable) -> None: + """Print message to log.""" + for text in message.split("
    "): + log(RX_HTML.sub("", text), stacklevel=3) + return + def _resetProject(self) -> None: """Create a new project and spell checking instance.""" from novelwriter.core.project import NWProject From af6b35cc43fb58d973463e48b3f930bd62053a8f Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 14 Jun 2025 15:28:51 +0200 Subject: [PATCH 53/96] Improve handling of CSS styles, and add viewport meta tag (#2358) --- novelwriter/formats/tohtml.py | 88 ++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/novelwriter/formats/tohtml.py b/novelwriter/formats/tohtml.py index c7bf7b17..404c6d09 100644 --- a/novelwriter/formats/tohtml.py +++ b/novelwriter/formats/tohtml.py @@ -159,34 +159,33 @@ class ToHtml(Tokenizer): # If we don't have formatting, we can do a plain replace tText = tText.replace("<", "<").replace(">", ">") - # Styles + # Inline Styles aStyle = [] - if self._cssStyles: - if tStyle & BlockFmt.LEFT: - aStyle.append("text-align: left;") - elif tStyle & BlockFmt.RIGHT: - aStyle.append("text-align: right;") - elif tStyle & BlockFmt.CENTRE: - aStyle.append("text-align: center;") - elif tStyle & BlockFmt.JUSTIFY: - aStyle.append("text-align: justify;") + if tStyle & BlockFmt.LEFT: + aStyle.append("text-align: left;") + elif tStyle & BlockFmt.RIGHT: + aStyle.append("text-align: right;") + elif tStyle & BlockFmt.CENTRE: + aStyle.append("text-align: center;") + elif tStyle & BlockFmt.JUSTIFY: + aStyle.append("text-align: justify;") - if tStyle & BlockFmt.PBB: - aStyle.append("page-break-before: always;") - if tStyle & BlockFmt.PBA: - aStyle.append("page-break-after: always;") + if tStyle & BlockFmt.PBB: + aStyle.append("page-break-before: always;") + if tStyle & BlockFmt.PBA: + aStyle.append("page-break-after: always;") - if tStyle & BlockFmt.Z_BTM: - aStyle.append("margin-bottom: 0;") - if tStyle & BlockFmt.Z_TOP: - aStyle.append("margin-top: 0;") + if tStyle & BlockFmt.Z_BTM: + aStyle.append("margin-bottom: 0;") + if tStyle & BlockFmt.Z_TOP: + aStyle.append("margin-top: 0;") - if tStyle & BlockFmt.IND_L: - aStyle.append(f"margin-left: {self._blockIndent:.2f}em;") - if tStyle & BlockFmt.IND_R: - aStyle.append(f"margin-right: {self._blockIndent:.2f}em;") - if tStyle & BlockFmt.IND_T: - aStyle.append(f"text-indent: {self._firstWidth:.2f}em;") + if tStyle & BlockFmt.IND_L: + aStyle.append(f"margin-left: {self._blockIndent:.2f}em;") + if tStyle & BlockFmt.IND_R: + aStyle.append(f"margin-right: {self._blockIndent:.2f}em;") + if tStyle & BlockFmt.IND_T: + aStyle.append(f"text-indent: {self._firstWidth:.2f}em;") if aStyle: stVals = " ".join(aStyle) @@ -288,26 +287,25 @@ class ToHtml(Tokenizer): json.dump(data, fObj, indent=2) else: + html = [] + html.append("") + html.append("") + html.append("") + html.append(f"{self._project.data.name:s}") + html.append("") + if self._cssStyles: + html.append("") + html.append("") + html.append("") + html.append("") + html.append(("".join(self._pages)).replace("\t", " ").rstrip()) + html.append("") + html.append("\n") + with open(path, mode="w", encoding="utf-8") as fObj: - fObj.write(( - "\n" - "\n" - "\n" - "\n" - "{title:s}\n" - "\n" - "\n" - "\n" - "{body:s}\n" - "\n" - "\n" - ).format( - title=self._project.data.name, - style="\n".join(self.getStyleSheet()), - body=("".join(self._pages)).replace("\t", " ").rstrip(), - )) + fObj.write("\n".join(html)) logger.info("Wrote file: %s", path) @@ -410,7 +408,11 @@ class ToHtml(Tokenizer): # isn't already open, and only closed if it has previously been opened. tags: list[tuple[int, str]] = [] state = dict.fromkeys(HTML_OPENER, False) + plain = not self._cssStyles for pos, fmt, data in tFmt: + if plain and fmt in (TextFmt.COL_B, TextFmt.COL_E): + # We ignore colour tags if CSS is off + continue if m := HTML_OPENER.get(fmt): if not state.get(fmt, True): if fmt == TextFmt.COL_B and (color := self._classes.get(data)): From 307e80bac9b0e7a7f7a43b78d775022d1a30ad21 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 14 Jun 2025 15:29:11 +0200 Subject: [PATCH 54/96] Update tests --- .../mBuildDocBuild_HTML5_Lorem_Ipsum.htm | 3 +- tests/test_formats/test_fmt_tohtml.py | 112 +++++++++++++----- 2 files changed, 87 insertions(+), 28 deletions(-) diff --git a/tests/reference/mBuildDocBuild_HTML5_Lorem_Ipsum.htm b/tests/reference/mBuildDocBuild_HTML5_Lorem_Ipsum.htm index f605b0fa..92482cd8 100644 --- a/tests/reference/mBuildDocBuild_HTML5_Lorem_Ipsum.htm +++ b/tests/reference/mBuildDocBuild_HTML5_Lorem_Ipsum.htm @@ -1,8 +1,9 @@ - Lorem Ipsum + + \n" "\n" "\n" - "{bodyText:s}\n" + "{body}\n" "\n" "\n" ).format( - htmlStyle="\n".join(hStyle), - bodyText="".join(resText).rstrip() + style="\n".join(hStyle), + body="".join(resText).rstrip() ) saveFile = fncPath / "outFile.htm" html.saveDocument(saveFile) - assert saveFile.read_text(encoding="utf-8") == htmlDoc + assert saveFile.read_text(encoding="utf-8") == htmlDocCSS - # JSON + HTML + # HTML wo/Styles + html.setStyles(False) + htmlDocCSS = ( + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "{body}\n" + "\n" + "\n" + ).format( + body="".join(resText).rstrip() + ) + + saveFile = fncPath / "outFile.htm" + html.saveDocument(saveFile) + assert saveFile.read_text(encoding="utf-8") == htmlDocCSS + + # JSON + HTML w/Styles + html.setStyles(True) saveFile = fncPath / "outFile.json" html.saveDocument(saveFile) data = json.loads(saveFile.read_text(encoding="utf-8")) From 5032ffdfd446187f69b89b6d794aead0c0721da9 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 14 Jun 2025 16:44:51 +0200 Subject: [PATCH 55/96] Add current line highlight --- novelwriter/config.py | 22 +++++++++++++--------- novelwriter/gui/doceditor.py | 28 +++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/novelwriter/config.py b/novelwriter/config.py index 9258bcca..9f422b4d 100644 --- a/novelwriter/config.py +++ b/novelwriter/config.py @@ -77,15 +77,16 @@ class Config: "fmtSQuoteOpen", "focusWidth", "guiFont", "guiLocale", "hasEnchant", "hideFocusFooter", "hideHScroll", "hideVScroll", "highlightEmph", "hostName", "iconColDocs", "iconColTree", "iconTheme", "incNotesWCount", "isDebug", "kernelVer", "lastNotes", "lightTheme", - "mainPanePos", "mainWinSize", "memInfo", "narratorBreak", "narratorDialog", "nativeFont", - "osDarwin", "osLinux", "osType", "osUnknown", "osWindows", "outlinePanePos", - "prefsWinSize", "scrollPastEnd", "searchCase", "searchLoop", "searchMatchCap", - "searchNextFile", "searchProjCase", "searchProjRegEx", "searchProjWord", "searchRegEx", - "searchWord", "showEditToolBar", "showFullPath", "showLineEndings", "showMultiSpaces", - "showSessionTime", "showTabsNSpaces", "showViewerPanel", "spellLanguage", "stopWhenIdle", - "tabWidth", "textFont", "textMargin", "textWidth", "themeMode", "useCharCount", - "userIdleTime", "verPyQtString", "verPyQtValue", "verPyString", "verQtString", - "verQtValue", "viewComments", "viewPanePos", "viewSynopsis", "welcomeWinSize", + "lineHighlight", "mainPanePos", "mainWinSize", "memInfo", "narratorBreak", + "narratorDialog", "nativeFont", "osDarwin", "osLinux", "osType", "osUnknown", "osWindows", + "outlinePanePos", "prefsWinSize", "scrollPastEnd", "searchCase", "searchLoop", + "searchMatchCap", "searchNextFile", "searchProjCase", "searchProjRegEx", "searchProjWord", + "searchRegEx", "searchWord", "showEditToolBar", "showFullPath", "showLineEndings", + "showMultiSpaces", "showSessionTime", "showTabsNSpaces", "showViewerPanel", + "spellLanguage", "stopWhenIdle", "tabWidth", "textFont", "textMargin", "textWidth", + "themeMode", "useCharCount", "userIdleTime", "verPyQtString", "verPyQtValue", + "verPyString", "verQtString", "verQtValue", "viewComments", "viewPanePos", "viewSynopsis", + "welcomeWinSize", ) LANG_NW = 1 @@ -191,6 +192,7 @@ class Config: self.textMargin = 40 # Editor/viewer text margin self.tabWidth = 40 # Editor tabulator width self.cursorWidth = 1 # Editor cursor width + self.lineHighlight = False # Highlight current line in editor self.focusWidth = 800 # Focus Mode text width self.hideFocusFooter = False # Hide document footer in Focus Mode @@ -667,6 +669,7 @@ class Config: self.textMargin = conf.rdInt(sec, "margin", self.textMargin) self.tabWidth = conf.rdInt(sec, "tabwidth", self.tabWidth) self.cursorWidth = conf.rdInt(sec, "cursorwidth", self.cursorWidth) + self.lineHighlight = conf.rdBool(sec, "linehighlight", self.lineHighlight) self.focusWidth = conf.rdInt(sec, "focuswidth", self.focusWidth) self.hideFocusFooter = conf.rdBool(sec, "hidefocusfooter", self.hideFocusFooter) self.doJustify = conf.rdBool(sec, "justify", self.doJustify) @@ -793,6 +796,7 @@ class Config: "margin": str(self.textMargin), "tabwidth": str(self.tabWidth), "cursorwidth": str(self.cursorWidth), + "lineHighlight": str(self.lineHighlight), "focuswidth": str(self.focusWidth), "hidefocusfooter": str(self.hideFocusFooter), "justify": str(self.doJustify), diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 846b6317..4def208e 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -45,11 +45,11 @@ from PyQt6.QtCore import ( from PyQt6.QtGui import ( QAction, QCursor, QDragEnterEvent, QDragMoveEvent, QDropEvent, QKeyEvent, QKeySequence, QMouseEvent, QPalette, QPixmap, QResizeEvent, QShortcut, - QTextBlock, QTextCursor, QTextDocument, QTextOption + QTextBlock, QTextCursor, QTextDocument, QTextFormat, QTextOption ) from PyQt6.QtWidgets import ( QApplication, QFrame, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QMenu, - QPlainTextEdit, QToolBar, QVBoxLayout, QWidget + QPlainTextEdit, QTextEdit, QToolBar, QVBoxLayout, QWidget ) from novelwriter import CONFIG, SHARED @@ -75,7 +75,8 @@ from novelwriter.tools.lipsum import GuiLipsum from novelwriter.types import ( QtAlignCenterTop, QtAlignJustify, QtAlignLeft, QtAlignLeftTop, QtAlignRight, QtKeepAnchor, QtModCtrl, QtModNone, QtModShift, QtMouseLeft, - QtMoveAnchor, QtMoveLeft, QtMoveRight, QtScrollAlwaysOff, QtScrollAsNeeded + QtMoveAnchor, QtMoveLeft, QtMoveRight, QtScrollAlwaysOff, QtScrollAsNeeded, + QtTransparent ) logger = logging.getLogger(__name__) @@ -145,6 +146,7 @@ class GuiDocEditor(QPlainTextEdit): self._lastActive = 0.0 # Timestamp of last activity self._lastFind = None # Position of the last found search word self._doReplace = False # Switch to temporarily disable auto-replace + self._lineColor = QtTransparent # Auto-Replace self._autoReplace = TextAutoReplace() @@ -231,6 +233,9 @@ class GuiDocEditor(QPlainTextEdit): self.updateSyntaxColors() self.initEditor() + # Connect Additional Signal + self.cursorPositionChanged.connect(self._highlightCurrentLine) + logger.debug("Ready: GuiDocEditor") return @@ -315,6 +320,9 @@ class GuiDocEditor(QPlainTextEdit): self.docHeader.matchColors() self.docFooter.matchColors() + self._lineColor = self.palette().alternateBase().color() + self._lineColor.setAlpha(160) + return def initEditor(self) -> None: @@ -372,6 +380,8 @@ class GuiDocEditor(QPlainTextEdit): # Refresh sizes self.setTabStopDistance(CONFIG.tabWidth) self.setCursorWidth(CONFIG.cursorWidth) + self.setExtraSelections([]) + self._highlightCurrentLine() # If we have a document open, we should refresh it in case the # font changed, otherwise we just clear the editor entirely, @@ -1301,6 +1311,18 @@ class GuiDocEditor(QPlainTextEdit): CONFIG.showEditToolBar = state return + @pyqtSlot() + def _highlightCurrentLine(self) -> None: + """Highlight the cursor line if setting is enabled.""" + if CONFIG.lineHighlight: + selection = QTextEdit.ExtraSelection() + selection.format.setBackground(self._lineColor) + selection.format.setProperty(QTextFormat.Property.FullWidthSelection, True) + selection.cursor = self.textCursor() + selection.cursor.clearSelection() + self.setExtraSelections([selection]) + return + ## # Search & Replace ## From 2589c43214e4e6280933f6abb360e8df5e0e22c0 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 14 Jun 2025 16:45:06 +0200 Subject: [PATCH 56/96] Expose line highlight setting in Preferences --- novelwriter/dialogs/preferences.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index 1a8645b3..23620cef 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -544,6 +544,13 @@ class GuiPreferences(NDialog): unit=self.tr("px") ) + # Highlight Current Line + self.lineHighlight = NSwitch(self) + self.lineHighlight.setChecked(CONFIG.lineHighlight) + self.mainForm.addRow( + self.tr("Highlight current line"), self.lineHighlight + ) + # Show Tabs and Spaces self.showTabsNSpaces = NSwitch(self) self.showTabsNSpaces.setChecked(CONFIG.showTabsNSpaces) @@ -1032,9 +1039,14 @@ class GuiPreferences(NDialog): CONFIG.tabWidth = self.tabWidth.value() # Text Editing + lineHighlight = self.lineHighlight.isChecked() + + updateSyntax |= CONFIG.lineHighlight != lineHighlight + CONFIG.spellLanguage = self.spellLanguage.currentData() CONFIG.autoSelect = self.autoSelect.isChecked() CONFIG.cursorWidth = self.cursorWidth.value() + CONFIG.lineHighlight = lineHighlight CONFIG.showTabsNSpaces = self.showTabsNSpaces.isChecked() CONFIG.showLineEndings = self.showLineEndings.isChecked() From 7a95980d2fe1acb75d87bb7b7744d8427c8935f9 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 14 Jun 2025 17:04:53 +0200 Subject: [PATCH 57/96] Add theme setting for current line --- novelwriter/gui/doceditor.py | 3 +-- novelwriter/gui/theme.py | 2 ++ tests/reference/baseConfig_novelwriter.conf | 3 ++- tests/test_gui/test_gui_theme.py | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 4def208e..b3c930ae 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -320,8 +320,7 @@ class GuiDocEditor(QPlainTextEdit): self.docHeader.matchColors() self.docFooter.matchColors() - self._lineColor = self.palette().alternateBase().color() - self._lineColor.setAlpha(160) + self._lineColor = syntax.line return diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index fbde3028..a92c6add 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -80,6 +80,7 @@ class SyntaxColors: back: QColor = QColor(255, 255, 255) text: QColor = QColor(0, 0, 0) + line: QColor = QColor(0, 0, 0) link: QColor = QColor(0, 0, 0) head: QColor = QColor(0, 0, 0) headH: QColor = QColor(0, 0, 0) @@ -364,6 +365,7 @@ class GuiTheme: if parser.has_section(sec): self.syntaxTheme.back = self._readColor(parser, sec, "background") self.syntaxTheme.text = self._readColor(parser, sec, "text") + self.syntaxTheme.line = self._readColor(parser, sec, "line") self.syntaxTheme.link = self._readColor(parser, sec, "link") self.syntaxTheme.head = self._readColor(parser, sec, "headertext") self.syntaxTheme.headH = self._readColor(parser, sec, "headertag") diff --git a/tests/reference/baseConfig_novelwriter.conf b/tests/reference/baseConfig_novelwriter.conf index fa16b190..859cca52 100644 --- a/tests/reference/baseConfig_novelwriter.conf +++ b/tests/reference/baseConfig_novelwriter.conf @@ -1,5 +1,5 @@ [Meta] -timestamp = 2025-06-10 23:18:12 +timestamp = 2025-06-14 17:03:01 [Main] font = @@ -40,6 +40,7 @@ width = 700 margin = 40 tabwidth = 40 cursorwidth = 1 +linehighlight = False focuswidth = 800 hidefocusfooter = False justify = False diff --git a/tests/test_gui/test_gui_theme.py b/tests/test_gui/test_gui_theme.py index 04e4c62b..805f5009 100644 --- a/tests/test_gui/test_gui_theme.py +++ b/tests/test_gui/test_gui_theme.py @@ -632,7 +632,7 @@ def testGuiTheme_CheckTheme(theme): "helptext", "fadedtext", "errortext", ], "Syntax": [ - "background", "text", "link", "headertext", "headertag", + "background", "text", "line", "link", "headertext", "headertag", "emphasis", "dialog", "altdialog", "hidden", "note", "shortcode", "keyword", "tag", "value", "optional", "spellcheckline", "errorline", "replacetag", "modifier", "texthighlight", From f6408e74d205f2c5571f25a167966e0771efef6b Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 14 Jun 2025 17:06:02 +0200 Subject: [PATCH 58/96] Update themes and docs --- docs/source/more/customise.rst | 3 ++- novelwriter/assets/themes/blue_streak_dark.conf | 1 + novelwriter/assets/themes/blue_streak_light.conf | 1 + novelwriter/assets/themes/cyberpunk_night.conf | 1 + novelwriter/assets/themes/default_dark.conf | 1 + novelwriter/assets/themes/default_light.conf | 1 + novelwriter/assets/themes/dracula.conf | 1 + novelwriter/assets/themes/grey_dark.conf | 1 + novelwriter/assets/themes/grey_light.conf | 1 + novelwriter/assets/themes/lcars.conf | 1 + novelwriter/assets/themes/light_owl.conf | 1 + novelwriter/assets/themes/night_owl.conf | 1 + novelwriter/assets/themes/primer_dark.conf | 1 + novelwriter/assets/themes/primer_light.conf | 1 + novelwriter/assets/themes/snazzy.conf | 1 + novelwriter/assets/themes/solarized_dark.conf | 1 + novelwriter/assets/themes/solarized_light.conf | 1 + novelwriter/assets/themes/tango_dark.conf | 1 + novelwriter/assets/themes/tango_light.conf | 1 + novelwriter/assets/themes/tomorrow.conf | 1 + novelwriter/assets/themes/tomorrow_night.conf | 1 + novelwriter/assets/themes/tomorrow_night_blue.conf | 1 + novelwriter/assets/themes/tomorrow_night_bright.conf | 1 + novelwriter/assets/themes/tomorrow_night_eighties.conf | 1 + 24 files changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/source/more/customise.rst b/docs/source/more/customise.rst index ef06f156..70905def 100644 --- a/docs/source/more/customise.rst +++ b/docs/source/more/customise.rst @@ -107,6 +107,7 @@ A colour theme ``.conf`` file consists of the following settings: [Syntax] background = base text = default + line = default:32 link = blue headertext = green headertag = green:L135 @@ -175,7 +176,7 @@ There are several ways to enter colour values: .. versionadded:: 2.8 The ``[Syntax]`` section was moved into the main theme file. Previously, these settings were in - their own file. The ``[Icons]`` section was renamed to ``[Base]``. + their own file. The ``[Icons]`` section was renamed to ``[Base]``. Added the ``line`` setting. Icon Themes diff --git a/novelwriter/assets/themes/blue_streak_dark.conf b/novelwriter/assets/themes/blue_streak_dark.conf index ed0f912d..7b4133a5 100644 --- a/novelwriter/assets/themes/blue_streak_dark.conf +++ b/novelwriter/assets/themes/blue_streak_dark.conf @@ -56,6 +56,7 @@ errortext = red [Syntax] background = base text = default +line = blue:48 link = blue headertext = blue headertag = blue:D150 diff --git a/novelwriter/assets/themes/blue_streak_light.conf b/novelwriter/assets/themes/blue_streak_light.conf index 0a3673b1..215cc8e1 100644 --- a/novelwriter/assets/themes/blue_streak_light.conf +++ b/novelwriter/assets/themes/blue_streak_light.conf @@ -56,6 +56,7 @@ errortext = red [Syntax] background = base text = default +line = blue:32 link = blue headertext = blue headertag = blue:D150 diff --git a/novelwriter/assets/themes/cyberpunk_night.conf b/novelwriter/assets/themes/cyberpunk_night.conf index 70996a22..4ba750f2 100644 --- a/novelwriter/assets/themes/cyberpunk_night.conf +++ b/novelwriter/assets/themes/cyberpunk_night.conf @@ -56,6 +56,7 @@ errortext = red [Syntax] background = base text = #969696 +line = #282828 link = blue headertext = #ffffff headertag = purple diff --git a/novelwriter/assets/themes/default_dark.conf b/novelwriter/assets/themes/default_dark.conf index 3d5436d7..0c7bd643 100644 --- a/novelwriter/assets/themes/default_dark.conf +++ b/novelwriter/assets/themes/default_dark.conf @@ -57,6 +57,7 @@ errortext = red [Syntax] background = base text = default +line = default:32 link = blue headertext = green headertag = green:D150 diff --git a/novelwriter/assets/themes/default_light.conf b/novelwriter/assets/themes/default_light.conf index 1fb2533d..fb4e707a 100644 --- a/novelwriter/assets/themes/default_light.conf +++ b/novelwriter/assets/themes/default_light.conf @@ -57,6 +57,7 @@ errortext = red [Syntax] background = base text = default +line = default:32 link = blue headertext = green headertag = green:L135 diff --git a/novelwriter/assets/themes/dracula.conf b/novelwriter/assets/themes/dracula.conf index 8e0d0133..3330f04c 100644 --- a/novelwriter/assets/themes/dracula.conf +++ b/novelwriter/assets/themes/dracula.conf @@ -73,6 +73,7 @@ errortext = red [Syntax] background = base text = #f8f8f2 +line = base:L150 link = #ff79c6 headertext = purple headertag = purple:D150 diff --git a/novelwriter/assets/themes/grey_dark.conf b/novelwriter/assets/themes/grey_dark.conf index 862caaf3..570a84b9 100644 --- a/novelwriter/assets/themes/grey_dark.conf +++ b/novelwriter/assets/themes/grey_dark.conf @@ -56,6 +56,7 @@ errortext = red [Syntax] background = #363636 text = default +line = default:32 link = default headertext = default:L115 headertag = default:D125 diff --git a/novelwriter/assets/themes/grey_light.conf b/novelwriter/assets/themes/grey_light.conf index 2da58171..feccddaa 100644 --- a/novelwriter/assets/themes/grey_light.conf +++ b/novelwriter/assets/themes/grey_light.conf @@ -56,6 +56,7 @@ errortext = red [Syntax] background = base text = default +line = default:32 link = default headertext = default:D200 headertag = default:L400 diff --git a/novelwriter/assets/themes/lcars.conf b/novelwriter/assets/themes/lcars.conf index e0130c59..0d5467db 100644 --- a/novelwriter/assets/themes/lcars.conf +++ b/novelwriter/assets/themes/lcars.conf @@ -57,6 +57,7 @@ errortext = red [Syntax] background = base text = default +line = yellow:48 link = purple headertext = orange headertag = red diff --git a/novelwriter/assets/themes/light_owl.conf b/novelwriter/assets/themes/light_owl.conf index 208cb459..a50c48b2 100644 --- a/novelwriter/assets/themes/light_owl.conf +++ b/novelwriter/assets/themes/light_owl.conf @@ -76,6 +76,7 @@ errortext = red [Syntax] background = base text = default +line = default:32 link = blue headertext = blue headertag = blue:160 diff --git a/novelwriter/assets/themes/night_owl.conf b/novelwriter/assets/themes/night_owl.conf index 79f9a5a5..c5ee6dd0 100644 --- a/novelwriter/assets/themes/night_owl.conf +++ b/novelwriter/assets/themes/night_owl.conf @@ -76,6 +76,7 @@ errortext = red [Syntax] background = base text = default +line = default:48 link = blue headertext = blue headertag = blue:160 diff --git a/novelwriter/assets/themes/primer_dark.conf b/novelwriter/assets/themes/primer_dark.conf index 8c26ce67..20be9548 100644 --- a/novelwriter/assets/themes/primer_dark.conf +++ b/novelwriter/assets/themes/primer_dark.conf @@ -56,6 +56,7 @@ errortext = #f85149 [Syntax] background = base text = faded +line = default:32 link = blue headertext = default headertag = faded diff --git a/novelwriter/assets/themes/primer_light.conf b/novelwriter/assets/themes/primer_light.conf index 93e7a87b..6d1263c5 100644 --- a/novelwriter/assets/themes/primer_light.conf +++ b/novelwriter/assets/themes/primer_light.conf @@ -56,6 +56,7 @@ errortext = #cf222e [Syntax] background = base text = faded +line = default:32 link = blue headertext = default headertag = faded:128 diff --git a/novelwriter/assets/themes/snazzy.conf b/novelwriter/assets/themes/snazzy.conf index 0cec0326..09b18a77 100644 --- a/novelwriter/assets/themes/snazzy.conf +++ b/novelwriter/assets/themes/snazzy.conf @@ -69,6 +69,7 @@ errortext = red [Syntax] background = base text = default +line = default:32 link = blue headertext = green headertag = green:D125 diff --git a/novelwriter/assets/themes/solarized_dark.conf b/novelwriter/assets/themes/solarized_dark.conf index e3f146ba..8bf4e983 100644 --- a/novelwriter/assets/themes/solarized_dark.conf +++ b/novelwriter/assets/themes/solarized_dark.conf @@ -75,6 +75,7 @@ errortext = red [Syntax] background = base text = default +line = default:32 link = blue headertext = default:D125 headertag = cyan diff --git a/novelwriter/assets/themes/solarized_light.conf b/novelwriter/assets/themes/solarized_light.conf index 76c2eec2..5f01abe7 100644 --- a/novelwriter/assets/themes/solarized_light.conf +++ b/novelwriter/assets/themes/solarized_light.conf @@ -75,6 +75,7 @@ errortext = red [Syntax] background = base text = default +line = default:32 link = blue headertext = default:L125 headertag = cyan diff --git a/novelwriter/assets/themes/tango_dark.conf b/novelwriter/assets/themes/tango_dark.conf index 8bd7d23c..aacb5e5f 100644 --- a/novelwriter/assets/themes/tango_dark.conf +++ b/novelwriter/assets/themes/tango_dark.conf @@ -66,6 +66,7 @@ errortext = red [Syntax] background = base text = default +line = default:32 link = blue headertext = blue headertag = blue:160 diff --git a/novelwriter/assets/themes/tango_light.conf b/novelwriter/assets/themes/tango_light.conf index df4b0a1b..70d6f741 100644 --- a/novelwriter/assets/themes/tango_light.conf +++ b/novelwriter/assets/themes/tango_light.conf @@ -66,6 +66,7 @@ errortext = red [Syntax] background = base text = default +line = default:32 link = blue headertext = blue headertag = blue:160 diff --git a/novelwriter/assets/themes/tomorrow.conf b/novelwriter/assets/themes/tomorrow.conf index 3175e68b..e355356a 100644 --- a/novelwriter/assets/themes/tomorrow.conf +++ b/novelwriter/assets/themes/tomorrow.conf @@ -76,6 +76,7 @@ errortext = red [Syntax] background = base text = #4d4d4c +line = default:32 link = blue headertext = blue headertag = blue:L135 diff --git a/novelwriter/assets/themes/tomorrow_night.conf b/novelwriter/assets/themes/tomorrow_night.conf index 671d1a9c..41298008 100644 --- a/novelwriter/assets/themes/tomorrow_night.conf +++ b/novelwriter/assets/themes/tomorrow_night.conf @@ -76,6 +76,7 @@ errortext = red [Syntax] background = base text = default +line = default:48 link = blue headertext = blue headertag = blue:D150 diff --git a/novelwriter/assets/themes/tomorrow_night_blue.conf b/novelwriter/assets/themes/tomorrow_night_blue.conf index a9b48dcc..5f951353 100644 --- a/novelwriter/assets/themes/tomorrow_night_blue.conf +++ b/novelwriter/assets/themes/tomorrow_night_blue.conf @@ -76,6 +76,7 @@ errortext = red [Syntax] background = base text = default +line = default:32 link = blue headertext = blue headertag = blue:D150 diff --git a/novelwriter/assets/themes/tomorrow_night_bright.conf b/novelwriter/assets/themes/tomorrow_night_bright.conf index e2df7d59..9207162f 100644 --- a/novelwriter/assets/themes/tomorrow_night_bright.conf +++ b/novelwriter/assets/themes/tomorrow_night_bright.conf @@ -76,6 +76,7 @@ errortext = red [Syntax] background = base text = default +line = default:48 link = blue headertext = blue headertag = blue:D150 diff --git a/novelwriter/assets/themes/tomorrow_night_eighties.conf b/novelwriter/assets/themes/tomorrow_night_eighties.conf index 367e1968..dcd093fb 100644 --- a/novelwriter/assets/themes/tomorrow_night_eighties.conf +++ b/novelwriter/assets/themes/tomorrow_night_eighties.conf @@ -76,6 +76,7 @@ errortext = red [Syntax] background = base text = default +line = default:32 link = blue headertext = blue headertag = blue:D150 From 294772172795556affcc5e122a2c21b344b9a95f Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 14 Jun 2025 17:08:06 +0200 Subject: [PATCH 59/96] Improve test coverage --- tests/conftest.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 4017bb9f..d8407d28 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -65,7 +65,11 @@ def resetConfigVars(): CONFIG.darkTheme = DEF_GUI_DARK CONFIG.lightTheme = DEF_GUI_LIGHT CONFIG.themeMode = nwTheme.LIGHT - CONFIG.emphLabels = True # Ensures better coverage, off by default + + # Enable a few settings to ensure better coverage + CONFIG.emphLabels = True + CONFIG.lineHighlight = True + return From d5dc66a33c6333a94fe5f2a25e36bc826b870bad Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 14 Jun 2025 17:13:35 +0200 Subject: [PATCH 60/96] Add to preferences test --- tests/test_dialogs/test_dlg_preferences.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_dialogs/test_dlg_preferences.py b/tests/test_dialogs/test_dlg_preferences.py index 66d6183e..da87a629 100644 --- a/tests/test_dialogs/test_dlg_preferences.py +++ b/tests/test_dialogs/test_dlg_preferences.py @@ -250,12 +250,14 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): prefs.spellLanguage.setCurrentIndex(prefs.spellLanguage.findData("de")) prefs.autoSelect.setChecked(False) prefs.cursorWidth.setValue(5) + prefs.lineHighlight.setChecked(False) prefs.showTabsNSpaces.setChecked(True) prefs.showLineEndings.setChecked(True) assert CONFIG.spellLanguage != "de" assert CONFIG.autoSelect is True assert CONFIG.cursorWidth == 1 + assert CONFIG.lineHighlight is True assert CONFIG.showTabsNSpaces is False assert CONFIG.showLineEndings is False @@ -390,6 +392,7 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths): assert CONFIG.spellLanguage == "de" assert CONFIG.autoSelect is False assert CONFIG.cursorWidth == 5 + assert CONFIG.lineHighlight is False assert CONFIG.showTabsNSpaces is True assert CONFIG.showLineEndings is True From 6d04c88d83e3e640928faac489ec75cad7ac4982 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 14 Jun 2025 17:20:34 +0200 Subject: [PATCH 61/96] Keep the ExtraSelection object around to prevent garbage collector race and segfault --- novelwriter/gui/doceditor.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index b3c930ae..c7b1e6a2 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -147,6 +147,7 @@ class GuiDocEditor(QPlainTextEdit): self._lastFind = None # Position of the last found search word self._doReplace = False # Switch to temporarily disable auto-replace self._lineColor = QtTransparent + self._selection = QTextEdit.ExtraSelection() # Auto-Replace self._autoReplace = TextAutoReplace() @@ -321,6 +322,8 @@ class GuiDocEditor(QPlainTextEdit): self.docFooter.matchColors() self._lineColor = syntax.line + self._selection.format.setBackground(self._lineColor) + self._selection.format.setProperty(QTextFormat.Property.FullWidthSelection, True) return @@ -1314,12 +1317,9 @@ class GuiDocEditor(QPlainTextEdit): def _highlightCurrentLine(self) -> None: """Highlight the cursor line if setting is enabled.""" if CONFIG.lineHighlight: - selection = QTextEdit.ExtraSelection() - selection.format.setBackground(self._lineColor) - selection.format.setProperty(QTextFormat.Property.FullWidthSelection, True) - selection.cursor = self.textCursor() - selection.cursor.clearSelection() - self.setExtraSelections([selection]) + self._selection.cursor = self.textCursor() + self._selection.cursor.clearSelection() + self.setExtraSelections([self._selection]) return ## From cbc79d70820d4874ab5de04a57275364d8f18446 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 14 Jun 2025 17:30:30 +0200 Subject: [PATCH 62/96] Merge line highlight with existing signal handler for cursor move --- novelwriter/gui/doceditor.py | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index c7b1e6a2..5e49d67e 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -234,9 +234,6 @@ class GuiDocEditor(QPlainTextEdit): self.updateSyntaxColors() self.initEditor() - # Connect Additional Signal - self.cursorPositionChanged.connect(self._highlightCurrentLine) - logger.debug("Ready: GuiDocEditor") return @@ -383,7 +380,7 @@ class GuiDocEditor(QPlainTextEdit): self.setTabStopDistance(CONFIG.tabWidth) self.setCursorWidth(CONFIG.cursorWidth) self.setExtraSelections([]) - self._highlightCurrentLine() + self._cursorMoved() # If we have a document open, we should refresh it in case the # font changed, otherwise we just clear the editor entirely, @@ -1122,6 +1119,10 @@ class GuiDocEditor(QPlainTextEdit): def _cursorMoved(self) -> None: """Triggered when the cursor moved in the editor.""" self.docFooter.updateLineCount(self.textCursor()) + if CONFIG.lineHighlight: + self._selection.cursor = self.textCursor() + self._selection.cursor.clearSelection() + self.setExtraSelections([self._selection]) return @pyqtSlot(int, int, str) @@ -1313,15 +1314,6 @@ class GuiDocEditor(QPlainTextEdit): CONFIG.showEditToolBar = state return - @pyqtSlot() - def _highlightCurrentLine(self) -> None: - """Highlight the cursor line if setting is enabled.""" - if CONFIG.lineHighlight: - self._selection.cursor = self.textCursor() - self._selection.cursor.clearSelection() - self.setExtraSelections([self._selection]) - return - ## # Search & Replace ## From 148fc685902d524cc0be0c3960511fc28103382e Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 16 Jun 2025 18:46:37 +0200 Subject: [PATCH 63/96] Add markdown highlight format --- novelwriter/constants.py | 1 + novelwriter/formats/shared.py | 10 +++++++++- novelwriter/formats/tokenizer.py | 1 + novelwriter/gui/dochighlight.py | 19 ++++++++++++++++--- novelwriter/text/patterns.py | 6 ++++++ sample/content/636b6aa9b697b.nwd | 6 +++--- sample/nwProject.nwx | 8 ++++---- tests/test_formats/test_fmt_tokenizer.py | 5 +++++ 8 files changed, 45 insertions(+), 11 deletions(-) diff --git a/novelwriter/constants.py b/novelwriter/constants.py index 701ac5a1..e47455d8 100644 --- a/novelwriter/constants.py +++ b/novelwriter/constants.py @@ -77,6 +77,7 @@ class nwRegEx: FMT_EI = r"(? re.Pattern: + """Markdown highlight style.""" + return self._rxMark + @property def shortcodePlain(self) -> re.Pattern: """Plain shortcode style.""" diff --git a/sample/content/636b6aa9b697b.nwd b/sample/content/636b6aa9b697b.nwd index e3d4bfde..12f0d4e0 100644 --- a/sample/content/636b6aa9b697b.nwd +++ b/sample/content/636b6aa9b697b.nwd @@ -1,8 +1,8 @@ %%~name: Making a Scene %%~path: 6a2d6d5f4f401/636b6aa9b697b %%~kind: NOVEL/DOCUMENT -%%~hash: 1f3d98a6a27b4f9a7f2239fcd78f9e2263cd3b97 -%%~date: Unknown/2025-05-18 22:36:59 +%%~hash: b85f815702763f58926edd72a2eeed1df5e1cbc9 +%%~date: Unknown/2025-06-16 12:49:10 ### Making a Scene @pov: Jane @@ -15,7 +15,7 @@ A scene is defined by a level three heading, like the one at the top of this page. The scene will be assigned to the chapter preceding it in the project tree. The scene document can be sorted after the chapter document, or as a child of the chapter. Both result in the same output in the end, so it is a matter of preference. -Each paragraph in the scene is separated by a blank line. The text supports minimal formatting, like **bold**, _italic_ and **_bold italic_**. You can also ~~strike through~~ text. There is **some support for _nested_ emphasis**, but there are some known limitations. If the syntax highlighter doesn’t show it correctly, the export tool will not either. +Each paragraph in the scene is separated by a blank line. The text supports minimal formatting, like **bold**, _italic_ and **_bold italic_**. You can also ~~strike through~~ text. There is **some support for _nested_ emphasis**, but there are some known limitations. If the ==syntax highlighter== doesn’t show it correctly, the export tool will not either. For special formatting aside from standard emphasis, you can use “shortcodes”. Here we have super[sup]script[/sup] and sub[sub]script[/sub], and [b]part[/b]ial bold too, which ends in the middle of a word. The shortcodes also support [u]underline[/u], and you can [m]highlight text as well[/m]. diff --git a/sample/nwProject.nwx b/sample/nwProject.nwx index 32ed2662..587802ef 100644 --- a/sample/nwProject.nwx +++ b/sample/nwProject.nwx @@ -1,6 +1,6 @@ - - + + Sample Project Jane Smith @@ -36,7 +36,7 @@ Main - + Novel @@ -58,7 +58,7 @@ Chapter One - + Making a Scene diff --git a/tests/test_formats/test_fmt_tokenizer.py b/tests/test_formats/test_fmt_tokenizer.py index d141b6ef..2b053e1b 100644 --- a/tests/test_formats/test_fmt_tokenizer.py +++ b/tests/test_formats/test_fmt_tokenizer.py @@ -919,6 +919,11 @@ def testFmtToken_ExtractFormats(mockGUI): assert text == "Text with strikethrough in it." assert fmt == [(10, TextFmt.D_B, ""), (23, TextFmt.D_E, "")] + # Plain mark + text, fmt = tokens._extractFormats("Text with ==a highlight== in it.") + assert text == "Text with a highlight in it." + assert fmt == [(10, TextFmt.M_B, ""), (21, TextFmt.M_E, "")] + # Nested bold/italics text, fmt = tokens._extractFormats("Text with **bold and _italics_** in it.") assert text == "Text with bold and italics in it." From c0da955fc6b55db43db969e14a943d480a6b0024 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 16 Jun 2025 18:47:16 +0200 Subject: [PATCH 64/96] Add button and menu entry for markdown highlight --- docs/source/features/shortcuts.rst | 1 + novelwriter/enum.py | 59 ++++++++++++++-------------- novelwriter/gui/doceditor.py | 11 ++++++ novelwriter/gui/mainmenu.py | 8 ++++ tests/test_gui/test_gui_doceditor.py | 9 ++++- 5 files changed, 58 insertions(+), 30 deletions(-) diff --git a/docs/source/features/shortcuts.rst b/docs/source/features/shortcuts.rst index 0a29927b..e5811c85 100644 --- a/docs/source/features/shortcuts.rst +++ b/docs/source/features/shortcuts.rst @@ -101,6 +101,7 @@ Text Formatting Shortcuts ":kbd:`Ctrl+B`", "Format selected text, or word under cursor, with bold" ":kbd:`Ctrl+D`", "Format selected text, or word under cursor, with strike through" ":kbd:`Ctrl+I`", "Format selected text, or word under cursor, with italic" + ":kbd:`Ctrl+M`", "Highlight selected text, or word under cursor" ":kbd:`Ctrl+Shift+/`", "Remove format for block or selected text" ":kbd:`Ctrl+Shift+D`", "Toggle ignored text format for block or selected text" diff --git a/novelwriter/enum.py b/novelwriter/enum.py index 18899295..9e50620e 100644 --- a/novelwriter/enum.py +++ b/novelwriter/enum.py @@ -92,35 +92,36 @@ class nwDocAction(Enum): MD_ITALIC = 6 MD_BOLD = 7 MD_STRIKE = 8 - S_QUOTE = 9 - D_QUOTE = 10 - SEL_ALL = 11 - SEL_PARA = 12 - BLOCK_H1 = 13 - BLOCK_H2 = 14 - BLOCK_H3 = 15 - BLOCK_H4 = 16 - BLOCK_COM = 17 - BLOCK_IGN = 18 - BLOCK_TXT = 19 - BLOCK_TTL = 20 - BLOCK_UNN = 21 - BLOCK_HSC = 22 - REPL_SNG = 23 - REPL_DBL = 24 - RM_BREAKS = 25 - ALIGN_L = 26 - ALIGN_C = 27 - ALIGN_R = 28 - INDENT_L = 29 - INDENT_R = 30 - SC_ITALIC = 31 - SC_BOLD = 32 - SC_STRIKE = 33 - SC_ULINE = 34 - SC_MARK = 35 - SC_SUP = 36 - SC_SUB = 37 + MD_MARK = 9 + S_QUOTE = 10 + D_QUOTE = 11 + SEL_ALL = 12 + SEL_PARA = 13 + BLOCK_H1 = 14 + BLOCK_H2 = 15 + BLOCK_H3 = 16 + BLOCK_H4 = 17 + BLOCK_COM = 18 + BLOCK_IGN = 19 + BLOCK_TXT = 20 + BLOCK_TTL = 21 + BLOCK_UNN = 22 + BLOCK_HSC = 23 + REPL_SNG = 24 + REPL_DBL = 25 + RM_BREAKS = 26 + ALIGN_L = 27 + ALIGN_C = 28 + ALIGN_R = 29 + INDENT_L = 30 + INDENT_R = 31 + SC_ITALIC = 32 + SC_BOLD = 33 + SC_STRIKE = 34 + SC_ULINE = 35 + SC_MARK = 36 + SC_SUP = 37 + SC_SUB = 38 class nwDocInsert(Enum): diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 5e49d67e..9f0f7bfd 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -286,6 +286,7 @@ class GuiDocEditor(QPlainTextEdit): self.docHeader.clearHeader() self.docFooter.setHandle(self._docHandle) self.docToolBar.setVisible(False) + self.setExtraSelections([]) self.itemHandleChanged.emit("") @@ -742,6 +743,8 @@ class GuiDocEditor(QPlainTextEdit): self._toggleFormat(2, "*") elif action == nwDocAction.MD_STRIKE: self._toggleFormat(2, "~") + elif action == nwDocAction.MD_MARK: + self._toggleFormat(2, "=") elif action == nwDocAction.S_QUOTE: self._wrapSelection(CONFIG.fmtSQuoteOpen, CONFIG.fmtSQuoteClose) elif action == nwDocAction.D_QUOTE: @@ -2418,6 +2421,12 @@ class GuiDocToolBar(QWidget): qtLambda(self.requestDocAction.emit, nwDocAction.MD_STRIKE) ) + self.tbMarkMD = NIconToolButton(self, iSz) + self.tbMarkMD.setToolTip(self.tr("Markdown Highlight")) + self.tbMarkMD.clicked.connect( + qtLambda(self.requestDocAction.emit, nwDocAction.MD_MARK) + ) + self.tbBold = NIconToolButton(self, iSz) self.tbBold.setToolTip(self.tr("Shortcode Bold")) self.tbBold.clicked.connect( @@ -2467,6 +2476,7 @@ class GuiDocToolBar(QWidget): self.outerBox.addWidget(self.tbBoldMD) self.outerBox.addWidget(self.tbItalicMD) self.outerBox.addWidget(self.tbStrikeMD) + self.outerBox.addWidget(self.tbMarkMD) self.outerBox.addSpacing(4) self.outerBox.addWidget(self.tbBold) self.outerBox.addWidget(self.tbItalic) @@ -2501,6 +2511,7 @@ class GuiDocToolBar(QWidget): self.tbBoldMD.setThemeIcon("fmt_bold", "orange") self.tbItalicMD.setThemeIcon("fmt_italic", "orange") self.tbStrikeMD.setThemeIcon("fmt_strike", "orange") + self.tbMarkMD.setThemeIcon("fmt_mark", "orange") self.tbBold.setThemeIcon("fmt_bold") self.tbItalic.setThemeIcon("fmt_italic") self.tbStrike.setThemeIcon("fmt_strike") diff --git a/novelwriter/gui/mainmenu.py b/novelwriter/gui/mainmenu.py index 33f97dde..3d0ab1c5 100644 --- a/novelwriter/gui/mainmenu.py +++ b/novelwriter/gui/mainmenu.py @@ -675,6 +675,14 @@ class GuiMainMenu(QMenuBar): ) self.mainGui.addAction(self.aFmtStrike) + # Format > Highlight + self.aFmtMark = qtAddAction(self.fmtMenu, self.tr("Highlight")) + self.aFmtMark.setShortcut("Ctrl+M") + self.aFmtMark.triggered.connect( + lambda: self.requestDocAction.emit(nwDocAction.MD_MARK) + ) + self.mainGui.addAction(self.aFmtStrike) + # Edit > Separator self.fmtMenu.addSeparator() diff --git a/tests/test_gui/test_gui_doceditor.py b/tests/test_gui/test_gui_doceditor.py index 5bda2d82..ea8f86dd 100644 --- a/tests/test_gui/test_gui_doceditor.py +++ b/tests/test_gui/test_gui_doceditor.py @@ -674,9 +674,16 @@ def testGuiEditor_Actions(qtbot, nwGUI, projPath, ipsumText, mockRnd): assert docEditor.docAction(nwDocAction.UNDO) is True assert docEditor.getText() == text + # Mark + docEditor.setCursorPosition(50) + assert docEditor.docAction(nwDocAction.MD_MARK) is True + assert docEditor.getText() == text.replace("consectetur", "==consectetur==") + assert docEditor.docAction(nwDocAction.UNDO) is True + assert docEditor.getText() == text + # Redo assert docEditor.docAction(nwDocAction.REDO) is True - assert docEditor.getText() == text.replace("consectetur", "~~consectetur~~") + assert docEditor.getText() == text.replace("consectetur", "==consectetur==") assert docEditor.docAction(nwDocAction.UNDO) is True assert docEditor.getText() == text From 0b13d4051637b83d9a306285562b3723dfa3b5a5 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 16 Jun 2025 21:46:27 +0200 Subject: [PATCH 65/96] Add text pattern test --- tests/test_text/test_text_patterns.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_text/test_text_patterns.py b/tests/test_text/test_text_patterns.py index e6a8b599..2670401e 100644 --- a/tests/test_text/test_text_patterns.py +++ b/tests/test_text/test_text_patterns.py @@ -157,6 +157,15 @@ def testTextPatterns_Markdown(): assert allMatches(regEx, "one ~two~~ three") == [] assert allMatches(regEx, "one~~two~~three") == [] + # Mark + regEx = REGEX_PATTERNS.markdownMark + assert allMatches(regEx, "one ==two== three") == [ + [("==two==", 4, 11), ("==", 4, 6), ("two", 6, 9), ("==", 9, 11)] + ] + assert allMatches(regEx, "one ==two= three") == [] + assert allMatches(regEx, "one =two== three") == [] + assert allMatches(regEx, "one==two==three") == [] + @pytest.mark.core def testTextPatterns_ShortcodesPlain(): From 5a177e500e4181813e709f787af59f3fabfa3ab3 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 18 Jun 2025 20:50:12 +0200 Subject: [PATCH 66/96] Update the help text for theme selections in Preferences --- novelwriter/dialogs/preferences.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index 23620cef..e7155bfd 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -180,11 +180,11 @@ class GuiPreferences(NDialog): self.mainForm.addRow( self.tr("Light colour theme"), self.lightTheme, - self.tr("User interface colour theme."), stretch=(3, 2) + self.tr("You can change theme mode from the sidebar."), stretch=(3, 2) ) self.mainForm.addRow( self.tr("Dark colour theme"), self.darkTheme, - self.tr("User interface colour theme."), stretch=(3, 2) + self.tr("You can change theme mode from the sidebar."), stretch=(3, 2) ) # Icon Theme From 110d8b8e5942409945d4d6a8f76cf3e79286f83b Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 18 Jun 2025 20:50:33 +0200 Subject: [PATCH 67/96] Swap value and modifier colours in default themes --- novelwriter/assets/themes/default_dark.conf | 4 ++-- novelwriter/assets/themes/default_light.conf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/novelwriter/assets/themes/default_dark.conf b/novelwriter/assets/themes/default_dark.conf index 0c7bd643..894fb9c8 100644 --- a/novelwriter/assets/themes/default_dark.conf +++ b/novelwriter/assets/themes/default_dark.conf @@ -69,10 +69,10 @@ hidden = faded shortcode = green keyword = red tag = green -value = blue +value = green optional = green spellcheckline = red errorline = green replacetag = green -modifier = green +modifier = blue texthighlight = yellow:72 diff --git a/novelwriter/assets/themes/default_light.conf b/novelwriter/assets/themes/default_light.conf index fb4e707a..704bb84f 100644 --- a/novelwriter/assets/themes/default_light.conf +++ b/novelwriter/assets/themes/default_light.conf @@ -69,10 +69,10 @@ hidden = faded shortcode = green keyword = red tag = green -value = blue +value = green optional = green spellcheckline = red errorline = green replacetag = green -modifier = green +modifier = blue texthighlight = yellow:72 From b2d31022af55c20b50b0a733a688b279edf954b9 Mon Sep 17 00:00:00 2001 From: Myian Date: Thu, 19 Jun 2025 13:16:23 +0200 Subject: [PATCH 68/96] adjusting colors and change name --- novelwriter/assets/themes/primer_light.conf | 70 +++++++++---------- .../{primer_dark.conf => primer_night.conf} | 62 ++++++++-------- 2 files changed, 66 insertions(+), 66 deletions(-) rename novelwriter/assets/themes/{primer_dark.conf => primer_night.conf} (57%) diff --git a/novelwriter/assets/themes/primer_light.conf b/novelwriter/assets/themes/primer_light.conf index 6d1263c5..6af88d09 100644 --- a/novelwriter/assets/themes/primer_light.conf +++ b/novelwriter/assets/themes/primer_light.conf @@ -10,68 +10,68 @@ licenseurl = https://github.com/primer/brand/blob/main/LICENSE [Base] base = #ffffff default = #1f2328 -faded = #59636e -red = #fa4549 +faded = #8c959f +red = #cf222e orange = #e16f24 yellow = #d4a72c green = #2da44e -cyan = #339D9B +cyan = #339d9b blue = #0969da -purple = #a475f9 +purple = #8557db [Project] -root = purple +root = #32383f folder = orange -file = faded -title = green -chapter = red -scene = blue +file = #49bcb7 +title = #116329 +chapter = #2e934a +scene = #4ac26b note = yellow -active = green -inactive = red -disabled = faded +active = #24292f +inactive = faded +disabled = #afb8c1 [Palette] window = #eaeef2 windowtext = default base = base -alternatebase = #dfe4e9 +alternatebase = #dde3e8 text = default -tooltipbase = #fae17d -tooltiptext = #0c1117 -button = #f6f8fa +tooltipbase = #fff8c5 +tooltiptext = default +button = base buttontext = default -brighttext = faded -highlight = #dafbe1 -highlightedtext = #1a7f37 +brighttext = base +highlight = green +highlightedtext = base link = blue linkvisited = blue -accent = #dafbe1 +accent = green [GUI] -helptext = faded -fadedtext = faded:128 -errortext = #cf222e +helptext = #424a53 +fadedtext = #8c959f +errortext = red [Syntax] background = base -text = faded -line = default:32 +text = #424a53 +line = #eaeef2 link = blue headertext = default -headertag = faded:128 -emphasis = green -dialog = default -altdialog = default -note = #d4a72c -hidden = faded:128 +headertag = #8c959f +emphasis = #2e934a +dialog = #000000 +altdialog = cyan +note = #bf8700 +hidden = #8c959f shortcode = #e85aad keyword = blue tag = #218bff -value = #fb8f44 +value = orange optional = #54aeff -spellcheckline = #cf222e +spellcheckline = #fa4549 errorline = cyan replacetag = purple -modifier = orange -texthighlight = faded:32 +modifier = #bc4c00 +texthighlight = #eaeef2 diff --git a/novelwriter/assets/themes/primer_dark.conf b/novelwriter/assets/themes/primer_night.conf similarity index 57% rename from novelwriter/assets/themes/primer_dark.conf rename to novelwriter/assets/themes/primer_night.conf index 20be9548..ba18b637 100644 --- a/novelwriter/assets/themes/primer_dark.conf +++ b/novelwriter/assets/themes/primer_night.conf @@ -1,5 +1,5 @@ [Main] -name = Primer Dark +name = Primer Night mode = dark author = Myian (adaptation) credit = GitHub Inc. @@ -8,63 +8,63 @@ license = MIT License licenseurl = https://github.com/primer/brand/blob/main/LICENSE [Base] -base = #0c1117 +base = #0d1117 default = #f0f6fc -faded = #a3b0be +faded = #6e7681 red = #ff7b72 orange = #ffa657 -yellow = #f8e3a1 -green = #7ee787 +yellow = #f2cc60 +green = #56d364 cyan = #57CCC5 blue = #79c0ff -purple = #bc8cff +purple = #c398ff [Project] -root = purple +root = default folder = orange -file = default -title = green -chapter = red -scene = blue -note = yellow -active = green -inactive = red -disabled = faded +file = #8adfd7 +title = #238636 +chapter = #56d364 +scene = #aff5b4 +note = #f8e3a1 +active = default +inactive = faded +disabled = #484f58 [Palette] -window = #141b23 +window = #161b22 windowtext = default base = base -alternatebase = #1e242a +alternatebase = #21262d text = default tooltipbase = yellow tooltiptext = base -button = #212830 +button = #21262d buttontext = default -brighttext = default -highlight = #104C35 +brighttext = base +highlight = #207c59 highlightedtext = default link = blue linkvisited = blue -accent = #104C35 +accent = #207c59 [GUI] -helptext = faded -fadedtext = faded:128 +helptext = #8b949e +fadedtext = #6e7681 errortext = #f85149 [Syntax] background = base -text = faded -line = default:32 +text = #b1bac4 +line = #21262d link = blue headertext = default -headertag = faded +headertag = #b1bac4 emphasis = #97ee9e -dialog = default -altdialog = default -note = yellow -hidden = faded:128 +dialog = #ffffff +altdialog = #8adfd7 +note = #f8e3a1 +hidden = faded shortcode = #ff9bce keyword = #4493f8 tag = blue @@ -74,4 +74,4 @@ spellcheckline = #f85149 errorline = cyan replacetag = purple modifier = orange -texthighlight = faded:32 +texthighlight = #21262d From 87f2f0eb24657362a8cdc5c2c119a2d09c31c541 Mon Sep 17 00:00:00 2001 From: Myian Date: Thu, 19 Jun 2025 13:24:35 +0200 Subject: [PATCH 69/96] fix tooltip --- novelwriter/assets/themes/primer_night.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/novelwriter/assets/themes/primer_night.conf b/novelwriter/assets/themes/primer_night.conf index ba18b637..73c80577 100644 --- a/novelwriter/assets/themes/primer_night.conf +++ b/novelwriter/assets/themes/primer_night.conf @@ -13,7 +13,7 @@ default = #f0f6fc faded = #6e7681 red = #ff7b72 orange = #ffa657 -yellow = #f2cc60 +yellow = #f8e3a1 green = #56d364 cyan = #57CCC5 blue = #79c0ff @@ -26,7 +26,7 @@ file = #8adfd7 title = #238636 chapter = #56d364 scene = #aff5b4 -note = #f8e3a1 +note = yellow active = default inactive = faded disabled = #484f58 From 36b757c22458bdbefbe7b8124460ba5d5ee632a4 Mon Sep 17 00:00:00 2001 From: Myian Date: Thu, 19 Jun 2025 17:31:24 +0200 Subject: [PATCH 70/96] better contrast for some elements --- novelwriter/assets/themes/primer_light.conf | 4 ++-- novelwriter/assets/themes/primer_night.conf | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/novelwriter/assets/themes/primer_light.conf b/novelwriter/assets/themes/primer_light.conf index 6af88d09..7aaa2cd0 100644 --- a/novelwriter/assets/themes/primer_light.conf +++ b/novelwriter/assets/themes/primer_light.conf @@ -56,7 +56,7 @@ errortext = red [Syntax] background = base text = #424a53 -line = #eaeef2 +line = #dde3e8 link = blue headertext = default headertag = #8c959f @@ -74,4 +74,4 @@ spellcheckline = #fa4549 errorline = cyan replacetag = purple modifier = #bc4c00 -texthighlight = #eaeef2 +texthighlight = #dde3e8 diff --git a/novelwriter/assets/themes/primer_night.conf b/novelwriter/assets/themes/primer_night.conf index 73c80577..4fd0225a 100644 --- a/novelwriter/assets/themes/primer_night.conf +++ b/novelwriter/assets/themes/primer_night.conf @@ -35,7 +35,7 @@ disabled = #484f58 window = #161b22 windowtext = default base = base -alternatebase = #21262d +alternatebase = #30363d text = default tooltipbase = yellow tooltiptext = base @@ -56,7 +56,7 @@ errortext = #f85149 [Syntax] background = base text = #b1bac4 -line = #21262d +line = #30363d link = blue headertext = default headertag = #b1bac4 @@ -74,4 +74,4 @@ spellcheckline = #f85149 errorline = cyan replacetag = purple modifier = orange -texthighlight = #21262d +texthighlight = #30363d From dbf0b5d3f756b260d44e3f91c0192fdc2896f35c Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 19 Jun 2025 19:29:14 +0200 Subject: [PATCH 71/96] Modify the style to show a scroll bar for combo boxes --- novelwriter/__init__.py | 3 ++- novelwriter/dialogs/docsplit.py | 8 ++++---- novelwriter/extensions/modified.py | 9 ++++++++- novelwriter/extensions/novelselector.py | 7 ++++++- novelwriter/types.py | 1 + 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/novelwriter/__init__.py b/novelwriter/__init__.py index 488353b3..3f2bc134 100644 --- a/novelwriter/__init__.py +++ b/novelwriter/__init__.py @@ -296,7 +296,8 @@ def _createApp(style: str) -> QApplication: """Create the app. This is done in a function to make it easier to block app creation during testing. """ - app = QApplication([CONFIG.appName, f"-style={style}"]) + app = QApplication([CONFIG.appName]) + app.setStyle(style) app.setApplicationName(CONFIG.appName) app.setApplicationVersion(__version__) app.setOrganizationDomain(__domain__) diff --git a/novelwriter/dialogs/docsplit.py b/novelwriter/dialogs/docsplit.py index a67aafa7..a2acd53f 100644 --- a/novelwriter/dialogs/docsplit.py +++ b/novelwriter/dialogs/docsplit.py @@ -28,13 +28,13 @@ import logging from PyQt6.QtCore import pyqtSlot from PyQt6.QtWidgets import ( - QAbstractItemView, QComboBox, QDialogButtonBox, QGridLayout, QLabel, - QListWidget, QListWidgetItem, QVBoxLayout, QWidget + QAbstractItemView, QDialogButtonBox, QGridLayout, QLabel, QListWidget, + QListWidgetItem, QVBoxLayout, QWidget ) from novelwriter import SHARED from novelwriter.extensions.configlayout import NColorLabel -from novelwriter.extensions.modified import NDialog +from novelwriter.extensions.modified import NComboBox, NDialog from novelwriter.extensions.switch import NSwitch from novelwriter.types import QtAccepted, QtDialogCancel, QtDialogOk, QtUserRole @@ -79,7 +79,7 @@ class GuiDocSplit(NDialog): self.listBox.setMinimumWidth(400) self.listBox.setMinimumHeight(180) - self.splitLevel = QComboBox(self) + self.splitLevel = NComboBox(self) self.splitLevel.addItem(self.tr("Split on Heading Level 1 (Partition)"), 1) self.splitLevel.addItem(self.tr("Split up to Heading Level 2 (Chapter)"), 2) self.splitLevel.addItem(self.tr("Split up to Heading Level 3 (Scene)"), 3) diff --git a/novelwriter/extensions/modified.py b/novelwriter/extensions/modified.py index 9bea4c78..4b2f663e 100644 --- a/novelwriter/extensions/modified.py +++ b/novelwriter/extensions/modified.py @@ -117,12 +117,19 @@ class NTreeView(QTreeView): class NComboBox(QComboBox): - def __init__(self, parent: QWidget | None = None) -> None: + def __init__(self, parent: QWidget | None = None, maxItems: int = 15) -> None: super().__init__(parent=parent) self.setFocusPolicy(Qt.FocusPolicy.StrongFocus) + self.setMaxVisibleItems(maxItems) + + # The style sheet disables Fusion style pop-up mode on some platforms + # and allows for scrolling of long lists of items + self.setStyleSheet("QComboBox {combobox-popup: 0;}") + return def wheelEvent(self, event: QWheelEvent) -> None: + """Only capture the mouse wheel if the widget has focus.""" if self.hasFocus(): super().wheelEvent(event) else: diff --git a/novelwriter/extensions/novelselector.py b/novelwriter/extensions/novelselector.py index ee585a0d..e3b1e93f 100644 --- a/novelwriter/extensions/novelselector.py +++ b/novelwriter/extensions/novelselector.py @@ -25,14 +25,19 @@ from __future__ import annotations import logging +from typing import TYPE_CHECKING + from PyQt6.QtCore import pyqtSignal, pyqtSlot from PyQt6.QtGui import QPalette -from PyQt6.QtWidgets import QComboBox, QWidget +from PyQt6.QtWidgets import QComboBox from novelwriter import SHARED from novelwriter.constants import nwLabels from novelwriter.enum import nwItemClass +if TYPE_CHECKING: + from PyQt6.QtWidgets import QWidget + logger = logging.getLogger(__name__) diff --git a/novelwriter/types.py b/novelwriter/types.py index fb0faebd..ead3397f 100644 --- a/novelwriter/types.py +++ b/novelwriter/types.py @@ -126,6 +126,7 @@ QtHeaderFixed = QHeaderView.ResizeMode.Fixed # Scroll Bar Policy +QtScrollAlwaysOn = Qt.ScrollBarPolicy.ScrollBarAlwaysOn QtScrollAlwaysOff = Qt.ScrollBarPolicy.ScrollBarAlwaysOff QtScrollAsNeeded = Qt.ScrollBarPolicy.ScrollBarAsNeeded From 4eaac8dbe87301c7476f21e4915f9ab4e2747ddd Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 19 Jun 2025 20:06:30 +0200 Subject: [PATCH 72/96] Fix issues with the Solarized themes --- novelwriter/assets/themes/solarized_dark.conf | 26 +++++++++---------- .../assets/themes/solarized_light.conf | 20 +++++++------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/novelwriter/assets/themes/solarized_dark.conf b/novelwriter/assets/themes/solarized_dark.conf index 8bf4e983..cf3fdc3c 100644 --- a/novelwriter/assets/themes/solarized_dark.conf +++ b/novelwriter/assets/themes/solarized_dark.conf @@ -27,7 +27,7 @@ licenseurl = https://github.com/altercation/solarized/blob/master/LICENSE ## [Base] -base = #073642 +base = #002b36 default = #fdf6e3 faded = #eee8d5 red = #dc322f @@ -51,12 +51,12 @@ inactive = red disabled = faded [Palette] -window = #002b36 +window = #073642 windowtext = default base = base alternatebase = #586e75 text = default -tooltipbase = yellow +tooltipbase = yellow:L150 tooltiptext = #002b36 button = base buttontext = default @@ -75,21 +75,21 @@ errortext = red [Syntax] background = base text = default -line = default:32 +line = #073642 link = blue -headertext = default:D125 -headertag = cyan +headertext = blue +headertag = #657b83 emphasis = blue dialog = cyan -altdialog = cyan -note = cyan:L115 -hidden = default:D150 -shortcode = yellow +altdialog = red +note = cyan:D125 +hidden = default:L200 +shortcode = blue keyword = green -tag = orange +tag = yellow value = orange -optional = cyan:L115 -spellcheckline = orange +optional = cyan:D125 +spellcheckline = red errorline = red replacetag = green modifier = yellow diff --git a/novelwriter/assets/themes/solarized_light.conf b/novelwriter/assets/themes/solarized_light.conf index 5f01abe7..aba3a711 100644 --- a/novelwriter/assets/themes/solarized_light.conf +++ b/novelwriter/assets/themes/solarized_light.conf @@ -27,7 +27,7 @@ licenseurl = https://github.com/altercation/solarized/blob/master/LICENSE ## [Base] -base = #eee8d5 +base = #fdf6e3 default = #002b36 faded = #073642 red = #dc322f @@ -51,12 +51,12 @@ inactive = red disabled = faded [Palette] -window = #fdf6e3 +window = #eee8d5 windowtext = default base = base alternatebase = #93a1a1 text = default -tooltipbase = yellow +tooltipbase = yellow:L150 tooltiptext = #002b36 button = base buttontext = default @@ -75,21 +75,21 @@ errortext = red [Syntax] background = base text = default -line = default:32 +line = #eee8d5 link = blue -headertext = default:L125 -headertag = cyan +headertext = blue +headertag = #657b83 emphasis = blue dialog = cyan -altdialog = cyan +altdialog = red note = cyan:D125 hidden = default:L200 -shortcode = yellow +shortcode = blue keyword = green -tag = orange +tag = yellow value = orange optional = cyan:D125 -spellcheckline = orange +spellcheckline = red errorline = red replacetag = green modifier = yellow From c598fdd00983526b85e4a1fb9f2c9f5f84428289 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 19 Jun 2025 20:30:54 +0200 Subject: [PATCH 73/96] Add separate toggle for notes in viewer --- novelwriter/config.py | 7 +++++-- novelwriter/gui/docviewer.py | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/novelwriter/config.py b/novelwriter/config.py index 9e1735c7..93d8fb02 100644 --- a/novelwriter/config.py +++ b/novelwriter/config.py @@ -85,8 +85,8 @@ class Config: "showMultiSpaces", "showSessionTime", "showTabsNSpaces", "showViewerPanel", "spellLanguage", "stopWhenIdle", "tabWidth", "textFont", "textMargin", "textWidth", "themeMode", "useCharCount", "userIdleTime", "verPyQtString", "verPyQtValue", - "verPyString", "verQtString", "verQtValue", "viewComments", "viewPanePos", "viewSynopsis", - "welcomeWinSize", + "verPyString", "verQtString", "verQtValue", "viewComments", "viewNotes", "viewPanePos", + "viewSynopsis", "welcomeWinSize", ) LANG_NW = 1 @@ -249,6 +249,7 @@ class Config: self.showSessionTime = True # Show the session time in the status bar self.viewComments = True # Comments are shown in the viewer self.viewSynopsis = True # Synopsis is shown in the viewer + self.viewNotes = True # Notes are shown in the viewer # Search Box States self.searchCase = False @@ -713,6 +714,7 @@ class Config: self.showSessionTime = conf.rdBool(sec, "showsessiontime", self.showSessionTime) self.viewComments = conf.rdBool(sec, "viewcomments", self.viewComments) self.viewSynopsis = conf.rdBool(sec, "viewsynopsis", self.viewSynopsis) + self.viewNotes = conf.rdBool(sec, "viewnotes", self.viewNotes) self.searchCase = conf.rdBool(sec, "searchcase", self.searchCase) self.searchWord = conf.rdBool(sec, "searchword", self.searchWord) self.searchRegEx = conf.rdBool(sec, "searchregex", self.searchRegEx) @@ -840,6 +842,7 @@ class Config: "showsessiontime": str(self.showSessionTime), "viewcomments": str(self.viewComments), "viewsynopsis": str(self.viewSynopsis), + "viewnotes": str(self.viewNotes), "searchcase": str(self.searchCase), "searchword": str(self.searchWord), "searchregex": str(self.searchRegEx), diff --git a/novelwriter/gui/docviewer.py b/novelwriter/gui/docviewer.py index 9657ee4e..d5445536 100644 --- a/novelwriter/gui/docviewer.py +++ b/novelwriter/gui/docviewer.py @@ -231,6 +231,8 @@ class GuiDocViewer(QTextBrowser): qDoc.setCommentType(nwComment.PLAIN, CONFIG.viewComments) qDoc.setCommentType(nwComment.SYNOPSIS, CONFIG.viewSynopsis) qDoc.setCommentType(nwComment.SHORT, CONFIG.viewSynopsis) + qDoc.setCommentType(nwComment.STORY, CONFIG.viewNotes) + qDoc.setCommentType(nwComment.NOTE, CONFIG.viewNotes) # Be extra careful here to prevent crashes when first opening a # project as a crash here leaves no way of recovering. @@ -911,12 +913,23 @@ class GuiDocViewFooter(QWidget): self.showSynopsis.toggled.connect(self._doToggleSynopsis) self.showSynopsis.setToolTip(self.tr("Show Synopsis Comments")) + # Show Notes + self.showNotes = QToolButton(self) + self.showNotes.setText(self.tr("Notes")) + self.showNotes.setCheckable(True) + self.showNotes.setChecked(CONFIG.viewNotes) + self.showNotes.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) + self.showNotes.setIconSize(iSz) + self.showNotes.toggled.connect(self._doToggleNotes) + self.showNotes.setToolTip(self.tr("Show Notes")) + # Assemble Layout self.outerBox = QHBoxLayout() self.outerBox.addWidget(self.showHide, 0) self.outerBox.addStretch(1) self.outerBox.addWidget(self.showComments, 0) self.outerBox.addWidget(self.showSynopsis, 0) + self.outerBox.addWidget(self.showNotes, 0) self.outerBox.setSpacing(4) self.setLayout(self.outerBox) @@ -942,6 +955,7 @@ class GuiDocViewFooter(QWidget): self.setFont(SHARED.theme.guiFont) self.showComments.setFont(SHARED.theme.guiFontSmall) self.showSynopsis.setFont(SHARED.theme.guiFontSmall) + self.showNotes.setFont(SHARED.theme.guiFontSmall) return def updateTheme(self) -> None: @@ -953,11 +967,13 @@ class GuiDocViewFooter(QWidget): self.showHide.setThemeIcon("panel") self.showComments.setIcon(bulletIcon) self.showSynopsis.setIcon(bulletIcon) + self.showNotes.setIcon(bulletIcon) buttonStyle = SHARED.theme.getStyleSheet(STYLES_MIN_TOOLBUTTON) self.showHide.setStyleSheet(buttonStyle) self.showComments.setStyleSheet(buttonStyle) self.showSynopsis.setStyleSheet(buttonStyle) + self.showNotes.setStyleSheet(buttonStyle) self.matchColors() @@ -992,3 +1008,10 @@ class GuiDocViewFooter(QWidget): CONFIG.viewSynopsis = state self.docViewer.reloadText() return + + @pyqtSlot(bool) + def _doToggleNotes(self, state: bool) -> None: + """Toggle the view notes button and reload the document.""" + CONFIG.viewNotes = state + self.docViewer.reloadText() + return From ba4fdd1f92c2251e2818add696f58b5e47722fd6 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 19 Jun 2025 20:47:34 +0200 Subject: [PATCH 74/96] Split up block types of comments in build formats --- novelwriter/formats/todocx.py | 4 ++-- novelwriter/formats/tohtml.py | 4 ++-- novelwriter/formats/tokenizer.py | 22 ++++++++++++++++----- novelwriter/formats/tomarkdown.py | 4 ++-- novelwriter/formats/toodt.py | 4 ++-- novelwriter/formats/toqdoc.py | 12 +++++++---- tests/reference/baseConfig_novelwriter.conf | 1 + tests/test_formats/test_fmt_tokenizer.py | 6 +++--- 8 files changed, 37 insertions(+), 20 deletions(-) diff --git a/novelwriter/formats/todocx.py b/novelwriter/formats/todocx.py index 366191ef..1c7a2a1f 100644 --- a/novelwriter/formats/todocx.py +++ b/novelwriter/formats/todocx.py @@ -38,7 +38,7 @@ from novelwriter import __version__ from novelwriter.common import firstFloat, xmlElement, xmlSubElem from novelwriter.constants import nwHeadFmt, nwStyles from novelwriter.formats.shared import BlockFmt, BlockTyp, T_Formats, TextFmt, stripEscape -from novelwriter.formats.tokenizer import Tokenizer +from novelwriter.formats.tokenizer import COMMENT_BLOCKS, Tokenizer from novelwriter.types import QtHexRgb if TYPE_CHECKING: @@ -296,7 +296,7 @@ class ToDocX(Tokenizer): elif tType == BlockTyp.SKIP: self._processFragments(par, S_NORM, "") - elif tType == BlockTyp.COMMENT: + elif tType in COMMENT_BLOCKS: self._processFragments(par, S_META, tText, tFormat) elif tType == BlockTyp.KEYWORD: diff --git a/novelwriter/formats/tohtml.py b/novelwriter/formats/tohtml.py index 404c6d09..4614050a 100644 --- a/novelwriter/formats/tohtml.py +++ b/novelwriter/formats/tohtml.py @@ -32,7 +32,7 @@ from typing import TYPE_CHECKING from novelwriter.common import formatTimeStamp from novelwriter.constants import nwHtmlUnicode, nwStyles from novelwriter.formats.shared import BlockFmt, BlockTyp, T_Formats, TextFmt, stripEscape -from novelwriter.formats.tokenizer import Tokenizer +from novelwriter.formats.tokenizer import COMMENT_BLOCKS, Tokenizer from novelwriter.types import FONT_STYLE, FONT_WEIGHTS, QtHexRgb if TYPE_CHECKING: @@ -228,7 +228,7 @@ class ToHtml(Tokenizer): elif tType == BlockTyp.SKIP: lines.append(f" 

    \n") - elif tType == BlockTyp.COMMENT: + elif tType in COMMENT_BLOCKS: lines.append(f"

    {self._formatText(tText, tFmt)}

    \n") elif tType == BlockTyp.KEYWORD: diff --git a/novelwriter/formats/tokenizer.py b/novelwriter/formats/tokenizer.py index ca1f20a8..984a3d71 100644 --- a/novelwriter/formats/tokenizer.py +++ b/novelwriter/formats/tokenizer.py @@ -71,11 +71,23 @@ COMMENT_STYLE = { nwComment.COMMENT: ComStyle(), nwComment.STORY: ComStyle("Story Structure", "modifier", "note"), } -HEADINGS = [ +COMMENT_TYPE = { + nwComment.PLAIN: BlockTyp.COMMENT, + nwComment.IGNORE: BlockTyp.COMMENT, + nwComment.SYNOPSIS: BlockTyp.SUMMARY, + nwComment.SHORT: BlockTyp.SUMMARY, + nwComment.NOTE: BlockTyp.NOTE, + nwComment.FOOTNOTE: BlockTyp.COMMENT, + nwComment.COMMENT: BlockTyp.COMMENT, + nwComment.STORY: BlockTyp.NOTE, +} +HEADING_BLOCKS = [ BlockTyp.TITLE, BlockTyp.PART, BlockTyp.HEAD1, BlockTyp.HEAD2, BlockTyp.HEAD3, BlockTyp.HEAD4, ] -SKIP_INDENT = [*HEADINGS, BlockTyp.SEP, BlockTyp.SKIP] +COMMENT_BLOCKS = (BlockTyp.COMMENT, BlockTyp.SUMMARY, BlockTyp.NOTE) +META_BLOCKS = (BlockTyp.COMMENT, BlockTyp.SUMMARY, BlockTyp.NOTE, BlockTyp.KEYWORD) +SKIP_INDENT = [*HEADING_BLOCKS, BlockTyp.SEP, BlockTyp.SKIP] B_EMPTY: T_Block = (BlockTyp.EMPTY, "", "", [], BlockFmt.NONE) @@ -619,7 +631,7 @@ class Tokenizer(ABC): bStyle = COMMENT_STYLE[cStyle] tLine, tFmt = self._formatComment(bStyle, cKey, cText) tBlocks.append(( - BlockTyp.COMMENT, "", tLine, tFmt, tStyle + COMMENT_TYPE[cStyle], "", tLine, tFmt, tStyle )) elif cStyle == nwComment.FOOTNOTE: @@ -990,7 +1002,7 @@ class Tokenizer(ABC): allWordChars += nPWChars textWordChars += nPWChars - elif tType in HEADINGS: + elif tType in HEADING_BLOCKS: titleCount += 1 allWords += nWords titleWords += nWords @@ -1004,7 +1016,7 @@ class Tokenizer(ABC): allChars += nChars allWordChars += nWChars - elif tType in (BlockTyp.COMMENT, BlockTyp.KEYWORD): + elif tType in META_BLOCKS: words = tText.split() allWords += len(words) allChars += len(tText) diff --git a/novelwriter/formats/tomarkdown.py b/novelwriter/formats/tomarkdown.py index b87d0325..0b477302 100644 --- a/novelwriter/formats/tomarkdown.py +++ b/novelwriter/formats/tomarkdown.py @@ -29,7 +29,7 @@ from typing import TYPE_CHECKING from novelwriter.constants import nwUnicode from novelwriter.formats.shared import BlockFmt, BlockTyp, T_Formats, TextFmt -from novelwriter.formats.tokenizer import Tokenizer +from novelwriter.formats.tokenizer import COMMENT_BLOCKS, Tokenizer if TYPE_CHECKING: from pathlib import Path @@ -144,7 +144,7 @@ class ToMarkdown(Tokenizer): elif tType == BlockTyp.SKIP: lines.append(f"{cSkip}\n\n") - elif tType == BlockTyp.COMMENT: + elif tType in COMMENT_BLOCKS: lines.append(f"{self._formatText(tText, tFormat, mTags)}\n\n") elif tType == BlockTyp.KEYWORD: diff --git a/novelwriter/formats/toodt.py b/novelwriter/formats/toodt.py index 15622845..ddd554ba 100644 --- a/novelwriter/formats/toodt.py +++ b/novelwriter/formats/toodt.py @@ -40,7 +40,7 @@ from novelwriter import __version__ from novelwriter.common import xmlElement, xmlIndent, xmlSubElem from novelwriter.constants import nwHeadFmt, nwStyles from novelwriter.formats.shared import BlockFmt, BlockTyp, TextFmt, stripEscape -from novelwriter.formats.tokenizer import Tokenizer +from novelwriter.formats.tokenizer import COMMENT_BLOCKS, Tokenizer from novelwriter.types import FONT_STYLE, QtHexRgb if TYPE_CHECKING: @@ -389,7 +389,7 @@ class ToOdt(Tokenizer): elif tType == BlockTyp.SKIP: self._addTextPar(xText, S_TEXT, oStyle, "") - elif tType == BlockTyp.COMMENT: + elif tType in COMMENT_BLOCKS: self._addTextPar(xText, S_META, oStyle, tText, tFmt=tFormat) elif tType == BlockTyp.KEYWORD: diff --git a/novelwriter/formats/toqdoc.py b/novelwriter/formats/toqdoc.py index 69c25fa4..28186b69 100644 --- a/novelwriter/formats/toqdoc.py +++ b/novelwriter/formats/toqdoc.py @@ -37,7 +37,7 @@ from PyQt6.QtPrintSupport import QPrinter from novelwriter import __version__ from novelwriter.constants import nwStyles, nwUnicode from novelwriter.formats.shared import BlockFmt, BlockTyp, T_Formats, TextFmt, stripEscape -from novelwriter.formats.tokenizer import HEADINGS, Tokenizer +from novelwriter.formats.tokenizer import HEADING_BLOCKS, META_BLOCKS, Tokenizer from novelwriter.types import ( QtAlignAbsolute, QtAlignCenter, QtAlignJustify, QtAlignLeft, QtAlignRight, QtKeepAnchor, QtMoveAnchor, QtPageBreakAfter, QtPageBreakAuto, @@ -214,7 +214,7 @@ class ToQTextDocument(Tokenizer): for tType, tMeta, tText, tFormat, tStyle in self._blocks: bFmt = QTextBlockFormat(self._blockFmt) - if tType in (BlockTyp.COMMENT, BlockTyp.KEYWORD): + if tType in META_BLOCKS: bFmt.setTopMargin(self._mMeta[0]) bFmt.setBottomMargin(self._mMeta[1]) elif tType == BlockTyp.SEP: @@ -248,17 +248,21 @@ class ToQTextDocument(Tokenizer): if tStyle & BlockFmt.IND_T: bFmt.setTextIndent(self._tIndent) - if tType in (BlockTyp.TEXT, BlockTyp.COMMENT, BlockTyp.KEYWORD): + if tType == BlockTyp.TEXT: newBlock(cursor, bFmt) self._insertFragments(tText, tFormat, cursor, self._charFmt) - elif tType in HEADINGS: + elif tType in HEADING_BLOCKS: bFmt, cFmt = self._genHeadStyle(tType, tMeta, bFmt) for tPart in tText.split("\n"): newBlock(cursor, bFmt) cursor.insertText(tPart, cFmt) bFmt.setPageBreakPolicy(QtPageBreakAuto) + elif tType in META_BLOCKS: + newBlock(cursor, bFmt) + self._insertFragments(tText, tFormat, cursor, self._charFmt) + elif tType == BlockTyp.SEP: newBlock(cursor, bFmt) cursor.insertText(tText, self._charFmt) diff --git a/tests/reference/baseConfig_novelwriter.conf b/tests/reference/baseConfig_novelwriter.conf index 859cca52..c3a45e6a 100644 --- a/tests/reference/baseConfig_novelwriter.conf +++ b/tests/reference/baseConfig_novelwriter.conf @@ -83,6 +83,7 @@ showedittoolbar = False showsessiontime = True viewcomments = True viewsynopsis = True +viewnotes = True searchcase = False searchword = False searchregex = False diff --git a/tests/test_formats/test_fmt_tokenizer.py b/tests/test_formats/test_fmt_tokenizer.py index 62fe24bd..2b589ccc 100644 --- a/tests/test_formats/test_fmt_tokenizer.py +++ b/tests/test_formats/test_fmt_tokenizer.py @@ -783,7 +783,7 @@ def testFmtToken_MetaFormat(mockGUI): tokens._text = "% synopsis: The synopsis\n" tokens.tokenizeText() assert tokens._blocks == [( - BlockTyp.COMMENT, "", "Synopsis: The synopsis", [ + BlockTyp.SUMMARY, "", "Synopsis: The synopsis", [ (0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "modifier"), (9, TextFmt.COL_E, ""), (9, TextFmt.B_E, ""), (10, TextFmt.COL_B, "note"), (22, TextFmt.COL_E, "") @@ -800,7 +800,7 @@ def testFmtToken_MetaFormat(mockGUI): tokens._text = "% short: A short description\n" tokens.tokenizeText() assert tokens._blocks == [( - BlockTyp.COMMENT, "", "Short Description: A short description", [ + BlockTyp.SUMMARY, "", "Short Description: A short description", [ (0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "modifier"), (18, TextFmt.COL_E, ""), (18, TextFmt.B_E, ""), (19, TextFmt.COL_B, "note"), (38, TextFmt.COL_E, ""), @@ -1563,7 +1563,7 @@ def testFmtToken_TextIndent(mockGUI): ] assert tokens._blocks == [ (BlockTyp.HEAD3, TM1, "Scene Two", [], BlockFmt.NONE), - (BlockTyp.COMMENT, "", "Synopsis: Stuff happens.", tFmt, BlockFmt.NONE), + (BlockTyp.SUMMARY, "", "Synopsis: Stuff happens.", tFmt, BlockFmt.NONE), ] assert tokens._noIndent is True From 4874c02c44d1c5d891ae879694f1322eb4e5691f Mon Sep 17 00:00:00 2001 From: Myian Date: Thu, 19 Jun 2025 21:04:42 +0200 Subject: [PATCH 75/96] fix highlight? --- novelwriter/assets/themes/primer_light.conf | 2 +- novelwriter/assets/themes/primer_night.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/novelwriter/assets/themes/primer_light.conf b/novelwriter/assets/themes/primer_light.conf index 7aaa2cd0..da7f1fb6 100644 --- a/novelwriter/assets/themes/primer_light.conf +++ b/novelwriter/assets/themes/primer_light.conf @@ -74,4 +74,4 @@ spellcheckline = #fa4549 errorline = cyan replacetag = purple modifier = #bc4c00 -texthighlight = #dde3e8 +texthighlight = #a7fbbe diff --git a/novelwriter/assets/themes/primer_night.conf b/novelwriter/assets/themes/primer_night.conf index 4fd0225a..294c30ef 100644 --- a/novelwriter/assets/themes/primer_night.conf +++ b/novelwriter/assets/themes/primer_night.conf @@ -74,4 +74,4 @@ spellcheckline = #f85149 errorline = cyan replacetag = purple modifier = orange -texthighlight = #30363d +texthighlight = #104C35 From c4cd151f2cfb14cbb3cdeceea82f432ed2d2d278 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 19 Jun 2025 21:05:44 +0200 Subject: [PATCH 76/96] Compact repeated blocks in both meta and note types --- novelwriter/formats/tokenizer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/novelwriter/formats/tokenizer.py b/novelwriter/formats/tokenizer.py index 984a3d71..176c4873 100644 --- a/novelwriter/formats/tokenizer.py +++ b/novelwriter/formats/tokenizer.py @@ -875,12 +875,12 @@ class Tokenizer(ABC): # We don't need to keep the empty lines after this pass pass - elif cBlock[0] == BlockTyp.KEYWORD: - # Adjust margins for lines in a list of keyword lines + elif cBlock[0] in (BlockTyp.KEYWORD, BlockTyp.NOTE): + # Adjust margins for lines in repeated meta blocks aStyle = cBlock[4] - if pBlock[0] == BlockTyp.KEYWORD: + if pBlock[0] == cBlock[0]: aStyle |= BlockFmt.Z_TOP - if nBlock[0] == BlockTyp.KEYWORD: + if nBlock[0] == cBlock[0]: aStyle |= BlockFmt.Z_BTM sBlocks.append(( cBlock[0], cBlock[1], cBlock[2], cBlock[3], aStyle From efa82e1761102fa14b6a33620e91c9c1a4b826d8 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 19 Jun 2025 21:31:57 +0200 Subject: [PATCH 77/96] Add more new features to the Lipsum test project --- tests/lipsum/content/04468803b92e1.nwd | 6 ++-- tests/lipsum/content/2426c6f0ca922.nwd | 6 ++-- tests/lipsum/content/441420a886d82.nwd | 6 ++-- tests/lipsum/content/47666c91c7ccf.nwd | 6 ++-- tests/lipsum/content/4c4f28287af27.nwd | 6 ++-- tests/lipsum/content/88243afbe5ed8.nwd | 6 ++-- tests/lipsum/content/88d59a277361b.nwd | 7 ++-- tests/lipsum/content/eb103bc70c90c.nwd | 6 ++-- tests/lipsum/content/f8c0562e50f1b.nwd | 6 ++-- tests/lipsum/content/f96ec11c6a3da.nwd | 6 ++-- tests/lipsum/content/fb609cd8319dc.nwd | 6 ++-- tests/lipsum/nwProject.nwx | 48 +++++++++++++------------- 12 files changed, 61 insertions(+), 54 deletions(-) diff --git a/tests/lipsum/content/04468803b92e1.nwd b/tests/lipsum/content/04468803b92e1.nwd index 35a2dad3..c1a7ac41 100644 --- a/tests/lipsum/content/04468803b92e1.nwd +++ b/tests/lipsum/content/04468803b92e1.nwd @@ -1,12 +1,14 @@ %%~name: Ancient Europe %%~path: 60bdf227455cc/04468803b92e1 %%~kind: WORLD/NOTE -%%~hash: 7b746485a1d06c64a5e0bf671e3141806ed51a54 -%%~date: Unknown/2024-01-30 21:36:44 +%%~hash: 9a0a98cda777f557ea10670ea1618cde253084b7 +%%~date: Unknown/2025-06-19 21:02:43 # Ancient Europe @tag: Europe | Ancient Europe +%Short: A strange place + Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula. Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque. diff --git a/tests/lipsum/content/2426c6f0ca922.nwd b/tests/lipsum/content/2426c6f0ca922.nwd index e6d5dd54..47db3a77 100644 --- a/tests/lipsum/content/2426c6f0ca922.nwd +++ b/tests/lipsum/content/2426c6f0ca922.nwd @@ -1,12 +1,14 @@ %%~name: Main %%~path: 6c6afb1247750/2426c6f0ca922 %%~kind: PLOT/NOTE -%%~hash: db3897d166e246acdb5e25e9bd98c5a40a699ed0 -%%~date: Unknown/Unknown +%%~hash: ffc82e98d37621d83a808a75f06bd36923356706 +%%~date: Unknown/2025-06-19 21:02:33 # Main Plot @tag: Main +%Short: Where it all happens + Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet. Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur. \ No newline at end of file diff --git a/tests/lipsum/content/441420a886d82.nwd b/tests/lipsum/content/441420a886d82.nwd index 05881160..b31445e3 100644 --- a/tests/lipsum/content/441420a886d82.nwd +++ b/tests/lipsum/content/441420a886d82.nwd @@ -1,14 +1,14 @@ %%~name: Chapter Two %%~path: 6bd935d2490cd/441420a886d82 %%~kind: NOVEL/DOCUMENT -%%~hash: fd6d46708faa1333f8f7ba0442fc5b35bf1e3f85 -%%~date: Unknown/Unknown +%%~hash: 81d30d3448202c782a6e252c5f7ef030bca3bf7f +%%~date: Unknown/2025-06-19 21:01:48 ## Chapter Two @pov: Bod @plot: Main @location: Europe -% Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. +%Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at. diff --git a/tests/lipsum/content/47666c91c7ccf.nwd b/tests/lipsum/content/47666c91c7ccf.nwd index e551a0e3..5f6011ef 100644 --- a/tests/lipsum/content/47666c91c7ccf.nwd +++ b/tests/lipsum/content/47666c91c7ccf.nwd @@ -1,15 +1,15 @@ %%~name: Scene Five %%~path: 6bd935d2490cd/47666c91c7ccf %%~kind: NOVEL/DOCUMENT -%%~hash: d210c26966da6f9edea8726567abf4860b7bb9b7 -%%~date: Unknown/Unknown +%%~hash: 680e26046056165f1560ed1468cf316a3c51f90e +%%~date: Unknown/2025-06-19 21:01:59 ### Scene Five @pov: Bod @plot: Main @location: Europe -% Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. +%Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet. diff --git a/tests/lipsum/content/4c4f28287af27.nwd b/tests/lipsum/content/4c4f28287af27.nwd index 4bf57987..7ee071db 100644 --- a/tests/lipsum/content/4c4f28287af27.nwd +++ b/tests/lipsum/content/4c4f28287af27.nwd @@ -1,13 +1,15 @@ %%~name: Mr. Nobody %%~path: 67a8707f2f249/4c4f28287af27 %%~kind: CHARACTER/NOTE -%%~hash: 2a9b9751e8207b719bfa6233ebe04e24928ff8a8 -%%~date: Unknown/2024-01-30 21:36:26 +%%~hash: 84639e78d265b3a1f2fb8e3211a08c223d95500a +%%~date: Unknown/2025-06-19 21:02:21 # Nobody Owens @tag: Bod | Nobody Owens @plot: Main +%Short: The Hero + Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus. Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat. diff --git a/tests/lipsum/content/88243afbe5ed8.nwd b/tests/lipsum/content/88243afbe5ed8.nwd index 3f40135a..c8276545 100644 --- a/tests/lipsum/content/88243afbe5ed8.nwd +++ b/tests/lipsum/content/88243afbe5ed8.nwd @@ -1,15 +1,15 @@ %%~name: Scene One %%~path: 45e6b01ca35c1/88243afbe5ed8 %%~kind: NOVEL/DOCUMENT -%%~hash: a09245a7a772bbe02850b5db109977e336cd9cc1 -%%~date: Unknown/Unknown +%%~hash: d660202d320b3c99dbcc3bd9dd39d464d4f422ae +%%~date: Unknown/2025-06-19 21:01:38 ### Scene One @pov: Bod @plot: Main @location: Europe -% Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. +%Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada. diff --git a/tests/lipsum/content/88d59a277361b.nwd b/tests/lipsum/content/88d59a277361b.nwd index a05c84e6..367ea3e1 100644 --- a/tests/lipsum/content/88d59a277361b.nwd +++ b/tests/lipsum/content/88d59a277361b.nwd @@ -1,11 +1,12 @@ %%~name: Prologue %%~path: b3643d0f92e32/88d59a277361b %%~kind: NOVEL/DOCUMENT -%%~hash: 377a72ba340ff458a00d98af745e9fa0c79fb26c -%%~date: Unknown/2024-10-25 19:16:49 +%%~hash: d43324a30d3f1e5608711ca71515dee429b30925 +%%~date: Unknown/2025-06-19 21:01:07 ##! Prologue -% Synopsis: Explanation from the lipsum.com website. +%Synopsis: Explanation from the lipsum.com website. +%Note.Purpose: Introduction _Lorem Ipsum_ is simply dummy text[footnote:f9kgf] of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. diff --git a/tests/lipsum/content/eb103bc70c90c.nwd b/tests/lipsum/content/eb103bc70c90c.nwd index bdfac437..3c126692 100644 --- a/tests/lipsum/content/eb103bc70c90c.nwd +++ b/tests/lipsum/content/eb103bc70c90c.nwd @@ -1,15 +1,15 @@ %%~name: Scene Three %%~path: 6bd935d2490cd/eb103bc70c90c %%~kind: NOVEL/DOCUMENT -%%~hash: c4eda49e4fe81dc450d547eee0bdabe77fdaaa98 -%%~date: Unknown/Unknown +%%~hash: 59eeb405f5b26cbe1056d1f7684f7ed40ed6685a +%%~date: Unknown/2025-06-19 21:01:52 ### Scene Three @pov: Bod @plot: Main @location: Europe -% Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. +%Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis. diff --git a/tests/lipsum/content/f8c0562e50f1b.nwd b/tests/lipsum/content/f8c0562e50f1b.nwd index 73bedd5f..890a7e06 100644 --- a/tests/lipsum/content/f8c0562e50f1b.nwd +++ b/tests/lipsum/content/f8c0562e50f1b.nwd @@ -1,15 +1,15 @@ %%~name: Scene Four %%~path: 6bd935d2490cd/f8c0562e50f1b %%~kind: NOVEL/DOCUMENT -%%~hash: 9461a279b9fb6ef005ee4d432fcda77ff5bfbd42 -%%~date: Unknown/Unknown +%%~hash: f4848b56d1f41a04de1579d772a4d1ddd3e28e55 +%%~date: Unknown/2025-06-19 21:01:55 ### Scene Four @pov: Bod @plot: Main @location: Europe -% Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. +%Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien. diff --git a/tests/lipsum/content/f96ec11c6a3da.nwd b/tests/lipsum/content/f96ec11c6a3da.nwd index b6434395..a71ad88a 100644 --- a/tests/lipsum/content/f96ec11c6a3da.nwd +++ b/tests/lipsum/content/f96ec11c6a3da.nwd @@ -1,15 +1,15 @@ %%~name: Scene Two %%~path: 45e6b01ca35c1/f96ec11c6a3da %%~kind: NOVEL/DOCUMENT -%%~hash: ebe3fbaa16d9d81bc1a139822e3bf39bb357866d -%%~date: Unknown/Unknown +%%~hash: e95ff5b633e74c9cab8dc32b6a77b3e40d265f2b +%%~date: Unknown/2025-06-19 21:01:41 ### Scene Two @pov: Bod @plot: Main @location: Europe -% Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. +%Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien. diff --git a/tests/lipsum/content/fb609cd8319dc.nwd b/tests/lipsum/content/fb609cd8319dc.nwd index 10e465ae..ff643fb1 100644 --- a/tests/lipsum/content/fb609cd8319dc.nwd +++ b/tests/lipsum/content/fb609cd8319dc.nwd @@ -1,14 +1,14 @@ %%~name: Chapter One %%~path: 45e6b01ca35c1/fb609cd8319dc %%~kind: NOVEL/DOCUMENT -%%~hash: 5dabeaa7a58238a6ad99ce73176b1bdfad1a71b7 -%%~date: Unknown/2024-01-30 21:35:57 +%%~hash: 73a1008ed17a84a48b14b41109a842a6ed300eec +%%~date: Unknown/2025-06-19 21:01:19 ## Chapter One @pov: Bod @plot: Main @location: Europe -% Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. +%Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar. diff --git a/tests/lipsum/nwProject.nwx b/tests/lipsum/nwProject.nwx index f2c7e31c..a403da4a 100644 --- a/tests/lipsum/nwProject.nwx +++ b/tests/lipsum/nwProject.nwx @@ -1,6 +1,6 @@ - - + + Lorem Ipsum lipsum.com @@ -9,7 +9,7 @@ en_GB None - 7a992350f3eb6 + 04468803b92e1 None b3643d0f92e32 None @@ -19,16 +19,16 @@ Replace Text 2 - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main @@ -45,7 +45,7 @@ Front Matter - + Prologue @@ -57,7 +57,7 @@ Chapter One - + Chapter One @@ -65,7 +65,7 @@ Scene One - + Scene Two @@ -77,19 +77,19 @@ Chapter Two - + Chapter Two - + Scene Three - + Scene Four - + Scene Five @@ -97,24 +97,24 @@ Characters - - Mr. Nobody + + Mr. Nobody Plot - - Main + + Main World - - Ancient Europe + + Ancient Europe From 0d94a84724859768ae795f53bbc7be6c1d9d619b Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 19 Jun 2025 21:32:11 +0200 Subject: [PATCH 78/96] Fix tests --- .../coreIndex_LoadSave_tagsIndex.json | 12 ++- .../reference/fmtToDocX_SaveDocument_app.xml | 6 +- .../reference/fmtToDocX_SaveDocument_core.xml | 6 +- .../fmtToDocX_SaveDocument_document.xml | 70 +++++++++++++++- .../fmtToDocX_SaveDocument_settings.xml | 6 +- .../reference/guiOutline_Content_outline.csv | 26 +++--- ...dDocBuild_Extended_Markdown_Lorem_Ipsum.md | 10 ++- .../mBuildDocBuild_HTML5_Lorem_Ipsum.htm | 7 +- .../mBuildDocBuild_HTML5_Lorem_Ipsum.json | 11 ++- .../mBuildDocBuild_NWD_Lorem_Ipsum.json | 27 ++++--- .../mBuildDocBuild_NWD_Lorem_Ipsum.txt | 23 ++++-- ...uildDocBuild_OpenDocument_Lorem_Ipsum.fodt | 19 +++-- ...dDocBuild_Standard_Markdown_Lorem_Ipsum.md | 10 ++- tests/test_gui/test_gui_doceditor.py | 42 +++++----- tests/test_gui/test_gui_mainmenu.py | 79 ++++++++++--------- 15 files changed, 230 insertions(+), 124 deletions(-) diff --git a/tests/reference/coreIndex_LoadSave_tagsIndex.json b/tests/reference/coreIndex_LoadSave_tagsIndex.json index 99201a13..c8365601 100644 --- a/tests/reference/coreIndex_LoadSave_tagsIndex.json +++ b/tests/reference/coreIndex_LoadSave_tagsIndex.json @@ -18,7 +18,8 @@ "88d59a277361b": { "T0001": { "meta": {"level": "H2", "title": "Prologue", "line": 1, "tag": "", "counts": [605, 94, 2]}, - "summary": "Explanation from the lipsum.com website." + "summary": "Explanation from the lipsum.com website.", + "note.Purpose": "Introduction" }, "document": { "footnotes": ["f9kgf"] @@ -92,17 +93,20 @@ "4c4f28287af27": { "T0001": { "meta": {"level": "H1", "title": "Nobody Owens", "line": 1, "tag": "bod", "counts": [1864, 284, 3]}, - "refs": {"main": "@plot"} + "refs": {"main": "@plot"}, + "summary": "The Hero" } }, "2426c6f0ca922": { "T0001": { - "meta": {"level": "H1", "title": "Main Plot", "line": 1, "tag": "main", "counts": [1369, 195, 2]} + "meta": {"level": "H1", "title": "Main Plot", "line": 1, "tag": "main", "counts": [1369, 195, 2]}, + "summary": "Where it all happens" } }, "04468803b92e1": { "T0001": { - "meta": {"level": "H1", "title": "Ancient Europe", "line": 1, "tag": "europe", "counts": [1770, 259, 3]} + "meta": {"level": "H1", "title": "Ancient Europe", "line": 1, "tag": "europe", "counts": [1770, 259, 3]}, + "summary": "A strange place" } } } diff --git a/tests/reference/fmtToDocX_SaveDocument_app.xml b/tests/reference/fmtToDocX_SaveDocument_app.xml index 43e25401..0e99320a 100644 --- a/tests/reference/fmtToDocX_SaveDocument_app.xml +++ b/tests/reference/fmtToDocX_SaveDocument_app.xml @@ -1,8 +1,8 @@ - 41 - novelWriter/2.7b1 - 4035 + 45 + novelWriter/2.8a1 + 4050 21296 24964 45 diff --git a/tests/reference/fmtToDocX_SaveDocument_core.xml b/tests/reference/fmtToDocX_SaveDocument_core.xml index 25a58621..35597dc5 100644 --- a/tests/reference/fmtToDocX_SaveDocument_core.xml +++ b/tests/reference/fmtToDocX_SaveDocument_core.xml @@ -1,10 +1,10 @@ - 2025-06-12T19:20:06 - 2025-06-12T19:20:06 + 2025-06-19T21:08:59 + 2025-06-19T21:08:59 lipsum.com Lorem Ipsum en_GB - 54 + 55 lipsum.com diff --git a/tests/reference/fmtToDocX_SaveDocument_document.xml b/tests/reference/fmtToDocX_SaveDocument_document.xml index 68bd89f3..3e631895 100644 --- a/tests/reference/fmtToDocX_SaveDocument_document.xml +++ b/tests/reference/fmtToDocX_SaveDocument_document.xml @@ -34,7 +34,7 @@ - 4,035 + 4,050 @@ -48,7 +48,7 @@ - 27,064 + 27,164 @@ -1250,6 +1250,28 @@ Main + + + + + + + + + + Short Description: + + + + + + + + + + The Hero + + @@ -1323,6 +1345,28 @@ Main + + + + + + + + + + Short Description: + + + + + + + + + + Where it all happens + + @@ -1396,6 +1440,28 @@ Ancient Europe + + + + + + + + + + Short Description: + + + + + + + + + + A strange place + + diff --git a/tests/reference/fmtToDocX_SaveDocument_settings.xml b/tests/reference/fmtToDocX_SaveDocument_settings.xml index 10913023..c1622522 100644 --- a/tests/reference/fmtToDocX_SaveDocument_settings.xml +++ b/tests/reference/fmtToDocX_SaveDocument_settings.xml @@ -9,13 +9,13 @@ - + - + - + diff --git a/tests/reference/guiOutline_Content_outline.csv b/tests/reference/guiOutline_Content_outline.csv index 62edb467..22bc5537 100644 --- a/tests/reference/guiOutline_Content_outline.csv +++ b/tests/reference/guiOutline_Content_outline.csv @@ -1,13 +1,13 @@ -"H","Title","Document","Line","Status","Chars","Words","Pars","POV","Focus","Characters","Plot","Timeline","Locations","Objects","Entities","Custom","Story","Mentions","Synopsis" -"H1","Lorem Ipsum","Lorem Ipsum","1","Finished","259","44","5","","","","","","","","","","","","" -"H2","Prologue","Prologue","1","Draft","605","94","2","","","","","","","","","","","","Explanation from the lipsum.com website." -"H1","Act One","Act One","1","New","35","6","1","","","","","","","","","","","","" -"H2","Chapter One","Chapter One","1","Draft","419","67","1","Bod","","","Main","","Europe","","","","","","Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam." -"H3","Scene One","Scene One","1","Finished","1197","174","2","Bod","","","Main","","Europe","","","","","","Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur." -"H4","Scene One, Section Two","Scene One","13","Finished","1561","230","2","","","","","","","","","","","","" -"H3","Scene Two","Scene Two","1","Finished","2034","299","3","Bod","","","Main","","Europe","","","","","","Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci." -"H4","Scene Two, Section Two","Scene Two","15","Finished","2009","301","3","","","","","","","","","","","","" -"H2","Chapter Two","Chapter Two","1","Draft","477","70","1","Bod","","","Main","","Europe","","","","","","Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue." -"H3","Scene Three","Scene Three","1","Finished","3006","439","4","Bod","","","Main","","Europe","","","","","","Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos." -"H3","Scene Four","Scene Four","1","Finished","3839","563","6","Bod","","","Main","","Europe","","","","","","Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo." -"H3","Scene Five","Scene Five","1","Finished","3644","543","5","Bod","","","Main","","Europe","","","","","","Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus." +"H","Title","Document","Line","Status","Chars","Words","Pars","POV","Focus","Characters","Plot","Timeline","Locations","Objects","Entities","Custom","Story","Mentions","Synopsis","Note (Purpose)" +"H1","Lorem Ipsum","Lorem Ipsum","1","Finished","259","44","5","","","","","","","","","","","","","" +"H2","Prologue","Prologue","1","Draft","605","94","2","","","","","","","","","","","","Explanation from the lipsum.com website.","Introduction" +"H1","Act One","Act One","1","New","35","6","1","","","","","","","","","","","","","" +"H2","Chapter One","Chapter One","1","Draft","419","67","1","Bod","","","Main","","Europe","","","","","","Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.","" +"H3","Scene One","Scene One","1","Finished","1197","174","2","Bod","","","Main","","Europe","","","","","","Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.","" +"H4","Scene One, Section Two","Scene One","13","Finished","1561","230","2","","","","","","","","","","","","","" +"H3","Scene Two","Scene Two","1","Finished","2034","299","3","Bod","","","Main","","Europe","","","","","","Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.","" +"H4","Scene Two, Section Two","Scene Two","15","Finished","2009","301","3","","","","","","","","","","","","","" +"H2","Chapter Two","Chapter Two","1","Draft","477","70","1","Bod","","","Main","","Europe","","","","","","Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.","" +"H3","Scene Three","Scene Three","1","Finished","3006","439","4","Bod","","","Main","","Europe","","","","","","Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.","" +"H3","Scene Four","Scene Four","1","Finished","3839","563","6","Bod","","","Main","","Europe","","","","","","Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.","" +"H3","Scene Five","Scene Five","1","Finished","3644","543","5","Bod","","","Main","","Europe","","","","","","Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.","" diff --git a/tests/reference/mBuildDocBuild_Extended_Markdown_Lorem_Ipsum.md b/tests/reference/mBuildDocBuild_Extended_Markdown_Lorem_Ipsum.md index 96b1fc07..329eeaea 100644 --- a/tests/reference/mBuildDocBuild_Extended_Markdown_Lorem_Ipsum.md +++ b/tests/reference/mBuildDocBuild_Extended_Markdown_Lorem_Ipsum.md @@ -3,9 +3,9 @@ Lorem Ipsum **By lipsum.com** -Word Count: 4,169 +Word Count: 4,184 -Character Count: 27,898 +Character Count: 27,998 “Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…” @@ -162,6 +162,8 @@ Notes: Characters **Tag:** Bod | Nobody Owens **Plot:** Main +**Short Description:** The Hero + Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus. Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat. @@ -175,6 +177,8 @@ Notes: Plot **Tag:** Main +**Short Description:** Where it all happens + Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet. Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur. @@ -186,6 +190,8 @@ Notes: World **Tag:** Europe | Ancient Europe +**Short Description:** A strange place + Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula. Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque. diff --git a/tests/reference/mBuildDocBuild_HTML5_Lorem_Ipsum.htm b/tests/reference/mBuildDocBuild_HTML5_Lorem_Ipsum.htm index 92482cd8..646a7c05 100644 --- a/tests/reference/mBuildDocBuild_HTML5_Lorem_Ipsum.htm +++ b/tests/reference/mBuildDocBuild_HTML5_Lorem_Ipsum.htm @@ -21,8 +21,8 @@ h4 {font-size: 1.25em; margin-top: 1.20em; margin-bottom: 0.60em;}

    Lorem Ipsum

    By lipsum.com

    -

    Word Count: 4,169

    -

    Character Count: 27,898

    +

    Word Count: 4,184

    +

    Character Count: 27,998

    “Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”

    “There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”

    Comment: Exctracted from the lipsum.com website.

    @@ -107,17 +107,20 @@ h4 {font-size: 1.25em; margin-top: 1.20em; margin-bottom: 0.60em;}

    Nobody Owens

    Tag: Bod | Nobody Owens

    Plot: Main

    +

    Short Description: The Hero

    Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus.

    Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat.

    Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque.

    Notes: Plot

    Main Plot

    Tag: Main

    +

    Short Description: Where it all happens

    Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet.

    Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur.

    Notes: World

    Ancient Europe

    Tag: Europe | Ancient Europe

    +

    Short Description: A strange place

    Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula.

    Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque.

    Nunc ullamcorper magna quis elit condimentum rhoncus. Aenean dictum pulvinar dolor suscipit interdum. Aliquam elit massa, elementum nec cursus eu, maximus nec ipsum. Donec ullamcorper iaculis dolor eu commodo. Nunc eget tortor quis turpis consectetur varius. Vestibulum nec justo vel tellus venenatis condimentum. Duis auctor iaculis massa. Nunc risus magna, rutrum vitae eros non, tristique mollis enim.

    diff --git a/tests/reference/mBuildDocBuild_HTML5_Lorem_Ipsum.json b/tests/reference/mBuildDocBuild_HTML5_Lorem_Ipsum.json index 7a4134ef..3c1ce845 100644 --- a/tests/reference/mBuildDocBuild_HTML5_Lorem_Ipsum.json +++ b/tests/reference/mBuildDocBuild_HTML5_Lorem_Ipsum.json @@ -2,8 +2,8 @@ "meta": { "projectName": "Lorem Ipsum", "novelAuthor": "lipsum.com", - "buildTime": 1737835371, - "buildTimeStr": "2025-01-25 21:02:51" + "buildTime": 1750360261, + "buildTimeStr": "2025-06-19 21:11:01" }, "text": { "css": [ @@ -23,8 +23,8 @@ [ "

    Lorem Ipsum

    ", "

    By lipsum.com

    ", - "

    Word Count: 4,169

    ", - "

    Character Count: 27,898

    ", + "

    Word Count: 4,184

    ", + "

    Character Count: 27,998

    ", "

    \u201cNeque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit\u2026\u201d

    ", "

    \u201cThere is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain\u2026\u201d

    " ], @@ -135,6 +135,7 @@ "

    Nobody Owens

    ", "

    Tag: Bod | Nobody Owens

    ", "

    Plot: Main

    ", + "

    Short Description: The Hero

    ", "

    Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus.

    ", "

    Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat.

    ", "

    Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque.

    " @@ -145,6 +146,7 @@ [ "

    Main Plot

    ", "

    Tag: Main

    ", + "

    Short Description: Where it all happens

    ", "

    Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet.

    ", "

    Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur.

    " ], @@ -154,6 +156,7 @@ [ "

    Ancient Europe

    ", "

    Tag: Europe | Ancient Europe

    ", + "

    Short Description: A strange place

    ", "

    Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula.

    ", "

    Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque.

    ", "

    Nunc ullamcorper magna quis elit condimentum rhoncus. Aenean dictum pulvinar dolor suscipit interdum. Aliquam elit massa, elementum nec cursus eu, maximus nec ipsum. Donec ullamcorper iaculis dolor eu commodo. Nunc eget tortor quis turpis consectetur varius. Vestibulum nec justo vel tellus venenatis condimentum. Duis auctor iaculis massa. Nunc risus magna, rutrum vitae eros non, tristique mollis enim.

    " diff --git a/tests/reference/mBuildDocBuild_NWD_Lorem_Ipsum.json b/tests/reference/mBuildDocBuild_NWD_Lorem_Ipsum.json index f1fd3415..8a08e557 100644 --- a/tests/reference/mBuildDocBuild_NWD_Lorem_Ipsum.json +++ b/tests/reference/mBuildDocBuild_NWD_Lorem_Ipsum.json @@ -2,8 +2,8 @@ "meta": { "projectName": "Lorem Ipsum", "novelAuthor": "lipsum.com", - "buildTime": 1731001720, - "buildTimeStr": "2024-11-07 18:48:40" + "buildTime": 1750360135, + "buildTimeStr": "2025-06-19 21:08:55" }, "text": { "nwd": [ @@ -32,7 +32,8 @@ [ "##! Prologue", "", - "% Synopsis: Explanation from the lipsum.com website.", + "%Synopsis: Explanation from the lipsum.com website.", + "%Note.Purpose: Introduction", "", "_Lorem Ipsum_ is simply dummy text[footnote:f9kgf] of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.", "", @@ -52,7 +53,7 @@ "@plot: Main", "@location: Europe", "", - "% Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.", + "%Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.", "", "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar." ], @@ -63,7 +64,7 @@ "@plot: Main", "@location: Europe", "", - "% Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.", + "%Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.", "", "Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.", "", @@ -82,7 +83,7 @@ "@plot: Main", "@location: Europe", "", - "% Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. ", + "%Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. ", "", "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.", "", @@ -116,7 +117,7 @@ "@plot: Main", "@location: Europe", "", - "% Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.", + "%Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.", "", "Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at." ], @@ -127,7 +128,7 @@ "@plot: Main", "@location: Europe", "", - "% Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.", + "%Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.", "", "Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.", "", @@ -144,7 +145,7 @@ "@plot: Main", "@location: Europe", "", - "% Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.", + "%Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.", "", "Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.", "", @@ -165,7 +166,7 @@ "@plot: Main", "@location: Europe", "", - "% Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", + "%Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", "", "Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.", "", @@ -186,6 +187,8 @@ "@tag: Bod | Nobody Owens", "@plot: Main", "", + "%Short: The Hero", + "", "Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus.", "", "Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat.", @@ -200,6 +203,8 @@ "", "@tag: Main", "", + "%Short: Where it all happens", + "", "Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet.", "", "Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur." @@ -212,6 +217,8 @@ "", "@tag: Europe | Ancient Europe", "", + "%Short: A strange place", + "", "Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula.", "", "Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque.", diff --git a/tests/reference/mBuildDocBuild_NWD_Lorem_Ipsum.txt b/tests/reference/mBuildDocBuild_NWD_Lorem_Ipsum.txt index 21935188..96df15ab 100644 --- a/tests/reference/mBuildDocBuild_NWD_Lorem_Ipsum.txt +++ b/tests/reference/mBuildDocBuild_NWD_Lorem_Ipsum.txt @@ -20,7 +20,8 @@ The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for t ##! Prologue -% Synopsis: Explanation from the lipsum.com website. +%Synopsis: Explanation from the lipsum.com website. +%Note.Purpose: Introduction _Lorem Ipsum_ is simply dummy text[footnote:f9kgf] of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. @@ -38,7 +39,7 @@ See http://lipsum.com @plot: Main @location: Europe -% Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. +%Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar. @@ -48,7 +49,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam @plot: Main @location: Europe -% Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. +%Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada. @@ -66,7 +67,7 @@ Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, @plot: Main @location: Europe -% Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. +%Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien. @@ -98,7 +99,7 @@ Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, @plot: Main @location: Europe -% Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. +%Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at. @@ -108,7 +109,7 @@ Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis phar @plot: Main @location: Europe -% Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. +%Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis. @@ -124,7 +125,7 @@ Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci va @plot: Main @location: Europe -% Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. +%Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien. @@ -144,7 +145,7 @@ Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lob @plot: Main @location: Europe -% Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. +%Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet. @@ -163,6 +164,8 @@ Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacin @tag: Bod | Nobody Owens @plot: Main +%Short: The Hero + Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus. Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat. @@ -175,6 +178,8 @@ Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales @tag: Main +%Short: Where it all happens + Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet. Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur. @@ -185,6 +190,8 @@ Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. @tag: Europe | Ancient Europe +%Short: A strange place + Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula. Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque. diff --git a/tests/reference/mBuildDocBuild_OpenDocument_Lorem_Ipsum.fodt b/tests/reference/mBuildDocBuild_OpenDocument_Lorem_Ipsum.fodt index ffb82ce7..5a5ec9db 100644 --- a/tests/reference/mBuildDocBuild_OpenDocument_Lorem_Ipsum.fodt +++ b/tests/reference/mBuildDocBuild_OpenDocument_Lorem_Ipsum.fodt @@ -1,13 +1,13 @@ - 2025-01-25T16:15:30 - novelWriter/2.6rc1 + 2025-06-19T21:05:16 + novelWriter/2.8a1 lipsum.com - 51 - P0DT0H40M56S + 55 + P0DT0H45M46S Lorem Ipsum - 2025-01-25T16:15:30 + 2025-06-19T21:05:16 lipsum.com @@ -152,13 +152,13 @@ - + - + - + @@ -255,17 +255,20 @@ Nobody Owens Tag: Bod | Nobody Owens Plot: Main + Short Description: The Hero Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus. Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat. Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque. Notes: Plot Main Plot Tag: Main + Short Description: Where it all happens Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet. Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur. Notes: World Ancient Europe Tag: Europe | Ancient Europe + Short Description: A strange place Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula. Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque. Nunc ullamcorper magna quis elit condimentum rhoncus. Aenean dictum pulvinar dolor suscipit interdum. Aliquam elit massa, elementum nec cursus eu, maximus nec ipsum. Donec ullamcorper iaculis dolor eu commodo. Nunc eget tortor quis turpis consectetur varius. Vestibulum nec justo vel tellus venenatis condimentum. Duis auctor iaculis massa. Nunc risus magna, rutrum vitae eros non, tristique mollis enim. diff --git a/tests/reference/mBuildDocBuild_Standard_Markdown_Lorem_Ipsum.md b/tests/reference/mBuildDocBuild_Standard_Markdown_Lorem_Ipsum.md index 96b1fc07..329eeaea 100644 --- a/tests/reference/mBuildDocBuild_Standard_Markdown_Lorem_Ipsum.md +++ b/tests/reference/mBuildDocBuild_Standard_Markdown_Lorem_Ipsum.md @@ -3,9 +3,9 @@ Lorem Ipsum **By lipsum.com** -Word Count: 4,169 +Word Count: 4,184 -Character Count: 27,898 +Character Count: 27,998 “Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…” @@ -162,6 +162,8 @@ Notes: Characters **Tag:** Bod | Nobody Owens **Plot:** Main +**Short Description:** The Hero + Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus. Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat. @@ -175,6 +177,8 @@ Notes: Plot **Tag:** Main +**Short Description:** Where it all happens + Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet. Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur. @@ -186,6 +190,8 @@ Notes: World **Tag:** Europe | Ancient Europe +**Short Description:** A strange place + Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula. Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque. diff --git a/tests/test_gui/test_gui_doceditor.py b/tests/test_gui/test_gui_doceditor.py index ea8f86dd..52cd8826 100644 --- a/tests/test_gui/test_gui_doceditor.py +++ b/tests/test_gui/test_gui_doceditor.py @@ -2074,7 +2074,7 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, prjLipsum): origText = docEditor.getText() # Select the Word "est" - docEditor.setCursorPosition(645) + docEditor.setCursorPosition(663) docEditor._makeSelection(QTextCursor.SelectionType.WordUnderCursor) cursor = docEditor.textCursor() assert cursor.selectedText() == "est" @@ -2087,11 +2087,11 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, prjLipsum): # Find next by enter key monkeypatch.setattr(docSearch.searchBox, "hasFocus", lambda: True) qtbot.keyClick(docSearch.searchBox, Qt.Key.Key_Return, delay=KEY_DELAY) - assert abs(docEditor.getCursorPosition() - 1299) < 3 + assert abs(docEditor.getCursorPosition() - 1317) < 3 # Find next by button qtbot.mouseClick(docSearch.searchButton, QtMouseLeft, delay=KEY_DELAY) - assert abs(docEditor.getCursorPosition() - 1513) < 3 + assert abs(docEditor.getCursorPosition() - 1531) < 3 # Activate loop search docSearch.toggleLoop.activate(QAction.ActionEvent.Trigger) @@ -2100,7 +2100,7 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, prjLipsum): # Find next by menu Search > Find Next nwGUI.mainMenu.aFindNext.activate(QAction.ActionEvent.Trigger) - assert abs(docEditor.getCursorPosition() - 647) < 3 + assert abs(docEditor.getCursorPosition() - 665) < 3 # Close search docSearch.cancelSearch.activate(QAction.ActionEvent.Trigger) @@ -2139,13 +2139,13 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, prjLipsum): # Set valid RegEx docSearch.setSearchText(r"\bSus") qtbot.mouseClick(docSearch.searchButton, QtMouseLeft, delay=KEY_DELAY) - assert abs(docEditor.getCursorPosition() - 223) < 3 + assert abs(docEditor.getCursorPosition() - 241) < 3 # Find next and then prev nwGUI.mainMenu.aFindNext.activate(QAction.ActionEvent.Trigger) - assert abs(docEditor.getCursorPosition() - 324) < 3 + assert abs(docEditor.getCursorPosition() - 342) < 3 nwGUI.mainMenu.aFindPrev.activate(QAction.ActionEvent.Trigger) - assert abs(docEditor.getCursorPosition() - 223) < 3 + assert abs(docEditor.getCursorPosition() - 241) < 3 # Make RegEx case sensitive docSearch.toggleCase.activate(QAction.ActionEvent.Trigger) @@ -2154,11 +2154,11 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, prjLipsum): # Find next/prev (one result) nwGUI.mainMenu.aFindNext.activate(QAction.ActionEvent.Trigger) - assert abs(docEditor.getCursorPosition() - 626) < 3 + assert abs(docEditor.getCursorPosition() - 644) < 3 nwGUI.mainMenu.aFindPrev.activate(QAction.ActionEvent.Trigger) - assert abs(docEditor.getCursorPosition() - 626) < 3 + assert abs(docEditor.getCursorPosition() - 644) < 3 nwGUI.mainMenu.aFindNext.activate(QAction.ActionEvent.Trigger) - assert abs(docEditor.getCursorPosition() - 626) < 3 + assert abs(docEditor.getCursorPosition() - 644) < 3 # Trigger replace nwGUI.mainMenu.aReplace.activate(QAction.ActionEvent.Trigger) @@ -2175,22 +2175,22 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, prjLipsum): assert CONFIG.searchMatchCap is True # Replace "Sus" with "Foo" via menu - docEditor.setCursorPosition(605) + docEditor.setCursorPosition(623) nwGUI.mainMenu.aFindNext.activate(QAction.ActionEvent.Trigger) nwGUI.mainMenu.aReplaceNext.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[623:634] == "Foopendisse" + assert docEditor.getText()[641:652] == "Foopendisse" # Find next/prev to loop file nwGUI.mainMenu.aFindNext.activate(QAction.ActionEvent.Trigger) - assert abs(docEditor.getCursorPosition() - 223) < 3 + assert abs(docEditor.getCursorPosition() - 241) < 3 nwGUI.mainMenu.aFindPrev.activate(QAction.ActionEvent.Trigger) - assert abs(docEditor.getCursorPosition() - 1805) < 3 + assert abs(docEditor.getCursorPosition() - 1823) < 3 nwGUI.mainMenu.aFindNext.activate(QAction.ActionEvent.Trigger) - assert abs(docEditor.getCursorPosition() - 223) < 3 + assert abs(docEditor.getCursorPosition() - 241) < 3 # Replace "sus" with "foo" via replace button qtbot.mouseClick(docSearch.replaceButton, QtMouseLeft, delay=KEY_DELAY) - assert docEditor.getText()[220:228] == "foocipit" + assert docEditor.getText()[238:246] == "foocipit" # Revert last two replaces assert docEditor.docAction(nwDocAction.UNDO) @@ -2204,7 +2204,7 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, prjLipsum): # Close search and select "est" again docSearch.cancelSearch.activate(QAction.ActionEvent.Trigger) - docEditor.setCursorPosition(645) + docEditor.setCursorPosition(663) docEditor._makeSelection(QTextCursor.SelectionType.WordUnderCursor) cursor = docEditor.textCursor() assert cursor.selectedText() == "est" @@ -2221,9 +2221,9 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, prjLipsum): # Only one match nwGUI.mainMenu.aFindNext.activate(QAction.ActionEvent.Trigger) - assert abs(docEditor.getCursorPosition() - 647) < 3 + assert abs(docEditor.getCursorPosition() - 665) < 3 nwGUI.mainMenu.aFindNext.activate(QAction.ActionEvent.Trigger) - assert abs(docEditor.getCursorPosition() - 647) < 3 + assert abs(docEditor.getCursorPosition() - 665) < 3 # Enable next doc search docSearch.toggleProject.activate(QAction.ActionEvent.Trigger) @@ -2234,9 +2234,9 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, prjLipsum): nwGUI.mainMenu.aFindNext.activate(QAction.ActionEvent.Trigger) assert docEditor.docHandle == "2426c6f0ca922" # Next document nwGUI.mainMenu.aFindNext.activate(QAction.ActionEvent.Trigger) - assert abs(docEditor.getCursorPosition() - 620) < 3 + assert abs(docEditor.getCursorPosition() - 651) < 3 nwGUI.mainMenu.aFindNext.activate(QAction.ActionEvent.Trigger) - assert abs(docEditor.getCursorPosition() - 1127) < 3 + assert abs(docEditor.getCursorPosition() - 1157) < 3 # Next doc, no match assert CONFIG.searchNextFile is True diff --git a/tests/test_gui/test_gui_mainmenu.py b/tests/test_gui/test_gui_mainmenu.py index f63f588a..b13b18a1 100644 --- a/tests/test_gui/test_gui_mainmenu.py +++ b/tests/test_gui/test_gui_mainmenu.py @@ -68,154 +68,155 @@ def testGuiMainMenu_EditFormat(qtbot, monkeypatch, nwGUI, prjLipsum): assert docEditor.docAction(nwDocAction.COPY) is False assert nwGUI.openProject(prjLipsum) is True + x = 72 # Split By Chapter assert nwGUI.openDocument("4c4f28287af27") is True - docEditor.setCursorPosition(57) - cleanText = docEditor.getText()[54:101] + docEditor.setCursorPosition(x+3) + cleanText = docEditor.getText()[x:x+47] # Bold mainMenu.aFmtBold.activate(QAction.ActionEvent.Trigger) fmtStr = "**Pellentesque** nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:105] == fmtStr + assert docEditor.getText()[x:x+51] == fmtStr mainMenu.aFmtBold.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:101] == cleanText + assert docEditor.getText()[x:x+47] == cleanText # Italic mainMenu.aFmtItalic.activate(QAction.ActionEvent.Trigger) fmtStr = "_Pellentesque_ nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:103] == fmtStr + assert docEditor.getText()[x:x+49] == fmtStr mainMenu.aFmtItalic.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:101] == cleanText + assert docEditor.getText()[x:x+47] == cleanText # Strikethrough mainMenu.aFmtStrike.activate(QAction.ActionEvent.Trigger) fmtStr = "~~Pellentesque~~ nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:105] == fmtStr + assert docEditor.getText()[x:x+51] == fmtStr mainMenu.aFmtStrike.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:101] == cleanText + assert docEditor.getText()[x:x+47] == cleanText # Should get us back to plain mainMenu.aFmtBold.activate(QAction.ActionEvent.Trigger) mainMenu.aFmtItalic.activate(QAction.ActionEvent.Trigger) mainMenu.aFmtItalic.activate(QAction.ActionEvent.Trigger) mainMenu.aFmtBold.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:101] == cleanText + assert docEditor.getText()[x:x+47] == cleanText # Double Quotes mainMenu.aFmtDQuote.activate(QAction.ActionEvent.Trigger) fmtStr = "“Pellentesque” nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:103] == fmtStr + assert docEditor.getText()[x:x+49] == fmtStr mainMenu.aEditUndo.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:101] == cleanText + assert docEditor.getText()[x:x+47] == cleanText # Single Quotes mainMenu.aFmtSQuote.activate(QAction.ActionEvent.Trigger) fmtStr = "‘Pellentesque’ nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:103] == fmtStr + assert docEditor.getText()[x:x+49] == fmtStr mainMenu.aEditUndo.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:101] == cleanText + assert docEditor.getText()[x:x+47] == cleanText # Block Formats # ============= # cSpell:ignore Pellentesque erat nulla posuere commodo - docEditor.setCursorPosition(57) + docEditor.setCursorPosition(x+3) # Header 1 mainMenu.aFmtHead1.activate(QAction.ActionEvent.Trigger) fmtStr = "# Pellentesque nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:103] == fmtStr + assert docEditor.getText()[x:x+49] == fmtStr # Header 2 mainMenu.aFmtHead2.activate(QAction.ActionEvent.Trigger) fmtStr = "## Pellentesque nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:104] == fmtStr + assert docEditor.getText()[x:x+50] == fmtStr # Header 3 mainMenu.aFmtHead3.activate(QAction.ActionEvent.Trigger) fmtStr = "### Pellentesque nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:105] == fmtStr + assert docEditor.getText()[x:x+51] == fmtStr # Header 4 mainMenu.aFmtHead4.activate(QAction.ActionEvent.Trigger) fmtStr = "#### Pellentesque nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:106] == fmtStr + assert docEditor.getText()[x:x+52] == fmtStr # Title Format mainMenu.aFmtTitle.activate(QAction.ActionEvent.Trigger) fmtStr = "#! Pellentesque nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:104] == fmtStr + assert docEditor.getText()[x:x+50] == fmtStr # Unnumbered Chapter mainMenu.aFmtUnNum.activate(QAction.ActionEvent.Trigger) fmtStr = "##! Pellentesque nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:105] == fmtStr + assert docEditor.getText()[x:x+51] == fmtStr # Hard Scene mainMenu.aFmtHardSc.activate(QAction.ActionEvent.Trigger) fmtStr = "###! Pellentesque nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:106] == fmtStr + assert docEditor.getText()[x:x+52] == fmtStr # Clear Format mainMenu.aFmtNoFormat.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:101] == cleanText + assert docEditor.getText()[x:x+47] == cleanText # Comment On mainMenu.aFmtComment.activate(QAction.ActionEvent.Trigger) fmtStr = "% Pellentesque nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:103] == fmtStr + assert docEditor.getText()[x:x+49] == fmtStr # Comment Off mainMenu.aFmtComment.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:101] == cleanText + assert docEditor.getText()[x:x+47] == cleanText # Check comment with no space before text - docEditor.setCursorPosition(54) + docEditor.setCursorPosition(x) docEditor.insertText("%") fmtStr = "%Pellentesque nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:102] == fmtStr + assert docEditor.getText()[x:x+48] == fmtStr mainMenu.aFmtNoFormat.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:101] == cleanText + assert docEditor.getText()[x:x+47] == cleanText # Undo/Redo mainMenu.aEditUndo.activate(QAction.ActionEvent.Trigger) fmtStr = "%Pellentesque nec erat ut nulla posuere commodo." - assert docEditor.getText()[54:102] == fmtStr + assert docEditor.getText()[x:x+48] == fmtStr mainMenu.aEditRedo.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:101] == cleanText + assert docEditor.getText()[x:x+47] == cleanText # Cut, Copy and Paste - docEditor.setCursorPosition(54) + docEditor.setCursorPosition(x) docEditor._makeSelection(QTextCursor.SelectionType.WordUnderCursor) mainMenu.aEditCut.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:104] == ( + assert docEditor.getText()[x:x+50] == ( " nec erat ut nulla posuere commodo. Curabitur nisi" ) mainMenu.aEditPaste.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:104] == ( + assert docEditor.getText()[x:x+50] == ( "Pellentesque nec erat ut nulla posuere commodo. Cu" ) - docEditor.setCursorPosition(54) + docEditor.setCursorPosition(x) docEditor._makeSelection(QTextCursor.SelectionType.WordUnderCursor) mainMenu.aEditCopy.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:104] == ( + assert docEditor.getText()[x:x+50] == ( "Pellentesque nec erat ut nulla posuere commodo. Cu" ) - docEditor.setCursorPosition(54) + docEditor.setCursorPosition(x) mainMenu.aEditPaste.activate(QAction.ActionEvent.Trigger) - assert docEditor.getText()[54:104] == ( + assert docEditor.getText()[x:x+50] == ( "PellentesquePellentesque nec erat ut nulla posuere" ) mainMenu.aEditUndo.activate(QAction.ActionEvent.Trigger) # Select Paragraph/All - docEditor.setCursorPosition(57) + docEditor.setCursorPosition(x+3) mainMenu.aSelectPar.activate(QAction.ActionEvent.Trigger) cursor = docEditor.textCursor() assert cursor.selectedText() == ( @@ -228,10 +229,10 @@ def testGuiMainMenu_EditFormat(qtbot, monkeypatch, nwGUI, prjLipsum): "nunc lacus, imperdiet nec posuere ac, interdum non lectus." ) - docEditor.setCursorPosition(57) + docEditor.setCursorPosition(x+3) mainMenu.aSelectAll.activate(QAction.ActionEvent.Trigger) cursor = docEditor.textCursor() - assert len(cursor.selectedText()) == 1910 + assert len(cursor.selectedText()) == 1928 # Clear the Text docEditor.clear() From 8d2551e0b6d1b708136a779be0a596b264ae8fa4 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 19 Jun 2025 21:35:39 +0200 Subject: [PATCH 79/96] Add notes toggle test coverage --- tests/test_gui/test_gui_docviewer.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/test_gui/test_gui_docviewer.py b/tests/test_gui/test_gui_docviewer.py index 65c31a24..8890df22 100644 --- a/tests/test_gui/test_gui_docviewer.py +++ b/tests/test_gui/test_gui_docviewer.py @@ -223,17 +223,23 @@ def testGuiViewer_Main(qtbot, monkeypatch, nwGUI, prjLipsum): CONFIG.showFullPath = True # Document footer show/hide synopsis - assert nwGUI.viewDocument("f96ec11c6a3da") is True + nwGUI.viewDocument("f96ec11c6a3da") assert len(docViewer.toPlainText()) == 4314 docViewer.docFooter._doToggleSynopsis(False) assert len(docViewer.toPlainText()) == 4098 # Document footer show/hide comments - assert nwGUI.viewDocument("846352075de7d") is True + nwGUI.viewDocument("846352075de7d") assert len(docViewer.toPlainText()) == 683 docViewer.docFooter._doToggleComments(False) assert len(docViewer.toPlainText()) == 634 + # Document footer show/hide notes + nwGUI.viewDocument("88d59a277361b") + assert len(docViewer.toPlainText()) == 900 + docViewer.docFooter._doToggleNotes(False) + assert len(docViewer.toPlainText()) == 871 + # Crash the HTML rendering with monkeypatch.context() as mp: mp.setattr(ToQTextDocument, "doConvert", causeException) From 32091ffd94fc408af98a577b974901aebc20f573 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 19 Jun 2025 21:49:33 +0200 Subject: [PATCH 80/96] Add test for story comment tokenizer --- tests/test_formats/test_fmt_tokenizer.py | 39 ++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tests/test_formats/test_fmt_tokenizer.py b/tests/test_formats/test_fmt_tokenizer.py index 2b589ccc..4f65e44c 100644 --- a/tests/test_formats/test_fmt_tokenizer.py +++ b/tests/test_formats/test_fmt_tokenizer.py @@ -807,6 +807,45 @@ def testFmtToken_MetaFormat(mockGUI): ], BlockFmt.NONE )] + # Story Comments + tokens.setCommentType(nwComment.STORY, False) + tokens.setCommentType(nwComment.NOTE, False) + tokens._text = ( + "%Story.Stuff: Stuff happens\n" + "%Note.More: That stuff that happened\n" + "%Note.Other: That other stuff that happened\n" + ) + tokens.tokenizeText() + assert tokens._blocks == [] + + tokens.setCommentType(nwComment.STORY, True) + tokens.setCommentType(nwComment.NOTE, True) + tokens._text = ( + "%Story.Stuff: Stuff happens\n" + "%Note.More: That stuff that happened\n" + "%Note.Other: That other stuff that happened\n" + ) + tokens.tokenizeText() + assert tokens._blocks == [( + BlockTyp.NOTE, "", "Story Structure (Stuff): Stuff happens", [ + (0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "modifier"), + (24, TextFmt.COL_E, ""), (24, TextFmt.B_E, ""), + (25, TextFmt.COL_B, "note"), (38, TextFmt.COL_E, "") + ], BlockFmt.Z_BTM + ), ( + BlockTyp.NOTE, "", "Note (More): That stuff that happened", [ + (0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "modifier"), + (12, TextFmt.COL_E, ""), (12, TextFmt.B_E, ""), + (13, TextFmt.COL_B, "note"), (37, TextFmt.COL_E, "") + ], BlockFmt.Z_TOP | BlockFmt.Z_BTM + ), ( + BlockTyp.NOTE, "", "Note (Other): That other stuff that happened", [ + (0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "modifier"), + (13, TextFmt.COL_E, ""), (13, TextFmt.B_E, ""), + (14, TextFmt.COL_B, "note"), (44, TextFmt.COL_E, "") + ], BlockFmt.Z_TOP + )] + # Keyword tokens.setKeywords(False) tokens._text = "@char: Bod\n" From b6de4fe8237ff9ff73a8e8e9667975bd50eac7f5 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 20 Jun 2025 00:13:15 +0200 Subject: [PATCH 81/96] First iteration of the espresso theme --- novelwriter/assets/themes/espresso.conf | 75 +++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 novelwriter/assets/themes/espresso.conf diff --git a/novelwriter/assets/themes/espresso.conf b/novelwriter/assets/themes/espresso.conf new file mode 100644 index 00000000..5639e51e --- /dev/null +++ b/novelwriter/assets/themes/espresso.conf @@ -0,0 +1,75 @@ +[Main] +name = Espresso +mode = dark +author = Veronica Berglyd Olsen +credit = Sainnhe Park and Antoine Cotten +url = https://github.com/sainnhe/sonokai + +[Base] +base = #2f2726 +default = #e5e4e2 +faded = #96817b +red = #f86882 +orange = #f08d71 +yellow = #f0c66f +green = #a6cd77 +cyan = #81d0c9 +blue = #89a8e0 +purple = #9fa0e1 + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded + +[Palette] +window = base:L125 +windowtext = default +base = base +alternatebase = #51403c +text = default +tooltipbase = yellow:L115 +tooltiptext = base +button = base +buttontext = default +brighttext = base +highlight = #4e5f80 +highlightedtext = default +link = blue +linkvisited = blue +accent = blue + +[GUI] +helptext = blue +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #392e2c +link = blue +headertext = yellow:L125 +headertag = faded +emphasis = orange +dialog = yellow +altdialog = orange +note = yellow:L125 +hidden = faded +shortcode = green +keyword = red +tag = green +value = orange +optional = yellow +spellcheckline = red +errorline = green +replacetag = cyan +modifier = blue +texthighlight = yellow:96 From e1b082d189315f3e6cd8ee44cb0b5046ca05bbe5 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:03:20 +0200 Subject: [PATCH 82/96] Improve tooltip and highlight --- novelwriter/assets/themes/espresso.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/novelwriter/assets/themes/espresso.conf b/novelwriter/assets/themes/espresso.conf index 5639e51e..3d222896 100644 --- a/novelwriter/assets/themes/espresso.conf +++ b/novelwriter/assets/themes/espresso.conf @@ -35,7 +35,7 @@ windowtext = default base = base alternatebase = #51403c text = default -tooltipbase = yellow:L115 +tooltipbase = yellow:L125 tooltiptext = base button = base buttontext = default @@ -72,4 +72,4 @@ spellcheckline = red errorline = green replacetag = cyan modifier = blue -texthighlight = yellow:96 +texthighlight = yellow:108 From b64c2f3597381a0ad3eab00e03c6a7570a8f7f91 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 20 Jun 2025 16:35:58 +0200 Subject: [PATCH 83/96] Refactor the theme setting meta fields and requirements --- docs/source/more/customise.rst | 6 +++--- novelwriter/gui/theme.py | 27 +++++++++++++++------------ tests/test_gui/test_gui_theme.py | 4 ++-- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/docs/source/more/customise.rst b/docs/source/more/customise.rst index 70905def..dea685b5 100644 --- a/docs/source/more/customise.rst +++ b/docs/source/more/customise.rst @@ -55,8 +55,6 @@ A colour theme ``.conf`` file consists of the following settings: author = Veronica Berglyd Olsen credit = Veronica Berglyd Olsen url = https://github.com/vkbo/novelWriter - license = CC BY-SA 4.0 - licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] base = #fcfcfc @@ -140,7 +138,7 @@ affects. :header: "Section", "Description" :class: "tight-table" - "``[Main]``", "Meta data about the theme, You must at least set ``name`` and ``mode``, and ``mode`` must be either ``light`` or ``dark``." + "``[Main]``", "Meta data about the theme, You must at least set ``name``, ``mode`` and ``author``, and ``mode`` must be either ``light`` or ``dark``." "``[Base]``", "The base colours of the theme. These are also selectable colours in various places inside the app, like for icon colours in **Preferences**." "``[Project]``", "The colours used for icons and markers for the different project item types." "``[Palette]``", "The colours used for styling the user interface. The values correspond to the ColorRole_ values in the Qt library." @@ -177,6 +175,8 @@ There are several ways to enter colour values: .. versionadded:: 2.8 The ``[Syntax]`` section was moved into the main theme file. Previously, these settings were in their own file. The ``[Icons]`` section was renamed to ``[Base]``. Added the ``line`` setting. + Dropped the ``license`` and ``licenseurl`` settings. The ``description`` and ``author`` fields + are now required if the theme is included in the app, but not for user themes. Icon Themes diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index a92c6add..cbd4166d 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -72,8 +72,13 @@ class ThemeMeta: author: str = "" credit: str = "" url: str = "" - license: str = "" - licenseUrl: str = "" + + +class IconsMeta: + + name: str = "" + author: str = "" + license: str = "" class SyntaxColors: @@ -296,12 +301,10 @@ class GuiTheme: if parser.has_section(sec): meta.name = parser.get(sec, "name", fallback="") meta.mode = parser.get(sec, "mode", fallback="light") - meta.description = parser.get(sec, "description", fallback="N/A") - meta.author = parser.get(sec, "author", fallback="N/A") - meta.credit = parser.get(sec, "credit", fallback="N/A") + meta.description = parser.get(sec, "description", fallback="") + meta.author = parser.get(sec, "author", fallback="") + meta.credit = parser.get(sec, "credit", fallback="") meta.url = parser.get(sec, "url", fallback="") - meta.license = parser.get(sec, "license", fallback="N/A") - meta.licenseUrl = parser.get(sec, "licenseurl", fallback="") self._meta = meta @@ -613,13 +616,13 @@ class GuiTheme: parser.clear() parser.read(file, encoding="utf-8") name = parser.get("Main", "name", fallback="") - dark = parser.get("Main", "mode", fallback="light").lower() == "dark" - if name: + mode = parser.get("Main", "mode", fallback="").lower() + if name and mode in ("light", "dark"): key = file.stem prefix = "*" if key.startswith("default") else "" lookup = f"{prefix}{name} {key}" keys.append(lookup) - data[lookup] = (file.stem, name, dark, file) + data[lookup] = (file.stem, name, mode == "dark", file) except Exception: # noqa: PERF203 logger.error("Could not read file: %s", file) logException() @@ -659,7 +662,7 @@ class GuiIcons: def __init__(self, mainTheme: GuiTheme) -> None: self._theme = mainTheme - self._meta = ThemeMeta() + self._meta = IconsMeta() # Storage self._allThemes: dict[str, ThemeEntry] = {} @@ -722,7 +725,7 @@ class GuiIcons: CONFIG.splashMessage(f"Loading icon theme: {entry.name}") logger.info("Loading icon theme '%s'", theme) try: - meta = ThemeMeta() + meta = IconsMeta() with open(entry.path, mode="r", encoding="utf-8") as icons: for icon in icons: bits = icon.partition("=") diff --git a/tests/test_gui/test_gui_theme.py b/tests/test_gui/test_gui_theme.py index 805f5009..933043b3 100644 --- a/tests/test_gui/test_gui_theme.py +++ b/tests/test_gui/test_gui_theme.py @@ -613,7 +613,7 @@ def testGuiTheme_CheckTheme(theme): structure = { "Main": [ - "name", "mode", # The rest are not required + "name", "mode", "description", "author", # The rest are not required ], "Base": [ "base", "default", "faded", "red", "orange", "yellow", "green", @@ -638,7 +638,7 @@ def testGuiTheme_CheckTheme(theme): "errorline", "replacetag", "modifier", "texthighlight", ], } - optional = ["description", "author", "credit", "url", "license", "licenseurl"] + optional = ["credit", "url"] missing = [] for section, options in structure.items(): missing.extend(opt for opt in options if opt not in parser[section]) From cdc05320d9bc714e86596c520c2cf4ba5566cb2a Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 20 Jun 2025 16:36:39 +0200 Subject: [PATCH 84/96] Update existing theme files --- novelwriter/assets/themes/blue_streak_dark.conf | 13 ++++++------- novelwriter/assets/themes/blue_streak_light.conf | 13 ++++++------- novelwriter/assets/themes/cyberpunk_night.conf | 2 -- novelwriter/assets/themes/default_dark.conf | 4 +--- novelwriter/assets/themes/default_light.conf | 4 +--- novelwriter/assets/themes/dracula.conf | 2 -- novelwriter/assets/themes/grey_dark.conf | 13 ++++++------- novelwriter/assets/themes/grey_light.conf | 13 ++++++------- novelwriter/assets/themes/lcars.conf | 4 +--- novelwriter/assets/themes/light_owl.conf | 13 ++++++------- novelwriter/assets/themes/night_owl.conf | 13 ++++++------- novelwriter/assets/themes/primer_light.conf | 13 ++++++------- novelwriter/assets/themes/primer_night.conf | 13 ++++++------- novelwriter/assets/themes/snazzy.conf | 13 ++++++------- novelwriter/assets/themes/solarized_dark.conf | 13 ++++++------- novelwriter/assets/themes/solarized_light.conf | 13 ++++++------- novelwriter/assets/themes/tango_dark.conf | 9 ++++++--- novelwriter/assets/themes/tango_light.conf | 9 ++++++--- novelwriter/assets/themes/tomorrow.conf | 13 ++++++------- novelwriter/assets/themes/tomorrow_night.conf | 13 ++++++------- novelwriter/assets/themes/tomorrow_night_blue.conf | 13 ++++++------- .../assets/themes/tomorrow_night_bright.conf | 13 ++++++------- .../assets/themes/tomorrow_night_eighties.conf | 13 ++++++------- 23 files changed, 111 insertions(+), 131 deletions(-) diff --git a/novelwriter/assets/themes/blue_streak_dark.conf b/novelwriter/assets/themes/blue_streak_dark.conf index 7b4133a5..c8dbf177 100644 --- a/novelwriter/assets/themes/blue_streak_dark.conf +++ b/novelwriter/assets/themes/blue_streak_dark.conf @@ -1,11 +1,10 @@ [Main] -name = Blue Streak Dark -mode = dark -author = Veronica Berglyd Olsen -credit = Veronica Berglyd Olsen -url = https://github.com/vkbo/novelWriter -license = CC BY-SA 4.0 -licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ +name = Blue Streak Dark +mode = dark +description = A theme mainly using shades of blue +author = Veronica Berglyd Olsen +credit = Veronica Berglyd Olsen +url = https://github.com/vkbo/novelWriter [Base] base = #2d2d2d diff --git a/novelwriter/assets/themes/blue_streak_light.conf b/novelwriter/assets/themes/blue_streak_light.conf index 215cc8e1..906ab71e 100644 --- a/novelwriter/assets/themes/blue_streak_light.conf +++ b/novelwriter/assets/themes/blue_streak_light.conf @@ -1,11 +1,10 @@ [Main] -name = Blue Streak Light -mode = light -author = Veronica Berglyd Olsen -credit = Veronica Berglyd Olsen -url = https://github.com/vkbo/novelWriter -license = CC BY-SA 4.0 -licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ +name = Blue Streak Light +mode = light +description = A theme mainly using shades of blue +author = Veronica Berglyd Olsen +credit = Veronica Berglyd Olsen +url = https://github.com/vkbo/novelWriter [Base] base = #fcfcfc diff --git a/novelwriter/assets/themes/cyberpunk_night.conf b/novelwriter/assets/themes/cyberpunk_night.conf index 4ba750f2..3643888f 100644 --- a/novelwriter/assets/themes/cyberpunk_night.conf +++ b/novelwriter/assets/themes/cyberpunk_night.conf @@ -4,8 +4,6 @@ mode = dark description = A taste of the future 80s author = Anders Lemvigh url = https://github.com/alemvigh -license = CC BY-SA 4.0 -licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] base = #000000 diff --git a/novelwriter/assets/themes/default_dark.conf b/novelwriter/assets/themes/default_dark.conf index 0c7bd643..f2fb097b 100644 --- a/novelwriter/assets/themes/default_dark.conf +++ b/novelwriter/assets/themes/default_dark.conf @@ -5,8 +5,6 @@ description = The novelWriter standard dark theme author = Veronica Berglyd Olsen credit = Veronica Berglyd Olsen url = https://github.com/vkbo/novelWriter -license = CC BY-SA 4.0 -licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] base = #373737 @@ -63,7 +61,7 @@ headertext = green headertag = green:D150 emphasis = orange dialog = blue -altdialog = blue +altdialog = red note = yellow hidden = faded shortcode = green diff --git a/novelwriter/assets/themes/default_light.conf b/novelwriter/assets/themes/default_light.conf index fb4e707a..2cb42b22 100644 --- a/novelwriter/assets/themes/default_light.conf +++ b/novelwriter/assets/themes/default_light.conf @@ -5,8 +5,6 @@ description = The novelWriter standard light theme author = Veronica Berglyd Olsen credit = Veronica Berglyd Olsen url = https://github.com/vkbo/novelWriter -license = CC BY-SA 4.0 -licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] base = #fcfcfc @@ -63,7 +61,7 @@ headertext = green headertag = green:L135 emphasis = orange dialog = blue -altdialog = blue +altdialog = red note = yellow:D125 hidden = faded shortcode = green diff --git a/novelwriter/assets/themes/dracula.conf b/novelwriter/assets/themes/dracula.conf index 3330f04c..25fe36ca 100644 --- a/novelwriter/assets/themes/dracula.conf +++ b/novelwriter/assets/themes/dracula.conf @@ -5,8 +5,6 @@ description = A dark theme with bright colours author = Veronica Berglyd Olsen (adaptation) credit = Zeno Rocha url = https://draculatheme.com -license = MIT -licenseurl = https://github.com/dracula/dracula-theme/blob/main/LICENSE ## # Colours: diff --git a/novelwriter/assets/themes/grey_dark.conf b/novelwriter/assets/themes/grey_dark.conf index 570a84b9..44f94e14 100644 --- a/novelwriter/assets/themes/grey_dark.conf +++ b/novelwriter/assets/themes/grey_dark.conf @@ -1,11 +1,10 @@ [Main] -name = Grey Dark -mode = dark -author = Veronica Berglyd Olsen -credit = Veronica Berglyd Olsen -url = https://github.com/vkbo/novelWriter -license = CC BY-SA 4.0 -licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ +name = Grey Dark +mode = dark +description = A theme with minimal colours +author = Veronica Berglyd Olsen +credit = Veronica Berglyd Olsen +url = https://github.com/vkbo/novelWriter [Base] base = #3e3e3e diff --git a/novelwriter/assets/themes/grey_light.conf b/novelwriter/assets/themes/grey_light.conf index feccddaa..3e4d3e86 100644 --- a/novelwriter/assets/themes/grey_light.conf +++ b/novelwriter/assets/themes/grey_light.conf @@ -1,11 +1,10 @@ [Main] -name = Grey Light -mode = light -author = Veronica Berglyd Olsen -credit = Veronica Berglyd Olsen -url = https://github.com/vkbo/novelWriter -license = CC BY-SA 4.0 -licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ +name = Grey Light +mode = light +description = A theme with minimal colours +author = Veronica Berglyd Olsen +credit = Veronica Berglyd Olsen +url = https://github.com/vkbo/novelWriter [Base] base = #ffffff diff --git a/novelwriter/assets/themes/lcars.conf b/novelwriter/assets/themes/lcars.conf index 0d5467db..94255255 100644 --- a/novelwriter/assets/themes/lcars.conf +++ b/novelwriter/assets/themes/lcars.conf @@ -3,10 +3,8 @@ name = LCARS mode = dark description = The Next Generation of Star Trek colours author = Veronica Berglyd Olsen -credit = Veronica Berglyd Olsen +credit = Star Trek TNG url = https://github.com/vkbo/novelWriter -license = CC BY-SA 4.0 -licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Base] base = #101010 diff --git a/novelwriter/assets/themes/light_owl.conf b/novelwriter/assets/themes/light_owl.conf index a50c48b2..24b676e1 100644 --- a/novelwriter/assets/themes/light_owl.conf +++ b/novelwriter/assets/themes/light_owl.conf @@ -1,11 +1,10 @@ [Main] -name = Light Owl -mode = light -author = Veronica Berglyd Olsen (adaptation) -credit = Sarah Drasner (color theme) -url = https://github.com/sdras/night-owl-vscode-theme -license = MIT License -licenseurl = https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE +name = Light Owl +mode = light +description = A theme for the night owls out there, but for daylight +author = Veronica Berglyd Olsen +credit = Sarah Drasner +url = https://github.com/sdras/night-owl-vscode-theme ## # Theme: Light Owl diff --git a/novelwriter/assets/themes/night_owl.conf b/novelwriter/assets/themes/night_owl.conf index c5ee6dd0..b42ea489 100644 --- a/novelwriter/assets/themes/night_owl.conf +++ b/novelwriter/assets/themes/night_owl.conf @@ -1,11 +1,10 @@ [Main] -name = Night Owl -mode = dark -author = Veronica Berglyd Olsen (adaptation) -credit = Sarah Drasner (color theme) -url = https://github.com/sdras/night-owl-vscode-theme -license = MIT License -licenseurl = https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE +name = Night Owl +mode = dark +description = A theme for the night owls out there +author = Veronica Berglyd Olsen +credit = Sarah Drasner +url = https://github.com/sdras/night-owl-vscode-theme ## # Theme: Night Owl diff --git a/novelwriter/assets/themes/primer_light.conf b/novelwriter/assets/themes/primer_light.conf index da7f1fb6..18e50814 100644 --- a/novelwriter/assets/themes/primer_light.conf +++ b/novelwriter/assets/themes/primer_light.conf @@ -1,11 +1,10 @@ [Main] -name = Primer Light -mode = light -author = Myian (adaptation) -credit = GitHub Inc. -url = https://github.com/primer -license = MIT License -licenseurl = https://github.com/primer/brand/blob/main/LICENSE +name = Primer Light +mode = light +description = Primer +author = Myian +credit = GitHub Inc. +url = https://github.com/primer [Base] base = #ffffff diff --git a/novelwriter/assets/themes/primer_night.conf b/novelwriter/assets/themes/primer_night.conf index 294c30ef..7663743e 100644 --- a/novelwriter/assets/themes/primer_night.conf +++ b/novelwriter/assets/themes/primer_night.conf @@ -1,11 +1,10 @@ [Main] -name = Primer Night -mode = dark -author = Myian (adaptation) -credit = GitHub Inc. -url = https://github.com/primer -license = MIT License -licenseurl = https://github.com/primer/brand/blob/main/LICENSE +name = Primer Night +mode = dark +description = Primer +author = Myian +credit = GitHub Inc. +url = https://github.com/primer [Base] base = #0d1117 diff --git a/novelwriter/assets/themes/snazzy.conf b/novelwriter/assets/themes/snazzy.conf index 09b18a77..3838eb26 100644 --- a/novelwriter/assets/themes/snazzy.conf +++ b/novelwriter/assets/themes/snazzy.conf @@ -1,11 +1,10 @@ [Main] -name = Snazzy Light -mode = light -author = Veronica Berglyd Olsen (adaptation) -credit = Florian Reuschel (color theme) -url = https://github.com/loilo/vscode-snazzy-light -license = MIT License -licenseurl = https://github.com/loilo/vscode-snazzy-light/blob/master/LICENSE +name = Snazzy Light +mode = light +description = A vivid light color theme +author = Veronica Berglyd Olsen +credit = Florian Reuschel, Sindre Sorhus +url = https://github.com/loilo/vscode-snazzy-light ## # Colours: diff --git a/novelwriter/assets/themes/solarized_dark.conf b/novelwriter/assets/themes/solarized_dark.conf index 8bf4e983..41e7013f 100644 --- a/novelwriter/assets/themes/solarized_dark.conf +++ b/novelwriter/assets/themes/solarized_dark.conf @@ -1,11 +1,10 @@ [Main] -name = Solarized Dark -mode = dark -author = nullbasis -credit = Ethan Schoonover -url = https://ethanschoonover.com/solarized/ -license = MIT -licenseurl = https://github.com/altercation/solarized/blob/master/LICENSE +name = Solarized Dark +mode = dark +description = Precision colors for machines and people +author = nullbasis, Veronica Berglyd Olsen +credit = Ethan Schoonover +url = https://ethanschoonover.com/solarized/ ## # base03: #002b36 diff --git a/novelwriter/assets/themes/solarized_light.conf b/novelwriter/assets/themes/solarized_light.conf index 5f01abe7..c2f70cbf 100644 --- a/novelwriter/assets/themes/solarized_light.conf +++ b/novelwriter/assets/themes/solarized_light.conf @@ -1,11 +1,10 @@ [Main] -name = Solarized Light -mode = light -author = nullbasis -credit = Ethan Schoonover -url = https://ethanschoonover.com/solarized/ -license = MIT -licenseurl = https://github.com/altercation/solarized/blob/master/LICENSE +name = Solarized Light +mode = light +description = Precision colors for machines and people +author = nullbasis, Veronica Berglyd Olsen +credit = Ethan Schoonover +url = https://ethanschoonover.com/solarized/ ## # base03: #002b36 diff --git a/novelwriter/assets/themes/tango_dark.conf b/novelwriter/assets/themes/tango_dark.conf index aacb5e5f..40f733c4 100644 --- a/novelwriter/assets/themes/tango_dark.conf +++ b/novelwriter/assets/themes/tango_dark.conf @@ -1,7 +1,10 @@ [Main] -name = Tango Dark -mode = dark -author = Veronica Berglyd Olsen (adaptation) +name = Tango Dark +mode = dark +description = Colors for everyone +author = Veronica Berglyd Olsen +credit = Tango Desktop Project +url = https://en.wikipedia.org/wiki/Tango_Desktop_Project ## # Colours: diff --git a/novelwriter/assets/themes/tango_light.conf b/novelwriter/assets/themes/tango_light.conf index 70d6f741..81c34c11 100644 --- a/novelwriter/assets/themes/tango_light.conf +++ b/novelwriter/assets/themes/tango_light.conf @@ -1,7 +1,10 @@ [Main] -name = Tango Light -mode = light -author = Veronica Berglyd Olsen (adaptation) +name = Tango Light +mode = light +description = Colors for everyone +author = Veronica Berglyd Olsen +credit = Tango Desktop Project +url = https://en.wikipedia.org/wiki/Tango_Desktop_Project ## # Colours: diff --git a/novelwriter/assets/themes/tomorrow.conf b/novelwriter/assets/themes/tomorrow.conf index e355356a..97872b2b 100644 --- a/novelwriter/assets/themes/tomorrow.conf +++ b/novelwriter/assets/themes/tomorrow.conf @@ -1,11 +1,10 @@ [Main] -name = Tomorrow -mode = light -author = Veronica Berglyd Olsen (adaptation) -credit = Chris Kempson (color theme) -url = https://github.com/chriskempson/tomorrow-theme -license = MIT License -licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md +name = Tomorrow +mode = light +description = A colourful theme with muted colours and sensible highlighting +author = Veronica Berglyd Olsen +credit = Chris Kempson +url = https://github.com/chriskempson/tomorrow-theme ## # Theme: Tomorrow diff --git a/novelwriter/assets/themes/tomorrow_night.conf b/novelwriter/assets/themes/tomorrow_night.conf index 41298008..8424a1a3 100644 --- a/novelwriter/assets/themes/tomorrow_night.conf +++ b/novelwriter/assets/themes/tomorrow_night.conf @@ -1,11 +1,10 @@ [Main] -name = Tomorrow Night -mode = dark -author = Veronica Berglyd Olsen (adaptation) -credit = Chris Kempson (color theme) -url = https://github.com/chriskempson/tomorrow-theme -license = MIT License -licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md +name = Tomorrow Night +mode = dark +description = A colourful theme with muted colours and sensible highlighting +author = Veronica Berglyd Olsen +credit = Chris Kempson +url = https://github.com/chriskempson/tomorrow-theme ## # Theme: Tomorrow Night diff --git a/novelwriter/assets/themes/tomorrow_night_blue.conf b/novelwriter/assets/themes/tomorrow_night_blue.conf index 5f951353..ab1692c7 100644 --- a/novelwriter/assets/themes/tomorrow_night_blue.conf +++ b/novelwriter/assets/themes/tomorrow_night_blue.conf @@ -1,11 +1,10 @@ [Main] -name = Tomorrow Night Blue -mode = dark -author = Veronica Berglyd Olsen (adaptation) -credit = Chris Kempson (color theme) -url = https://github.com/chriskempson/tomorrow-theme -license = MIT License -licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md +name = Tomorrow Night Blue +mode = dark +description = A colourful theme with muted colours and sensible highlighting +author = Veronica Berglyd Olsen +credit = Chris Kempson +url = https://github.com/chriskempson/tomorrow-theme ## # Theme: Tomorrow Night Blue diff --git a/novelwriter/assets/themes/tomorrow_night_bright.conf b/novelwriter/assets/themes/tomorrow_night_bright.conf index 9207162f..3fd7d44a 100644 --- a/novelwriter/assets/themes/tomorrow_night_bright.conf +++ b/novelwriter/assets/themes/tomorrow_night_bright.conf @@ -1,11 +1,10 @@ [Main] -name = Tomorrow Night Bright -mode = dark -author = Veronica Berglyd Olsen (adaptation) -credit = Chris Kempson (color theme) -url = https://github.com/chriskempson/tomorrow-theme -license = MIT License -licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md +name = Tomorrow Night Bright +mode = dark +description = A colourful theme with muted colours and sensible highlighting +author = Veronica Berglyd Olsen +credit = Chris Kempson +url = https://github.com/chriskempson/tomorrow-theme ## # Theme: Tomorrow Night Bright diff --git a/novelwriter/assets/themes/tomorrow_night_eighties.conf b/novelwriter/assets/themes/tomorrow_night_eighties.conf index dcd093fb..4a72bcf5 100644 --- a/novelwriter/assets/themes/tomorrow_night_eighties.conf +++ b/novelwriter/assets/themes/tomorrow_night_eighties.conf @@ -1,11 +1,10 @@ [Main] -name = Tomorrow Night Eighties -mode = dark -author = Veronica Berglyd Olsen (adaptation) -credit = Chris Kempson (color theme) -url = https://github.com/chriskempson/tomorrow-theme -license = MIT License -licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md +name = Tomorrow Night Eighties +mode = dark +description = A colourful theme with muted colours and sensible highlighting +author = Veronica Berglyd Olsen +credit = Chris Kempson +url = https://github.com/chriskempson/tomorrow-theme ## # Theme: Tomorrow Night Eighties From 6ed572772f657fa60375a08f7d711524c130f19a Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 20 Jun 2025 16:47:11 +0200 Subject: [PATCH 85/96] Add theme description --- novelwriter/assets/themes/espresso.conf | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/novelwriter/assets/themes/espresso.conf b/novelwriter/assets/themes/espresso.conf index 3d222896..74ff4b33 100644 --- a/novelwriter/assets/themes/espresso.conf +++ b/novelwriter/assets/themes/espresso.conf @@ -1,9 +1,10 @@ [Main] -name = Espresso -mode = dark -author = Veronica Berglyd Olsen -credit = Sainnhe Park and Antoine Cotten -url = https://github.com/sainnhe/sonokai +name = Espresso +mode = dark +description = High contrast & vivid color scheme based on Monokai Pro +author = Veronica Berglyd Olsen +credit = Sainnhe Park and Antoine Cotten +url = https://github.com/sainnhe/sonokai [Base] base = #2f2726 From aff634a9707938cf0e4d94cdad95fff39d4b8097 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 20 Jun 2025 16:54:14 +0200 Subject: [PATCH 86/96] Add Noctis Lux theme --- novelwriter/assets/themes/noctis_lux.conf | 107 ++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 novelwriter/assets/themes/noctis_lux.conf diff --git a/novelwriter/assets/themes/noctis_lux.conf b/novelwriter/assets/themes/noctis_lux.conf new file mode 100644 index 00000000..65090ef3 --- /dev/null +++ b/novelwriter/assets/themes/noctis_lux.conf @@ -0,0 +1,107 @@ +[Main] +name = Noctis Lux +mode = light +description = A light theme with a well balanced blend of warm and cold medium contrast colors +author = Veronica Berglyd Olsen +credit = Liviu Schera, and contributors +url = https://github.com/liviuschera/noctis + +## +# Noctis Lux : themes/lux.json +## +# colors +# selection.background : #169fb155 -> Palette.highlight +# sideBar.background : #f9f1e1 -> Palette.window +# editor.background : #fef8ec -> Base.base +# editor.foreground : #005661 -> Base.default +# editor.selectionBackground : #ade2eb77 -> Syntax.line, Syntax.texthighlight +# textLink.foreground : #00c6e0 -> Palette.link, Syntax.link +# input.background : #fef8ec -> Palette.button +# notifications.foreground : #005661 -> Palette.tooltiptext +# notifications.background : #f2edde -> Palette.tooltipbase +## +# tokenColors +# COMMENT : #8ca6a6 -> Base.faded +# TEXT : #004d57 -> Syntax.text, Syntax.optional +# KEYWORD : #ff5792 -> Base.red +# VARIABLE : #fa8900 -> Palette.accent +# ANNOTATION : #b3694d -> Syntax.note, Syntax.emphasis +# CONSTANT : #a88c00 -> Base.yellow +# TAG : #e64100 -> Base.orange +# STRING : #00b368 -> Syntax.headertext, Palette.accent +# STRINGINTERPOLATED : #009456 -> Base.green +# NUMBER : #5842ff -> Base.purple +# FUNCTION : #0095a8 -> Base.cyan +# SUPPORT : #00bdd6 -> Syntax.replacetag +# MISC : #0094f0 -> Base.blue +# INVALID : #ff530f -> GUI.errortext +## + +[Base] +base = #fef8ec +default = #005661 +faded = #8ca6a6 +red = #ff5792 +orange = #e64100 +yellow = #a88c00 +green = #009456 +cyan = #0095a8 +blue = #0094f0 +purple = #5842ff + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded + +[Palette] +window = #f9f1e1 +windowtext = default +base = base +alternatebase = base:D115 +text = default +tooltipbase = #f2edde +tooltiptext = #005661 +button = base +buttontext = #6a7a7c +brighttext = base +highlight = #169fb155 +highlightedtext = default +link = #00c6e0 +linkvisited = blue +accent = #00b368 + +[GUI] +helptext = #fa8900 +fadedtext = faded +errortext = #ff530f + +[Syntax] +background = base +text = #004d57 +line = #ade2eb56 +link = #00c6e0 +headertext = #00b368 +headertag = green:D125 +emphasis = #b3694d +dialog = green +altdialog = blue +note = #b3694d +hidden = faded +shortcode = red +keyword = yellow +tag = blue +value = red:D125 +optional = #004d57 +spellcheckline = red +errorline = green +replacetag = #00bdd6 +modifier = red +texthighlight = #ade2eb77 From ab1d55611f86101086cea199b8518d864ba21f3b Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 20 Jun 2025 17:06:50 +0200 Subject: [PATCH 87/96] Add Noctis theme --- novelwriter/assets/themes/noctis.conf | 107 ++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 novelwriter/assets/themes/noctis.conf diff --git a/novelwriter/assets/themes/noctis.conf b/novelwriter/assets/themes/noctis.conf new file mode 100644 index 00000000..0b5cfe7f --- /dev/null +++ b/novelwriter/assets/themes/noctis.conf @@ -0,0 +1,107 @@ +[Main] +name = Noctis +mode = dark +description = A dark theme with a well balanced blend of warm and cold medium contrast colors +author = Veronica Berglyd Olsen +credit = Liviu Schera, and contributors +url = https://github.com/liviuschera/noctis + +## +# Noctis Lux : themes/lux.json +## +# colors +# selection.background : #107684 -> Palette.highlight +# sideBar.background : #041d20 -> Palette.window +# editor.background : #052529 -> Base.base +# editor.foreground : #b2cacd -> Base.default +# editor.selectionBackground : #169fb144 -> Syntax.line, Syntax.texthighlight +# textLink.foreground : #40d4e7 -> Palette.link, Syntax.link +# input.background : #052529 -> Palette.button +# notifications.foreground : #cdd3de -> Palette.tooltiptext +# notifications.background : #073940 -> Palette.tooltipbase +## +# tokenColors +# COMMENT : #5b858b -> Base.faded +# TEXT : #b2cacd -> Syntax.text, Syntax.optional +# KEYWORD : #df769b -> Base.red +# VARIABLE : #e4b781 -> Palette.accent +# ANNOTATION : #d67e5c -> Syntax.note, Syntax.emphasis +# CONSTANT : #d5971a -> Base.yellow +# TAG : #e66533 -> Base.orange +# STRING : #49e9a6 -> Syntax.headertext, Palette.accent +# STRINGINTERPOLATED : #16b673 -> Base.green +# NUMBER : #7060eb -> Base.purple +# FUNCTION : #16a3b6 -> Base.cyan +# SUPPORT : #49d6e9 -> Syntax.replacetag +# MISC : #49ace9 -> Base.blue +# INVALID : #e3541c -> GUI.errortext +## + +[Base] +base = #052529 +default = #b2cacd +faded = #5b858b +red = #df769b +orange = #e66533 +yellow = #d5971a +green = #16b673 +cyan = #16a3b6 +blue = #49ace9 +purple = #7060eb + +[Project] +root = blue +folder = yellow +file = default +title = green +chapter = red +scene = blue +note = yellow +active = green +inactive = red +disabled = faded + +[Palette] +window = #041d20 +windowtext = default +base = base +alternatebase = base:L175 +text = default +tooltipbase = #073940 +tooltiptext = #cdd3de +button = base +buttontext = #6a7a7c +brighttext = base +highlight = #107684 +highlightedtext = default +link = #40d4e7 +linkvisited = blue +accent = #49e9a6 + +[GUI] +helptext = #e4b781 +fadedtext = faded +errortext = #e3541c + +[Syntax] +background = base +text = #b2cacd +line = #169fb132 +link = #40d4e7 +headertext = #49e9a6 +headertag = green:D125 +emphasis = #d67e5c +dialog = green +altdialog = blue +note = #d67e5c +hidden = faded +shortcode = red +keyword = yellow +tag = blue +value = red:D125 +optional = #b2cacd +spellcheckline = red +errorline = green +replacetag = #49d6e9 +modifier = red +texthighlight = #169fb144 From cf3f6caca85e77faeadc9da97f806856389ed231 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 20 Jun 2025 17:12:00 +0200 Subject: [PATCH 88/96] Fix Noctis button text colour --- novelwriter/assets/themes/noctis.conf | 5 +++-- novelwriter/assets/themes/noctis_lux.conf | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/novelwriter/assets/themes/noctis.conf b/novelwriter/assets/themes/noctis.conf index 0b5cfe7f..35820118 100644 --- a/novelwriter/assets/themes/noctis.conf +++ b/novelwriter/assets/themes/noctis.conf @@ -7,7 +7,7 @@ credit = Liviu Schera, and contributors url = https://github.com/liviuschera/noctis ## -# Noctis Lux : themes/lux.json +# Noctis Lux : themes/noctis.json ## # colors # selection.background : #107684 -> Palette.highlight @@ -17,6 +17,7 @@ url = https://github.com/liviuschera/noctis # editor.selectionBackground : #169fb144 -> Syntax.line, Syntax.texthighlight # textLink.foreground : #40d4e7 -> Palette.link, Syntax.link # input.background : #052529 -> Palette.button +# input.foreground : #cdd3de -> Palette.buttontext # notifications.foreground : #cdd3de -> Palette.tooltiptext # notifications.background : #073940 -> Palette.tooltipbase ## @@ -70,7 +71,7 @@ text = default tooltipbase = #073940 tooltiptext = #cdd3de button = base -buttontext = #6a7a7c +buttontext = #cdd3de brighttext = base highlight = #107684 highlightedtext = default diff --git a/novelwriter/assets/themes/noctis_lux.conf b/novelwriter/assets/themes/noctis_lux.conf index 65090ef3..ddf34244 100644 --- a/novelwriter/assets/themes/noctis_lux.conf +++ b/novelwriter/assets/themes/noctis_lux.conf @@ -17,6 +17,7 @@ url = https://github.com/liviuschera/noctis # editor.selectionBackground : #ade2eb77 -> Syntax.line, Syntax.texthighlight # textLink.foreground : #00c6e0 -> Palette.link, Syntax.link # input.background : #fef8ec -> Palette.button +# input.foreground : #6a7a7c -> Palette.buttontext # notifications.foreground : #005661 -> Palette.tooltiptext # notifications.background : #f2edde -> Palette.tooltipbase ## From 5b24d8e61a73d28329f6898fa554d0dbe0dde930 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 24 Jun 2025 17:16:39 +0200 Subject: [PATCH 89/96] Fix merge issue --- novelwriter/gui/docviewer.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/novelwriter/gui/docviewer.py b/novelwriter/gui/docviewer.py index ec002e9f..d5445536 100644 --- a/novelwriter/gui/docviewer.py +++ b/novelwriter/gui/docviewer.py @@ -228,8 +228,6 @@ class GuiDocViewer(QTextBrowser): qDoc.setTheme(self._docTheme) qDoc.initDocument() qDoc.setKeywords(True) - qDoc.setCommentType(nwComment.NOTE, CONFIG.viewComments) - qDoc.setCommentType(nwComment.STORY, CONFIG.viewComments) qDoc.setCommentType(nwComment.PLAIN, CONFIG.viewComments) qDoc.setCommentType(nwComment.SYNOPSIS, CONFIG.viewSynopsis) qDoc.setCommentType(nwComment.SHORT, CONFIG.viewSynopsis) From d1c3643cff2a6d30003d6f7303849b23801c5cd0 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 2 Jul 2025 17:41:41 +0200 Subject: [PATCH 90/96] Add all used licenses to package meta --- pyproject.toml | 2 +- setup/LICENSE-Apache-2.0.txt | 202 +++++++++++++++++++++++++++++++++++ 2 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 setup/LICENSE-Apache-2.0.txt diff --git a/pyproject.toml b/pyproject.toml index 9263eb81..5dc6e443 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ authors = [ ] description = "A plain text editor for planning and writing novels" readme = {file = "setup/description_pypi.md", content-type = "text/markdown"} -license = {text = "GPL-3.0-or-later"} +license = {text = "GPL-3.0-or-later AND Apache-2.0 AND CC-BY-4.0"} classifiers = [ "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", diff --git a/setup/LICENSE-Apache-2.0.txt b/setup/LICENSE-Apache-2.0.txt new file mode 100644 index 00000000..7a4a3ea2 --- /dev/null +++ b/setup/LICENSE-Apache-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file From 849f6c7d05c4592a7972bb80ad8f7c248fc98a60 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 2 Jul 2025 17:42:57 +0200 Subject: [PATCH 91/96] Update credits files --- CREDITS.md | 30 +++++++++++++++++------ novelwriter/assets/text/credits_en.htm | 34 ++++++++++++++++++++------ 2 files changed, 48 insertions(+), 16 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index b3c527a5..4c08b186 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -55,19 +55,33 @@ The following libraries are dependencies of novelWriter: * **Enchant** by Dom Lachowicz * **PyEnchant** by Dimitri Merejkowsky -## Assets +## Icon Themes -Some of the assets bundled with novelWriter were adapted from the following sources: +The following icon themes are bundles with novelWriter: * **Material Symbols** icons by Google Inc (Apache 2.0) * **Remix** icons by RemixIcon (Apache 2.0) * **Font Awesome** icons by Fonticons Inc (CC BY 4.0) -* **Tomorrow** themes by Chris Kempson (MIT License) -* **Owl** themes by Sarah Drasner (MIT License) -* **Solarized** themes by Ethan Schoonover (MIT License) -* **Cyberpunk Night** theme by Anders Lemvigh (CC BY-SA 4.0) -* **Dracula** theme by Zeno Rocha (MIT License) -* **Snazzy Light** theme by Florian Reuschel (MIT License) + +## Colour Themes + +Some colour themes included with novelWriter were adapted from the following sources: + +* **Dracula** theme by Zeno Rocha +* **Espresso** theme by Sainnhe Park and Antoine Cotten +* **Noctis** themes by Liviu Schera, and contributors +* **Owl** themes by Sarah Drasner +* **Primer** themes by GitHub Inc and Myian +* **Snazzy Light** theme by Florian Reuschel +* **Solarized** themes by Ethan Schoonover +* **Tango** themes by the Tango Desktop Project +* **Tomorrow** themes by Chris Kempson + +Other themes were created for novelWriter: + +* **Blue Streak** themes by Veronica Berglyd Olsen +* **Cyberpunk Night** theme by Anders Lemvigh +* **LCARS** theme by Veronica Berglyd Olsen ## Fonts diff --git a/novelwriter/assets/text/credits_en.htm b/novelwriter/assets/text/credits_en.htm index 33903616..c8d868a9 100644 --- a/novelwriter/assets/text/credits_en.htm +++ b/novelwriter/assets/text/credits_en.htm @@ -67,20 +67,38 @@ more contributions are listed on the project's Members page.

  • PyEnchant by Dimitri Merejkowsky
  • -

    Assets

    +

    Icon Themes

    -

    Some of the assets bundled with novelWriter were adapted from the following sources:

    +

    The following icon themes are bundles with novelWriter:

    • Material Symbols icons by Google Inc (Apache 2.0)
    • Remix icons by RemixIcon (Apache 2.0)
    • Font Awesome icons by Fonticons Inc (CC BY 4.0)
    • -
    • Tomorrow themes by Chris Kempson (MIT License)
    • -
    • Owl themes by Sarah Drasner (MIT License)
    • -
    • Solarized themes by Ethan Schoonover (MIT License)
    • -
    • Cyberpunk Night theme by Anders Lemvigh (CC BY-SA 4.0)
    • -
    • Dracula theme by Zeno Rocha (MIT License)
    • -
    • Snazzy Light theme by Florian Reuschel (MIT License)
    • +
    + +

    Colour Themes

    + +

    Some colour themes included with novelWriter were adapted from the following sources:

    + +
      +
    • Dracula theme by Zeno Rocha
    • +
    • Espresso theme by Sainnhe Park and Antoine Cotten
    • +
    • Noctis themes by Liviu Schera, and contributors
    • +
    • Owl themes by Sarah Drasner
    • +
    • Primer themes by GitHub Inc and Myian
    • +
    • Snazzy Light theme by Florian Reuschel
    • +
    • Solarized themes by Ethan Schoonover
    • +
    • Tango themes by the Tango Desktop Project
    • +
    • Tomorrow themes by Chris Kempson
    • +
    + +

    Other themes were created for novelWriter:

    + +
      +
    • Blue Streak themes by Veronica Berglyd Olsen
    • +
    • Cyberpunk Night theme by Anders Lemvigh
    • +
    • LCARS theme by Veronica Berglyd Olsen

    Fonts

    From 168bb0be88e5c89f02608be12ab50947b95f6cd6 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 2 Jul 2025 17:55:06 +0200 Subject: [PATCH 92/96] Update license fields in project file to latest format --- pyproject.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5dc6e443..3610e012 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,11 @@ authors = [ ] description = "A plain text editor for planning and writing novels" readme = {file = "setup/description_pypi.md", content-type = "text/markdown"} -license = {text = "GPL-3.0-or-later AND Apache-2.0 AND CC-BY-4.0"} +license = "GPL-3.0-or-later AND Apache-2.0 AND CC-BY-4.0" +license-files = [ + "LICENSE.md", + "setup/LICENSE-Apache-2.0.txt", +] classifiers = [ "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", From 30530b1b8b358aed6914dc4f7c5ae0c917a02e65 Mon Sep 17 00:00:00 2001 From: Myian Date: Sat, 5 Jul 2025 14:02:56 +0200 Subject: [PATCH 93/96] add more themes --- novelwriter/assets/themes/aura.conf | 76 +++++++++++++++++++ novelwriter/assets/themes/aura_bright.conf | 74 ++++++++++++++++++ novelwriter/assets/themes/aura_soft.conf | 76 +++++++++++++++++++ .../assets/themes/b2t_garden_dark.conf | 76 +++++++++++++++++++ .../assets/themes/b2t_garden_light.conf | 76 +++++++++++++++++++ .../assets/themes/b2t_suburb_dark.conf | 76 +++++++++++++++++++ .../assets/themes/b2t_suburb_light.conf | 76 +++++++++++++++++++ .../assets/themes/b4t_classic_o_dark.conf | 76 +++++++++++++++++++ .../assets/themes/b4t_classic_o_light.conf | 76 +++++++++++++++++++ .../assets/themes/b4t_modern_c_dark.conf | 76 +++++++++++++++++++ .../assets/themes/b4t_modern_c_light.conf | 76 +++++++++++++++++++ novelwriter/assets/themes/castle_day.conf | 74 ++++++++++++++++++ novelwriter/assets/themes/castle_night.conf | 74 ++++++++++++++++++ novelwriter/assets/themes/chalky_soil.conf | 74 ++++++++++++++++++ novelwriter/assets/themes/chernozem.conf | 74 ++++++++++++++++++ .../assets/themes/everforest_dark.conf | 76 +++++++++++++++++++ .../assets/themes/everforest_light.conf | 76 +++++++++++++++++++ .../assets/themes/floral_daydream.conf | 74 ++++++++++++++++++ .../assets/themes/floral_midnight.conf | 74 ++++++++++++++++++ novelwriter/assets/themes/full_moon.conf | 75 ++++++++++++++++++ novelwriter/assets/themes/new_moon.conf | 76 +++++++++++++++++++ novelwriter/assets/themes/nord.conf | 76 +++++++++++++++++++ novelwriter/assets/themes/nordlicht.conf | 74 ++++++++++++++++++ novelwriter/assets/themes/primer_light.conf | 8 +- novelwriter/assets/themes/primer_night.conf | 6 +- novelwriter/assets/themes/ruby_day.conf | 74 ++++++++++++++++++ novelwriter/assets/themes/ruby_night.conf | 74 ++++++++++++++++++ 27 files changed, 1886 insertions(+), 7 deletions(-) create mode 100644 novelwriter/assets/themes/aura.conf create mode 100644 novelwriter/assets/themes/aura_bright.conf create mode 100644 novelwriter/assets/themes/aura_soft.conf create mode 100644 novelwriter/assets/themes/b2t_garden_dark.conf create mode 100644 novelwriter/assets/themes/b2t_garden_light.conf create mode 100644 novelwriter/assets/themes/b2t_suburb_dark.conf create mode 100644 novelwriter/assets/themes/b2t_suburb_light.conf create mode 100644 novelwriter/assets/themes/b4t_classic_o_dark.conf create mode 100644 novelwriter/assets/themes/b4t_classic_o_light.conf create mode 100644 novelwriter/assets/themes/b4t_modern_c_dark.conf create mode 100644 novelwriter/assets/themes/b4t_modern_c_light.conf create mode 100644 novelwriter/assets/themes/castle_day.conf create mode 100644 novelwriter/assets/themes/castle_night.conf create mode 100644 novelwriter/assets/themes/chalky_soil.conf create mode 100644 novelwriter/assets/themes/chernozem.conf create mode 100644 novelwriter/assets/themes/everforest_dark.conf create mode 100644 novelwriter/assets/themes/everforest_light.conf create mode 100644 novelwriter/assets/themes/floral_daydream.conf create mode 100644 novelwriter/assets/themes/floral_midnight.conf create mode 100644 novelwriter/assets/themes/full_moon.conf create mode 100644 novelwriter/assets/themes/new_moon.conf create mode 100644 novelwriter/assets/themes/nord.conf create mode 100644 novelwriter/assets/themes/nordlicht.conf create mode 100644 novelwriter/assets/themes/ruby_day.conf create mode 100644 novelwriter/assets/themes/ruby_night.conf diff --git a/novelwriter/assets/themes/aura.conf b/novelwriter/assets/themes/aura.conf new file mode 100644 index 00000000..b6d8749e --- /dev/null +++ b/novelwriter/assets/themes/aura.conf @@ -0,0 +1,76 @@ +[Main] +name = Aura +mode = dark +description = Aura +author = Myian +credit = Dalton Menezes +url = https://github.com/daltonmenezes/aura-theme + +[Base] +base = #15141b +default = #edecee +faded = #888888 +red = #ff6767 +orange = #ff9341 +yellow = #ffca85 +green = #8ae986 +cyan = #61ffca +blue = #82e2ff +purple = #a277ff + +[Project] +root = default +folder = red +file = default +title = cyan +chapter = purple +scene = #f694ff +note = yellow +active = cyan +inactive = red +disabled = faded + +[Palette] +window = #0c0c11 +windowtext = default +base = base +alternatebase = #353249 +text = default +tooltipbase = yellow +tooltiptext = base +button = base:L125 +buttontext = default +brighttext = base +highlight = #603bb1 +highlightedtext = default +link = blue +linkvisited = blue +accent = #603bb1 + +[GUI] +helptext = faded:L125 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #29263c +link = blue +headertext = cyan +headertag = cyan:128 +emphasis = purple:L110 +dialog = cyan +altdialog = blue +note = yellow +hidden = faded +shortcode = yellow +keyword = #f694ff +tag = yellow +value = faded +optional = faded +spellcheckline = red +errorline = blue +replacetag = yellow +modifier = red +texthighlight = #3c3958 diff --git a/novelwriter/assets/themes/aura_bright.conf b/novelwriter/assets/themes/aura_bright.conf new file mode 100644 index 00000000..8b178860 --- /dev/null +++ b/novelwriter/assets/themes/aura_bright.conf @@ -0,0 +1,74 @@ +[Main] +name = Aura (bright) +mode = light +description = Aura +author = Myian + +[Base] +base = #f0e9f0 +default = #45425a +faded = #777777 +red = #ce4e4e +orange = #bd6b23 +yellow = #a97a20 +green = #378c1d +cyan = #098d82 +blue = #3371c2 +purple = #7752ce + +[Project] +root = default +folder = red +file = default +title = cyan +chapter = purple +scene = #c540cc +note = #c49134 +active = cyan +inactive = red +disabled = faded + +[Palette] +window = #e1dae2 +windowtext = default +base = base +alternatebase = #cec9d3 +text = default +tooltipbase = #ffecad +tooltiptext = default +button = base +buttontext = default +brighttext = base +highlight = purple +highlightedtext = base +link = blue +linkvisited = blue +accent = purple + +[GUI] +helptext = faded:D125 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #e1dae2 +link = blue +headertext = cyan +headertag = cyan:128 +emphasis = purple +dialog = cyan:D105 +altdialog = blue +note = yellow +hidden = faded +shortcode = yellow +keyword = #c540cc +tag = yellow +value = faded +optional = faded +spellcheckline = red +errorline = blue +replacetag = yellow +modifier = red +texthighlight = #c5bfca diff --git a/novelwriter/assets/themes/aura_soft.conf b/novelwriter/assets/themes/aura_soft.conf new file mode 100644 index 00000000..15f6c410 --- /dev/null +++ b/novelwriter/assets/themes/aura_soft.conf @@ -0,0 +1,76 @@ +[Main] +name = Aura (soft) +mode = dark +description = Aura +author = Myian +credit = Dalton Menezes +url = https://github.com/daltonmenezes/aura-theme + +[Base] +base = #15141b +default = #bdbdbd +faded = #6d6d6d +red = #c55858 +orange = #e0925d +yellow = #d8af79 +green = #6fb16d +cyan = #54c59f +blue = #6cb2c7 +purple = #8464c6 + +[Project] +root = default +folder = red +file = default +title = cyan +chapter = purple +scene = #f694ff +note = yellow +active = cyan +inactive = red +disabled = faded + +[Palette] +window = #0c0c11 +windowtext = default +base = base +alternatebase = #353249 +text = default +tooltipbase = yellow +tooltiptext = base +button = base:L125 +buttontext = default +brighttext = base +highlight = #6a4da3 +highlightedtext = #edecee +link = blue +linkvisited = blue +accent = #6a4da3 + +[GUI] +helptext = faded:L125 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #29263c +link = blue +headertext = cyan +headertag = cyan:128 +emphasis = purple:L110 +dialog = cyan +altdialog = blue +note = yellow +hidden = faded +shortcode = yellow +keyword = #c17ac8 +tag = yellow +value = faded +optional = faded +spellcheckline = #ff6767 +errorline = #82e2ff +replacetag = yellow +modifier = red +texthighlight = #3c3958 diff --git a/novelwriter/assets/themes/b2t_garden_dark.conf b/novelwriter/assets/themes/b2t_garden_dark.conf new file mode 100644 index 00000000..a6dcf87a --- /dev/null +++ b/novelwriter/assets/themes/b2t_garden_dark.conf @@ -0,0 +1,76 @@ +[Main] +name = B2T Garden Dark +mode = dark +description = Garden Dark +author = Myian +credit = Bram de Haan +url = https://base2t.one/demo/garden/ + +[Base] +base = #2b2c2a +default = #ece5df +faded = #828782 +red = #df6547 +orange = #db9257 +yellow = #e9e98e +green = #90d98c +cyan = #81c5de +blue = #9596ea +purple = #da72b2 + +[Project] +root = default +folder = orange +file = #1c8217 +title = default +chapter = #90d98c +scene = #4cb946 +note = faded +active = green +inactive = orange +disabled = #696d69 + +[Palette] +window = #1e1f1e +windowtext = default +base = base +alternatebase = #505350 +text = default +tooltipbase = #e0cab8 +tooltiptext = base +button = base +buttontext = default +brighttext = base +highlight = #1c8217 +highlightedtext = default +link = green +linkvisited = green +accent = #bd5d0f + +[GUI] +helptext = #aab1aa +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #3e403d +link = blue +headertext = #fbfaf8 +headertag = #828782 +emphasis = #3fac39 +dialog = #90d98c +altdialog = #4cb946 +note = #dd843c +hidden = faded +shortcode = #dd843c +keyword = #dd843c +tag = #dba070 +value = #dba070 +optional = faded +spellcheckline = #ff6f65 +errorline = green +replacetag = #dd843c +modifier = faded +texthighlight = green:80 \ No newline at end of file diff --git a/novelwriter/assets/themes/b2t_garden_light.conf b/novelwriter/assets/themes/b2t_garden_light.conf new file mode 100644 index 00000000..6d3172bd --- /dev/null +++ b/novelwriter/assets/themes/b2t_garden_light.conf @@ -0,0 +1,76 @@ +[Main] +name = B2T Garden Light +mode = light +description = Garden Light +author = Myian +credit = Bram de Haan +url = https://base2t.one/demo/garden/ + +[Base] +base = #fbfaf8 +default = #505350 +faded = #969c96 +red = #df6547 +orange = #db9257 +yellow = #cccc58 +green = #3fac39 +cyan = #5dacc9 +blue = #7678d4 +purple = #d362a8 + +[Project] +root = default +folder = orange +file = #6bcc66 +title = default +chapter = #1c8217 +scene = #3fac39 +note = faded +active = green +inactive = orange +disabled = #aab1aa + +[Palette] +window = #ece5df +windowtext = default +base = base +alternatebase = #dbd0c7 +text = default +tooltipbase = #dcf0db +tooltiptext = default +button = base +buttontext = default +brighttext = base +highlight = #4cb946 +highlightedtext = base +link = #1c8217 +linkvisited = #1c8217 +accent = #bd5d0f + +[GUI] +helptext = #696d69 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #f0ebe6 +link = blue +headertext = #2b2c2a +headertag = #828782 +emphasis = #4cb946 +dialog = #1c8217 +altdialog = #3fac39 +note = #d97726 +hidden = faded +shortcode = #d97726 +keyword = #d97726 +tag = #bd5d0f +value = #bd5d0f +optional = faded +spellcheckline = red +errorline = green +replacetag = #d97726 +modifier = faded +texthighlight = green:80 \ No newline at end of file diff --git a/novelwriter/assets/themes/b2t_suburb_dark.conf b/novelwriter/assets/themes/b2t_suburb_dark.conf new file mode 100644 index 00000000..a088ecef --- /dev/null +++ b/novelwriter/assets/themes/b2t_suburb_dark.conf @@ -0,0 +1,76 @@ +[Main] +name = B2T Suburb Dark +mode = dark +description = Suburb Dark +author = Myian +credit = Bram de Haan +url = https://base2t.one/demo/suburb/ + +[Base] +base = #25293d +default = #d7dbf3 +faded = #888eaf +red = #fb6fa9 +orange = #ff9b7d +yellow = #ffdf8f +green = #8bd59d +cyan = #76cde3 +blue = #8696fd +purple = #de95ee + +[Project] +root = default +folder = faded +file = #b0a6aa +title = #d14781 +chapter = #f764a1 +scene = #ff99c3 +note = #8696fd +active = red +inactive = faded +disabled = #575c79 + +[Palette] +window = #1e212f +windowtext = default +base = base +alternatebase = #444864 +text = default +tooltipbase = #d2d8fe +tooltiptext = base +button = base +buttontext = default +brighttext = base +highlight = red +highlightedtext = #1e202f +link = blue +linkvisited = blue +accent = red + +[GUI] +helptext = #9b9fb6 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = #b1b7d9 +line = #373a51 +link = blue +headertext = red +headertag = red:128 +emphasis = #ffffff +dialog = #fe81b5 +altdialog = #ffb3d2 +note = #a0acfe +hidden = blue +shortcode = #6375ee +keyword = faded +tag = #a0acfe +value = default +optional = faded +spellcheckline = #ff3b3b +errorline = #7083ff +replacetag = blue +modifier = faded +texthighlight = red:72 \ No newline at end of file diff --git a/novelwriter/assets/themes/b2t_suburb_light.conf b/novelwriter/assets/themes/b2t_suburb_light.conf new file mode 100644 index 00000000..429994df --- /dev/null +++ b/novelwriter/assets/themes/b2t_suburb_light.conf @@ -0,0 +1,76 @@ +[Main] +name = B2T Suburb Light +mode = light +description = Suburb Light +author = Myian +credit = Bram de Haan +url = https://base2t.one/demo/suburb/ + +[Base] +base = #fbf9fa +default = #444864 +faded = #878ba6 +red = #d14781 +orange = #d38152 +yellow = #cac63a +green = #378d60 +cyan = #308ab1 +blue = #5165e6 +purple = #9958be + +[Project] +root = default +folder = faded +file = #b0a5a9 +title = red +chapter = #f764a1 +scene = #ff99c3 +note = #8696fd +active = red +inactive = faded +disabled = #b6bad1 + +[Palette] +window = #e9e5e7 +windowtext = default +base = base +alternatebase = #d7cbd0 +text = default +tooltipbase = #d2d8fe +tooltiptext = default +button = #fbf9fa +buttontext = default +brighttext = base +highlight = #f764a1 +highlightedtext = base +link = blue +linkvisited = blue +accent = #fe81b5 + +[GUI] +helptext = #65697c +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = #6e7396 +line = #eae1e5 +link = blue +headertext = red +headertag = red:128 +emphasis = #1e202f +dialog = red +altdialog = #fb6fa9 +note = blue +hidden = blue +shortcode = #8696fd +keyword = faded +tag = blue +value = default +optional = faded +spellcheckline = #ff0000 +errorline = cyan +replacetag = blue +modifier = faded +texthighlight = #f25a9944 \ No newline at end of file diff --git a/novelwriter/assets/themes/b4t_classic_o_dark.conf b/novelwriter/assets/themes/b4t_classic_o_dark.conf new file mode 100644 index 00000000..5c664a5b --- /dev/null +++ b/novelwriter/assets/themes/b4t_classic_o_dark.conf @@ -0,0 +1,76 @@ +[Main] +name = B4T Classic-O Dark +mode = dark +description = Classic-O Dark +author = Myian +credit = Bram de Haan +url = https://atelierbram.github.io/Base4Tone-prism/b4t_classic-o/dark/ + +[Base] +base = #22272f +default = #d0d5dd +faded = #707F98 +red = #f17eaa +orange = #eca277 +yellow = #f3cd91 +green = #7bd892 +cyan = #5ee3d1 +blue = #9cc1fc +purple = #d19af4 + +[Project] +root = default +folder = #649efb +file = default +title = #039582 +chapter = #1abba6 +scene = #5ee3d1 +note = #d19af4 +active = default +inactive = faded +disabled = #454f5f + +[Palette] +window = #191d23 +windowtext = default +base = base +alternatebase = #333b47 +text = default +tooltipbase = yellow +tooltiptext = base +button = #22272f +buttontext = default +brighttext = base +highlight = #0c9c89 +highlightedtext = base +link = blue +linkvisited = blue +accent = #0c9c89 + +[GUI] +helptext = default:192 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #333b47 +link = blue +headertext = cyan +headertag = cyan:128 +emphasis = #5fe2d1 +dialog = #87B4FC +altdialog = #5A96F6 +note = #d19af4 +hidden = faded +shortcode = #18ae9a +keyword = #877af0 +tag = #a095f3 +value = faded +optional = faded +spellcheckline = #ff688d +errorline = #5fe2d1 +replacetag = blue +modifier = #ba6cea +texthighlight = cyan:56 diff --git a/novelwriter/assets/themes/b4t_classic_o_light.conf b/novelwriter/assets/themes/b4t_classic_o_light.conf new file mode 100644 index 00000000..0b664ef0 --- /dev/null +++ b/novelwriter/assets/themes/b4t_classic_o_light.conf @@ -0,0 +1,76 @@ +[Main] +name = B4T Classic-O Light +mode = light +description = Classic-O Light +author = Myian +credit = Bram de Haan +url = https://atelierbram.github.io/Base4Tone-prism/b4t_classic-o/dark/ + +[Base] +base = #f6f7f9 +default = #333b47 +faded = #718098 +red = #c03b6e +orange = #c46d26 +yellow = #bb8e46 +green = #3d9e29 +cyan = #039582 +blue = #4187f5 +purple = #aa52e0 + +[Project] +root = default +folder = #5996F6 +file = faded +title = #007061 +chapter = #039582 +scene = #1abba6 +note = #c17eed +active = default +inactive = faded +disabled = #acb5c3 + +[Palette] +window = #e7eaee +windowtext = default +base = base +alternatebase = #d0d5dd +text = default +tooltipbase = #ffe8c4 +tooltiptext = default +button = base +buttontext = default +brighttext = base +highlight = #0c9c89 +highlightedtext = base +link = blue +linkvisited = blue +accent = #0c9c89 + +[GUI] +helptext = default:192 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #dcdfe4 +link = blue +headertext = cyan +headertag = cyan:128 +emphasis = #008976 +dialog = #1a68e5 +altdialog = #1249a0 +note = purple +hidden = faded +shortcode = #17a592 +keyword = #9488F2 +tag = #6555e0 +value = faded +optional = faded +spellcheckline = #ff2259 +errorline = blue +replacetag = blue +modifier = #c17eed +texthighlight = cyan:64 diff --git a/novelwriter/assets/themes/b4t_modern_c_dark.conf b/novelwriter/assets/themes/b4t_modern_c_dark.conf new file mode 100644 index 00000000..4300da41 --- /dev/null +++ b/novelwriter/assets/themes/b4t_modern_c_dark.conf @@ -0,0 +1,76 @@ +[Main] +name = B4T Modern-C Dark +mode = dark +description = Modern-C Dark +author = Myian +credit = Bram de Haan +url = https://atelierbram.github.io/Base4Tone-prism/b4t_modern-c/dark/ + +[Base] +base = #25262c +default = #e7e7ed +faded = #9b9daa +red = #f17eaa +orange = #ffa978 +yellow = #f3cd91 +green = #46db6c +cyan = #5fe2d1 +blue = #8393f6 +purple = #d292f7 + +[Project] +root = default +folder = blue +file = #fad6e4 +title = #e64d87 +chapter = #eb75a2 +scene = #f5a3c2 +note = #18ae9a +active = default +inactive = faded +disabled = #5d5f6f + +[Palette] +window = #1b1c20 +windowtext = default +base = base +alternatebase = #40424e +text = default +tooltipbase = yellow +tooltiptext = base +button = #2e2f37 +buttontext = default +brighttext = base +highlight = yellow +highlightedtext = base +link = blue +linkvisited = blue +accent = yellow + +[GUI] +helptext = default:192 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #373943 +link = blue +headertext = red +headertag = red:128 +emphasis = #f391b6 +dialog = yellow +altdialog = #9fabf8 +note = #929ff7 +hidden = faded +shortcode = cyan +keyword = #18ae9a +tag = #93ece0 +value = #c5cdfb +optional = faded +spellcheckline = #e64d87 +errorline = blue +replacetag = blue +modifier = #6f81f0 +texthighlight = blue:72 diff --git a/novelwriter/assets/themes/b4t_modern_c_light.conf b/novelwriter/assets/themes/b4t_modern_c_light.conf new file mode 100644 index 00000000..ef4c23f5 --- /dev/null +++ b/novelwriter/assets/themes/b4t_modern_c_light.conf @@ -0,0 +1,76 @@ +[Main] +name = B4T Modern-C Light +mode = light +description = Modern-C Light +author = Myian +credit = Bram de Haan +url = https://atelierbram.github.io/Base4Tone-prism/b4t_modern-c/light/ + +[Base] +base = #f6f6f9 +default = #4a4c59 +faded = #848699 +red = #d22d6c +orange = #d55c0b +yellow = #d5880b +green = #269b43 +cyan = #17a592 +blue = #5b6feb +purple = #8e4fb3 + +[Project] +root = default +folder = blue +file = #eb75a2 +title = #931f4c +chapter = #d22d6c +scene = #e64d87 +note = #18ae9a +active = default +inactive = faded +disabled = #BBBDC9 + +[Palette] +window = #e7e7ed +windowtext = default +base = base +alternatebase = #d1d2dc +text = default +tooltipbase = #f9e6c8 +tooltiptext = default +button = #ffffff +buttontext = default +brighttext = base +highlight = yellow +highlightedtext = base +link = blue +linkvisited = blue +accent = yellow + +[GUI] +helptext = default:192 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #e7e7ed +link = blue +headertext = red +headertag = red:128 +emphasis = #d53874 +dialog = #9f6303 +altdialog = #354ddd +note = blue +hidden = faded +shortcode = cyan +keyword = #007a6a +tag = #18ae9a +value = #8493F6 +optional = faded +spellcheckline = red +errorline = blue +replacetag = blue +modifier = #354ddd +texthighlight = blue:64 \ No newline at end of file diff --git a/novelwriter/assets/themes/castle_day.conf b/novelwriter/assets/themes/castle_day.conf new file mode 100644 index 00000000..a7948592 --- /dev/null +++ b/novelwriter/assets/themes/castle_day.conf @@ -0,0 +1,74 @@ +[Main] +name = Castle by Day +mode = light +description = Castle Day +author = Myian + +[Base] +base = #f3eeec +default = #443d38 +faded = #8b827b +red = #c95e5e +orange = #d47643 +yellow = #b68730 +green = #4e8b30 +cyan = #539c9c +blue = #687fca +purple = #b261b4 + +[Project] +root = default +folder = blue +file = red +title = green +chapter = yellow +scene = orange +note = #9c9188 +active = default +inactive = faded +disabled = #b4aca5 + +[Palette] +window = base:D110 +windowtext = default +base = base +alternatebase = base:D115 +text = default +tooltipbase = yellow:L230 +tooltiptext = default +button = base +buttontext = default +brighttext = base +highlight = #cf7c6d +highlightedtext = base:L110 +link = #5068b6 +linkvisited = #5068b6 +accent = red:192 + +[GUI] +helptext = default:L180 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = base:D110 +link = blue +headertext = yellow +headertag = yellow:160 +emphasis = #aa791e +dialog = green:D110 +altdialog = #378b8b +note = faded +hidden = faded +shortcode = faded +keyword = #ca4b4b +tag = orange +value = purple +optional = #dd8c60 +spellcheckline = #e94444 +errorline = #378b8b +replacetag = blue +modifier = #963399 +texthighlight = red:80 diff --git a/novelwriter/assets/themes/castle_night.conf b/novelwriter/assets/themes/castle_night.conf new file mode 100644 index 00000000..8fd8a963 --- /dev/null +++ b/novelwriter/assets/themes/castle_night.conf @@ -0,0 +1,74 @@ +[Main] +name = Castle by Night +mode = dark +description = Castle Night +author = Myian + +[Base] +base = #1c1f28 +default = #d6d6d6 +faded = #878a91 +red = #fa8080 +orange = #ee9c70 +yellow = #fadd8d +green = #afd49d +cyan = #a4dad7 +blue = #9cb2ec +purple = #d296d4 + +[Project] +root = default +folder = blue +file = red +title = green +chapter = yellow +scene = orange +note = #9b9ea5 +active = default +inactive = faded +disabled = #4b4f5c + +[Palette] +window = base:D130 +windowtext = default +base = base +alternatebase = base:L160 +text = default +tooltipbase = yellow:L120 +tooltiptext = base +button = base:L110 +buttontext = default +brighttext = base +highlight = red:D150 +highlightedtext = default:L110 +link = blue +linkvisited = blue +accent = red:D150 + +[GUI] +helptext = faded +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = base:L150 +link = blue +headertext = yellow +headertag = yellow:160 +emphasis = yellow +dialog = green +altdialog = cyan +note = faded +hidden = faded +shortcode = faded +keyword = red +tag = orange +value = #e4b2e6 +optional = orange:L120 +spellcheckline = #ff5d5d +errorline = cyan +replacetag = blue +modifier = purple +texthighlight = red:72 diff --git a/novelwriter/assets/themes/chalky_soil.conf b/novelwriter/assets/themes/chalky_soil.conf new file mode 100644 index 00000000..19b8dc6a --- /dev/null +++ b/novelwriter/assets/themes/chalky_soil.conf @@ -0,0 +1,74 @@ +[Main] +name = Chalky Soil +mode = light +description = Chalky +author = Myian + +[Base] +base = #f0f0f0 +default = #494949 +faded = #8a8a8a +red = #c45e6c +orange = #c9700b +yellow = #c09227 +green = #5f8f5a +cyan = #3f9b96 +blue = #417db6 +purple = #975ea8 + +[Project] +root = default +folder = green +file = faded:D105 +title = red +chapter = orange +scene = yellow +note = #6293c2 +active = green +inactive = faded +disabled = faded:L135 + +[Palette] +window = base:D108 +windowtext = default +base = base +alternatebase = base:D115 +text = default +tooltipbase = #f1dcab +tooltiptext = default +button = base:D110 +buttontext = default +brighttext = base +highlight = green +highlightedtext = base +link = blue +linkvisited = blue +accent = green + +[GUI] +helptext = default:L140 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = faded:48 +link = blue +headertext = red +headertag = red:128 +emphasis = #488843 +dialog = #b95a00 +altdialog = yellow +note = faded +hidden = faded +shortcode = #967044 +keyword = blue +tag = #276096 +value = #276096 +optional = faded +spellcheckline = #f0344d +errorline = cyan +replacetag = purple +modifier = blue +texthighlight = green:80 diff --git a/novelwriter/assets/themes/chernozem.conf b/novelwriter/assets/themes/chernozem.conf new file mode 100644 index 00000000..10847dd3 --- /dev/null +++ b/novelwriter/assets/themes/chernozem.conf @@ -0,0 +1,74 @@ +[Main] +name = Chernozem +mode = dark +description = Chernozem +author = Myian + +[Base] +base = #2c2525 +default = #dad0ca +faded = #857972 +red = #e06c6c +orange = #ec935f +yellow = #e5cc91 +green = #6e9e6a +cyan = #72b69f +blue = #7c9fbd +purple = #c899d6 + +[Project] +root = default +folder = green +file = default +title = red +chapter = orange +scene = yellow +note = blue +active = green +inactive = faded +disabled = #504742 + +[Palette] +window = #241d1d +windowtext = default +base = base +alternatebase = faded:80 +text = default +tooltipbase = yellow +tooltiptext = base +button = #362c2b +buttontext = default +brighttext = base +highlight = #5a8d55 +highlightedtext = #241d1d +link = blue +linkvisited = blue +accent = #5a8d55 + +[GUI] +helptext = #a39891 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = faded:48 +link = blue +headertext = red +headertag = red:128 +emphasis = #85c47f +dialog = orange +altdialog = yellow +note = faded +hidden = faded +shortcode = #af8973 +keyword = blue +tag = #a1c4e4 +value = #a1c4e4 +optional = faded +spellcheckline = #ff5555 +errorline = cyan +replacetag = purple +modifier = blue +texthighlight = green:80 diff --git a/novelwriter/assets/themes/everforest_dark.conf b/novelwriter/assets/themes/everforest_dark.conf new file mode 100644 index 00000000..8de92d38 --- /dev/null +++ b/novelwriter/assets/themes/everforest_dark.conf @@ -0,0 +1,76 @@ +[Main] +name = Everforest Dark +mode = dark +description = Everforest +author = Myian +credit = Sainnhe Park +url = https://github.com/sainnhe/everforest + +[Base] +base = #272e33 +default = #d3c6aa +faded = #859289 +red = #e67e80 +orange = #e69875 +yellow = #dbbc7f +green = #a7c080 +cyan = #83c092 +blue = #7fbbb3 +purple = #d699b6 + +[Project] +root = default +folder = orange +file = red +title = green +chapter = blue +scene = purple +note = faded +active = cyan +inactive = orange +disabled = faded + +[Palette] +window = #1e2326 +windowtext = default +base = base +alternatebase = #374145 +text = default +tooltipbase = yellow +tooltiptext = base +button = #2e383c +buttontext = default +brighttext = base +highlight = #a7c080 +highlightedtext = base +link = blue +linkvisited = blue +accent = #a7c080 + +[GUI] +helptext = #a9a49d +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #343f44 +link = blue +headertext = cyan +headertag = cyan:128 +emphasis = blue +dialog = green +altdialog = cyan +note = purple +hidden = faded +shortcode = orange +keyword = orange +tag = purple +value = faded +optional = faded +spellcheckline = red +errorline = cyan +replacetag = purple +modifier = red +texthighlight = cyan:72 diff --git a/novelwriter/assets/themes/everforest_light.conf b/novelwriter/assets/themes/everforest_light.conf new file mode 100644 index 00000000..f6219327 --- /dev/null +++ b/novelwriter/assets/themes/everforest_light.conf @@ -0,0 +1,76 @@ +[Main] +name = Everforest Light +mode = light +description = Everforest +author = Myian +credit = Sainnhe Park +url = https://github.com/sainnhe/everforest + +[Base] +base = #fffbef +default = #5c6a72 +faded = #939f91 +red = #f85552 +orange = #f57d26 +yellow = #dfa000 +green = #8da101 +cyan = #35a77c +blue = #3a94c5 +purple = #df69ba + +[Project] +root = default +folder = orange +file = red +title = green +chapter = blue +scene = purple +note = faded +active = cyan +inactive = orange +disabled = faded + +[Palette] +window = #f2efdf +windowtext = default +base = base +alternatebase = #e8e5d5 +text = default +tooltipbase = #fef2d5 +tooltiptext = default +button = #f8f5e4 +buttontext = default +brighttext = base +highlight = #93b259 +highlightedtext = base +link = blue +linkvisited = blue +accent = #93b259 + +[GUI] +helptext = #829181 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #edeada +link = blue +headertext = cyan +headertag = cyan:128 +emphasis = blue +dialog = green +altdialog = cyan +note = purple +hidden = faded +shortcode = orange +keyword = orange +tag = purple +value = faded +optional = faded +spellcheckline = red +errorline = cyan +replacetag = purple +modifier = red +texthighlight = cyan:64 diff --git a/novelwriter/assets/themes/floral_daydream.conf b/novelwriter/assets/themes/floral_daydream.conf new file mode 100644 index 00000000..97c71ec3 --- /dev/null +++ b/novelwriter/assets/themes/floral_daydream.conf @@ -0,0 +1,74 @@ +[Main] +name = Floral Daydream +mode = light +description = Floral +author = Myian + +[Base] +base = #fff4f7 +default = #ac3b6f +faded = #c285aa +red = #e76b6d +orange = #e08b46 +yellow = #bea224 +green = #59976b +cyan = #5d9ea3 +blue = #658cc5 +purple = #9d77c9 + +[Project] +root = default +folder = yellow +file = orange +title = blue +chapter = purple +scene = red +note = #6dad7f +active = green +inactive = faded +disabled = #e2bcce + +[Palette] +window = #ffe3ea +windowtext = default +base = base +alternatebase = #ffc7d8 +text = default +tooltipbase = #fff0ba +tooltiptext = #413309 +button = #ffffff +buttontext = default +brighttext = base +highlight = #e4688d +highlightedtext = #ffffff +link = #4781d8 +linkvisited = #4781d8 +accent = #e4688d + +[GUI] +helptext = #d14a73 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = #974169 +line = #ffdbe4 +link = blue +headertext = blue +headertag = blue:128 +emphasis = #8152b8 +dialog = #eb4073 +altdialog = #4781d8 +note = #31924c +hidden = faded +shortcode = #31924c +keyword = #1a6d32 +tag = #31924c +value = #ce7b1d +optional = faded +spellcheckline = #ff0000 +errorline = #1a6d32 +replacetag = #31924c +modifier = #1a6d32 +texthighlight = #bae2c5 diff --git a/novelwriter/assets/themes/floral_midnight.conf b/novelwriter/assets/themes/floral_midnight.conf new file mode 100644 index 00000000..8dc48dbe --- /dev/null +++ b/novelwriter/assets/themes/floral_midnight.conf @@ -0,0 +1,74 @@ +[Main] +name = Floral Midnight +mode = dark +description = Floral +author = Myian + +[Base] +base = #1e1e31 +default = #d3cfe7 +faded = #948dac +red = #ff7b7d +orange = #ffad6e +yellow = #eedb94 +green = #79bd8b +cyan = #8bcac8 +blue = #91b7ff +purple = #b78ff0 + +[Project] +root = default +folder = yellow +file = orange +title = blue +chapter = purple +scene = red +note = green +active = green +inactive = faded +disabled = #55516d + +[Palette] +window = base:D130 +windowtext = default +base = base +alternatebase = #3e395a +text = default +tooltipbase = yellow +tooltiptext = yellow:D400 +button = #1f1d35 +buttontext = default +brighttext = base +highlight = #705a94 +highlightedtext = #ffffff +link = blue +linkvisited = blue +accent = #b060c0 + +[GUI] +helptext = faded +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #3e395a +link = blue +headertext = blue +headertag = blue:128 +emphasis = #ff9dd9 +dialog = #c29df3 +altdialog = blue +note = #65ca80 +hidden = faded +shortcode = #65ca80 +keyword = #a6fdbd +tag = #65ca80 +value = yellow +optional = faded +spellcheckline = #ff4949 +errorline = #65ca80 +replacetag = #a6fdbd +modifier = #a6fdbd +texthighlight = green:96 diff --git a/novelwriter/assets/themes/full_moon.conf b/novelwriter/assets/themes/full_moon.conf new file mode 100644 index 00000000..25e9678c --- /dev/null +++ b/novelwriter/assets/themes/full_moon.conf @@ -0,0 +1,75 @@ +[Main] +name = Full Moon +mode = light +description = New Moon Light +author = Myian + +[Base] +base = #ffffff +default = #454c55 +faded = #9197a0 +red = #d84f52 +orange = #db7a34 +yellow = #c5931f +green = #479e47 +cyan = #219fa3 +blue = #3e8acc +purple = #bd70cc + + +[Project] +root = default +folder = orange +file = green +title = blue +chapter = red +scene = purple +note = yellow +active = green +inactive = red +disabled = faded + +[Palette] +window = #eceef1 +windowtext = default +base = base +alternatebase = #e2eaf0 +text = default +tooltipbase = #ffeea6 +tooltiptext = default +button = #ffffff +buttontext = default +brighttext = base +highlight = #549adb +highlightedtext = base +link = blue +linkvisited = blue +accent = #549adb + +[GUI] +helptext = faded:D125 +fadedtext = faded:L135 +errortext = red + +[Syntax] +background = base +text = #565c63 +line = #eceff5 +link = blue +headertext = purple +headertag = purple:128 +emphasis = blue +dialog = #2d2d2d +altdialog = orange +note = yellow +hidden = faded +shortcode = cyan +keyword = red +tag = yellow +value = orange +optional = yellow +spellcheckline = #f73c3f +errorline = cyan +replacetag = purple +modifier = green +texthighlight = blue:80 \ No newline at end of file diff --git a/novelwriter/assets/themes/new_moon.conf b/novelwriter/assets/themes/new_moon.conf new file mode 100644 index 00000000..39656db7 --- /dev/null +++ b/novelwriter/assets/themes/new_moon.conf @@ -0,0 +1,76 @@ +[Main] +name = New Moon +mode = dark +description = New moon +author = Myian +credit = Tania Rascia +url = https://github.com/taniarascia/new-moon + +[Base] +base = #2d2d2d +default = #ffffff +faded = #777c85 +red = #f2777a +orange = #fca369 +yellow = #ffd479 +green = #92d192 +cyan = #76d4d6 +blue = #6ab0f3 +purple = #e1a6f2 + +[Project] +root = default +folder = orange +file = green +title = blue +chapter = red +scene = purple +note = yellow +active = green +inactive = red +disabled = faded + +[Palette] +window = #252525 +windowtext = default +base = base +alternatebase = #444444 +text = default +tooltipbase = #ffeea6 +tooltiptext = base +button = #333333 +buttontext = default +brighttext = base +highlight = #4386c5 +highlightedtext = default +link = blue +linkvisited = blue +accent = #4386c5 + +[GUI] +helptext = #a4a4a4 +fadedtext = #949494 +errortext = red + +[Syntax] +background = base +text = #bcc2cc +line = #444444 +link = blue +headertext = purple +headertag = purple:128 +emphasis = blue +dialog = default +altdialog = #ffeea6 +note = yellow +hidden = faded +shortcode = cyan +keyword = red +tag = yellow +value = orange +optional = #ffeea6 +spellcheckline = #ff6265 +errorline = green +replacetag = purple +modifier = green +texthighlight = blue:80 \ No newline at end of file diff --git a/novelwriter/assets/themes/nord.conf b/novelwriter/assets/themes/nord.conf new file mode 100644 index 00000000..be9d956a --- /dev/null +++ b/novelwriter/assets/themes/nord.conf @@ -0,0 +1,76 @@ +[Main] +name = Nord +mode = dark +description = Nord +author = Myian +credit = Sven Greb +url = https://github.com/nordtheme/nord + +[Base] +base = #2e3440 +default = #d8dee9 +faded = #7b88a1 +red = #bf616a +orange = #d08770 +yellow = #ebcb8b +green = #a3be8c +cyan = #88c0d0 +blue = #81a1c1 +purple = #b48ead + +[Project] +root = default +folder = yellow +file = default +title = purple +chapter = blue +scene = #8fbcbb +note = #696f7e +active = green +inactive = faded +disabled = #576279 + +[Palette] +window = #242933 +windowtext = default +base = base +alternatebase = #434c5e +text = default +tooltipbase = yellow +tooltiptext = base +button = #2e3440 +buttontext = default +brighttext = base +highlight = cyan +highlightedtext = base +link = blue +linkvisited = blue +accent = cyan + +[GUI] +helptext = blue +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #3b4252 +link = purple +headertext = cyan +headertag = cyan:128 +emphasis = #8fbcbb +dialog = blue +altdialog = green +note = orange +hidden = faded +shortcode = orange +keyword = purple +tag = #8fbcbb +value = #8fbcbb +optional = faded +spellcheckline = #ff717f +errorline = #b2da8f +replacetag = orange +modifier = purple +texthighlight = cyan:64 diff --git a/novelwriter/assets/themes/nordlicht.conf b/novelwriter/assets/themes/nordlicht.conf new file mode 100644 index 00000000..2d78a103 --- /dev/null +++ b/novelwriter/assets/themes/nordlicht.conf @@ -0,0 +1,74 @@ +[Main] +name = Nordlicht +mode = light +description = Nord +author = Myian + +[Base] +base = #ffffff +default = #4c566a +faded = #7b88a1 +red = #bf616a +orange = #d08770 +yellow = #daba7a +green = #7cac78 +cyan = #6bacbe +blue = #6b8ab8 +purple = #aa7aa1 + +[Project] +root = default +folder = #d4b067 +file = #6d7a96 +title = purple +chapter = blue +scene = #68a593 +note = #a5b3ca +active = green +inactive = faded +disabled = #b2c0d6 + +[Palette] +window = #e5e9f0 +windowtext = default +base = base +alternatebase = #d8dee9 +text = default +tooltipbase = #fff0d3 +tooltiptext = default +button = #e5e9f0 +buttontext = default +brighttext = base +highlight = cyan +highlightedtext = base +link = blue +linkvisited = blue +accent = cyan + +[GUI] +helptext = blue +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #eceff4 +link = purple +headertext = #559db1 +headertag = #559db188 +emphasis = #549b86 +dialog = #5e81ac +altdialog = #619b5b +note = orange +hidden = faded +shortcode = orange +keyword = purple +tag = #68a593 +value = #68a593 +optional = faded +spellcheckline = #ff3b4f +errorline = #58aa51 +replacetag = orange +modifier = #a16e98 +texthighlight = cyan:64 \ No newline at end of file diff --git a/novelwriter/assets/themes/primer_light.conf b/novelwriter/assets/themes/primer_light.conf index 18e50814..e578b603 100644 --- a/novelwriter/assets/themes/primer_light.conf +++ b/novelwriter/assets/themes/primer_light.conf @@ -55,12 +55,12 @@ errortext = red [Syntax] background = base text = #424a53 -line = #dde3e8 +line = #eaeef2 link = blue headertext = default -headertag = #8c959f -emphasis = #2e934a -dialog = #000000 +headertag = #afb8c1 +emphasis = #1a7f37 +dialog = #0d1117 altdialog = cyan note = #bf8700 hidden = #8c959f diff --git a/novelwriter/assets/themes/primer_night.conf b/novelwriter/assets/themes/primer_night.conf index 7663743e..2496f10d 100644 --- a/novelwriter/assets/themes/primer_night.conf +++ b/novelwriter/assets/themes/primer_night.conf @@ -55,13 +55,13 @@ errortext = #f85149 [Syntax] background = base text = #b1bac4 -line = #30363d +line = #21262d link = blue headertext = default headertag = #b1bac4 -emphasis = #97ee9e +emphasis = #7ee787 dialog = #ffffff -altdialog = #8adfd7 +altdialog = #57ccc5 note = #f8e3a1 hidden = faded shortcode = #ff9bce diff --git a/novelwriter/assets/themes/ruby_day.conf b/novelwriter/assets/themes/ruby_day.conf new file mode 100644 index 00000000..20891da0 --- /dev/null +++ b/novelwriter/assets/themes/ruby_day.conf @@ -0,0 +1,74 @@ +[Main] +name = Ruby Day +mode = light +description = Ruby +author = Myian + +[Base] +base = #ffeeee +default = #444252 +faded = #8e8c9c +red = #e46363 +orange = #df9a61 +yellow = #e5c280 +green = #72ac79 +cyan = #6aa2a7 +blue = #7b80c2 +purple = #b781c2 + +[Project] +root = default +folder = orange +file = #7d7a8d +title = green +chapter = red +scene = blue +note = purple +active = default +inactive = red +disabled = faded + +[Palette] +window = #f1d9d9 +windowtext = default +base = base +alternatebase = #e9c1c1 +text = default +tooltipbase = #f0d0d0 +tooltiptext = default +button = base +buttontext = default +brighttext = red +highlight = #da3d3d +highlightedtext = base +link = #9f58ad +linkvisited = #9f58ad +accent = #c43939 + +[GUI] +helptext = #756777 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #f3dbdd +link = #5159cc +headertext = default +headertag = default:128 +emphasis = #c05858 +dialog = #c53030 +altdialog = #c45522 +note = #9f58ad +hidden = faded +shortcode = #9f58ad +keyword = #5159cc +tag = #9f58ad +value = #b98421 +optional = faded +spellcheckline = #ff3333 +errorline = cyan +replacetag = #5159cc +modifier = #2a9638 +texthighlight = red:80 diff --git a/novelwriter/assets/themes/ruby_night.conf b/novelwriter/assets/themes/ruby_night.conf new file mode 100644 index 00000000..b9fe7486 --- /dev/null +++ b/novelwriter/assets/themes/ruby_night.conf @@ -0,0 +1,74 @@ +[Main] +name = Ruby Night +mode = dark +description = Ruby +author = Myian + +[Base] +base = #18181C +default = #dcd9e6 +faded = #817b94 +red = #ec6262 +orange = #f89d68 +yellow = #ebcf84 +green = #7fb88b +cyan = #75c5ca +blue = #7f8dcf +purple = #c37ac5 + +[Project] +root = default +folder = orange +file = default +title = green +chapter = red +scene = blue +note = purple +active = default +inactive = red +disabled = faded + +[Palette] +window = #0e0e11 +windowtext = default +base = base +alternatebase = #29292e +text = default +tooltipbase = #fa9b9b +tooltiptext = base +button = #1c1c21 +buttontext = default +brighttext = base +highlight = #a52a2c +highlightedtext = #ebd9d9 +link = purple +linkvisited = purple +accent = #a52a2c + +[GUI] +helptext = #a5a1b3 +fadedtext = faded +errortext = red + +[Syntax] +background = base +text = default +line = #29292e +link = blue +headertext = default +headertag = default:128 +emphasis = #ff9d9d +dialog = #ff6969 +altdialog = orange +note = purple +hidden = faded +shortcode = purple +keyword = blue +tag = purple +value = yellow +optional = faded +spellcheckline = #ff2727 +errorline = cyan +replacetag = blue +modifier = green +texthighlight = red:80 \ No newline at end of file From c832b2d8607a419413db76305ca94dc47752323e Mon Sep 17 00:00:00 2001 From: Myian Date: Sat, 5 Jul 2025 14:17:50 +0200 Subject: [PATCH 94/96] fix: Primer Light headertag --- novelwriter/assets/themes/primer_light.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/novelwriter/assets/themes/primer_light.conf b/novelwriter/assets/themes/primer_light.conf index e578b603..ecd1d34a 100644 --- a/novelwriter/assets/themes/primer_light.conf +++ b/novelwriter/assets/themes/primer_light.conf @@ -58,7 +58,7 @@ text = #424a53 line = #eaeef2 link = blue headertext = default -headertag = #afb8c1 +headertag = #9ea7b0 emphasis = #1a7f37 dialog = #0d1117 altdialog = cyan From 590f13203a735e65fb24363988c946e691425380 Mon Sep 17 00:00:00 2001 From: Myian Date: Sat, 5 Jul 2025 14:23:24 +0200 Subject: [PATCH 95/96] fix: Classic-O Light url --- novelwriter/assets/themes/b4t_classic_o_light.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/novelwriter/assets/themes/b4t_classic_o_light.conf b/novelwriter/assets/themes/b4t_classic_o_light.conf index 0b664ef0..b7d7643d 100644 --- a/novelwriter/assets/themes/b4t_classic_o_light.conf +++ b/novelwriter/assets/themes/b4t_classic_o_light.conf @@ -4,7 +4,7 @@ mode = light description = Classic-O Light author = Myian credit = Bram de Haan -url = https://atelierbram.github.io/Base4Tone-prism/b4t_classic-o/dark/ +url = https://atelierbram.github.io/Base4Tone-prism/b4t_classic-o/light/ [Base] base = #f6f7f9 From 3352a24750d4797f64b36e8c72d60cd57c35634a Mon Sep 17 00:00:00 2001 From: Myian Date: Sat, 5 Jul 2025 15:33:42 +0200 Subject: [PATCH 96/96] fix: rename the Auras --- novelwriter/assets/themes/aura_bright.conf | 2 +- novelwriter/assets/themes/aura_soft.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/novelwriter/assets/themes/aura_bright.conf b/novelwriter/assets/themes/aura_bright.conf index 8b178860..65f41056 100644 --- a/novelwriter/assets/themes/aura_bright.conf +++ b/novelwriter/assets/themes/aura_bright.conf @@ -1,5 +1,5 @@ [Main] -name = Aura (bright) +name = Aura (Bright) mode = light description = Aura author = Myian diff --git a/novelwriter/assets/themes/aura_soft.conf b/novelwriter/assets/themes/aura_soft.conf index 15f6c410..82ddbc11 100644 --- a/novelwriter/assets/themes/aura_soft.conf +++ b/novelwriter/assets/themes/aura_soft.conf @@ -1,5 +1,5 @@ [Main] -name = Aura (soft) +name = Aura (Soft) mode = dark description = Aura author = Myian

    (iumb_%EofV1=K8}q>jQs? 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 diff --git a/novelwriter/assets/images/welcome.webp b/novelwriter/assets/images/welcome.webp new file mode 100644 index 0000000000000000000000000000000000000000..3831aafe27ac93adbe79044b01fcf1775e836ece GIT binary patch literal 352664 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�@eFUzzw`X7Egd)`ZQsx9e5Oi-v~>k&^;!G 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