diff --git a/README.md b/README.md index 3b01953..140422d 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,25 @@ -# cutelog – GUI for Python's logging module +# cutelog – GUI for logging [![PyPi](https://img.shields.io/pypi/v/cutelog.svg?style=flat-square)](https://pypi.python.org/pypi/cutelog) -This is a graphical log viewer for Python's standard logging module. +This is a graphical log viewer for Python's logging module. It can be targeted with a SocketHandler with no additional setup (see [Usage](#usage)). -The program is in beta: it's lacking some features and may be unstable, but it works. -cutelog is cross-platform, although it's mainly written and optimized for Linux. +It can also be used from other languages or logging libraries with little effort (see the [Wiki](../../wiki/Creating-a-client-for-cutelog)). +For example, a Go library [gocutelog](https://github.com/busimus/gocutelog) shows how to enable +regular Go logging libraries to connect to cutelog. -This is my first released project, so the code is by no means stellar. -Feedback and contributions are appreciated! +This program is in beta, so please report bugs if you encounter them. ## Features * Allows any number of simultaneous connections -* Fully customizable look of log levels and columns -* Filtering based on level and name of the logger, as well as filtering by searching +* Customizable look of log levels and columns, with presets for each +* Filtering based on level and namespace, as well as filtering by searching * Search through all records or only through filtered ones +* Display extra fields under the message with [Extra mode](../../wiki/Creating-a-client-for-cutelog#extra-mode) * View exception tracebacks or messages in a separate window * Dark theme (with its own set of colors for levels) * Pop tabs out of the window, merge records of multiple tabs into one +* Save/load records to/from a file in JSON format ## Screenshots Light theme | Dark theme @@ -30,7 +32,7 @@ Light theme | Dark theme ``` $ pip install cutelog ``` -Or install the latest development version from the source: +Or install the latest development version from the source (requires PyQt5 to build resources): ``` $ pip install git+https://github.com/busimus/cutelog.git @@ -38,7 +40,8 @@ $ pip install git+https://github.com/busimus/cutelog.git ### Requirements * Python 3.5 (or newer) -* PyQt5 (preferably 5.6 or newer) +* PyQt5 (preferably 5.6 or newer) or PySide2 +* [QtPy](https://github.com/spyder-ide/qtpy) ## Usage 1. Start `cutelog` @@ -48,7 +51,7 @@ import logging from logging.handlers import SocketHandler log = logging.getLogger('Root logger') -log.setLevel(1) # to send all messages to cutelog +log.setLevel(1) # to send all records to cutelog socket_handler = SocketHandler('127.0.0.1', 19996) # default listening address log.addHandler(socket_handler) log.info('Hello world!') @@ -56,32 +59,13 @@ log.info('Hello world!') Afterwards it's recommended to designate different loggers for different parts of your program with `log_2 = log.getChild("Child logger")`. This will create "log namespaces" which allow you to filter out messages from various subsystems of your program. -## Planned features -* [ ] Presets for colors -* [ ] Modify how rows are arranged in the detail table (like the header dialog) -* [ ] Fix double-search on the last matched result (or indicate that the last result was reached) -* [ ] Ability to save and load logs (as text or as full records) -* [ ] Alarms/notifications triggered by specified messages -* [ ] Figure out how to search up - -### Code improvements: -* [ ] Proper exception handling in critical places -* [ ] Message boxes for errors to avoid relying on CLI logging -* [ ] Ability to ignore resources.py and instead use actual files for quick stylesheet reload, etc. - -### Dreams, uncertainties, and low priority improvements: -* [ ] Rewrite all/most UIs in code instead of using Qt Designer -* [ ] Switch to [qtawesome](https://github.com/spyder-ide/qtawesome) instead of ion-icons? -* [ ] Support for custom themes? -* [ ] Rewrite the server with robust architecture and additional transports and serializers (e.g. ZeroMQ, WebSockets; msgpack)? -* [ ] Ditch asyncio if/when [curio](https://github.com/dabeaz/curio) takes off? -* [ ] Or rewrite the whole thing in C++ and make it be a generic logging receiver not just for Python??? - - ## Attributions Free software used: -* [PyQt5](https://riverbankcomputing.com/software/pyqt/intro) - GPLv3 License, Copyright (c) 2018 Riverbank Computing Limited -* [ion-icons](https://github.com/ionic-team/ionicons) - MIT License, Copyright (c) 2016 Drifty (http://drifty.com/) +* Qt via either: + * [PyQt5](https://riverbankcomputing.com/software/pyqt/intro) - GPLv3 License, Copyright (c) 2018 Riverbank Computing Limited + * [PySide2](https://wiki.qt.io/PySide2) - LGPLv3 License, Copyright (C) 2015 The Qt Company Ltd (http://www.qt.io/licensing/) +* [QtPy](https://github.com/spyder-ide/qtpy) - MIT License, Copyright © 2009–2018 The Spyder Development Team +* [ion-icons](https://github.com/ionic-team/ionicons) - MIT License, Copyright (c) 2015-present Ionic (http://ionic.io/) And thanks to [logview](https://pythonhosted.org/logview/) by Vinay Sajip for UI inspiration. diff --git a/README.rst b/README.rst index bba07ec..9fa04b8 100644 --- a/README.rst +++ b/README.rst @@ -11,9 +11,6 @@ It can be targeted with a SocketHandler with no additional setup (see Usage_). The program is in beta: it's lacking some features and may be unstable, but it works. cutelog is cross-platform, although it's mainly written and optimized for Linux. -This is my first released project, so the code is by no means stellar. -Feedback and contributions are appreciated! - Features ======== * Allows any number of simultaneous connections @@ -39,7 +36,8 @@ Or install the latest development version from the source:: Requirements ------------ * Python 3.5 (or newer) -* PyQt5 (preferably 5.6 or newer) +* PyQt5 (preferably 5.6 or newer) or PySide2 +* QtPy Usage ===== diff --git a/cutelog/__main__.py b/cutelog/__main__.py index 5b53072..06219fd 100644 --- a/cutelog/__main__.py +++ b/cutelog/__main__.py @@ -1,59 +1,32 @@ -import asyncio -import signal import sys +import qtpy -try: - import PyQt5.QtCore - PyQt5.QtCore -except ImportError: + +if not qtpy.PYQT5 and not qtpy.PYSIDE2: if sys.platform == 'linux': - sys.exit("Error: PyQt5 couldn't be imported.\n" + sys.exit("Error: a compatible Qt library couldn't be imported.\n" "Please install python3-pyqt5 (or just python-pyqt5) from your package manager.") else: # this technically shouldn't ever happen - sys.exit("Error: PyQt5 couldn't be imported.\n" - "Please install it by running `pip install pyqt5`") - -from PyQt5.QtCore import pyqtRemoveInputHook -from PyQt5.QtGui import QIcon -from PyQt5.QtWidgets import QApplication - -# !! resources and config must be imported before main_window !! -from .resources import qCleanupResources -from .config import CONFIG, ROOT_LOG -from .main_window import MainWindow - - -class Application(QApplication): - def __init__(self, argv): - super().__init__(argv) - self.log = ROOT_LOG - self.setWindowIcon(QIcon(':/cutelog.png')) - self.config = CONFIG - - async def process_events(self): - while not self.main_finished.is_set(): - await asyncio.sleep(self.config.loop_event_delay) - self.processEvents() - - def run(self): - pyqtRemoveInputHook() # to prevent Qt conflicting with pdb debug - self.loop = asyncio.get_event_loop() - self.loop.set_debug(False) - - main = MainWindow(self.loop, self.log, self) - self.main_finished = main.finished - try: - self.loop.add_signal_handler(signal.SIGINT, main.shutdown, None) - except NotImplementedError: # for Windows - pass - self.loop.run_until_complete(self.process_events()) - qCleanupResources() + sys.exit("Error: a compatible Qt library couldn't be imported.\n" + "Please install it by running `pip install pyqt5") def main(): - app = Application(sys.argv) - app.run() + import signal + from .config import ROOT_LOG + from .main_window import MainWindow + from .resources import qCleanupResources + from qtpy.QtGui import QIcon + from qtpy.QtWidgets import QApplication + + app = QApplication(sys.argv) + app.setWindowIcon(QIcon(':/cutelog.png')) + mw = MainWindow(ROOT_LOG, app) + signal.signal(signal.SIGINT, mw.signal_handler) + + sys.exit(app.exec_()) + qCleanupResources() if __name__ == '__main__': diff --git a/cutelog/about_dialog.py b/cutelog/about_dialog.py index 5bba094..1f3d0f0 100644 --- a/cutelog/about_dialog.py +++ b/cutelog/about_dialog.py @@ -1,18 +1,15 @@ -from PyQt5 import uic +# from qtpy.uic import loadUi +from qtpy.QtWidgets import QDialog from .config import CONFIG +from .utils import loadUi -uif = CONFIG.get_ui_qfile('about_dialog.ui') -AboutDialogBase = uic.loadUiType(uif) -uif.close() - - -class AboutDialog(*AboutDialogBase): +class AboutDialog(QDialog): def __init__(self, parent): super().__init__(parent) self.setupUi() def setupUi(self): - super().setupUi(self) + self.ui = loadUi(CONFIG.get_ui_qfile("about_dialog.ui"), baseinstance=self) self.nameLabel.setText(CONFIG.full_name) diff --git a/cutelog/config.py b/cutelog/config.py index 5d2e223..770bf2c 100644 --- a/cutelog/config.py +++ b/cutelog/config.py @@ -3,11 +3,11 @@ import os import sys from collections import namedtuple +from distutils.version import StrictVersion from pkg_resources import get_distribution, resource_filename -from PyQt5.QtCore import (QT_VERSION_STR, QCoreApplication, QFile, QObject, - QSettings, Qt, pyqtSignal) - +from qtpy import QT_VERSION +from qtpy.QtCore import QCoreApplication, QFile, QObject, QSettings, Qt, Signal if sys.platform == 'win': DEFAULT_FONT = 'MS Shell Dlg 2' @@ -16,9 +16,21 @@ else: DEFAULT_FONT = 'Sans' +try: + import msgpack + MSGPACK_SUPPORT = True +except ImportError: + MSGPACK_SUPPORT = False + +try: + import cbor + CBOR_SUPPORT = True +except ImportError: + CBOR_SUPPORT = False + # @Future: when Qt 5.6 becomes standard, remove this: -QT_VER = QT_VERSION_STR.split('.') +QT_VER = QT_VERSION.split('.') if QT_VER[0] == '5' and int(QT_VER[1]) < 6: QT55_COMPAT = True else: @@ -44,8 +56,9 @@ class Exc_Indication(enum.IntEnum): ('logger_table_font_size', int, 9), ('text_view_dialog_font', str, 'Courier New'), ('text_view_dialog_font_size', int, 12), - ('logger_row_height', int, 20), + ('logger_row_height', int, 15), ('exception_indication', int, Exc_Indication.RED_BG), + ('time_format_string', str, "%Y-%m-%d %H:%M:%S.%f"), # Search ('search_open_default', bool, False), @@ -57,24 +70,27 @@ class Exc_Indication(enum.IntEnum): ('listen_host', str, '0.0.0.0'), ('listen_port', int, 19996), ('single_tab_mode_default', bool, False), + ('extra_mode_default', bool, False), + ('default_serialization_format', str, 'pickle'), # Advanced ('console_logging_level', int, 30), - ('loop_event_delay', float, 0.005), ('benchmark', bool, False), ('benchmark_interval', float, 0.0005), ('light_theme_is_native', bool, False), # NON-SETTINGS OPTIONS: # Header - ('default_header_preset', str, "Default"), + ('default_header_preset', str, 'Stock'), + ('default_levels_preset', str, 'Stock'), + ('cutelog_version', str, ''), ) class Config(QObject): - "Configuration provider for the whole program, wapper for QSettings" + "Configuration provider for the whole program, wrapper for QSettings" - row_height_changed = pyqtSignal(int) + row_height_changed = Signal(int) def __init__(self, log=None): super().__init__() @@ -94,19 +110,25 @@ def __init__(self, log=None): self.full_name = "{} {}".format(QCoreApplication.applicationName(), QCoreApplication.applicationVersion()) - # options that need fast access are also definded as attributes, which + # options that need fast access are also defined as attributes, which # are updated by calling update_attributes() - # (on paper it's 4 times faster, but i don't think it matters in my case) + # (on paper it's 4 times faster, but I don't think it matters in my case) self.logger_table_font = None self.logger_table_font_size = None - self.loop_event_delay = None + self.logger_row_height = None self.benchmark_interval = None self.update_attributes() + def post_init(self): + running_version = StrictVersion(QCoreApplication.applicationVersion()) + config_version = self.options['cutelog_version'] + if config_version == "" or config_version != running_version: + self.save_running_version() + def __getitem__(self, name): # self.log.debug('Getting "{}"'.format(name)) - value = self.options.get(name, None) + value = self.options.get(name) if value is None: raise Exception('No option with name "{}"'.format(name)) # self.log.debug('Returning "{}"'.format(value)) @@ -141,8 +163,8 @@ def get_ui_qfile(self, name): @property def listen_address(self): - host = self.options.get('listen_host', None) - port = self.options.get('listen_port', None) + host = self.options.get('listen_host') + port = self.options.get('listen_port') if host is None or port is None: raise Exception('Listen host or port not in options: "{}:{}"'.format(host, port)) return (host, port) @@ -170,6 +192,7 @@ def load_options(self): return options def update_options(self, new_options, save=True): + self.emit_needed_changes(new_options) self.options.update(new_options) if save: self.save_options() @@ -177,20 +200,22 @@ def update_options(self, new_options, save=True): def update_attributes(self, options=None): "Updates fast attributes and everything else outside of self.options" - if options: - # here will be things that only need to be updated when they actually changed - new_row_height = options.get('logger_row_height', self.options['logger_row_height']) - if new_row_height != self.options['logger_row_height']: - self.row_height_changed.emit(new_row_height) - else: + if options is None: options = self.options - self.loop_event_delay = options.get('loop_event_delay', self.loop_event_delay) self.benchmark_interval = options.get('benchmark_interval', self.benchmark_interval) self.logger_table_font = options.get('logger_table_font', self.logger_table_font) self.logger_table_font_size = options.get('logger_table_font_size', self.logger_table_font_size) + self.logger_row_height = options.get('logger_row_height', self.logger_row_height) self.set_logging_level(options.get('console_logging_level', ROOT_LOG.level)) + def emit_needed_changes(self, new_options): + new_row_height = new_options.get('logger_row_height') + old_row_height = self.options.get('logger_row_height') + if new_row_height != old_row_height: + self.logger_row_height = new_row_height + self.row_height_changed.emit(new_row_height) + def save_options(self, sync=False): self.log.debug('Saving options') self.qsettings.beginGroup('Configuration') @@ -214,8 +239,47 @@ def set_logging_level(self, level): ROOT_LOG.setLevel(level) self.log.setLevel(level) - # def save_levels_preset(self, levels, preset_name): - # pass + def get_levels_presets(self): + self.qsettings.beginGroup('Levels_Presets') + result = self.qsettings.childGroups() + self.qsettings.endGroup() + return result + + def save_levels_preset(self, name, levels): + self.log.debug('Saving levels preset "{}"'.format(name)) + s = self.qsettings + s.beginGroup('Levels_Presets') + s.beginWriteArray(name, len(levels)) + for i, levelname in enumerate(levels): + level = levels[levelname] + s.setArrayIndex(i) + dump = level.dumps() + s.setValue('level', dump) + s.endArray() + s.endGroup() + + def load_levels_preset(self, name): + from .log_levels import LogLevel + self.log.debug('Loading levels preset "{}"'.format(name)) + s = self.qsettings + if name not in self.get_levels_presets(): + return None + s.beginGroup('Levels_Presets') + size = s.beginReadArray(name) + result = {} + for i in range(size): + s.setArrayIndex(i) + new_level = LogLevel(None).loads(s.value('level')) + result[new_level.levelname] = new_level + s.endArray() + s.endGroup() + return result + + def delete_levels_preset(self, name): + s = self.qsettings + s.beginGroup('Levels_Presets') + s.remove(name) + s.endGroup() def get_header_presets(self): self.qsettings.beginGroup('Header_Presets') @@ -230,7 +294,12 @@ def save_header_preset(self, name, columns): s.beginWriteArray(name, len(columns)) for i, col in enumerate(columns): s.setArrayIndex(i) - s.setValue('column', col.dump_to_string()) + # read the comment in Column.dumps() for reasoning + if i == len(columns) - 1: + col.width = 10 + # dump = col.dumps(width=10) + dump = col.dumps() + s.setValue('column', dump) s.endArray() s.endGroup() @@ -238,14 +307,14 @@ def load_header_preset(self, name): from .logger_table_header import Column self.log.debug('Loading header preset "{}"'.format(name)) s = self.qsettings - result = [] if name not in self.get_header_presets(): return None s.beginGroup('Header_Presets') size = s.beginReadArray(name) + result = [] for i in range(size): s.setArrayIndex(i) - new_column = Column(load=s.value('column')) + new_column = Column().loads(s.value('column')) result.append(new_column) s.endArray() s.endGroup() @@ -271,6 +340,20 @@ def load_geometry(self): s.endGroup() return geometry + def save_running_version(self): + version = QCoreApplication.applicationVersion() + self.log.debug("Updating the config version to {}".format(version)) + s = self.qsettings + s.beginGroup('Configuration') + s.setValue('cutelog_version', version) + self.options['cutelog_version'] = version + s.endGroup() + self.sync() + + def restore_defaults(self): + self.qsettings.clear() + self.sync() + def init_qt_info(): QCoreApplication.setOrganizationName('busimus') @@ -303,3 +386,4 @@ def init_logging(): init_qt_info() ROOT_LOG = init_logging() CONFIG = Config(ROOT_LOG) +CONFIG.post_init() diff --git a/cutelog/level_edit_dialog.py b/cutelog/level_edit_dialog.py index 4620bea..d73cb68 100644 --- a/cutelog/level_edit_dialog.py +++ b/cutelog/level_edit_dialog.py @@ -1,26 +1,32 @@ +from copy import deepcopy from functools import partial -from PyQt5.QtWidgets import (QCheckBox, QColorDialog, QDialog, - QDialogButtonBox, QFormLayout, QGridLayout, - QGroupBox, QLabel, QLineEdit, QPushButton, - QSizePolicy, QSpacerItem) +from qtpy.QtCore import Signal +from qtpy.QtGui import QValidator +from qtpy.QtWidgets import (QCheckBox, QColorDialog, QDialog, QDialogButtonBox, + QFormLayout, QGridLayout, QGroupBox, QLabel, + QLineEdit, QSizePolicy, QSpacerItem) -from .log_levels import DEFAULT_LEVELS, LogLevel +from .log_levels import DEFAULT_LEVELS, NO_LEVEL, LogLevel class LevelEditDialog(QDialog): - def __init__(self, parent, level=None, creating_new_level=False): + + level_changed = Signal(LogLevel) + + def __init__(self, parent, level=None, creating_new_level=False, level_names=set()): super().__init__(parent) if level: self.level = level else: - self.level = level = LogLevel(0, 'NOTSET') + self.level = deepcopy(NO_LEVEL) self.creating_new_level = creating_new_level + self.level_names = level_names - self.load_level() self.setupUi() + self.load_level(self.level) self.update_output() def setupUi(self): @@ -28,13 +34,9 @@ def setupUi(self): self.gridLayout = QGridLayout(self) self.levelNameLabel = QLabel("Level name", self) self.gridLayout.addWidget(self.levelNameLabel, 0, 0) - self.levelNumberLabel = QLabel("Level number", self) - self.gridLayout.addWidget(self.levelNumberLabel, 0, 1) self.levelNameLine = QLineEdit(self) - self.levelNoLine = QLineEdit(self) - self.gridLayout.addWidget(self.levelNameLine, 1, 0) - self.gridLayout.addWidget(self.levelNoLine, 1, 1) + self.gridLayout.addWidget(self.levelNameLine, 1, 0, 1, 0) self.groupBox = QGroupBox("Light mode", self) self.gridLayout.addWidget(self.groupBox, 2, 0) @@ -77,11 +79,10 @@ def setupUi(self): self.previewLineDark = QLineEdit(self) self.gridLayout.addWidget(self.previewLineDark, 5, 1) - self.resetButton = QPushButton('Reset') - self.gridLayout.addWidget(self.resetButton, 6, 0) - - self.buttonBox = QDialogButtonBox(QDialogButtonBox.Save | QDialogButtonBox.Cancel, self) - self.gridLayout.addWidget(self.buttonBox, 6, 1) + buttons = QDialogButtonBox.Reset | QDialogButtonBox.Save | QDialogButtonBox.Cancel + self.buttonBox = QDialogButtonBox(buttons, self) + self.resetButton = self.buttonBox.button(QDialogButtonBox.Reset) + self.gridLayout.addWidget(self.buttonBox, 6, 0, 1, 2) self.setup_widget_attributes() self.setup_widget_connections() @@ -100,13 +101,12 @@ def setup_widget_attributes(self): self.resetButton.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.levelNameLine.setText(self.level.levelname) - self.levelNoLine.setText(str(self.level.levelno)) - - if not self.creating_new_level: - self.levelNoLine.setReadOnly(True) - self.levelNoLine.setDisabled(True) - - self.set_checkboxes_state() + if self.creating_new_level: + self.name_validator = LevelNameValidator(self, self.level_names) + self.levelNameLine.setValidator(self.name_validator) + self.levelNameLine.textChanged.connect(self.level_name_valid) + else: + self.levelNameLine.setReadOnly(True) def setup_widget_connections(self): self.boldCheckBox.toggled.connect(self.toggle_bold) @@ -136,8 +136,7 @@ def set_checkboxes_state(self): self.italicCheckBoxDark.setChecked(self.italicDark) self.underlineCheckBoxDark.setChecked(self.underlineDark) - def load_level(self): - level = self.level + def load_level(self, level): self.bg = level.bg self.fg = level.fg self.bgDark = level.bgDark @@ -152,35 +151,32 @@ def load_level(self): self.underlineDark = 'underline' in level.stylesDark def reset_level(self): - if self.level.levelno in DEFAULT_LEVELS: - replacement = DEFAULT_LEVELS[self.level.levelno] - else: - replacement = LogLevel(0, 'NOTSET') + replacement = DEFAULT_LEVELS.get(self.level.levelname) + if not replacement: + replacement = NO_LEVEL - self.level.copy_level(replacement) - self.load_level() - self.set_checkboxes_state() + self.load_level(replacement) self.update_output() - def toggle_bold(self, value, dark=False): + def toggle_bold(self, enabled, dark=False): if not dark: - self.bold = value + self.bold = enabled else: - self.boldDark = value + self.boldDark = enabled self.update_output() - def toggle_italic(self, value, dark=False): + def toggle_italic(self, enabled, dark=False): if not dark: - self.italic = value + self.italic = enabled else: - self.italicDark = value + self.italicDark = enabled self.update_output() - def toggle_underline(self, value, dark=False): + def toggle_underline(self, enabled, dark=False): if not dark: - self.underline = value + self.underline = enabled else: - self.underlineDark = value + self.underlineDark = enabled self.update_output() def open_color_dialog(self, attr_name, mouse_event): @@ -216,10 +212,9 @@ def accept(self): self.level.bgDark = self.bgDark self.level.fgDark = self.fgDark - self.level.levelname = self.levelNameLine.text() - if self.creating_new_level: - self.level.levelno = self.levelNoLine.text() + self.level.levelname = self.levelNameLine.text().upper() + self.level_changed.emit(self.level) self.done(0) def reject(self): @@ -242,8 +237,10 @@ def update_output(self): self.bgColorPreview.setStyleSheet('QLineEdit {{background: {} }}'.format(self.bg.name())) self.fgColorPreview.setStyleSheet('QLineEdit {{background: {} }}'.format(self.fg.name())) - self.bgColorPreviewDark.setStyleSheet('QLineEdit {{ background: {} }}'.format(self.bgDark.name())) - self.fgColorPreviewDark.setStyleSheet('QLineEdit {{ background: {} }}'.format(self.fgDark.name())) + self.bgColorPreviewDark.setStyleSheet('QLineEdit {{ background: {} }}' + .format(self.bgDark.name())) + self.fgColorPreviewDark.setStyleSheet('QLineEdit {{ background: {} }}' + .format(self.fgDark.name())) font = self.previewLine.font() font.setBold(self.bold) @@ -256,3 +253,23 @@ def update_output(self): fontDark.setItalic(self.italicDark) fontDark.setUnderline(self.underlineDark) self.previewLineDark.setFont(fontDark) + + self.set_checkboxes_state() + + def level_name_valid(self): + if self.levelNameLine.hasAcceptableInput(): + self.buttonBox.button(QDialogButtonBox.Save).setEnabled(True) + else: + self.buttonBox.button(QDialogButtonBox.Save).setEnabled(False) + + +class LevelNameValidator(QValidator): + def __init__(self, parent, level_names): + super().__init__(parent) + self.level_names = level_names + + def validate(self, levelname, pos): + if len(levelname.strip()) == 0 or levelname in self.level_names: + return self.Intermediate, levelname, pos + else: + return self.Acceptable, levelname.upper(), pos diff --git a/cutelog/levels_preset_dialog.py b/cutelog/levels_preset_dialog.py new file mode 100644 index 0000000..ea3d01b --- /dev/null +++ b/cutelog/levels_preset_dialog.py @@ -0,0 +1,226 @@ +from copy import deepcopy +from functools import partial + +from qtpy.QtCore import Qt, Signal +from qtpy.QtGui import QBrush, QFont +from qtpy.QtWidgets import (QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, + QHeaderView, QInputDialog, QLabel, QMenu, + QTableWidget, QTableWidgetItem, QVBoxLayout, + QWidget) + +from .config import CONFIG +from .level_edit_dialog import LevelEditDialog +from .log_levels import DEFAULT_LEVELS, get_default_level +from .utils import show_warning_dialog + + +class LevelsPresetDialog(QDialog): + # name of the current preset; whether to set this preset as default; dict of Levels + levels_changed = Signal(str, bool, dict) + + def __init__(self, parent, preset_name, levels): + super().__init__(parent) + + self.preset_name = preset_name + self.levels = deepcopy(levels) + + self.setupUi() + self.update_output() + + def setupUi(self): + self.resize(480, 340) + self.vbox = QVBoxLayout(self) + self.presetLabel = QLabel(self) + self.table = QTableWidget(0, 4, self) + self.setAsDefaultCheckbox = QCheckBox("Set as default preset", self) + self.vbox.addWidget(self.presetLabel) + self.vbox.addWidget(self.table) + self.vbox.addWidget(self.setAsDefaultCheckbox) + + self.table.setEditTriggers(QTableWidget.NoEditTriggers) + self.table.setSelectionBehavior(QTableWidget.SelectRows) + self.table.setHorizontalHeaderLabels(["Show", "Level name", "Preview", "Preview (dark)"]) + self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) + self.table.horizontalHeader().setSectionsClickable(False) + self.table.horizontalHeader().setSectionsMovable(False) + self.table.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents) + self.table.verticalHeader().setVisible(False) + self.table.doubleClicked.connect(self.open_level_edit_dialog) + + self.table.setContextMenuPolicy(Qt.CustomContextMenu) + self.table.customContextMenuRequested.connect(self.open_menu) + + buttons = QDialogButtonBox.Reset | QDialogButtonBox.Save | QDialogButtonBox.Cancel + self.buttonBox = QDialogButtonBox(buttons, self) + self.vbox.addWidget(self.buttonBox) + + self.buttonBox.accepted.connect(self.accept) + self.buttonBox.rejected.connect(self.reject) + self.resetButton = self.buttonBox.button(QDialogButtonBox.Reset) + self.resetButton.clicked.connect(self.reset) + + def update_output(self): + self.presetLabel.setText("Preset: {}".format(self.preset_name)) + self.setAsDefaultCheckbox.setChecked(CONFIG['default_levels_preset'] == self.preset_name) + self.table.clearContents() + self.table.setRowCount(len(self.levels)) + + for i, levelname in enumerate(self.levels): + level = self.levels[levelname] + checkbox = self.get_level_show_checkbox(level) + nameItem = QTableWidgetItem(level.levelname) + preview, previewDark = self.get_preview_items(level) + + self.table.setCellWidget(i, 0, checkbox) + self.table.setItem(i, 1, nameItem) + self.table.setItem(i, 2, preview) + self.table.setItem(i, 3, previewDark) + + def get_level_show_checkbox(self, level): + checkbox_widget = QWidget(self.table) + checkbox_widget.setStyleSheet("QWidget { background-color:none;}") + + checkbox = QCheckBox() + checkbox.setStyleSheet("QCheckBox::indicator { width: 15px; height: 15px;}") + checkbox.setChecked(level.enabled) + + checkbox_layout = QHBoxLayout() + checkbox_layout.setAlignment(Qt.AlignCenter) + checkbox_layout.setContentsMargins(0, 0, 0, 0) + checkbox_layout.addWidget(checkbox) + checkbox_widget.setLayout(checkbox_layout) + return checkbox_widget + + def get_preview_items(self, level): + previewItem = QTableWidgetItem("Log message") + previewItem.setBackground(QBrush(level.bg, Qt.SolidPattern)) + previewItem.setForeground(QBrush(level.fg, Qt.SolidPattern)) + previewItemDark = QTableWidgetItem("Log message") + previewItemDark.setBackground(QBrush(level.bgDark, Qt.SolidPattern)) + previewItemDark.setForeground(QBrush(level.fgDark, Qt.SolidPattern)) + font = QFont(CONFIG.logger_table_font, CONFIG.logger_table_font_size) + fontDark = QFont(font) + if 'bold' in level.styles: + font.setBold(True) + if 'italic' in level.styles: + font.setItalic(True) + if 'underline' in level.styles: + font.setUnderline(True) + if 'bold' in level.stylesDark: + fontDark.setBold(True) + if 'italic' in level.stylesDark: + fontDark.setItalic(True) + if 'underline' in level.stylesDark: + fontDark.setUnderline(True) + previewItem.setFont(font) + previewItemDark.setFont(fontDark) + return previewItem, previewItemDark + + def open_level_edit_dialog(self, index): + levelname = self.table.item(index.row(), 1).data(Qt.DisplayRole) + level = self.levels[levelname] + d = LevelEditDialog(self, level) + d.setWindowModality(Qt.NonModal) + d.setWindowTitle('Level editor') + d.level_changed.connect(self.update_output) + d.open() + + def open_menu(self, position): + menu = QMenu(self) + + preset_menu = menu.addMenu('Presets') + preset_menu.addAction('New preset', self.new_preset_dialog) + preset_menu.addSeparator() + + preset_names = CONFIG.get_levels_presets() + + if len(preset_names) == 0: + action = preset_menu.addAction('No presets') + action.setEnabled(False) + else: + delete_menu = menu.addMenu('Delete preset') + for name in preset_names: + preset_menu.addAction(name, partial(self.load_preset, name)) + delete_menu.addAction(name, partial(self.delete_preset, name)) + + menu.addSeparator() + menu.addAction('New level...', self.create_new_level_dialog) + + if len(self.table.selectedIndexes()) > 0: + menu.addAction('Delete selected', self.delete_selected) + + menu.popup(self.table.viewport().mapToGlobal(position)) + + def load_preset(self, name): + new_levels = CONFIG.load_levels_preset(name) + if not new_levels: + return + + self.levels = new_levels + self.preset_name = name + self.update_output() + + def delete_preset(self, name): + CONFIG.delete_levels_preset(name) + if name == self.preset_name: + self.reset() + + def delete_selected(self): + selected = self.table.selectionModel().selectedRows() + for index in selected: + item = self.table.item(index.row(), 1) + del self.levels[item.text()] + self.update_output() + + def new_preset_dialog(self): + d = QInputDialog(self) + d.setLabelText('Enter the new name for the new preset:') + d.setWindowTitle('Create new preset') + d.textValueSelected.connect(self.create_new_preset) + d.open() + + def create_new_preset(self, name): + if name in CONFIG.get_levels_presets(): + show_warning_dialog(self, "Preset creation error", + 'Preset named "{}" already exists.'.format(name)) + return + if len(name.strip()) == 0: + show_warning_dialog(self, "Preset creation error", + 'This preset name is not allowed.'.format(name)) + return + + self.preset_name = name + self.update_output() + CONFIG.save_levels_preset(name, self.levels) + + def create_new_level_dialog(self): + d = LevelEditDialog(self, creating_new_level=True, level_names=self.levels.keys()) + d.setWindowModality(Qt.NonModal) + d.setWindowTitle('Level editor') + d.level_changed.connect(self.level_changed) + d.open() + + def level_changed(self, level): + if level.levelname in self.levels: + self.levels.copy_from(level) + else: + self.levels[level.levelname] = level + self.update_output() + + def accept(self): + for i, _ in enumerate(self.levels): + checkbox = self.table.cellWidget(i, 0).children()[1] + levelname = self.table.item(i, 1).text() + self.levels[levelname].enabled = checkbox.isChecked() + self.levels_changed.emit(self.preset_name, + self.setAsDefaultCheckbox.isChecked(), + self.levels) + self.done(0) + + def reject(self): + self.done(0) + + def reset(self): + for levelname, level in self.levels.items(): + level.copy_from(get_default_level(levelname)) + self.update_output() diff --git a/cutelog/listener.py b/cutelog/listener.py index dedac90..f05fafd 100644 --- a/cutelog/listener.py +++ b/cutelog/listener.py @@ -1,41 +1,41 @@ -import logging -import struct +import json import pickle +import struct import time -from PyQt5.QtNetwork import QTcpServer, QTcpSocket, QHostAddress -from PyQt5.QtCore import QThread, pyqtSignal +from qtpy.QtCore import QThread, Signal +from qtpy.QtNetwork import QHostAddress, QTcpServer, QTcpSocket +from .config import CONFIG, MSGPACK_SUPPORT, CBOR_SUPPORT +from .logger_tab import LogRecord from .utils import show_critical_dialog -from .config import CONFIG class LogServer(QTcpServer): - def __init__(self, main_window, on_connection, log, stop_signal): - super().__init__() + def __init__(self, main_window, on_connection, log): + super().__init__(main_window) self.log = log.getChild('TCP') self.log.info('Initializing') self.main_window = main_window self.on_connection = on_connection - self.stop_signal = stop_signal self.host, self.port = CONFIG.listen_address self.host = QHostAddress(self.host) self.benchmark = CONFIG['benchmark'] + self.conn_count = 0 self.threads = [] - self.connections = 0 def start(self): self.log.info('Starting the server') if self.benchmark: self.log.debug('Starting a benchmark connection') - new_conn = BenchmarkConnection(self, None, "benchmark", self.stop_signal, self.log) + new_conn = BenchmarkConnection(self, None, "benchmark", self.log) new_conn.finished.connect(new_conn.deleteLater) new_conn.connection_finished.connect(self.cleanup_connection) - self.on_connection(new_conn, "benchmark") + self.on_connection(new_conn, -1) self.threads.append(new_conn) new_conn.start() @@ -48,70 +48,81 @@ def start(self): self.main_window.set_status('Server is listening on {}...'.format(address)) def incomingConnection(self, socketDescriptor): - self.connections += 1 - name = 'Logger {}'.format(self.connections) - self.log.info('New connection: "{}"'.format(name)) - new_conn = LogConnection(self, socketDescriptor, name, self.stop_signal, self.log) + self.conn_count += 1 + conn_id = str(self.conn_count) + self.log.info('New connection id={}'.format(conn_id)) + new_conn = LogConnection(self, socketDescriptor, conn_id, self.log) - self.on_connection(new_conn, name) + self.on_connection(new_conn, conn_id) + new_conn.setObjectName(conn_id) new_conn.finished.connect(new_conn.deleteLater) new_conn.connection_finished.connect(self.cleanup_connection) new_conn.start() self.threads.append(new_conn) - def close_server(self, wait=True): + def close_server(self): self.log.debug('Closing the server') self.main_window.set_status('Stopping the server...') self.close() - if wait: - self.wait_connections_stopped() + for thread in self.threads.copy(): + thread.requestInterruption() + self.wait_connections_stopped() self.main_window.set_status('Server has stopped') def wait_connections_stopped(self): self.log.debug('Waiting for {} connections threads to stop'.format(len(self.threads))) - to_wait = self.threads.copy() # to protect against changes during iteration - for thread in to_wait: + for thread in self.threads.copy(): try: - if not thread.wait(1000): - self.log.error('Thread "{}" didn\'t stop in time, terminating'.format(thread)) - thread.terminate() - self.log.error('Thread "{}" terminated'.format(thread)) + if not thread.wait(1500): + # @Hmm: sometimes wait() complains about QThread waiting on itself + self.log.debug("Thread \"{}\" didn't stop in time, exiting".format(thread)) + return except RuntimeError: # happens when thread has been deleted before we got to it self.log.debug('Thread {} has been deleted already'.format(thread)) - self.log.debug('All connections stopped') + self.log.debug('Waiting for connections has stopped') def cleanup_connection(self, connection): try: self.threads.remove(connection) - except Exception as e: + except Exception: self.log.error('Double delete on connection: {}'.format(connection), exc_info=True) - # import pdb; pdb.set_trace() + return class LogConnection(QThread): - new_record = pyqtSignal(logging.LogRecord) - connection_finished = pyqtSignal(object) + new_record = Signal(LogRecord) + connection_finished = Signal(object) + internal_prefix = b"!!cutelog!!" - def __init__(self, parent, socketDescriptor, name, stop_signal, log): + def __init__(self, parent, socketDescriptor, conn_id, log): super().__init__(parent) - self.log = log.getChild(name) + self.log = log.getChild(conn_id) self.socketDescriptor = socketDescriptor - self.name = name - self.stop_signal = stop_signal + self.conn_id = conn_id self.tab_closed = False # used to stop the connection from a "parent" logger + self.setup_serializers() def __repr__(self): - # return "{}(name={}, socketDescriptor={})".format(self.__class__.__name__, self.name, - # self.socketDescriptor) - return "{}(name={})".format(self.__class__.__name__, self.name) + return "{}(id={})".format(self.__class__.__name__, self.conn_id) + + def setup_serializers(self): + self.serializers = {'pickle': pickle.loads, 'json': json.loads} + if MSGPACK_SUPPORT: + import msgpack + from functools import partial + self.serializers['msgpack'] = partial(msgpack.loads, raw=False) + if CBOR_SUPPORT: + import cbor + self.serializers['cbor'] = cbor.loads + self.deserialize = self.serializers[CONFIG['default_serialization_format']] def run(self): - self.log.debug('Connection "{}" is starting'.format(self.name)) + self.log.debug('Connection id={} is starting'.format(self.conn_id)) def wait_and_read(n_bytes): """ - Convinience function that simplifies reading and checking for stop events, etc. + Convenience function that simplifies reading and checking for stop events, etc. Returns a byte string of length n_bytes or None if socket needs to be closed. """ @@ -124,7 +135,11 @@ def wait_and_read(n_bytes): return None else: continue + if self.need_to_stop(): + return None new_data = sock.read(n_bytes - len(data)) + if type(new_data) != bytes: + new_data = new_data.data() data += new_data return data @@ -142,34 +157,65 @@ def wait_and_read(n_bytes): if not data: break + if data.startswith(self.internal_prefix): + self.handle_internal_command(data) + continue + try: - data = pickle.loads(data) - record = logging.makeLogRecord(data) - except Exception as e: + logDict = self.deserialize(data) + record = LogRecord(logDict) + except Exception: self.log.error('Creating log record failed', exc_info=True) continue self.new_record.emit(record) - self.log.debug('Connection "{}" is stopping'.format(self.name)) + self.log.debug('Connection id={} is stopping'.format(self.conn_id)) sock.disconnectFromHost() sock.close() self.connection_finished.emit(self) - self.log.debug('Connection "{}" has stopped'.format(self.name)) + self.log.debug('Connection id={} has stopped'.format(self.conn_id)) def need_to_stop(self): - return any([self.stop_signal.is_set(), self.tab_closed]) + return any([self.tab_closed, self.isInterruptionRequested()]) + + def handle_internal_command(self, data): + """ + Used for managing listener options from non-Python clients. + Command data must start with a special prefix (see self.internal_prefix), + followed by a command in a key=value format. + + Supported commands: + format - changes the serialization format to one specified in + self.serializers[value]. pickle and json are supported out of the box + Example: format=json + """ + try: + data = data[len(self.internal_prefix):].decode('utf-8') + cmd, value = data.split("=", 1) + except Exception: + self.log.error('Internal request decoding failed', exc_info=True) + return + self.log.debug('Handling internal cmd="{}", value="{}"'.format(cmd, value)) + if cmd == 'format': + if value in self.serializers: + self.log.debug('Changing serialization format to "{}"'.format(value)) + self.deserialize = self.serializers[value] + else: + self.log.error('Serialization format "{}" is not supported'.format(value)) class BenchmarkConnection(LogConnection): def run(self): + import random test_levels = [(10, 'DEBUG'), (20, 'INFO'), (30, 'WARNING'), (40, 'ERROR'), (50, 'CRITICAL'), (21, 'REQ')] + test_names = ['CL', 'CL.Test1', 'CL.Test1.Test2', 'CL.Test3' + 'hey', 'hey.hi.hello', 'CL.Test3.Test4.Test5'] # dummy log item d = {'args': None, 'created': 0, 'exc_info': None, - 'exc_text': 'exception test', 'filename': 'test.py', 'funcName': 'test_func', 'levelname': 'DEBUG', @@ -187,20 +233,51 @@ def run(self): 'thread': 140062538003776, 'threadName': 'MainThread', 'extra_column': 'hey there'} + d = {} c = 0 while True: if self.need_to_stop(): break - d['msg'] = "hey {}".format(c) + dd = d.copy() + dd['msg'] = "msg {}".format(c) + dd['name'] = random.choice(test_names) t = time.time() - d['created'] = t - d['msecs'] = t % 1 * 1000 + dd['created'] = t level_index = c % len(test_levels) - d['levelno'] = test_levels[level_index][0] - d['levelname'] = test_levels[level_index][1] - r = logging.makeLogRecord(d) + dd['levelname'] = test_levels[level_index][1] + if dd['levelname'] == "CRITICAL": + dd['exc_text'] = 'exception test' + + for i in range(random.randrange(6)): + dd[str(i) + "f"] = random.randrange(256) + r = LogRecord(dd) self.new_record.emit(r) c += 1 time.sleep(CONFIG.benchmark_interval) self.connection_finished.emit(self) - self.log.debug('Connection "{}" has stopped'.format(self.name)) + self.log.debug('Connection id={} has stopped'.format(self.conn_id)) + + +class BenchmarkMonitor(QThread): + speed_readout = Signal(str) + + def __init__(self, main_window, logger): + super().__init__(main_window) + self.logger = logger + + def run(self): + import time + readouts = [] + while True: + if self.isInterruptionRequested(): + break + time.sleep(0.5) + readouts.append(self.logger.monitor_count) + average = int(sum(readouts) / len(readouts)) * 2 + status = "{} rows/s, average: {} rows/s".format(self.logger.monitor_count * 2, average) + if self.logger.monitor_count == 0: + continue + self.speed_readout.emit(status) + print(status, average) + self.logger.monitor_count = 0 + print('Result:', int(sum(readouts) / len(readouts)) * 2, 'average') diff --git a/cutelog/log_levels.py b/cutelog/log_levels.py index 273fc32..47e1c2e 100644 --- a/cutelog/log_levels.py +++ b/cutelog/log_levels.py @@ -1,15 +1,18 @@ +import json from copy import deepcopy -from PyQt5.QtGui import QColor +from qtpy.QtGui import QColor -# from .config import CONFIG +from .config import CONFIG class LogLevel: - def __init__(self, levelno, levelname, enabled=True, - fg=None, bg=None, - fgDark=None, bgDark=None, styles=set(), stylesDark=None): - self.levelno = levelno + def __init__(self, levelname, enabled=True, fg=None, bg=None, + fgDark=None, bgDark=None, styles=set(), stylesDark=None, load=None): + if load: + self.loads(load) + return + self.levelname = levelname self.enabled = enabled @@ -19,8 +22,6 @@ def __init__(self, levelno, levelname, enabled=True, else: self.stylesDark = stylesDark - self.msg_count = 0 # @MaybeDelete: is this necessary? - if not fg: self.fg = QColor(0, 0, 0) else: @@ -39,57 +40,82 @@ def __init__(self, levelno, levelname, enabled=True, else: self.bgDark = bgDark - def set_enabled(self, value): - self.enabled = value + def set_enabled(self, enabled): + self.enabled = enabled - def copy_level(self, other_level): + def copy_from(self, other_level): for attr in self.__dict__: - if attr in ['levelno', 'levelname', 'msg_count', 'enabled']: + if attr in ['levelname']: continue self.__dict__[attr] = deepcopy(other_level.__dict__[attr]) + def dumps(self): + d = deepcopy(self.__dict__) + d['styles'] = list(d['styles']) + d['stylesDark'] = list(d['stylesDark']) + d['fg'], d['fgDark'] = d['fg'].name(), d['fgDark'].name() + d['bg'], d['bgDark'] = d['bg'].name(), d['bgDark'].name() + return json.dumps(d, ensure_ascii=False, separators=(',', ':')) + + def loads(self, string): + self.__dict__ = json.loads(string) + self.styles = set(self.styles) + self.stylesDark = set(self.stylesDark) + self.fg, self.fgDark = QColor(self.fg), QColor(self.fgDark) + self.bg, self.bgDark = QColor(self.bg), QColor(self.bgDark) + return self + def __repr__(self): - return "{}(levelname={}, "\ - "levelno={}, enabled={})".format(self.__class.__name__, self.levelname, - self.levelno, self.enabled) + return "{}(levelname={}, enabled={})".format(self.__class__.__name__, self.levelname, + self.enabled) DEFAULT_LEVELS = \ { - 50: LogLevel(50, 'CRITICAL', fg=QColor(255, 0, 0), bg=QColor(0, 0, 0), - fgDark=QColor(255, 0, 0), styles={'bold'}), - 40: LogLevel(40, 'ERROR', bg=QColor(255, 190, 190), fgDark=QColor(255, 169, 169)), - 30: LogLevel(30, 'WARNING', bg=QColor(255, 255, 180), fgDark=QColor(255, 255, 129)), - 20: LogLevel(20, 'INFO', bg=QColor(200, 255, 200), fgDark=QColor(169, 255, 169)), - 10: LogLevel(10, 'DEBUG', fg=QColor(145, 145, 145), fgDark=QColor(169, 169, 169)), + 'DEBUG': LogLevel('DEBUG', fg=QColor(145, 145, 145), fgDark=QColor(169, 169, 169)), + 'INFO': LogLevel('INFO', bg=QColor(200, 255, 200), fgDark=QColor(169, 255, 169)), + 'WARNING': LogLevel('WARNING', bg=QColor(255, 255, 180), fgDark=QColor(255, 255, 129)), + 'ERROR': LogLevel('ERROR', bg=QColor(255, 190, 190), fgDark=QColor(255, 169, 169)), + 'CRITICAL': LogLevel('CRITICAL', fg=QColor(255, 0, 0), bg=QColor(0, 0, 0), + fgDark=QColor(255, 0, 0), styles={'bold'}), } +NO_LEVEL = LogLevel("NO_LEVEL") -class LevelFilter: - def __init__(self): - self.levels = deepcopy(DEFAULT_LEVELS) - self.all_pass = False - - def add_level(self, level): - self.levels[level.levelno] = level - - def enable_level(self, level): - self.numbers.add(level) - def disable_level(self, level): - try: - self.numbers.remove(level) - except KeyError: - pass +def get_default_level(name): + if name in DEFAULT_LEVELS: + return DEFAULT_LEVELS[name] + # some Go compat + elif name in ('FATAL', 'PANIC'): + return DEFAULT_LEVELS['CRITICAL'] + elif name == 'WARN': + return DEFAULT_LEVELS['WARNING'] + else: + return NO_LEVEL - def set_all_pass(self, value): - self.all_pass = value - def __contains__(self, levelno): - if self.all_pass or levelno is None: +class LevelFilter: + def __init__(self): + self.preset_name = CONFIG['default_levels_preset'] + self.levels = CONFIG.load_levels_preset(self.preset_name) + if not self.levels: + self.levels = deepcopy(DEFAULT_LEVELS) + + def set_level(self, level): + self.levels[level.levelname] = level + + def merge_with(self, new_levels): + # This is done because self.levels gets passed to other things. + # I'm lazy, so lets just modify it inplace instead. + self.levels.clear() + self.levels.update(new_levels) + + def __contains__(self, levelname): + if levelname is None: return True - level = self.levels.get(levelno) + level = self.levels.get(levelname) if level and level.enabled: return True diff --git a/cutelog/logger_tab.py b/cutelog/logger_tab.py index 0e2016e..c5fc9fd 100644 --- a/cutelog/logger_tab.py +++ b/cutelog/logger_tab.py @@ -1,25 +1,20 @@ -# import time -import asyncio -import logging from collections import deque +from datetime import datetime from functools import partial -from PyQt5 import uic -from PyQt5.QtCore import (QAbstractItemModel, QAbstractTableModel, QEvent, - QModelIndex, QSortFilterProxyModel, Qt) -from PyQt5.QtGui import QBrush, QColor, QFont -from PyQt5.QtWidgets import (QCheckBox, QHBoxLayout, QMenu, QShortcut, QStyle, - QTableWidgetItem, QWidget) +from qtpy.QtCore import (QAbstractItemModel, QAbstractTableModel, QEvent, + QModelIndex, QSize, QSortFilterProxyModel, Qt) +from qtpy.QtGui import QBrush, QColor, QFont +from qtpy.QtWidgets import (QCheckBox, QHBoxLayout, QMenu, QShortcut, QStyle, + QTableWidgetItem, QWidget) from .config import CONFIG, Exc_Indication from .level_edit_dialog import LevelEditDialog -from .log_levels import LevelFilter, LogLevel +from .levels_preset_dialog import LevelsPresetDialog +from .log_levels import NO_LEVEL, LevelFilter, LogLevel, get_default_level from .logger_table_header import HeaderEditDialog, LoggerTableHeader from .text_view_dialog import TextViewDialog - -uif = CONFIG.get_ui_qfile('logger.ui') -LoggerTabBase = uic.loadUiType(uif) -uif.close() +from .utils import loadUi INVALID_INDEX = QModelIndex() SearchRole = 256 @@ -47,6 +42,9 @@ def row(self): else: return 0 + def is_descendant_of(self, node_path): + return self.path.startswith(node_path + '.') + def __repr__(self): return "{}(name={}, path={})".format(self.__class__.__name__, self.name, self.path) @@ -56,6 +54,7 @@ def __init__(self, parent=None): super().__init__(parent) self.root = TreeNode(None, '') self.registry = {'': self.root} + self.selected_nodes = set() def data(self, index, role=Qt.DisplayRole): if not index.isValid(): @@ -124,6 +123,60 @@ def columnCount(self, parent=None): def headerData(self, column, orientation, role): return None + def selection_changed(self, selected, deselected): + for item in selected.indexes(): + self.selected_nodes.add(item.internalPointer()) + for item in deselected.indexes(): + self.selected_nodes.remove(item.internalPointer()) + + +class LogRecord: + """ + This is a simple replacement for logging.LogRecord to support non-Python logging. + It's used to avoid creation of useless fields that logging.makeLogRecord produces, + as well as imitate some of its behavior. + """ + def __init__(self, logDict): + # this is what logging.Formatter (for asctime) did previously, but it didn't delete "msg" + self.message = logDict.get("message") + if self.message is None: + self.message = logDict.get("msg") + + # copying level field to levelname, if it doesn't exits already + self.levelname = logDict.get("levelname") + if self.levelname is None: + self.levelname = logDict.get("level") + if self.levelname is not None: + self.levelname = self.levelname.upper() + + self.created = logDict.get("created") + if self.created is None: + self.created = logDict.get("time") + if self.created is None or type(self.created) not in (int, float): + self.created = datetime.now().timestamp() + + self._logDict = logDict + self.generate_asctime() + + def __getattr__(self, name): + try: + return self.__dict__[name] + except Exception: + return self._logDict.get(name) + + def __repr__(self): + return str(self._logDict) + + def generate_asctime(self): + fmt = CONFIG['time_format_string'] + if fmt: + try: + self.asctime = datetime.fromtimestamp(self.created).strftime(fmt) + except Exception: + self.asctime = datetime.now().strftime(fmt) + else: + self.asctime = self.created + class LogRecordModel(QAbstractTableModel): @@ -133,11 +186,10 @@ def __init__(self, parent, levels, header, max_capacity=0): self.levels = levels self.records = deque() self.font = parent.font() - self.date_formatter = logging.Formatter('%(asctime)s') # to format unix timestamp as a date self.dark_theme = False self.max_capacity = max_capacity self.table_header = header - self.table_header.table_model = self # this is probably bad software practice + self.extra_mode = CONFIG['extra_mode_default'] def columnCount(self, index): return self.table_header.column_count @@ -153,26 +205,31 @@ def data(self, index, role=Qt.DisplayRole): record = self.records[index.row()] if getattr(record, '_cutelog', False): return self.data_internal(index, record, role) - level = self.levels[record.levelno] if role == Qt.DisplayRole: - column = self.table_header[index.column()] - result = getattr(record, column.name, None) + column_name = self.table_header[index.column()].name + if self.extra_mode and column_name == "message": + result = self.get_extra(record.message, record) + else: + result = getattr(record, column_name, None) + elif role == Qt.SizeHintRole: + if self.extra_mode and self.table_header[index.column()].name == 'message': + return QSize(1, CONFIG.logger_row_height * + (1 + len(self.get_fields_for_extra(record)))) + else: + return QSize(1, CONFIG.logger_row_height) elif role == Qt.DecorationRole: - if self.headerData(index.column()) == 'Message': + if self.table_header[index.column()].name == 'message': if record.exc_text: mode = CONFIG['exception_indication'] should = mode in (Exc_Indication.MSG_ICON, Exc_Indication.ICON_AND_RED_BG) if should: result = self.parent_widget.style().standardIcon(QStyle.SP_BrowserStop) elif role == Qt.FontRole: - result = None + level = self.levels.get(record.levelname, NO_LEVEL) styles = level.styles if not self.dark_theme else level.stylesDark - # although there is a more efficient way of doing this, - # this is as fast as QFont(self.font) result = QFont(CONFIG.logger_table_font, CONFIG.logger_table_font_size) if styles: - # result = QFont(self.font) if 'bold' in styles: result.setBold(True) if 'italic' in styles: @@ -180,6 +237,7 @@ def data(self, index, role=Qt.DisplayRole): if 'underline' in styles: result.setUnderline(True) elif role == Qt.ForegroundRole: + level = self.levels.get(record.levelname, NO_LEVEL) if not self.dark_theme: result = level.fg else: @@ -195,6 +253,7 @@ def data(self, index, role=Qt.DisplayRole): color = Qt.darkRed result = QBrush(color, Qt.DiagCrossPattern) return result + level = self.levels.get(record.levelname, NO_LEVEL) if not self.dark_theme: result = level.bg else: @@ -206,12 +265,14 @@ def data(self, index, role=Qt.DisplayRole): def data_internal(self, index, record, role): result = None if role == Qt.DisplayRole: - if index.column() == self.columnCount(INVALID_INDEX) - 1: # if last column + if index.column() == self.columnCount(INVALID_INDEX) - 1: result = record._cutelog else: column = self.table_header[index.column()] if column.name == 'asctime': result = record.asctime + elif role == Qt.SizeHintRole: + result = QSize(1, CONFIG.logger_row_height) elif role == Qt.FontRole: result = QFont(CONFIG.logger_table_font, CONFIG.logger_table_font_size) elif role == Qt.ForegroundRole: @@ -227,6 +288,17 @@ def data_internal(self, index, record, role): result = QBrush(color, Qt.BDiagPattern) return result + def get_fields_for_extra(self, record): + # this is a tiny bit slower than a set difference, but preserves order + return [field for field in record._logDict if field not in self.table_header.visible_names] + + def get_extra(self, msg, record): + fields = self.get_fields_for_extra(record) + result = ["{}={}".format(field, record._logDict[field]) for field in fields] + if msg is not None: + result.insert(0, msg) + return "\n".join(result) + def headerData(self, section, orientation=Qt.Horizontal, role=Qt.DisplayRole): result = None if orientation == Qt.Horizontal and role == Qt.DisplayRole: @@ -236,7 +308,6 @@ def headerData(self, section, orientation=Qt.Horizontal, role=Qt.DisplayRole): def add_record(self, record, internal=False): if not internal: self.trim_if_needed() - self.date_formatter.format(record) row = len(self.records) self.beginInsertRows(INVALID_INDEX, row, row) @@ -284,25 +355,26 @@ def get_record(self, pos): class RecordFilter(QSortFilterProxyModel): - def __init__(self, parent, namespace_tree, level_filter): + def __init__(self, parent, namespace_tree_model, level_filter): super().__init__(parent) - self.namespace_tree = namespace_tree + self.namespace_tree_model = namespace_tree_model self.level_filter = level_filter self.selection_includes_children = True self.search_filter = False + self.clear_filter() def filterAcceptsRow(self, sourceRow, sourceParent): record = self.sourceModel().get_record(sourceRow) - if record.levelno not in self.level_filter: + if record.levelname not in self.level_filter: return False else: result = True - tindexes = self.namespace_tree.selectedIndexes() - if len(tindexes) == 0: + selected_nodes = self.namespace_tree_model.selected_nodes + if len(selected_nodes) == 0: result = True else: - for tindex in tindexes: - path = tindex.internalPointer().path + for node in selected_nodes: + path = node.path if path == '': result = True break @@ -324,9 +396,10 @@ def filterAcceptsRow(self, sourceRow, sourceParent): result = False if result and self.search_filter: msg = record.message + if msg is None: + return False regexp = self.filterRegExp() if not regexp.isEmpty(): - # print(regexp.pattern()) return regexp.exactMatch(msg) else: if self.filterCaseSensitivity() == Qt.CaseInsensitive: @@ -390,33 +463,31 @@ def reset(self): self.endResetModel() def set_record(self, record): - record_dict = vars(record).copy() # copy to prevent editing the actual record - del record_dict['exc_text'] - del record_dict['exc_info'] + record_dict = record._logDict.copy() # copy to prevent editing the actual record self.record = tuple(record_dict.items()) self.reset() -class LoggerTab(*LoggerTabBase): - def __init__(self, parent, name, connection, log, loop, main_window): +class LoggerTab(QWidget): + def __init__(self, parent, name, connection, log, main_window): super().__init__(parent) self.log = log.getChild(name) self.log.debug('Starting a logger named {}'.format(name)) self.name = name self.main_window = main_window - self.loop = loop self.level_filter = LevelFilter() - self.level_filter.set_all_pass(False) self.filter_model_enabled = True self.detail_model = DetailTableModel() self.namespace_tree_model = LogNamespaceTreeModel() self.popped_out = False self.autoscroll = True self.scroll_max = 0 - self.record_count = 0 self.monitor_count = 0 # for monitoring - self.connections = [connection] + self.connections = [] + if connection is not None: + self.connections.append(connection) self.last_status_update_time = 0 + self.extra_mode = CONFIG['extra_mode_default'] self.search_bar_visible = CONFIG['search_open_default'] self.search_regex = CONFIG['search_regex_default'] @@ -425,18 +496,17 @@ def __init__(self, parent, name, connection, log, loop, main_window): self.search_start = 0 self.search_filter = False + self.setupUi() + self.setup_shortcuts() + self.setup_internal_connections() + self.set_columns_sizes() def setupUi(self): - super().setupUi(self) + self.ui = loadUi(CONFIG.get_ui_qfile('logger.ui'), baseinstance=self) self.table_header = LoggerTableHeader(self.loggerTable.horizontalHeader()) self.record_model = LogRecordModel(self, self.level_filter.levels, self.table_header) - self.createLevelButton.clicked.connect(self.create_level) - - self.loggerTable.setMouseTracking(False) - self.loggerTable.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) - self.loggerTable.verticalScrollBar().rangeChanged.connect(self.onRangeChanged) self.loggerTable.verticalScrollBar().valueChanged.connect(self.onScroll) self.loggerTable.setContextMenuPolicy(Qt.CustomContextMenu) @@ -447,12 +517,14 @@ def setupUi(self): self.loggerTable.verticalHeader().setDefaultSectionSize(CONFIG['logger_row_height']) self.namespaceTreeView.setModel(self.namespace_tree_model) - self.namespaceTreeView.selectionModel().selectionChanged.connect(self.reset_master) self.namespaceTreeView.setContextMenuPolicy(Qt.CustomContextMenu) self.namespaceTreeView.customContextMenuRequested.connect(self.open_namespace_table_menu) + tree_sel_model = self.namespaceTreeView.selectionModel() + tree_sel_model.selectionChanged.connect(self.namespace_tree_model.selection_changed) + tree_sel_model.selectionChanged.connect(self.tree_selection_changed) self.namespace_tree_model.rowsInserted.connect(self.on_tree_rows_inserted) - for levelno, level in self.level_filter.levels.items(): + for levelname, level in self.level_filter.levels.items(): self.add_level_to_table(level) self.levelsTable.doubleClicked.connect(self.level_double_clicked) self.levelsTable.installEventFilter(self) @@ -460,7 +532,7 @@ def setupUi(self): self.levelsTable.customContextMenuRequested.connect(self.open_levels_table_menu) if self.filter_model_enabled: - self.filter_model = RecordFilter(self, self.namespaceTreeView, self.level_filter) + self.filter_model = RecordFilter(self, self.namespace_tree_model, self.level_filter) self.filter_model.setSourceModel(self.record_model) self.loggerTable.setModel(self.filter_model) else: @@ -471,11 +543,28 @@ def setupUi(self): self.table_header_view = header = self.loggerTable.horizontalHeader() header.setStretchLastSection(True) - # header.sectionResized.connect(self.table_header.column_resized) + self.loggerTable.resizeColumnsToContents() header.viewport().installEventFilter(self.table_header) # read the docstring header.setContextMenuPolicy(Qt.CustomContextMenu) header.customContextMenuRequested.connect(self.open_header_menu) + self.searchLine.returnPressed.connect(self.search_down) + self.searchDownButton.clicked.connect(self.search_down) + self.searchDownButton.setMenu(self.setup_search_button_menu()) + + self.searchWidget.setVisible(self.search_bar_visible) + self.filterButton.clicked.connect(self.filter_or_clear) + self.filterButton.setToolTip('Adheres to the same settings as the search') + + def setup_shortcuts(self): + self.searchSC_Home = QShortcut('Home', self) + self.searchSC_Home.activated.connect(partial(self.loggerTable.selectRow, 0)) + self.searchSC_Home.setAutoRepeat(False) + + self.searchSC_End = QShortcut('End', self) + self.searchSC_End.activated.connect(self.select_last_row) + self.searchSC_End.setAutoRepeat(False) + self.searchSC = QShortcut('Ctrl+F', self) self.searchSC.activated.connect(self.toggle_search) self.searchSC.setAutoRepeat(False) @@ -488,37 +577,32 @@ def setupUi(self): self.searchSC_Esc.activated.connect(partial(self.set_search_visible, False)) self.searchSC_Esc.setAutoRepeat(False) - self.searchLine.returnPressed.connect(self.search_down) - self.searchDownButton.clicked.connect(self.search_down) - self.searchDownButton.setMenu(self.setup_search_button_menu()) - - self.searchWidget.setVisible(self.search_bar_visible) - self.filterButton.clicked.connect(self.filter_or_clear) - self.filterButton.setToolTip('Adheres to the same settings as the search') - - # @NextVersion: make this happen - self.createLevelButton.setVisible(False) - self.presetsButton.setVisible(False) - - self.setup_internal_connections() - self.set_columns_sizes() - def setup_search_button_menu(self): smenu = QMenu(self.searchDownButton) action_regex = smenu.addAction('Regex') action_regex.setCheckable(True) action_regex.setChecked(self.search_regex) - action_regex.triggered.connect(partial(setattr, self, 'search_regex')) + # PySide2 doesn't like functools.partial(setattr, ...) + action_regex.triggered.connect(self.set_search_regex) action_case = smenu.addAction('Case sensitive') action_case.setCheckable(True) action_case.setChecked(self.search_casesensitive) - action_case.triggered.connect(partial(setattr, self, 'search_casesensitive')) + action_case.triggered.connect(self.set_search_casesensitive) action_wild = smenu.addAction('Wildcard') action_wild.setCheckable(True) action_wild.setChecked(self.search_wildcard) - action_wild.triggered.connect(partial(setattr, self, 'search_wildcard')) + action_wild.triggered.connect(self.set_search_wildcard) return smenu + def set_search_regex(self, enabled): + self.search_regex = enabled + + def set_search_casesensitive(self, enabled): + self.search_casesensitive = enabled + + def set_search_wildcard(self, enabled): + self.search_wildcard = enabled + def setup_internal_connections(self): CONFIG.row_height_changed.connect(self.row_height_changed) @@ -532,13 +616,12 @@ def filter_or_clear(self): else: self.filterButton.setText('Filter') self.filter_model.clear_filter() + self.invalidate_filter(resize_rows=True) def set_columns_sizes(self): - # self.table_header.ignore_resizing = True cols = self.table_header.visible_columns for i, col in enumerate(cols): self.table_header_view.resizeSection(i, col.width) - # self.table_header.ignore_resizing = False def set_max_capacity(self, max_capacity): self.record_model.max_capacity = max_capacity @@ -557,7 +640,7 @@ def toggle_selected_levels(self): if index.column() == 0: checkbox = self.levelsTable.cellWidget(index.row(), index.column()).children()[1] checkbox.toggle() - self.reset_master() + self.invalidate_filter(resize_rows=True) def search_down(self): start = self.filter_model.index(self.search_start, 0, INVALID_INDEX) @@ -591,6 +674,10 @@ def search_down_or_close(self): self.search_down() def set_search_visible(self, visible): + # these 2 lines are for clearing selection when you press Esc with the search bar hidden + if not self.search_bar_visible and not visible: + self.loggerTable.clearSelection() + self.search_bar_visible = visible self.searchWidget.setVisible(self.search_bar_visible) if self.search_bar_visible: @@ -599,26 +686,25 @@ def set_search_visible(self, visible): self.searchLine.clear() def toggle_search(self): - self.search_bar_visible = not self.search_bar_visible - self.set_search_visible(self.search_bar_visible) + self.set_search_visible(not self.search_bar_visible) def on_record(self, record): - level = self.process_level(record.levelno, record.levelname) - record.levelname = level.levelname + levelname = record.levelname + if levelname: + self.process_level(levelname) self.record_model.add_record(record) - if self.autoscroll: - self.loggerTable.scrollToBottom() - self.register_logger(record.name) - self.record_count += 1 + if record.name: + self.register_logger(record.name) self.monitor_count += 1 - def add_conn_closed_record(self, conn): - d = {'_cutelog': 'Connection "{}" closed'.format(conn.name)} - record = logging.makeLogRecord(d) - self.record_model.add_record(record) + self.loggerTable.resizeRowToContents(self.filter_model.rowCount() - 1) if self.autoscroll: self.loggerTable.scrollToBottom() + def add_conn_closed_record(self, conn): + record = LogRecord({'_cutelog': 'Connection {} closed'.format(conn.conn_id)}) + self.on_record(record) + def get_record(self, index): if self.filter_model_enabled: source_index = self.filter_model.mapToSource(index) @@ -630,13 +716,14 @@ def get_record(self, index): def register_logger(self, name): self.namespace_tree_model.register_logger(name) - def process_level(self, levelno, levelname): - level = self.level_filter.levels.get(levelno) + def process_level(self, levelname): + levelname = levelname.upper() + level = self.level_filter.levels.get(levelname) if level: - level.msg_count += 1 return level - new_level = LogLevel(levelno, levelname) - self.level_filter.add_level(new_level) + new_level = LogLevel(levelname) + new_level.copy_from(get_default_level(levelname)) + self.level_filter.set_level(new_level) self.add_level_to_table(new_level) return new_level @@ -644,27 +731,24 @@ def add_level_to_table(self, level): row_count = self.levelsTable.rowCount() self.levelsTable.setRowCount(row_count + 1) + checkbox_widget = QWidget(self.levelsTable) + checkbox_widget.setStyleSheet("QWidget { background-color:none;}") + checkbox = QCheckBox() checkbox.setStyleSheet("QCheckBox::indicator { width: 15px; height: 15px;}") - checkbox.toggle() + checkbox.setChecked(level.enabled) checkbox.clicked.connect(level.set_enabled) - checkbox.clicked.connect(self.reset_master) + checkbox.clicked.connect(self.level_show_changed) checkbox.toggled.connect(level.set_enabled) checkbox_layout = QHBoxLayout() checkbox_layout.setAlignment(Qt.AlignCenter) checkbox_layout.setContentsMargins(0, 0, 0, 0) checkbox_layout.addWidget(checkbox) - - checkbox_widget = QWidget() checkbox_widget.setLayout(checkbox_layout) - checkbox_widget.setStyleSheet("QWidget { background-color:none;}") self.levelsTable.setCellWidget(row_count, 0, checkbox_widget) - self.levelsTable.setItem(row_count, 1, QTableWidgetItem(str(level.levelno))) - self.levelsTable.setItem(row_count, 2, QTableWidgetItem(level.levelname)) - - self.levelsTable.sortItems(1, Qt.SortOrder(Qt.AscendingOrder)) + self.levelsTable.setItem(row_count, 1, QTableWidgetItem(level.levelname)) self.levelsTable.resizeColumnToContents(1) def open_namespace_table_menu(self, position): @@ -674,13 +758,13 @@ def open_namespace_table_menu(self, position): if self.filter_model_enabled: include_children_action.setChecked(self.filter_model.selection_includes_children) else: - include_children_action.set_enabled(False) + include_children_action.setEnabled(False) include_children_action.triggered.connect(self.toggle_selection_includes_children) menu.popup(self.namespaceTreeView.viewport().mapToGlobal(position)) def toggle_selection_includes_children(self, val): self.filter_model.selection_includes_children = val - self.reset_master() + self.invalidate_filter(resize_rows=True) def open_levels_table_menu(self, position): menu = QMenu(self) @@ -689,8 +773,11 @@ def open_levels_table_menu(self, position): disable_all_action = menu.addAction("Disable all") disable_all_action.triggered.connect(self.disable_all_levels) menu.addSeparator() - edit_action = menu.addAction("Edit selected level") - edit_action.triggered.connect(self.open_edit_level_dialog) + if self.levelsTable.selectedIndexes(): + edit_action = menu.addAction("Edit selected level") + edit_action.triggered.connect(self.open_level_edit_dialog) + presets_dialog_action = menu.addAction("Presets") + presets_dialog_action.triggered.connect(self.open_levels_preset_dialog) menu.popup(self.levelsTable.viewport().mapToGlobal(position)) def open_logger_table_menu(self, position): @@ -715,9 +802,6 @@ def open_header_menu(self, position): menu = QMenu(self) customize_header = menu.addAction("Customize header") customize_header.triggered.connect(self.open_header_dialog) - reset_header_action = menu.addAction("Reset header") - reset_header_action.triggered.connect(self.table_header.reset_columns) - reset_header_action.triggered.connect(self.set_columns_sizes) menu.popup(self.table_header_view.viewport().mapToGlobal(position)) def open_header_dialog(self): @@ -730,15 +814,24 @@ def header_changed(self, preset_name, set_as_default, columns): self.table_header.preset_name = preset_name if set_as_default: CONFIG.set_option('default_header_preset', preset_name) + CONFIG.save_header_preset(preset_name, columns) self.table_header.replace_columns(columns) + self.record_model.modelReset.emit() self.set_columns_sizes() + if self.extra_mode: + self.loggerTable.resizeRowsToContents() def merge_with_records(self, new_records): self.record_model.merge_with_records(new_records) for record in new_records: - self.register_logger(record.name) - level = self.process_level(record.levelno, record.levelname) - record.levelname = level.levelname + if record._cutelog is not None: + continue + if record.name: + self.register_logger(record.name) + if record.levelname: + level = self.process_level(record.levelname) + record.levelname = level.levelname + self.invalidate_filter(resize_rows=True) def update_detail(self, sel, desel): indexes = sel.indexes() @@ -762,50 +855,128 @@ def enable_all_levels(self): checkbox = self.levelsTable.cellWidget(row, 0).children()[1] if not checkbox.isChecked(): checkbox.setChecked(True) - self.reset_master() + self.level_show_changed(True) def disable_all_levels(self): for row in range(self.levelsTable.rowCount()): checkbox = self.levelsTable.cellWidget(row, 0).children()[1] if checkbox.isChecked(): checkbox.setChecked(False) - self.reset_master() + self.level_show_changed(False) + + def set_dark_theme(self, enabled): + self.record_model.dark_theme = enabled - def set_dark_theme(self, value): - self.record_model.dark_theme = value + def set_extra_mode(self, enabled): + self.extra_mode = enabled + self.record_model.extra_mode = enabled + self.loggerTable.resizeRowsToContents() def level_double_clicked(self, index): row, column = index.row(), index.column() if column == 0: # if you're clicking at the checkbox widget, just toggle it instead checkbox = self.levelsTable.cellWidget(row, column).children()[1] checkbox.toggle() - self.reset_master() + self.level_show_changed(checkbox.isChecked()) else: - self.open_edit_level_dialog(row) + self.open_level_edit_dialog(row) - def open_edit_level_dialog(self, row=None): + def open_level_edit_dialog(self, row=None): if not row: selected = self.levelsTable.selectedIndexes() if not selected: return row = selected[0].row() - levelno = self.levelsTable.item(row, 1).data(Qt.DisplayRole) - level = self.level_filter.levels[int(levelno)] + levelname = self.levelsTable.item(row, 1).data(Qt.DisplayRole) + level = self.level_filter.levels[levelname] d = LevelEditDialog(self.main_window, level) + d.level_changed.connect(self.level_changed) d.setWindowModality(Qt.NonModal) d.setWindowTitle('Level editor') d.open() - def create_level(self): - self.log.warn('Creating level') - d = LevelEditDialog(creating_new_level=True) - d.setWindowModality(Qt.NonModal) - d.setWindowTitle('Level editor') + def open_levels_preset_dialog(self): + preset_name = self.level_filter.preset_name + d = LevelsPresetDialog(self.main_window, preset_name, self.level_filter.levels) + d.levels_changed.connect(self.levels_changed) + d.setWindowTitle('Header editor') d.open() - def reset_master(self, sel=None, desel=None): - self.record_model.beginResetModel() - self.record_model.endResetModel() + def level_changed(self, level): + self.level_filter.set_level(level) + CONFIG.save_levels_preset(self.level_filter.preset_name, self.level_filter.levels) + + def levels_changed(self, preset_name, set_as_default, levels): + self.level_filter.preset_name = preset_name + if set_as_default: + CONFIG.set_option('default_levels_preset', preset_name) + self.level_filter.merge_with(levels) + self.regen_levels_table(self.level_filter.levels) + CONFIG.save_levels_preset(preset_name, levels) + self.invalidate_filter(resize_rows=True) + + def regen_levels_table(self, levels): + self.levelsTable.clearContents() + self.levelsTable.setRowCount(0) + for levelname in levels: + level = levels[levelname] + self.add_level_to_table(level) + + def tree_selection_changed(self, sel, desel): + # Problem: when RecordFilter un-hides a row, that row forgets its size. + # This creates major problems in extra mode. + # + # The obvious solution is to use ResizeToContents mode on the vertical + # header of the table and let Qt handle it. But it slows down insertions + # to a halt, but it also doesn't have any speed benefits of this approach. + # + # So, the second best solution is to force a resize only when rows can + # definitely reappear. The drawback is code bloat, the benefit is speed + # in certain cases + cur_sel = self.namespace_tree_model.selected_nodes + sel = [i.internalPointer() for i in sel.indexes()] + desel = [i.internalPointer() for i in desel.indexes()] + prev_sel = cur_sel.difference(sel) + prev_sel = prev_sel.union(desel) + # print('prev:', prev_sel) + # print('cur :', cur_sel) + + resize_rows = False + # empty filter, resizing needed + if len(cur_sel) == 0: + resize_rows = True + # filter can only converge, no resizing needed + elif len(prev_sel) == 0: + resize_rows = False + else: + # if selection includes children, and at least one currently + # selected node is not a descendant of a previously selected + # node, then resizing is needed + if self.filter_model.selection_includes_children: + for node in cur_sel: + if not any([node.is_descendant_of(pnode.path) for pnode in prev_sel]): + resize_rows = True + break + # if selection doesn't include children, records can re-appear + # when a currently selected node wasn't selected before + else: + for node in cur_sel: + if node not in prev_sel: + resize_rows = True + break + + self.log.debug('resize_rows = {}'.format(resize_rows)) + self.invalidate_filter(resize_rows=resize_rows) + + def level_show_changed(self, val): + # resize_rows is only needed when rows get un-hidden, because they forget their size + self.invalidate_filter(resize_rows=val) + + def invalidate_filter(self, resize_rows=True): + self.filter_model.invalidateFilter() + # resizeRowsToContents is very slow, so it's best to try to do it only when necessary + if resize_rows: + self.loggerTable.resizeRowsToContents() if self.autoscroll: self.loggerTable.scrollToBottom() @@ -845,23 +1016,16 @@ def remove_connection(self, connection): self.connections.remove(connection) self.add_conn_closed_record(connection) - def stop_all_connections(self): + def destroy(self): for conn in self.connections: conn.tab_closed = True + self.record_model.records.clear() def row_height_changed(self, new_height): + self.log.info("new height = {}".format(new_height)) self.loggerTable.verticalHeader().setDefaultSectionSize(new_height) + self.loggerTable.resizeRowsToContents() - async def monitor(self): - "Used only when benchmark parameter of LogServer is True" - records = [] - while True: - await asyncio.sleep(0.5) - status = "{} rows/s".format(self.monitor_count * 2) - if self.monitor_count == 0: - break - records.append(self.monitor_count) - print(status, int(sum(records) / len(records)) * 2, 'average') - self.main_window.set_status(status) - self.monitor_count = 0 - print('Result:', int(sum(records) / len(records)) * 2, 'average') + def select_last_row(self): + row = self.record_model.rowCount() + self.loggerTable.selectRow(row - 1) diff --git a/cutelog/logger_table_header.py b/cutelog/logger_table_header.py index 05d62e5..444516c 100644 --- a/cutelog/logger_table_header.py +++ b/cutelog/logger_table_header.py @@ -1,47 +1,50 @@ -import copy import json +from copy import deepcopy from functools import partial -from PyQt5.QtCore import QEvent, QObject, Qt, pyqtSignal -from PyQt5.QtWidgets import (QCheckBox, QDialog, QDialogButtonBox, - QInputDialog, QLabel, QLineEdit, QListWidget, - QListWidgetItem, QMenu, QVBoxLayout) +from qtpy.QtCore import QEvent, QObject, Qt, Signal +from qtpy.QtWidgets import (QCheckBox, QDialog, QDialogButtonBox, QInputDialog, + QLabel, QLineEdit, QListWidget, QListWidgetItem, + QMenu, QVBoxLayout) from .config import CONFIG from .utils import show_warning_dialog class Column: - def __init__(self, name=None, title=None, visible=True, width=50, load=None): - if load: - self.load_from_string(load) - else: - self.name = name - self.title = title - self.visible = visible - self.width = width - - def dump_to_string(self): + def __init__(self, name=None, title=None, visible=True, width=50): + self.name = name + self.title = title + self.visible = visible + self.width = width + + def dumps(self, width=None): + # So QHeaderView sucks. It's hard to make it do what humans expect. + # For that reason, the program has many tiny hacks around its behavior. + # One of those hacks: setting the width of the last column to a small + # value to help with resizing when header.stretchLastSection is True. + if width is None: + width = self.width d = {'name': self.name, 'title': self.title, - 'width': self.width, 'visible': self.visible} + 'width': width, 'visible': self.visible} return json.dumps(d, ensure_ascii=False, separators=(',', ':')) - def load_from_string(self, string): - d = json.loads(string) - self.name = d['name'] - self.title = d['title'] - self.visible = d['visible'] - self.width = int(d['width']) + def loads(self, string): + self.__dict__ = json.loads(string) + self.width = int(self.width) + return self def __repr__(self): - return "{}(name={}, title={})".format(self.__class__.__name__, self.name, self.title) + return "{}(name={}, title={}, width={})".format(self.__class__.__name__, self.name, + self.title, self.width) +# @Future: replace with dict when Python 3.6 becomes the minimum DEFAULT_COLUMNS = [ Column('asctime', 'Time', width=125), - Column('name', 'Logger name', width=80), + Column('name', 'Name', width=80), Column('levelname', 'Level', width=60), - Column('levelno', '#', width=22), + Column('levelno', '#', False, width=22), Column('funcName', 'Function', False, width=80), Column('pathname', 'Path', False, width=120), Column('filename', 'File', False, width=75), @@ -51,21 +54,23 @@ def __repr__(self): Column('processName', 'Process name', False, width=80), Column('thread', 'Thread', False, width=100), Column('threadName', 'Thread name', False, width=70), - Column('message', 'Message'), + Column('message', 'Message', True, width=10), ] +SPECIAL_COLUMNS = {"created", "time", "levelname", "level", "name", + "message", "msg", "exc_text"} + class LoggerTableHeader(QObject): def __init__(self, header_view): super().__init__() + self.header_view = header_view self.preset_name = CONFIG['default_header_preset'] columns = CONFIG.load_header_preset(self.preset_name) if not columns: columns = DEFAULT_COLUMNS - self.columns = copy.deepcopy(columns) - self.visible_columns = [c for c in self.columns if c.visible] - self.header_view = header_view - self.table_model = None # will be set from within the model immediately + self.columns = deepcopy(columns) + self.regen_visible() def eventFilter(self, object, event): """ @@ -88,16 +93,16 @@ def mouse_released(self): col.width = self.header_view.sectionSize(section) CONFIG.save_header_preset(self.preset_name, self.columns) - def reset_columns(self): - self.replace_columns(copy.deepcopy(DEFAULT_COLUMNS), save=False) - self.preset_name = 'Stock' - - def replace_columns(self, new_columns, save=True): + def replace_columns(self, new_columns): self.columns = new_columns + self.regen_visible() + + def regen_visible(self): self.visible_columns = [c for c in self.columns if c.visible] - self.table_model.modelReset.emit() - if save: - CONFIG.save_header_preset(self.preset_name, self.columns) + self.visible_names = set([c.name for c in self.visible_columns]) | SPECIAL_COLUMNS + print(self.visible_names) + for i, column in enumerate(self.visible_columns): + self.header_view.resizeSection(i, column.width) def __getitem__(self, index): return self.visible_columns[index] @@ -131,8 +136,8 @@ def setData(self, role, value): class HeaderEditDialog(QDialog): - # name of the current preset, whether to set this preset as default, list of Columns - header_changed = pyqtSignal(str, bool, list) + # name of the current preset; whether to set this preset as default; list of Columns + header_changed = Signal(str, bool, list) def __init__(self, parent, table_header): super().__init__(parent) @@ -140,13 +145,14 @@ def __init__(self, parent, table_header): self.table_header = table_header self.default_preset_name = None self.preset_name = table_header.preset_name - self.columns = copy.deepcopy(table_header.columns) + self.columns = deepcopy(table_header.columns) self.setupUi() + self.update_output() def setupUi(self): - self.resize(200, 400) + self.resize(240, 400) self.vbox = QVBoxLayout(self) - self.presetLabel = QLabel("Preset: {}".format(self.preset_name), self) + self.presetLabel = QLabel(self) self.columnList = QListWidget(self) self.setAsDefaultCheckbox = QCheckBox("Set as default preset", self) self.vbox.addWidget(self.presetLabel) @@ -165,22 +171,27 @@ def setupUi(self): # for a dumb qss hack to make selected checkboxes not white on a light theme self.columnList.setObjectName("ColumnList") - self.buttonBox = QDialogButtonBox(QDialogButtonBox.Save | QDialogButtonBox.Cancel, self) + buttons = QDialogButtonBox.Reset | QDialogButtonBox.Save | QDialogButtonBox.Cancel + self.buttonBox = QDialogButtonBox(buttons, self) self.vbox.addWidget(self.buttonBox) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) - - self.fill_column_list() - self.set_default_checkbox() + self.resetButton = self.buttonBox.button(QDialogButtonBox.Reset) + self.resetButton.clicked.connect(self.reset_to_stock) def eventFilter(self, object, event): if event.type() == QEvent.KeyPress: if event.key() == Qt.Key_Space or event.key() == Qt.Key_Return: self.toggle_selected_columns() return True + if event.key() == Qt.Key_Delete: + self.delete_selected() + return True return False - def fill_column_list(self): + def update_output(self): + self.presetLabel.setText("Preset: {}".format(self.preset_name)) + self.setAsDefaultCheckbox.setChecked(CONFIG['default_header_preset'] == self.preset_name) self.columnList.clear() for column in self.columns: ColumnListItem(self.columnList, column) @@ -195,6 +206,10 @@ def accept(self): def reject(self): self.done(0) + def reset_to_stock(self): + self.columns = deepcopy(DEFAULT_COLUMNS) + self.update_output() + def read_columns_from_list(self): new_columns = [] for i in range(self.columnList.count()): @@ -242,9 +257,7 @@ def load_preset(self, name): self.columns = new_columns self.preset_name = name - self.fill_column_list() - self.presetLabel.setText("Preset: {}".format(name)) - self.set_default_checkbox() + self.update_output() def new_preset_dialog(self): d = QInputDialog(self) @@ -264,15 +277,14 @@ def create_new_preset(self, name): return self.preset_name = name - self.presetLabel.setText("Preset: {}".format(name)) + self.update_output() CONFIG.save_header_preset(name, self.columns) - self.setAsDefaultCheckbox.setChecked(False) def delete_preset(self, name): CONFIG.delete_header_preset(name) if name == self.preset_name: - self.columns = copy.deepcopy(DEFAULT_COLUMNS) - self.fill_column_list() + self.columns = deepcopy(DEFAULT_COLUMNS) + self.update_output() def create_new_column_dialog(self): d = CreateNewColumnDialog(self) @@ -282,28 +294,27 @@ def create_new_column_dialog(self): def add_new_column(self, name, title): new_column = Column(name, title) - # if the last column is message, insert this column before it (i think it makes sense?) - if self.columns[-1].name == 'message': + # if the last column is message, insert this column before it (I think that makes sense?) + if len(self.columns) == 0: + self.columns.append(new_column) + elif self.columns[-1].name in ('message', 'msg'): self.columns.insert(-1, new_column) else: self.columns.append(new_column) - self.fill_column_list() - - def set_default_checkbox(self): - self.setAsDefaultCheckbox.setChecked(CONFIG['default_header_preset'] == self.preset_name) + self.update_output() def delete_selected(self): selected = self.columnList.selectedItems() for item in selected: self.columnList.takeItem(self.columnList.row(item)) self.read_columns_from_list() - self.fill_column_list() + self.update_output() class CreateNewColumnDialog(QDialog): # name, title - add_new_column = pyqtSignal(str, str) + add_new_column = Signal(str, str) def __init__(self, parent): super().__init__(parent) diff --git a/cutelog/main_window.py b/cutelog/main_window.py index 017136d..4383588 100644 --- a/cutelog/main_window.py +++ b/cutelog/main_window.py @@ -1,58 +1,58 @@ -import asyncio -from functools import partial +from qtpy.QtCore import QFile, Qt, QTextStream +from qtpy.QtWidgets import (QFileDialog, QInputDialog, QMainWindow, QMenuBar, + QStatusBar, QTabWidget) -from PyQt5 import uic -from PyQt5.QtCore import Qt, QFile, QTextStream -from PyQt5.QtWidgets import QInputDialog, QMenuBar - -from .listener import LogServer -from .logger_tab import LoggerTab -from .settings_dialog import SettingsDialog from .about_dialog import AboutDialog +from .config import CONFIG +from .listener import LogServer +from .logger_tab import LoggerTab, LogRecord from .merge_dialog import MergeDialog from .pop_in_dialog import PopInDialog -from .utils import show_warning_dialog, center_widget_on_screen -from .config import CONFIG - - -uif = CONFIG.get_ui_qfile('main_window.ui') -MainWindowBase = uic.loadUiType(uif) -uif.close() +from .settings_dialog import SettingsDialog +from .utils import (center_widget_on_screen, show_critical_dialog, + show_warning_dialog) -class MainWindow(*MainWindowBase): +class MainWindow(QMainWindow): - def __init__(self, loop, log, app): - self.loop = loop + def __init__(self, log, app): self.log = log.getChild('Main') self.app = app super().__init__() - self.stop_signal = asyncio.Event() - self.finished = asyncio.Event() self.dark_theme = CONFIG['dark_theme_default'] self.single_tab_mode = CONFIG['single_tab_mode_default'] self.loggers_by_name = {} # name -> LoggerTab + self.popped_out_loggers = {} - # used for starting/stopping the server self.server_running = False - self.start_server_again = asyncio.Event() - self.stop_reason = None + self.shutting_down = False self.setupUi() - - self.loop.create_task(self.run()) + self.start_server() + # self.load_records('/home/bus/4krecords.log') + # self.load_records('/home/bus/busocket_records.log') def setupUi(self): - super().setupUi(self) + self.resize(800, 600) self.setWindowTitle('cutelog') + self.loggerTabWidget = QTabWidget(self) + self.loggerTabWidget.setTabsClosable(True) + self.loggerTabWidget.setMovable(True) + self.loggerTabWidget.setTabBarAutoHide(True) + self.loggerTabWidget.currentChanged.connect(self.change_actions_state) + self.setCentralWidget(self.loggerTabWidget) + + self.statusbar = QStatusBar(self) + self.setStatusBar(self.statusbar) + self.setup_menubar() self.setup_action_triggers() self.setup_shortcuts() - self.connectionTabWidget.tabCloseRequested.connect(self.close_tab) + self.loggerTabWidget.tabCloseRequested.connect(self.close_tab) self.reload_stylesheet() self.restore_geometry() @@ -60,12 +60,14 @@ def setupUi(self): self.show() def setup_menubar(self): - "Copied from pyuic-generated code to gain some control" self.menubar = QMenuBar(self) self.setMenuBar(self.menubar) # File menu self.menuFile = self.menubar.addMenu("File") + self.actionLoadRecords = self.menuFile.addAction('Load records') + self.actionSaveRecords = self.menuFile.addAction('Save records') + self.menuFile.addSeparator() self.actionDarkTheme = self.menuFile.addAction('Dark theme') self.actionDarkTheme.setCheckable(True) self.actionDarkTheme.setChecked(self.dark_theme) @@ -77,54 +79,100 @@ def setup_menubar(self): self.menuFile.addSeparator() self.actionQuit = self.menuFile.addAction('Quit') - # Edit menu - self.menuEdit = self.menubar.addMenu("Edit") - - self.menuEditTabs = self.menuEdit.addMenu("Tabs") - self.actionCloseTab = self.menuEditTabs.addAction('Close') - self.actionPopOut = self.menuEditTabs.addAction('Pop out') - self.actionRenameTab = self.menuEditTabs.addAction('Rename') - self.actionPopIn = self.menuEditTabs.addAction('Pop in tabs...') - self.actionMergeTabs = self.menuEditTabs.addAction('Merge tabs...') - - self.menuEditServer = self.menuEdit.addMenu("Server") - self.actionRestartServer = self.menuEditServer.addAction('Restart server') - self.actionStartStopServer = self.menuEditServer.addAction('Stop server') - - self.menuEditRecords = self.menuEdit.addMenu("Records") - self.actionTrimTabRecords = self.menuEditRecords.addAction('Trim records of this tab') - self.actionSetMaxCapacity = self.menuEditRecords.addAction('Set max capacity for this tab') + # Tab menu + self.menuTab = self.menubar.addMenu("Tab") + self.actionCloseTab = self.menuTab.addAction('Close') + self.actionPopOut = self.menuTab.addAction('Pop out') + self.actionRenameTab = self.menuTab.addAction('Rename') + self.menuTab.addSeparator() + self.actionPopIn = self.menuTab.addAction('Pop in tabs...') + self.actionMergeTabs = self.menuTab.addAction('Merge tabs...') + self.menuTab.addSeparator() + self.actionExtraMode = self.menuTab.addAction('Extra mode') + self.actionExtraMode.setCheckable(True) + + # Server menu + self.menuServer = self.menubar.addMenu("Server") + self.actionRestartServer = self.menuServer.addAction('Restart server') + self.actionStartStopServer = self.menuServer.addAction('Stop server') + + # Records menu + self.menuRecords = self.menubar.addMenu("Records") + self.actionTrimTabRecords = self.menuRecords.addAction('Trim records') + self.actionSetMaxCapacity = self.menuRecords.addAction('Set max capacity') # Help menu self.menuHelp = self.menubar.addMenu("Help") self.actionAbout = self.menuHelp.addAction("About cutelog") + self.change_actions_state() # to disable all logger actions, since they don't function yet + def setup_action_triggers(self): + # File menu + self.actionLoadRecords.triggered.connect(self.open_load_records_dialog) + self.actionSaveRecords.triggered.connect(self.open_save_records_dialog) + self.actionDarkTheme.toggled.connect(self.toggle_dark_theme) + self.actionSingleTab.triggered.connect(self.set_single_tab_mode) + # self.actionReloadStyle.triggered.connect(self.reload_stylesheet) + self.actionSettings.triggered.connect(self.settings_dialog) self.actionQuit.triggered.connect(self.shutdown) - self.actionSingleTab.triggered.connect(partial(setattr, self, 'single_tab_mode')) - self.actionRenameTab.triggered.connect(self.rename_tab_dialog) + # Tab meny self.actionCloseTab.triggered.connect(self.close_current_tab) - self.actionPopOut.triggered.connect(self.pop_out_tab) + self.actionRenameTab.triggered.connect(self.rename_tab_dialog) self.actionPopIn.triggered.connect(self.pop_in_tabs_dialog) - self.actionDarkTheme.toggled.connect(self.toggle_dark_theme) + self.actionMergeTabs.triggered.connect(self.merge_tabs_dialog) + self.actionExtraMode.triggered.connect(self.toggle_extra_mode) - # self.actionReloadStyle.triggered.connect(self.reload_stylesheet) + # Server menu self.actionRestartServer.triggered.connect(self.restart_server) self.actionStartStopServer.triggered.connect(self.start_or_stop_server) - self.actionAbout.triggered.connect(self.about_dialog) - self.actionSettings.triggered.connect(self.settings_dialog) - self.actionMergeTabs.triggered.connect(self.merge_tabs_dialog) + # Records menu self.actionTrimTabRecords.triggered.connect(self.trim_records_dialog) self.actionSetMaxCapacity.triggered.connect(self.max_capacity_dialog) + # About menu + self.actionAbout.triggered.connect(self.about_dialog) + + def change_actions_state(self, index=None): + logger, _ = self.current_logger_and_index() + # if there are no loggers in tabs, these actions will be disabled: + actions = [self.actionCloseTab, self.actionExtraMode, self.actionPopOut, + self.actionRenameTab, self.actionPopIn, + self.actionTrimTabRecords, self.actionSetMaxCapacity, self.actionSaveRecords] + + if not logger: + for action in actions: + action.setDisabled(True) + self.actionExtraMode.setChecked(False) + if len(self.popped_out_loggers) > 0: + self.actionPopIn.setDisabled(False) + else: + for action in actions: + action.setDisabled(False) + if len(self.loggers_by_name) == self.loggerTabWidget.count(): + self.actionPopIn.setDisabled(True) + self.actionExtraMode.setChecked(logger.extra_mode) + + # if all loggers are popped in + if len(self.popped_out_loggers) == 0: + self.actionPopIn.setDisabled(True) + + if len(self.loggers_by_name) <= 1: + self.actionMergeTabs.setDisabled(True) + else: + self.actionMergeTabs.setDisabled(False) + + def set_single_tab_mode(self, enabled): + self.single_tab_mode = enabled + def setup_shortcuts(self): self.actionQuit.setShortcut('Ctrl+Q') self.actionDarkTheme.setShortcut('Ctrl+S') # self.actionReloadStyle.setShortcut('Ctrl+R') - self.actionSettings.setShortcut('Ctrl+A') + # self.actionSettings.setShortcut('Ctrl+A') self.actionCloseTab.setShortcut('Ctrl+W') def save_geometry(self): @@ -146,7 +194,6 @@ def about_dialog(self): d.open() def reload_stylesheet(self): - # @Improvement: make one common function for both/many? styles? if self.dark_theme: self.reload_dark_style() else: @@ -176,60 +223,74 @@ def reload_dark_style(self): def set_style_to_stock(self): self.app.setStyleSheet('') - def toggle_dark_theme(self, value): - self.dark_theme = value + def toggle_dark_theme(self, enabled): + self.dark_theme = enabled self.reload_stylesheet() for logger in self.loggers_by_name.values(): - logger.set_dark_theme(value) + logger.set_dark_theme(enabled) - async def run(self): - while True: - self.create_server() - self.server.start() - self.server_running = True - await self.stop_signal.wait() - self.server.close_server(wait=False) + def toggle_extra_mode(self, enabled): + logger, _ = self.current_logger_and_index() + if not logger: + return + logger.set_extra_mode(enabled) - # executor is used here because stopping threads can take some time and stall the loop - await self.loop.run_in_executor(None, self.server.wait_connections_stopped) + def start_server(self): + self.log.debug('Starting the server') + self.server = LogServer(self, self.on_connection, self.log) + self.server.start() + self.server_running = True + self.actionStartStopServer.setText('Stop server') + def stop_server(self): + if self.server_running: + self.log.debug('Stopping the server') + self.server.close_server() self.server_running = False - self.log.debug('Run got the stop_signal with reason {}'.format(self.stop_reason)) - if self.stop_reason == 'restart': - continue - elif self.stop_reason == 'pause': - await self.start_server_again.wait() - continue - else: - break + del self.server + self.server = None + self.actionStartStopServer.setText('Start server') - self.log.info('Main window stopped') - self.finished.set() + def restart_server(self): + self.log.debug('Restarting the server') + self.stop_server() + self.start_server() - def on_connection(self, conn, name): - self.log.debug('New connection: "{}"'.format(name)) + def start_or_stop_server(self): + if self.server_running: + self.stop_server() + else: + self.start_server() - # self.single_tab_mode is ignored if there are 0 tabs currently - single_tab_mode = self.single_tab_mode and len(self.loggers_by_name) > 0 + def on_connection(self, conn, conn_id): + self.log.debug('New connection id={}'.format(conn_id)) - if single_tab_mode: + if self.single_tab_mode and len(self.loggers_by_name) > 0: new_logger = list(self.loggers_by_name.values())[0] new_logger.add_connection(conn) else: - name = self.make_logger_name_unique(name) - new_logger = LoggerTab(self.connectionTabWidget, name, conn, self.log, self.loop, self) - new_logger.set_dark_theme(self.dark_theme) + new_logger, index = self.create_logger(conn) + self.loggerTabWidget.setCurrentIndex(index) conn.new_record.connect(new_logger.on_record) conn.connection_finished.connect(new_logger.remove_connection) - if not single_tab_mode: - self.connectionTabWidget.addTab(new_logger, name) - self.loggers_by_name[name] = new_logger - - if self.server.benchmark and name == 'benchmark': - self.loop.create_task(new_logger.monitor()) + if self.server.benchmark and conn_id == -1: + from .listener import BenchmarkMonitor + bm = BenchmarkMonitor(self, new_logger) + bm.speed_readout.connect(self.set_status) + conn.connection_finished.connect(bm.requestInterruption) + self.server.threads.append(bm) + bm.start() + + def create_logger(self, conn, name=None): + name = self.make_logger_name_unique("Logger" if name is None else name) + new_logger = LoggerTab(self.loggerTabWidget, name, conn, self.log, self) + new_logger.set_dark_theme(self.dark_theme) + self.loggers_by_name[name] = new_logger + index = self.loggerTabWidget.addTab(new_logger, name) + return new_logger, index def make_logger_name_unique(self, name): name_f = "{} {{}}".format(name) @@ -239,30 +300,8 @@ def make_logger_name_unique(self, name): c += 1 return name - def create_server(self): - self.log.debug('Creating the server') - self.stop_reason = None - self.stop_signal = asyncio.Event() # putting .clear() here has some async weirdness - self.start_server_again = asyncio.Event() - self.server = LogServer(self, self.on_connection, self.log, self.stop_signal) - - def restart_server(self): - "Stops the server, and run() creates and starts again it automatically" - self.log.debug('Restarting the server') - self.stop_reason = 'restart' - self.stop_signal.set() - - def start_or_stop_server(self): - if self.server_running: - self.stop_reason = 'pause' - self.stop_signal.set() - self.actionStartStopServer.setText('Start server') - else: - self.start_server_again.set() - self.actionStartStopServer.setText('Stop server') - - def set_status(self, string): - self.statusBar().showMessage(string) + def set_status(self, string, timeout=3000): + self.statusBar().showMessage(string, timeout) def rename_tab_dialog(self): logger, index = self.current_logger_and_index() @@ -286,7 +325,7 @@ def rename_current_tab(self, new_name): logger.name = new_name self.loggers_by_name[new_name] = logger logger.log.name = '.'.join(logger.log.name.split('.')[:-1]) + '.{}'.format(new_name) - self.connectionTabWidget.setTabText(index, new_name) + self.loggerTabWidget.setTabText(index, new_name) def trim_records_dialog(self): logger, index = self.current_logger_and_index() @@ -357,26 +396,30 @@ def close_current_tab(self): def close_tab(self, index): self.log.debug("Tab close requested: {}".format(index)) - logger = self.connectionTabWidget.widget(index) - self.connectionTabWidget.removeTab(index) + logger = self.loggerTabWidget.widget(index) + self.loggerTabWidget.removeTab(index) + self.log.debug(logger.name) self.destroy_logger(logger) def destroy_logger(self, logger): - logger.setParent(None) - logger.stop_all_connections() del self.loggers_by_name[logger.name] + logger.setParent(None) + logger.destroy() del logger def close_popped_out_logger(self, logger): del self.loggers_by_name[logger.name] + del self.popped_out_loggers[logger.name] del logger + if len(self.popped_out_loggers): + self.actionPopIn.setDisabled(True) def current_logger_and_index(self): - index = self.connectionTabWidget.currentIndex() + index = self.loggerTabWidget.currentIndex() if index == -1: return None, None - logger = self.connectionTabWidget.widget(index) + logger = self.loggerTabWidget.widget(index) return logger, index def pop_out_tab(self): @@ -388,8 +431,9 @@ def pop_out_tab(self): logger.destroyed.connect(logger.closeEvent) logger.setAttribute(Qt.WA_DeleteOnClose, True) logger.setWindowFlags(Qt.Window) - logger.setWindowTitle('cutelog: "{}"'.format(self.connectionTabWidget.tabText(index))) - self.connectionTabWidget.removeTab(index) + logger.setWindowTitle('cutelog: "{}"'.format(self.loggerTabWidget.tabText(index))) + self.popped_out_loggers[logger.name] = logger + self.loggerTabWidget.removeTab(index) logger.popped_out = True logger.show() center_widget_on_screen(logger) @@ -412,7 +456,94 @@ def pop_in_tab(self, logger): logger.destroyed.disconnect(logger.closeEvent) logger.setWindowTitle(logger.name) logger.popped_out = False - self.connectionTabWidget.addTab(logger, logger.windowTitle()) + del self.popped_out_loggers[logger.name] + index = self.loggerTabWidget.addTab(logger, logger.windowTitle()) + self.loggerTabWidget.setCurrentIndex(index) + + def open_load_records_dialog(self): + d = QFileDialog(self) + d.setFileMode(QFileDialog.ExistingFile) + d.fileSelected.connect(self.load_records) + d.setWindowTitle('Load records from...') + d.open() + + def load_records(self, load_path): + import json + from os import path + + class RecordDecoder(json.JSONDecoder): + def __init__(self, *args, **kwargs): + json.JSONDecoder.__init__(self, object_hook=self.object_hook, *args, **kwargs) + + def object_hook(self, obj): + if '_created' in obj: + obj['created'] = obj['_created'] + del obj['_created'] + record = LogRecord(obj) + del record._logDict['created'] + else: + record = LogRecord(obj) + return record + + name = path.basename(load_path) + index = None + + try: + with open(load_path, 'r') as f: + records = json.load(f, cls=RecordDecoder) + new_logger, index = self.create_logger(None, name) + new_logger.merge_with_records(records) + self.loggerTabWidget.setCurrentIndex(index) + self.set_status('Records have been loaded into "{}" tab'.format(new_logger.name)) + except Exception as e: + if index: + self.close_tab(index) + text = "Error while loading records: \n{}".format(e) + self.log.error(text, exc_info=True) + show_critical_dialog(self, "Couldn't load records", text) + + def open_save_records_dialog(self): + from functools import partial + logger, _ = self.current_logger_and_index() + if not logger: + return + + d = QFileDialog(self) + d.selectFile(logger.name + '.log') + d.setFileMode(QFileDialog.AnyFile) + d.fileSelected.connect(partial(self.save_records, logger)) + d.setWindowTitle('Save records of "{}" tab to...'.format(logger.name)) + d.open() + + def save_records(self, logger, path): + import json + + # needed because a deque is not serializable + class RecordList(list): + def __init__(self, records): + self.records = records + + def __len__(self): + return len(self.records) + + def __iter__(self): + for record in self.records: + d = record._logDict + if not d.get('created', False) and not d.get('time', False): + d['_created'] = record.created + yield d + + try: + records = logger.record_model.records + record_list = RecordList(records) + with open(path, 'w') as f: + json.dump(record_list, f, indent=2) + self.set_status('Records have been saved to "{}"'.format(path)) + + except Exception as e: + text = "Error while saving records: \n{}".format(e) + self.log.error(text, exc_info=True) + show_critical_dialog(self, "Couldn't save records", text) def closeEvent(self, event): self.log.info('Close event on main window') @@ -425,13 +556,16 @@ def destroy_all_tabs(self): for logger in delete_this: self.destroy_logger(logger) - def shutdown(self, signal=None): + def shutdown(self): self.log.info('Shutting down') - if not self.stop_signal.is_set(): # do this for the first time shutdown is called - self.save_geometry() - self.destroy_all_tabs() - self.stop_reason = 'shutdown' - self.stop_signal.set() - else: - self.log.error('Forcefully shutting down') + if self.shutting_down: + self.log.error('Exiting forcefully') raise SystemExit + self.shutting_down = True + self.stop_server() + self.save_geometry() + self.destroy_all_tabs() + self.app.quit() + + def signal_handler(self, *args): + self.shutdown() diff --git a/cutelog/merge_dialog.py b/cutelog/merge_dialog.py index 89343b2..4a6f0aa 100644 --- a/cutelog/merge_dialog.py +++ b/cutelog/merge_dialog.py @@ -1,12 +1,8 @@ -from PyQt5 import uic -from PyQt5.QtCore import Qt, pyqtSignal -from PyQt5.QtWidgets import QListWidgetItem, QDialogButtonBox - -from .config import CONFIG - -uif = CONFIG.get_ui_qfile('merge_dialog.ui') -MergeDialogBase = uic.loadUiType(uif) -uif.close() +# from qtpy.uic import loadUi +from qtpy.QtCore import Qt, Signal +from qtpy.QtWidgets import (QAbstractItemView, QCheckBox, QComboBox, QDialog, + QDialogButtonBox, QGridLayout, QLabel, QListWidget, + QListWidgetItem, QSizePolicy, QSpacerItem) class LoggerListItem(QListWidgetItem): @@ -20,10 +16,10 @@ def data(self, role): return None -class MergeDialog(*MergeDialogBase): +class MergeDialog(QDialog): # name of src tab, names of dst tabs, whether to keep connections alive or not - merge_tabs_signal = pyqtSignal(str, list, bool) + merge_tabs_signal = Signal(str, list, bool) def __init__(self, parent, loggers): super().__init__(parent) @@ -35,7 +31,29 @@ def __init__(self, parent, loggers): self.setupUi() def setupUi(self): - super().setupUi(self) + self.resize(340, 320) + self.gridLayout = QGridLayout(self) + self.dstComboBox = QComboBox(self) + self.gridLayout.addWidget(self.dstComboBox, 1, 2, 1, 2) + self.buttonBox = QDialogButtonBox(QDialogButtonBox.Cancel | QDialogButtonBox.Ok, self) + self.gridLayout.addWidget(self.buttonBox, 5, 0, 1, 4) + self.loggerList = QListWidget(self) + self.loggerList.setDefaultDropAction(Qt.IgnoreAction) + self.loggerList.setSelectionMode(QAbstractItemView.MultiSelection) + self.gridLayout.addWidget(self.loggerList, 1, 0, 4, 2) + self.keepAliveCheckBox = QCheckBox("Keep connections alive", self) + self.keepAliveCheckBox.setChecked(True) + self.gridLayout.addWidget(self.keepAliveCheckBox, 2, 2, 1, 2) + self.srcsLabel = QLabel("All loggers:", self) + self.gridLayout.addWidget(self.srcsLabel, 0, 0, 1, 2) + self.dstLabel = QLabel("Merge all into:", self) + self.gridLayout.addWidget(self.dstLabel, 0, 2, 1, 2) + spacerItem = QSpacerItem(20, 169, QSizePolicy.Minimum, QSizePolicy.Expanding) + self.gridLayout.addItem(spacerItem, 4, 2, 1, 2) + + self.buttonBox.accepted.connect(self.accept) + self.buttonBox.rejected.connect(self.reject) + self.loggerList.selectionModel().selectionChanged.connect(self.merge_list_changed) self.dstComboBox.currentTextChanged.connect(self.merge_dst_changed) self.ok_button = self.buttonBox.button(QDialogButtonBox.Ok) diff --git a/cutelog/pop_in_dialog.py b/cutelog/pop_in_dialog.py index 1ee0a3b..c843403 100644 --- a/cutelog/pop_in_dialog.py +++ b/cutelog/pop_in_dialog.py @@ -1,10 +1,10 @@ -from PyQt5.QtCore import pyqtSignal -from PyQt5.QtWidgets import QDialog, QVBoxLayout, QListWidget, QDialogButtonBox +from qtpy.QtCore import Signal +from qtpy.QtWidgets import QDialog, QDialogButtonBox, QListWidget, QVBoxLayout class PopInDialog(QDialog): - pop_in_tabs = pyqtSignal(list) + pop_in_tabs = Signal(list) def __init__(self, parent, loggers): super().__init__(parent) @@ -16,11 +16,13 @@ def setupUi(self): self.vbox = QVBoxLayout(self) self.listWidget = QListWidget(self) self.listWidget.setSelectionMode(self.listWidget.MultiSelection) + self.listWidget.selectionModel().reset() self.vbox.addWidget(self.listWidget) self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, self) self.vbox.addWidget(self.buttonBox) self.buttonBox.accepted.connect(self.accept) + self.listWidget.doubleClicked.connect(self.accept) self.buttonBox.rejected.connect(self.reject) self.fill_logger_list() @@ -31,10 +33,14 @@ def fill_logger_list(self): self.listWidget.addItem(logger.name) self.listWidget.setCurrentRow(0) - def accept(self): + def accept(self, index=None): names = [] - for item in self.listWidget.selectedItems(): + if index is not None: + item = self.listWidget.itemFromIndex(index) names.append(item.text()) + else: + for item in self.listWidget.selectedItems(): + names.append(item.text()) if len(names) > 0: self.pop_in_tabs.emit(names) self.done(0) diff --git a/cutelog/resources/dark_theme.qss b/cutelog/resources/dark_theme.qss index 1e1d21d..19288ba 100644 --- a/cutelog/resources/dark_theme.qss +++ b/cutelog/resources/dark_theme.qss @@ -204,6 +204,10 @@ QMenu::item { border: 1px solid transparent; } +QMenu::item:disabled { + color: #777777; +} + QMenu::item:selected { padding: 2px 20px 2px 20px; border: 1px solid transparent; @@ -216,21 +220,36 @@ QMenu::indicator { } QMenu::indicator:non-exclusive:unchecked { - border: 1px solid #5A5A5F; + border: 1px solid #8A8A8F; + position: absolute; + top: 1px; + right: 1px; + bottom: 1px; + left: 1px; +} + +QMenu::indicator:non-exclusive:disabled { + border: 1px solid #777777; + position: absolute; + top: 1px; + right: 1px; + bottom: 1px; + left: 1px; } QMenu::indicator:non-exclusive:checked { image: url(:/dark_theme/icons/check); - border: 1px solid #5A5A5F; + border: 1px solid #8A8A8F; position: absolute; top: 1px; right: 1px; bottom: 1px; left: 1px; } + QMenu::separator { height: 1px; - background-color: #363636; + background-color: #636363; color: white; padding-left: 4px; margin-left: 10px; diff --git a/cutelog/resources/light_theme.qss b/cutelog/resources/light_theme.qss index 0670db0..06cff84 100644 --- a/cutelog/resources/light_theme.qss +++ b/cutelog/resources/light_theme.qss @@ -213,6 +213,10 @@ QMenu::item:selected { border: 1px solid transparent; } +QMenu::item:disabled { + color: #777777; +} + QMenu::indicator { width: 10px; height: 10px; @@ -220,7 +224,21 @@ QMenu::indicator { } QMenu::indicator:non-exclusive:unchecked { - border: 1px solid #35353B; + border: 1px solid #000000; + position: absolute; + top: 1px; + right: 1px; + bottom: 1px; + left: 1px; +} + +QMenu::indicator:non-exclusive:disabled { + border: 1px solid #777777; + position: absolute; + top: 1px; + right: 1px; + bottom: 1px; + left: 1px; } QMenu::indicator:non-exclusive:checked { diff --git a/cutelog/resources/resources.qrc b/cutelog/resources/resources.qrc index 31c6f0f..63a5da0 100644 --- a/cutelog/resources/resources.qrc +++ b/cutelog/resources/resources.qrc @@ -24,10 +24,8 @@ ui/logger.ui - ui/main_window.ui ui/about_dialog.ui ui/settings_dialog.ui - ui/merge_dialog.ui diff --git a/cutelog/resources/ui/about_dialog.ui b/cutelog/resources/ui/about_dialog.ui index befad7d..9742d47 100644 --- a/cutelog/resources/ui/about_dialog.ui +++ b/cutelog/resources/ui/about_dialog.ui @@ -60,659 +60,836 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; font-weight:600;">PyQt5:</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">GPLv3 License, Copyright (c) 2018 Riverbank Computing Limited &lt;info@riverbankcomputing.com&gt;</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; font-weight:600;">ion-icons</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">MIT License, Copyright (c) 2016 Drifty (http://drifty.com/)</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">And thanks to logview by Vinay Sajip for UI inspiration.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:16pt;">GPLv3 License:</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> GNU GENERAL PUBLIC LICENSE</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Version 3, 29 June 2007</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Copyright (C) 2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Everyone is permitted to copy and distribute verbatim copies</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> of this license document, but changing it is not allowed.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Preamble</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The GNU General Public License is a free, copyleft license for</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software and other kinds of works.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The licenses for most software and other practical works are designed</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">to take away your freedom to share and change the works. By contrast,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the GNU General Public License is intended to guarantee your freedom to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">share and change all versions of a program--to make sure it remains free</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software for all its users. We, the Free Software Foundation, use the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">GNU General Public License for most of our software; it applies also to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">any other work released this way by its authors. You can apply it to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your programs, too.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> When we speak of free software, we are referring to freedom, not</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">price. Our General Public Licenses are designed to make sure that you</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">have the freedom to distribute copies of free software (and charge for</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">them if you wish), that you receive source code or can get it if you</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">want it, that you can change the software or use pieces of it in new</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">free programs, and that you know you can do these things.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> To protect your rights, we need to prevent others from denying you</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">these rights or asking you to surrender the rights. Therefore, you have</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">certain responsibilities if you distribute copies of the software, or if</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you modify it: responsibilities to respect the freedom of others.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> For example, if you distribute copies of such a program, whether</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">gratis or for a fee, you must pass on to the recipients the same</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">freedoms that you received. You must make sure that they, too, receive</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">or can get the source code. And you must show them these terms so they</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">know their rights.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Developers that use the GNU GPL protect your rights with two steps:</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">(1) assert copyright on the software, and (2) offer you this License</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">giving you legal permission to copy, distribute and/or modify it.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> For the developers' and authors' protection, the GPL clearly explains</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that there is no warranty for this free software. For both users' and</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">authors' sake, the GPL requires that modified versions be marked as</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">changed, so that their problems will not be attributed erroneously to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">authors of previous versions.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Some devices are designed to deny users access to install or run</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">modified versions of the software inside them, although the manufacturer</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">can do so. This is fundamentally incompatible with the aim of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">protecting users' freedom to change the software. The systematic</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">pattern of such abuse occurs in the area of products for individuals to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">use, which is precisely where it is most unacceptable. Therefore, we</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">have designed this version of the GPL to prohibit the practice for those</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">products. If such problems arise substantially in other domains, we</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">stand ready to extend this provision to those domains in future versions</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">of the GPL, as needed to protect the freedom of users.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Finally, every program is threatened constantly by software patents.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">States should not allow patents to restrict development and use of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software on general-purpose computers, but in those that do, we wish to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">avoid the special danger that patents applied to a free program could</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">make it effectively proprietary. To prevent this, the GPL assures that</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patents cannot be used to render the program non-free.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The precise terms and conditions for copying, distribution and</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">modification follow.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> TERMS AND CONDITIONS</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 0. Definitions.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> &quot;This License&quot; refers to version 3 of the GNU General Public License.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> &quot;Copyright&quot; also means copyright-like laws that apply to other kinds of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">works, such as semiconductor masks.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> &quot;The Program&quot; refers to any copyrightable work licensed under this</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">License. Each licensee is addressed as &quot;you&quot;. &quot;Licensees&quot; and</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">&quot;recipients&quot; may be individuals or organizations.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> To &quot;modify&quot; a work means to copy from or adapt all or part of the work</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in a fashion requiring copyright permission, other than the making of an</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">exact copy. The resulting work is called a &quot;modified version&quot; of the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">earlier work or a work &quot;based on&quot; the earlier work.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> A &quot;covered work&quot; means either the unmodified Program or a work based</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">on the Program.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> To &quot;propagate&quot; a work means to do anything with it that, without</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">permission, would make you directly or secondarily liable for</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">infringement under applicable copyright law, except executing it on a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">computer or modifying a private copy. Propagation includes copying,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribution (with or without modification), making available to the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">public, and in some countries other activities as well.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> To &quot;convey&quot; a work means any kind of propagation that enables other</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">parties to make or receive copies. Mere interaction with a user through</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a computer network, with no transfer of a copy, is not conveying.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> An interactive user interface displays &quot;Appropriate Legal Notices&quot;</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">to the extent that it includes a convenient and prominently visible</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">feature that (1) displays an appropriate copyright notice, and (2)</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">tells the user that there is no warranty for the work (except to the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">extent that warranties are provided), that licensees may convey the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">work under this License, and how to view a copy of this License. If</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the interface presents a list of user commands or options, such as a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">menu, a prominent item in the list meets this criterion.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 1. Source Code.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The &quot;source code&quot; for a work means the preferred form of the work</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">for making modifications to it. &quot;Object code&quot; means any non-source</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">form of a work.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> A &quot;Standard Interface&quot; means an interface that either is an official</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">standard defined by a recognized standards body, or, in the case of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">interfaces specified for a particular programming language, one that</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">is widely used among developers working in that language.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The &quot;System Libraries&quot; of an executable work include anything, other</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">than the work as a whole, that (a) is included in the normal form of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">packaging a Major Component, but which is not part of that Major</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Component, and (b) serves only to enable use of the work with that</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Major Component, or to implement a Standard Interface for which an</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">implementation is available to the public in source code form. A</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">&quot;Major Component&quot;, in this context, means a major essential component</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">(kernel, window system, and so on) of the specific operating system</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">(if any) on which the executable work runs, or a compiler used to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">produce the work, or an object code interpreter used to run it.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The &quot;Corresponding Source&quot; for a work in object code form means all</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the source code needed to generate, install, and (for an executable</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">work) run the object code and to modify the work, including scripts to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">control those activities. However, it does not include the work's</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">System Libraries, or general-purpose tools or generally available free</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">programs which are used unmodified in performing those activities but</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">which are not part of the work. For example, Corresponding Source</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">includes interface definition files associated with source files for</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the work, and the source code for shared libraries and dynamically</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">linked subprograms that the work is specifically designed to require,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">such as by intimate data communication or control flow between those</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">subprograms and other parts of the work.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The Corresponding Source need not include anything that users</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">can regenerate automatically from other parts of the Corresponding</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Source.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The Corresponding Source for a work in source code form is that</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">same work.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 2. Basic Permissions.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> All rights granted under this License are granted for the term of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">copyright on the Program, and are irrevocable provided the stated</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">conditions are met. This License explicitly affirms your unlimited</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">permission to run the unmodified Program. The output from running a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">covered work is covered by this License only if the output, given its</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">content, constitutes a covered work. This License acknowledges your</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">rights of fair use or other equivalent, as provided by copyright law.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> You may make, run and propagate covered works that you do not</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">convey, without conditions so long as your license otherwise remains</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in force. You may convey covered works to others for the sole purpose</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">of having them make modifications exclusively for you, or provide you</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">with facilities for running those works, provided that you comply with</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the terms of this License in conveying all material for which you do</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">not control copyright. Those thus making or running the covered works</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">for you must do so exclusively on your behalf, under your direction</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and control, on terms that prohibit them from making any copies of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your copyrighted material outside their relationship with you.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Conveying under any other circumstances is permitted solely under</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the conditions stated below. Sublicensing is not allowed; section 10</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">makes it unnecessary.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 3. Protecting Users' Legal Rights From Anti-Circumvention Law.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> No covered work shall be deemed part of an effective technological</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">measure under any applicable law fulfilling obligations under article</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">11 of the WIPO copyright treaty adopted on 20 December 1996, or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">similar laws prohibiting or restricting circumvention of such</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">measures.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> When you convey a covered work, you waive any legal power to forbid</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">circumvention of technological measures to the extent such circumvention</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">is effected by exercising rights under this License with respect to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the covered work, and you disclaim any intention to limit operation or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">modification of the work as a means of enforcing, against the work's</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">users, your or third parties' legal rights to forbid circumvention of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">technological measures.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 4. Conveying Verbatim Copies.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> You may convey verbatim copies of the Program's source code as you</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">receive it, in any medium, provided that you conspicuously and</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">appropriately publish on each copy an appropriate copyright notice;</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">keep intact all notices stating that this License and any</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">non-permissive terms added in accord with section 7 apply to the code;</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">keep intact all notices of the absence of any warranty; and give all</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">recipients a copy of this License along with the Program.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> You may charge any price or no price for each copy that you convey,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and you may offer support or warranty protection for a fee.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 5. Conveying Modified Source Versions.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> You may convey a work based on the Program, or the modifications to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">produce it from the Program, in the form of source code under the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">terms of section 4, provided that you also meet all of these conditions:</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) The work must carry prominent notices stating that you modified</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> it, and giving a relevant date.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) The work must carry prominent notices stating that it is</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> released under this License and any conditions added under section</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 7. This requirement modifies the requirement in section 4 to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> &quot;keep intact all notices&quot;.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) You must license the entire work, as a whole, under this</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> License to anyone who comes into possession of a copy. This</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> License will therefore apply, along with any applicable section 7</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> additional terms, to the whole of the work, and all its parts,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> regardless of how they are packaged. This License gives no</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> permission to license the work in any other way, but it does not</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> invalidate such permission if you have separately received it.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> d) If the work has interactive user interfaces, each must display</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Appropriate Legal Notices; however, if the Program has interactive</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> interfaces that do not display Appropriate Legal Notices, your</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> work need not make them do so.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> A compilation of a covered work with other separate and independent</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">works, which are not by their nature extensions of the covered work,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and which are not combined with it such as to form a larger program,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in or on a volume of a storage or distribution medium, is called an</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">&quot;aggregate&quot; if the compilation and its resulting copyright are not</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">used to limit the access or legal rights of the compilation's users</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">beyond what the individual works permit. Inclusion of a covered work</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in an aggregate does not cause this License to apply to the other</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">parts of the aggregate.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 6. Conveying Non-Source Forms.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> You may convey a covered work in object code form under the terms</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">of sections 4 and 5, provided that you also convey the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">machine-readable Corresponding Source under the terms of this License,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in one of these ways:</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) Convey the object code in, or embodied in, a physical product</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> (including a physical distribution medium), accompanied by the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Corresponding Source fixed on a durable physical medium</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> customarily used for software interchange.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) Convey the object code in, or embodied in, a physical product</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> (including a physical distribution medium), accompanied by a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> written offer, valid for at least three years and valid for as</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> long as you offer spare parts or customer support for that product</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> model, to give anyone who possesses the object code either (1) a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> copy of the Corresponding Source for all the software in the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> product that is covered by this License, on a durable physical</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> medium customarily used for software interchange, for a price no</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> more than your reasonable cost of physically performing this</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> conveying of source, or (2) access to copy the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Corresponding Source from a network server at no charge.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) Convey individual copies of the object code with a copy of the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> written offer to provide the Corresponding Source. This</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> alternative is allowed only occasionally and noncommercially, and</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> only if you received the object code with such an offer, in accord</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> with subsection 6b.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> d) Convey the object code by offering access from a designated</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> place (gratis or for a charge), and offer equivalent access to the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Corresponding Source in the same way through the same place at no</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> further charge. You need not require recipients to copy the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Corresponding Source along with the object code. If the place to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> copy the object code is a network server, the Corresponding Source</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> may be on a different server (operated by you or a third party)</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> that supports equivalent copying facilities, provided you maintain</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> clear directions next to the object code saying where to find the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Corresponding Source. Regardless of what server hosts the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Corresponding Source, you remain obligated to ensure that it is</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> available for as long as needed to satisfy these requirements.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> e) Convey the object code using peer-to-peer transmission, provided</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> you inform other peers where the object code and Corresponding</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Source of the work are being offered to the general public at no</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> charge under subsection 6d.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> A separable portion of the object code, whose source code is excluded</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">from the Corresponding Source as a System Library, need not be</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">included in conveying the object code work.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> A &quot;User Product&quot; is either (1) a &quot;consumer product&quot;, which means any</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">tangible personal property which is normally used for personal, family,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">or household purposes, or (2) anything designed or sold for incorporation</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">into a dwelling. In determining whether a product is a consumer product,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">doubtful cases shall be resolved in favor of coverage. For a particular</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">product received by a particular user, &quot;normally used&quot; refers to a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">typical or common use of that class of product, regardless of the status</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">of the particular user or of the way in which the particular user</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">actually uses, or expects or is expected to use, the product. A product</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">is a consumer product regardless of whether the product has substantial</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">commercial, industrial or non-consumer uses, unless such uses represent</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the only significant mode of use of the product.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> &quot;Installation Information&quot; for a User Product means any methods,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">procedures, authorization keys, or other information required to install</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and execute modified versions of a covered work in that User Product from</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a modified version of its Corresponding Source. The information must</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">suffice to ensure that the continued functioning of the modified object</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">code is in no case prevented or interfered with solely because</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">modification has been made.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> If you convey an object code work under this section in, or with, or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">specifically for use in, a User Product, and the conveying occurs as</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">part of a transaction in which the right of possession and use of the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">User Product is transferred to the recipient in perpetuity or for a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">fixed term (regardless of how the transaction is characterized), the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Corresponding Source conveyed under this section must be accompanied</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">by the Installation Information. But this requirement does not apply</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">if neither you nor any third party retains the ability to install</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">modified object code on the User Product (for example, the work has</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">been installed in ROM).</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The requirement to provide Installation Information does not include a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">requirement to continue to provide support service, warranty, or updates</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">for a work that has been modified or installed by the recipient, or for</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the User Product in which it has been modified or installed. Access to a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">network may be denied when the modification itself materially and</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">adversely affects the operation of the network or violates the rules and</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">protocols for communication across the network.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Corresponding Source conveyed, and Installation Information provided,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in accord with this section must be in a format that is publicly</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">documented (and with an implementation available to the public in</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">source code form), and must require no special password or key for</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">unpacking, reading or copying.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 7. Additional Terms.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> &quot;Additional permissions&quot; are terms that supplement the terms of this</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">License by making exceptions from one or more of its conditions.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Additional permissions that are applicable to the entire Program shall</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">be treated as though they were included in this License, to the extent</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that they are valid under applicable law. If additional permissions</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">apply only to part of the Program, that part may be used separately</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under those permissions, but the entire Program remains governed by</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License without regard to the additional permissions.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> When you convey a copy of a covered work, you may at your option</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">remove any additional permissions from that copy, or from any part of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">it. (Additional permissions may be written to require their own</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">removal in certain cases when you modify the work.) You may place</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">additional permissions on material, added by you to a covered work,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">for which you have or can give appropriate copyright permission.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Notwithstanding any other provision of this License, for material you</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">add to a covered work, you may (if authorized by the copyright holders of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that material) supplement the terms of this License with terms:</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) Disclaiming warranty or limiting liability differently from the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> terms of sections 15 and 16 of this License; or</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) Requiring preservation of specified reasonable legal notices or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> author attributions in that material or in the Appropriate Legal</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Notices displayed by works containing it; or</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) Prohibiting misrepresentation of the origin of that material, or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> requiring that modified versions of such material be marked in</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> reasonable ways as different from the original version; or</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> d) Limiting the use for publicity purposes of names of licensors or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> authors of the material; or</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> e) Declining to grant rights under trademark law for use of some</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> trade names, trademarks, or service marks; or</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> f) Requiring indemnification of licensors and authors of that</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> material by anyone who conveys the material (or modified versions of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> it) with contractual assumptions of liability to the recipient, for</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> any liability that these contractual assumptions directly impose on</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> those licensors and authors.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> All other non-permissive additional terms are considered &quot;further</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">restrictions&quot; within the meaning of section 10. If the Program as you</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">received it, or any part of it, contains a notice stating that it is</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">governed by this License along with a term that is a further</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">restriction, you may remove that term. If a license document contains</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a further restriction but permits relicensing or conveying under this</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">License, you may add to a covered work material governed by the terms</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">of that license document, provided that the further restriction does</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">not survive such relicensing or conveying.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> If you add terms to a covered work in accord with this section, you</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">must place, in the relevant source files, a statement of the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">additional terms that apply to those files, or a notice indicating</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">where to find the applicable terms.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Additional terms, permissive or non-permissive, may be stated in the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">form of a separately written license, or stated as exceptions;</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the above requirements apply either way.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 8. Termination.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> You may not propagate or modify a covered work except as expressly</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">provided under this License. Any attempt otherwise to propagate or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">modify it is void, and will automatically terminate your rights under</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License (including any patent licenses granted under the third</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">paragraph of section 11).</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> However, if you cease all violation of this License, then your</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">license from a particular copyright holder is reinstated (a)</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">provisionally, unless and until the copyright holder explicitly and</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">finally terminates your license, and (b) permanently, if the copyright</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">holder fails to notify you of the violation by some reasonable means</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">prior to 60 days after the cessation.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Moreover, your license from a particular copyright holder is</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">reinstated permanently if the copyright holder notifies you of the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">violation by some reasonable means, this is the first time you have</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">received notice of violation of this License (for any work) from that</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">copyright holder, and you cure the violation prior to 30 days after</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your receipt of the notice.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Termination of your rights under this section does not terminate the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">licenses of parties who have received copies or rights from you under</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License. If your rights have been terminated and not permanently</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">reinstated, you do not qualify to receive new licenses for the same</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">material under section 10.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 9. Acceptance Not Required for Having Copies.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> You are not required to accept this License in order to receive or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">run a copy of the Program. Ancillary propagation of a covered work</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">occurring solely as a consequence of using peer-to-peer transmission</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">to receive a copy likewise does not require acceptance. However,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">nothing other than this License grants you permission to propagate or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">modify any covered work. These actions infringe copyright if you do</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">not accept this License. Therefore, by modifying or propagating a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">covered work, you indicate your acceptance of this License to do so.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 10. Automatic Licensing of Downstream Recipients.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Each time you convey a covered work, the recipient automatically</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">receives a license from the original licensors, to run, modify and</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">propagate that work, subject to this License. You are not responsible</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">for enforcing compliance by third parties with this License.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> An &quot;entity transaction&quot; is a transaction transferring control of an</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">organization, or substantially all assets of one, or subdividing an</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">organization, or merging organizations. If propagation of a covered</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">work results from an entity transaction, each party to that</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">transaction who receives a copy of the work also receives whatever</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">licenses to the work the party's predecessor in interest had or could</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">give under the previous paragraph, plus a right to possession of the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Corresponding Source of the work from the predecessor in interest, if</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the predecessor has it or can get it with reasonable efforts.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> You may not impose any further restrictions on the exercise of the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">rights granted or affirmed under this License. For example, you may</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">not impose a license fee, royalty, or other charge for exercise of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">rights granted under this License, and you may not initiate litigation</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">(including a cross-claim or counterclaim in a lawsuit) alleging that</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">any patent claim is infringed by making, using, selling, offering for</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">sale, or importing the Program or any portion of it.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 11. Patents.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> A &quot;contributor&quot; is a copyright holder who authorizes use under this</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">License of the Program or a work on which the Program is based. The</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">work thus licensed is called the contributor's &quot;contributor version&quot;.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> A contributor's &quot;essential patent claims&quot; are all patent claims</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">owned or controlled by the contributor, whether already acquired or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">hereafter acquired, that would be infringed by some manner, permitted</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">by this License, of making, using, or selling its contributor version,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">but do not include claims that would be infringed only as a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">consequence of further modification of the contributor version. For</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">purposes of this definition, &quot;control&quot; includes the right to grant</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patent sublicenses in a manner consistent with the requirements of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Each contributor grants you a non-exclusive, worldwide, royalty-free</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patent license under the contributor's essential patent claims, to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">make, use, sell, offer for sale, import and otherwise run, modify and</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">propagate the contents of its contributor version.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> In the following three paragraphs, a &quot;patent license&quot; is any express</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">agreement or commitment, however denominated, not to enforce a patent</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">(such as an express permission to practice a patent or covenant not to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">sue for patent infringement). To &quot;grant&quot; such a patent license to a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">party means to make such an agreement or commitment not to enforce a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patent against the party.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> If you convey a covered work, knowingly relying on a patent license,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and the Corresponding Source of the work is not available for anyone</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">to copy, free of charge and under the terms of this License, through a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">publicly available network server or other readily accessible means,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">then you must either (1) cause the Corresponding Source to be so</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">available, or (2) arrange to deprive yourself of the benefit of the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patent license for this particular work, or (3) arrange, in a manner</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">consistent with the requirements of this License, to extend the patent</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">license to downstream recipients. &quot;Knowingly relying&quot; means you have</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">actual knowledge that, but for the patent license, your conveying the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">covered work in a country, or your recipient's use of the covered work</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in a country, would infringe one or more identifiable patents in that</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">country that you have reason to believe are valid.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> If, pursuant to or in connection with a single transaction or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">arrangement, you convey, or propagate by procuring conveyance of, a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">covered work, and grant a patent license to some of the parties</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">receiving the covered work authorizing them to use, propagate, modify</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">or convey a specific copy of the covered work, then the patent license</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you grant is automatically extended to all recipients of the covered</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">work and works based on it.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> A patent license is &quot;discriminatory&quot; if it does not include within</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the scope of its coverage, prohibits the exercise of, or is</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">conditioned on the non-exercise of one or more of the rights that are</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">specifically granted under this License. You may not convey a covered</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">work if you are a party to an arrangement with a third party that is</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in the business of distributing software, under which you make payment</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">to the third party based on the extent of your activity of conveying</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the work, and under which the third party grants, to any of the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">parties who would receive the covered work from you, a discriminatory</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patent license (a) in connection with copies of the covered work</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">conveyed by you (or copies made from those copies), or (b) primarily</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">for and in connection with specific products or compilations that</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">contain the covered work, unless you entered into that arrangement,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">or that patent license was granted, prior to 28 March 2007.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Nothing in this License shall be construed as excluding or limiting</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">any implied license or other defenses to infringement that may</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">otherwise be available to you under applicable patent law.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 12. No Surrender of Others' Freedom.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> If conditions are imposed on you (whether by court order, agreement or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">otherwise) that contradict the conditions of this License, they do not</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">excuse you from the conditions of this License. If you cannot convey a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">covered work so as to satisfy simultaneously your obligations under this</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">License and any other pertinent obligations, then as a consequence you may</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">not convey it at all. For example, if you agree to terms that obligate you</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">to collect a royalty for further conveying from those to whom you convey</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the Program, the only way you could satisfy both those terms and this</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">License would be to refrain entirely from conveying the Program.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 13. Use with the GNU Affero General Public License.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Notwithstanding any other provision of this License, you have</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">permission to link or combine any covered work with a work licensed</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under version 3 of the GNU Affero General Public License into a single</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">combined work, and to convey the resulting work. The terms of this</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">License will continue to apply to the part which is the covered work,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">but the special requirements of the GNU Affero General Public License,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">section 13, concerning interaction through a network will apply to the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">combination as such.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 14. Revised Versions of this License.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The Free Software Foundation may publish revised and/or new versions of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the GNU General Public License from time to time. Such new versions will</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">be similar in spirit to the present version, but may differ in detail to</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">address new problems or concerns.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Each version is given a distinguishing version number. If the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Program specifies that a certain numbered version of the GNU General</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Public License &quot;or any later version&quot; applies to it, you have the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">option of following the terms and conditions either of that numbered</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">version or of any later version published by the Free Software</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Foundation. If the Program does not specify a version number of the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">GNU General Public License, you may choose any version ever published</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">by the Free Software Foundation.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> If the Program specifies that a proxy can decide which future</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">versions of the GNU General Public License can be used, that proxy's</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">public statement of acceptance of a version permanently authorizes you</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">to choose that version for the Program.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Later license versions may give you additional or different</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">permissions. However, no additional obligations are imposed on any</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">author or copyright holder as a result of your choosing to follow a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">later version.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 15. Disclaimer of Warranty.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM &quot;AS IS&quot; WITHOUT WARRANTY</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 16. Limitation of Liability.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">SUCH DAMAGES.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 17. Interpretation of Sections 15 and 16.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> If the disclaimer of warranty and limitation of liability provided</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">above cannot be given local legal effect according to their terms,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">reviewing courts shall apply local law that most closely approximates</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">an absolute waiver of all civil liability in connection with the</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Program, unless a warranty or assumption of liability accompanies a</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">copy of the Program in return for a fee.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> END OF TERMS AND CONDITIONS</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:16pt;">The MIT License (MIT):</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Permission is hereby granted, free of charge, to any person obtaining a copy</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">of this software and associated documentation files (the &quot;Software&quot;), to deal</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in the Software without restriction, including without limitation the rights</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">copies of the Software, and to permit persons to whom the Software is</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">furnished to do so, subject to the following conditions:</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">The above copyright notice and this permission notice shall be included in</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">all copies or substantial portions of the Software.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">THE SOFTWARE.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html> +</style></head><body style=" font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Qt: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;"> PyQt5:</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> GPLv3 License, Copyright (c) 2018 Riverbank Computing Limited &lt;info@riverbankcomputing.com&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> </span><span style=" font-size:9pt; font-weight:600;">OR</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;"> PySide2:</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> LGPLv3 License, Copyright (C) 2015 The Qt Company Ltd (http://www.qt.io/licensing/)</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">ion-icons:</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">MIT License, Copyright (c) 2015-present Ionic (http://ionic.io/)</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">QtPy:</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">MIT License, Copyright © 2009–2018 The Spyder Development Team</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Thanks to logview by Vinay Sajip for UI inspiration.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">And thanks to contributors to the cutelog project: Anil Berry, Thomas Hess</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">GPLv3 License:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> GNU GENERAL PUBLIC LICENSE</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Version 3, 29 June 2007</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Copyright (C) 2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Everyone is permitted to copy and distribute verbatim copies</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> of this license document, but changing it is not allowed.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Preamble</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The GNU General Public License is a free, copyleft license for</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">software and other kinds of works.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The licenses for most software and other practical works are designed</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">to take away your freedom to share and change the works. By contrast,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the GNU General Public License is intended to guarantee your freedom to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">share and change all versions of a program--to make sure it remains free</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">software for all its users. We, the Free Software Foundation, use the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">GNU General Public License for most of our software; it applies also to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">any other work released this way by its authors. You can apply it to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">your programs, too.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> When we speak of free software, we are referring to freedom, not</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">price. Our General Public Licenses are designed to make sure that you</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">have the freedom to distribute copies of free software (and charge for</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">them if you wish), that you receive source code or can get it if you</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">want it, that you can change the software or use pieces of it in new</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">free programs, and that you know you can do these things.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> To protect your rights, we need to prevent others from denying you</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">these rights or asking you to surrender the rights. Therefore, you have</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">certain responsibilities if you distribute copies of the software, or if</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">you modify it: responsibilities to respect the freedom of others.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> For example, if you distribute copies of such a program, whether</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">gratis or for a fee, you must pass on to the recipients the same</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">freedoms that you received. You must make sure that they, too, receive</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">or can get the source code. And you must show them these terms so they</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">know their rights.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Developers that use the GNU GPL protect your rights with two steps:</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">(1) assert copyright on the software, and (2) offer you this License</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">giving you legal permission to copy, distribute and/or modify it.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> For the developers' and authors' protection, the GPL clearly explains</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">that there is no warranty for this free software. For both users' and</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">authors' sake, the GPL requires that modified versions be marked as</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">changed, so that their problems will not be attributed erroneously to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">authors of previous versions.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Some devices are designed to deny users access to install or run</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">modified versions of the software inside them, although the manufacturer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">can do so. This is fundamentally incompatible with the aim of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">protecting users' freedom to change the software. The systematic</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">pattern of such abuse occurs in the area of products for individuals to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">use, which is precisely where it is most unacceptable. Therefore, we</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">have designed this version of the GPL to prohibit the practice for those</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">products. If such problems arise substantially in other domains, we</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">stand ready to extend this provision to those domains in future versions</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">of the GPL, as needed to protect the freedom of users.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Finally, every program is threatened constantly by software patents.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">States should not allow patents to restrict development and use of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">software on general-purpose computers, but in those that do, we wish to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">avoid the special danger that patents applied to a free program could</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">make it effectively proprietary. To prevent this, the GPL assures that</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">patents cannot be used to render the program non-free.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The precise terms and conditions for copying, distribution and</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">modification follow.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> TERMS AND CONDITIONS</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 0. Definitions.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> &quot;This License&quot; refers to version 3 of the GNU General Public License.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> &quot;Copyright&quot; also means copyright-like laws that apply to other kinds of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">works, such as semiconductor masks.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> &quot;The Program&quot; refers to any copyrightable work licensed under this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">License. Each licensee is addressed as &quot;you&quot;. &quot;Licensees&quot; and</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">&quot;recipients&quot; may be individuals or organizations.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> To &quot;modify&quot; a work means to copy from or adapt all or part of the work</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">in a fashion requiring copyright permission, other than the making of an</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">exact copy. The resulting work is called a &quot;modified version&quot; of the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">earlier work or a work &quot;based on&quot; the earlier work.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> A &quot;covered work&quot; means either the unmodified Program or a work based</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">on the Program.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> To &quot;propagate&quot; a work means to do anything with it that, without</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">permission, would make you directly or secondarily liable for</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">infringement under applicable copyright law, except executing it on a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">computer or modifying a private copy. Propagation includes copying,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">distribution (with or without modification), making available to the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">public, and in some countries other activities as well.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> To &quot;convey&quot; a work means any kind of propagation that enables other</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">parties to make or receive copies. Mere interaction with a user through</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">a computer network, with no transfer of a copy, is not conveying.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> An interactive user interface displays &quot;Appropriate Legal Notices&quot;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">to the extent that it includes a convenient and prominently visible</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">feature that (1) displays an appropriate copyright notice, and (2)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">tells the user that there is no warranty for the work (except to the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">extent that warranties are provided), that licensees may convey the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">work under this License, and how to view a copy of this License. If</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the interface presents a list of user commands or options, such as a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">menu, a prominent item in the list meets this criterion.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 1. Source Code.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The &quot;source code&quot; for a work means the preferred form of the work</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">for making modifications to it. &quot;Object code&quot; means any non-source</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">form of a work.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> A &quot;Standard Interface&quot; means an interface that either is an official</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">standard defined by a recognized standards body, or, in the case of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">interfaces specified for a particular programming language, one that</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">is widely used among developers working in that language.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The &quot;System Libraries&quot; of an executable work include anything, other</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">than the work as a whole, that (a) is included in the normal form of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">packaging a Major Component, but which is not part of that Major</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Component, and (b) serves only to enable use of the work with that</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Major Component, or to implement a Standard Interface for which an</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">implementation is available to the public in source code form. A</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">&quot;Major Component&quot;, in this context, means a major essential component</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">(kernel, window system, and so on) of the specific operating system</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">(if any) on which the executable work runs, or a compiler used to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">produce the work, or an object code interpreter used to run it.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The &quot;Corresponding Source&quot; for a work in object code form means all</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the source code needed to generate, install, and (for an executable</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">work) run the object code and to modify the work, including scripts to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">control those activities. However, it does not include the work's</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">System Libraries, or general-purpose tools or generally available free</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">programs which are used unmodified in performing those activities but</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">which are not part of the work. For example, Corresponding Source</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">includes interface definition files associated with source files for</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the work, and the source code for shared libraries and dynamically</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">linked subprograms that the work is specifically designed to require,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">such as by intimate data communication or control flow between those</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">subprograms and other parts of the work.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The Corresponding Source need not include anything that users</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">can regenerate automatically from other parts of the Corresponding</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Source.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The Corresponding Source for a work in source code form is that</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">same work.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 2. Basic Permissions.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> All rights granted under this License are granted for the term of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">copyright on the Program, and are irrevocable provided the stated</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">conditions are met. This License explicitly affirms your unlimited</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">permission to run the unmodified Program. The output from running a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">covered work is covered by this License only if the output, given its</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">content, constitutes a covered work. This License acknowledges your</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">rights of fair use or other equivalent, as provided by copyright law.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> You may make, run and propagate covered works that you do not</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">convey, without conditions so long as your license otherwise remains</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">in force. You may convey covered works to others for the sole purpose</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">of having them make modifications exclusively for you, or provide you</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">with facilities for running those works, provided that you comply with</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the terms of this License in conveying all material for which you do</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">not control copyright. Those thus making or running the covered works</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">for you must do so exclusively on your behalf, under your direction</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">and control, on terms that prohibit them from making any copies of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">your copyrighted material outside their relationship with you.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Conveying under any other circumstances is permitted solely under</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the conditions stated below. Sublicensing is not allowed; section 10</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">makes it unnecessary.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 3. Protecting Users' Legal Rights From Anti-Circumvention Law.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> No covered work shall be deemed part of an effective technological</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">measure under any applicable law fulfilling obligations under article</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">11 of the WIPO copyright treaty adopted on 20 December 1996, or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">similar laws prohibiting or restricting circumvention of such</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">measures.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> When you convey a covered work, you waive any legal power to forbid</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">circumvention of technological measures to the extent such circumvention</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">is effected by exercising rights under this License with respect to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the covered work, and you disclaim any intention to limit operation or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">modification of the work as a means of enforcing, against the work's</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">users, your or third parties' legal rights to forbid circumvention of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">technological measures.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 4. Conveying Verbatim Copies.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> You may convey verbatim copies of the Program's source code as you</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">receive it, in any medium, provided that you conspicuously and</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">appropriately publish on each copy an appropriate copyright notice;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">keep intact all notices stating that this License and any</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">non-permissive terms added in accord with section 7 apply to the code;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">keep intact all notices of the absence of any warranty; and give all</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">recipients a copy of this License along with the Program.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> You may charge any price or no price for each copy that you convey,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">and you may offer support or warranty protection for a fee.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 5. Conveying Modified Source Versions.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> You may convey a work based on the Program, or the modifications to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">produce it from the Program, in the form of source code under the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">terms of section 4, provided that you also meet all of these conditions:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> a) The work must carry prominent notices stating that you modified</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> it, and giving a relevant date.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> b) The work must carry prominent notices stating that it is</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> released under this License and any conditions added under section</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 7. This requirement modifies the requirement in section 4 to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> &quot;keep intact all notices&quot;.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> c) You must license the entire work, as a whole, under this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> License to anyone who comes into possession of a copy. This</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> License will therefore apply, along with any applicable section 7</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> additional terms, to the whole of the work, and all its parts,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> regardless of how they are packaged. This License gives no</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> permission to license the work in any other way, but it does not</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> invalidate such permission if you have separately received it.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> d) If the work has interactive user interfaces, each must display</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Appropriate Legal Notices; however, if the Program has interactive</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> interfaces that do not display Appropriate Legal Notices, your</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> work need not make them do so.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> A compilation of a covered work with other separate and independent</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">works, which are not by their nature extensions of the covered work,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">and which are not combined with it such as to form a larger program,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">in or on a volume of a storage or distribution medium, is called an</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">&quot;aggregate&quot; if the compilation and its resulting copyright are not</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">used to limit the access or legal rights of the compilation's users</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">beyond what the individual works permit. Inclusion of a covered work</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">in an aggregate does not cause this License to apply to the other</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">parts of the aggregate.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 6. Conveying Non-Source Forms.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> You may convey a covered work in object code form under the terms</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">of sections 4 and 5, provided that you also convey the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">machine-readable Corresponding Source under the terms of this License,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">in one of these ways:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> a) Convey the object code in, or embodied in, a physical product</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> (including a physical distribution medium), accompanied by the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Corresponding Source fixed on a durable physical medium</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> customarily used for software interchange.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> b) Convey the object code in, or embodied in, a physical product</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> (including a physical distribution medium), accompanied by a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> written offer, valid for at least three years and valid for as</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> long as you offer spare parts or customer support for that product</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> model, to give anyone who possesses the object code either (1) a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> copy of the Corresponding Source for all the software in the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> product that is covered by this License, on a durable physical</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> medium customarily used for software interchange, for a price no</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> more than your reasonable cost of physically performing this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> conveying of source, or (2) access to copy the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Corresponding Source from a network server at no charge.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> c) Convey individual copies of the object code with a copy of the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> written offer to provide the Corresponding Source. This</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> alternative is allowed only occasionally and noncommercially, and</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> only if you received the object code with such an offer, in accord</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> with subsection 6b.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> d) Convey the object code by offering access from a designated</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> place (gratis or for a charge), and offer equivalent access to the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Corresponding Source in the same way through the same place at no</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> further charge. You need not require recipients to copy the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Corresponding Source along with the object code. If the place to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> copy the object code is a network server, the Corresponding Source</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> may be on a different server (operated by you or a third party)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> that supports equivalent copying facilities, provided you maintain</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> clear directions next to the object code saying where to find the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Corresponding Source. Regardless of what server hosts the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Corresponding Source, you remain obligated to ensure that it is</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> available for as long as needed to satisfy these requirements.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> e) Convey the object code using peer-to-peer transmission, provided</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> you inform other peers where the object code and Corresponding</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Source of the work are being offered to the general public at no</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> charge under subsection 6d.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> A separable portion of the object code, whose source code is excluded</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">from the Corresponding Source as a System Library, need not be</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">included in conveying the object code work.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> A &quot;User Product&quot; is either (1) a &quot;consumer product&quot;, which means any</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">tangible personal property which is normally used for personal, family,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">or household purposes, or (2) anything designed or sold for incorporation</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">into a dwelling. In determining whether a product is a consumer product,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">doubtful cases shall be resolved in favor of coverage. For a particular</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">product received by a particular user, &quot;normally used&quot; refers to a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">typical or common use of that class of product, regardless of the status</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">of the particular user or of the way in which the particular user</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">actually uses, or expects or is expected to use, the product. A product</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">is a consumer product regardless of whether the product has substantial</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">commercial, industrial or non-consumer uses, unless such uses represent</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the only significant mode of use of the product.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> &quot;Installation Information&quot; for a User Product means any methods,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">procedures, authorization keys, or other information required to install</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">and execute modified versions of a covered work in that User Product from</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">a modified version of its Corresponding Source. The information must</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">suffice to ensure that the continued functioning of the modified object</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">code is in no case prevented or interfered with solely because</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">modification has been made.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> If you convey an object code work under this section in, or with, or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">specifically for use in, a User Product, and the conveying occurs as</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">part of a transaction in which the right of possession and use of the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">User Product is transferred to the recipient in perpetuity or for a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">fixed term (regardless of how the transaction is characterized), the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Corresponding Source conveyed under this section must be accompanied</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">by the Installation Information. But this requirement does not apply</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">if neither you nor any third party retains the ability to install</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">modified object code on the User Product (for example, the work has</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">been installed in ROM).</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The requirement to provide Installation Information does not include a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">requirement to continue to provide support service, warranty, or updates</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">for a work that has been modified or installed by the recipient, or for</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the User Product in which it has been modified or installed. Access to a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">network may be denied when the modification itself materially and</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">adversely affects the operation of the network or violates the rules and</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">protocols for communication across the network.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Corresponding Source conveyed, and Installation Information provided,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">in accord with this section must be in a format that is publicly</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">documented (and with an implementation available to the public in</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">source code form), and must require no special password or key for</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">unpacking, reading or copying.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 7. Additional Terms.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> &quot;Additional permissions&quot; are terms that supplement the terms of this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">License by making exceptions from one or more of its conditions.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Additional permissions that are applicable to the entire Program shall</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">be treated as though they were included in this License, to the extent</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">that they are valid under applicable law. If additional permissions</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">apply only to part of the Program, that part may be used separately</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">under those permissions, but the entire Program remains governed by</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">this License without regard to the additional permissions.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> When you convey a copy of a covered work, you may at your option</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">remove any additional permissions from that copy, or from any part of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">it. (Additional permissions may be written to require their own</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">removal in certain cases when you modify the work.) You may place</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">additional permissions on material, added by you to a covered work,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">for which you have or can give appropriate copyright permission.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Notwithstanding any other provision of this License, for material you</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">add to a covered work, you may (if authorized by the copyright holders of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">that material) supplement the terms of this License with terms:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> a) Disclaiming warranty or limiting liability differently from the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> terms of sections 15 and 16 of this License; or</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> b) Requiring preservation of specified reasonable legal notices or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> author attributions in that material or in the Appropriate Legal</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Notices displayed by works containing it; or</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> c) Prohibiting misrepresentation of the origin of that material, or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> requiring that modified versions of such material be marked in</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> reasonable ways as different from the original version; or</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> d) Limiting the use for publicity purposes of names of licensors or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> authors of the material; or</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> e) Declining to grant rights under trademark law for use of some</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> trade names, trademarks, or service marks; or</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> f) Requiring indemnification of licensors and authors of that</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> material by anyone who conveys the material (or modified versions of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> it) with contractual assumptions of liability to the recipient, for</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> any liability that these contractual assumptions directly impose on</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> those licensors and authors.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> All other non-permissive additional terms are considered &quot;further</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">restrictions&quot; within the meaning of section 10. If the Program as you</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">received it, or any part of it, contains a notice stating that it is</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">governed by this License along with a term that is a further</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">restriction, you may remove that term. If a license document contains</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">a further restriction but permits relicensing or conveying under this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">License, you may add to a covered work material governed by the terms</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">of that license document, provided that the further restriction does</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">not survive such relicensing or conveying.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> If you add terms to a covered work in accord with this section, you</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">must place, in the relevant source files, a statement of the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">additional terms that apply to those files, or a notice indicating</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">where to find the applicable terms.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Additional terms, permissive or non-permissive, may be stated in the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">form of a separately written license, or stated as exceptions;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the above requirements apply either way.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 8. Termination.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> You may not propagate or modify a covered work except as expressly</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">provided under this License. Any attempt otherwise to propagate or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">modify it is void, and will automatically terminate your rights under</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">this License (including any patent licenses granted under the third</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">paragraph of section 11).</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> However, if you cease all violation of this License, then your</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">license from a particular copyright holder is reinstated (a)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">provisionally, unless and until the copyright holder explicitly and</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">finally terminates your license, and (b) permanently, if the copyright</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">holder fails to notify you of the violation by some reasonable means</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">prior to 60 days after the cessation.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Moreover, your license from a particular copyright holder is</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">reinstated permanently if the copyright holder notifies you of the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">violation by some reasonable means, this is the first time you have</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">received notice of violation of this License (for any work) from that</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">copyright holder, and you cure the violation prior to 30 days after</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">your receipt of the notice.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Termination of your rights under this section does not terminate the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">licenses of parties who have received copies or rights from you under</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">this License. If your rights have been terminated and not permanently</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">reinstated, you do not qualify to receive new licenses for the same</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">material under section 10.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 9. Acceptance Not Required for Having Copies.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> You are not required to accept this License in order to receive or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">run a copy of the Program. Ancillary propagation of a covered work</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">occurring solely as a consequence of using peer-to-peer transmission</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">to receive a copy likewise does not require acceptance. However,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">nothing other than this License grants you permission to propagate or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">modify any covered work. These actions infringe copyright if you do</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">not accept this License. Therefore, by modifying or propagating a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">covered work, you indicate your acceptance of this License to do so.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 10. Automatic Licensing of Downstream Recipients.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Each time you convey a covered work, the recipient automatically</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">receives a license from the original licensors, to run, modify and</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">propagate that work, subject to this License. You are not responsible</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">for enforcing compliance by third parties with this License.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> An &quot;entity transaction&quot; is a transaction transferring control of an</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">organization, or substantially all assets of one, or subdividing an</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">organization, or merging organizations. If propagation of a covered</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">work results from an entity transaction, each party to that</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">transaction who receives a copy of the work also receives whatever</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">licenses to the work the party's predecessor in interest had or could</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">give under the previous paragraph, plus a right to possession of the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Corresponding Source of the work from the predecessor in interest, if</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the predecessor has it or can get it with reasonable efforts.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> You may not impose any further restrictions on the exercise of the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">rights granted or affirmed under this License. For example, you may</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">not impose a license fee, royalty, or other charge for exercise of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">rights granted under this License, and you may not initiate litigation</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">(including a cross-claim or counterclaim in a lawsuit) alleging that</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">any patent claim is infringed by making, using, selling, offering for</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">sale, or importing the Program or any portion of it.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 11. Patents.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> A &quot;contributor&quot; is a copyright holder who authorizes use under this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">License of the Program or a work on which the Program is based. The</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">work thus licensed is called the contributor's &quot;contributor version&quot;.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> A contributor's &quot;essential patent claims&quot; are all patent claims</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">owned or controlled by the contributor, whether already acquired or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">hereafter acquired, that would be infringed by some manner, permitted</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">by this License, of making, using, or selling its contributor version,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">but do not include claims that would be infringed only as a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">consequence of further modification of the contributor version. For</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">purposes of this definition, &quot;control&quot; includes the right to grant</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">patent sublicenses in a manner consistent with the requirements of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">this License.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Each contributor grants you a non-exclusive, worldwide, royalty-free</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">patent license under the contributor's essential patent claims, to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">make, use, sell, offer for sale, import and otherwise run, modify and</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">propagate the contents of its contributor version.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> In the following three paragraphs, a &quot;patent license&quot; is any express</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">agreement or commitment, however denominated, not to enforce a patent</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">(such as an express permission to practice a patent or covenant not to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">sue for patent infringement). To &quot;grant&quot; such a patent license to a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">party means to make such an agreement or commitment not to enforce a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">patent against the party.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> If you convey a covered work, knowingly relying on a patent license,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">and the Corresponding Source of the work is not available for anyone</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">to copy, free of charge and under the terms of this License, through a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">publicly available network server or other readily accessible means,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">then you must either (1) cause the Corresponding Source to be so</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">available, or (2) arrange to deprive yourself of the benefit of the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">patent license for this particular work, or (3) arrange, in a manner</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">consistent with the requirements of this License, to extend the patent</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">license to downstream recipients. &quot;Knowingly relying&quot; means you have</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">actual knowledge that, but for the patent license, your conveying the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">covered work in a country, or your recipient's use of the covered work</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">in a country, would infringe one or more identifiable patents in that</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">country that you have reason to believe are valid.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> If, pursuant to or in connection with a single transaction or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">arrangement, you convey, or propagate by procuring conveyance of, a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">covered work, and grant a patent license to some of the parties</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">receiving the covered work authorizing them to use, propagate, modify</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">or convey a specific copy of the covered work, then the patent license</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">you grant is automatically extended to all recipients of the covered</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">work and works based on it.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> A patent license is &quot;discriminatory&quot; if it does not include within</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the scope of its coverage, prohibits the exercise of, or is</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">conditioned on the non-exercise of one or more of the rights that are</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">specifically granted under this License. You may not convey a covered</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">work if you are a party to an arrangement with a third party that is</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">in the business of distributing software, under which you make payment</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">to the third party based on the extent of your activity of conveying</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the work, and under which the third party grants, to any of the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">parties who would receive the covered work from you, a discriminatory</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">patent license (a) in connection with copies of the covered work</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">conveyed by you (or copies made from those copies), or (b) primarily</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">for and in connection with specific products or compilations that</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">contain the covered work, unless you entered into that arrangement,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">or that patent license was granted, prior to 28 March 2007.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Nothing in this License shall be construed as excluding or limiting</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">any implied license or other defenses to infringement that may</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">otherwise be available to you under applicable patent law.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 12. No Surrender of Others' Freedom.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> If conditions are imposed on you (whether by court order, agreement or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">otherwise) that contradict the conditions of this License, they do not</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">excuse you from the conditions of this License. If you cannot convey a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">covered work so as to satisfy simultaneously your obligations under this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">License and any other pertinent obligations, then as a consequence you may</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">not convey it at all. For example, if you agree to terms that obligate you</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">to collect a royalty for further conveying from those to whom you convey</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the Program, the only way you could satisfy both those terms and this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">License would be to refrain entirely from conveying the Program.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 13. Use with the GNU Affero General Public License.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Notwithstanding any other provision of this License, you have</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">permission to link or combine any covered work with a work licensed</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">under version 3 of the GNU Affero General Public License into a single</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">combined work, and to convey the resulting work. The terms of this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">License will continue to apply to the part which is the covered work,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">but the special requirements of the GNU Affero General Public License,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">section 13, concerning interaction through a network will apply to the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">combination as such.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 14. Revised Versions of this License.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The Free Software Foundation may publish revised and/or new versions of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the GNU General Public License from time to time. Such new versions will</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">be similar in spirit to the present version, but may differ in detail to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">address new problems or concerns.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Each version is given a distinguishing version number. If the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Program specifies that a certain numbered version of the GNU General</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Public License &quot;or any later version&quot; applies to it, you have the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">option of following the terms and conditions either of that numbered</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">version or of any later version published by the Free Software</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Foundation. If the Program does not specify a version number of the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">GNU General Public License, you may choose any version ever published</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">by the Free Software Foundation.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> If the Program specifies that a proxy can decide which future</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">versions of the GNU General Public License can be used, that proxy's</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">public statement of acceptance of a version permanently authorizes you</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">to choose that version for the Program.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Later license versions may give you additional or different</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">permissions. However, no additional obligations are imposed on any</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">author or copyright holder as a result of your choosing to follow a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">later version.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 15. Disclaimer of Warranty.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM &quot;AS IS&quot; WITHOUT WARRANTY</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 16. Limitation of Liability.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">SUCH DAMAGES.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 17. Interpretation of Sections 15 and 16.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> If the disclaimer of warranty and limitation of liability provided</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">above cannot be given local legal effect according to their terms,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">reviewing courts shall apply local law that most closely approximates</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">an absolute waiver of all civil liability in connection with the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Program, unless a warranty or assumption of liability accompanies a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">copy of the Program in return for a fee.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> END OF TERMS AND CONDITIONS</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">LGPLv3 License:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> GNU LESSER GENERAL PUBLIC LICENSE</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Version 3, 29 June 2007</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Copyright (C) 2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Everyone is permitted to copy and distribute verbatim copies</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> of this license document, but changing it is not allowed.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> This version of the GNU Lesser General Public License incorporates</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the terms and conditions of version 3 of the GNU General Public</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">License, supplemented by the additional permissions listed below.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 0. Additional Definitions.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> As used herein, &quot;this License&quot; refers to version 3 of the GNU Lesser</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">General Public License, and the &quot;GNU GPL&quot; refers to version 3 of the GNU</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">General Public License.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> &quot;The Library&quot; refers to a covered work governed by this License,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">other than an Application or a Combined Work as defined below.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> An &quot;Application&quot; is any work that makes use of an interface provided</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">by the Library, but which is not otherwise based on the Library.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Defining a subclass of a class defined by the Library is deemed a mode</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">of using an interface provided by the Library.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> A &quot;Combined Work&quot; is a work produced by combining or linking an</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Application with the Library. The particular version of the Library</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">with which the Combined Work was made is also called the &quot;Linked</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Version&quot;.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The &quot;Minimal Corresponding Source&quot; for a Combined Work means the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Corresponding Source for the Combined Work, excluding any source code</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">for portions of the Combined Work that, considered in isolation, are</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">based on the Application, and not on the Linked Version.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The &quot;Corresponding Application Code&quot; for a Combined Work means the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">object code and/or source code for the Application, including any data</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">and utility programs needed for reproducing the Combined Work from the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Application, but excluding the System Libraries of the Combined Work.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 1. Exception to Section 3 of the GNU GPL.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> You may convey a covered work under sections 3 and 4 of this License</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">without being bound by section 3 of the GNU GPL.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 2. Conveying Modified Versions.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> If you modify a copy of the Library, and, in your modifications, a</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">facility refers to a function or data to be supplied by an Application</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">that uses the facility (other than as an argument passed when the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">facility is invoked), then you may convey a copy of the modified</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">version:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> a) under this License, provided that you make a good faith effort to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> ensure that, in the event an Application does not supply the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> function or data, the facility still operates, and performs</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> whatever part of its purpose remains meaningful, or</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> b) under the GNU GPL, with none of the additional permissions of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> this License applicable to that copy.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 3. Object Code Incorporating Material from Library Header Files.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The object code form of an Application may incorporate material from</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">a header file that is part of the Library. You may convey such object</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">code under terms of your choice, provided that, if the incorporated</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">material is not limited to numerical parameters, data structure</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">layouts and accessors, or small macros, inline functions and templates</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">(ten or fewer lines in length), you do both of the following:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> a) Give prominent notice with each copy of the object code that the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Library is used in it and that the Library and its use are</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> covered by this License.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> b) Accompany the object code with a copy of the GNU GPL and this license</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> document.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 4. Combined Works.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> You may convey a Combined Work under terms of your choice that,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">taken together, effectively do not restrict modification of the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">portions of the Library contained in the Combined Work and reverse</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">engineering for debugging such modifications, if you also do each of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">the following:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> a) Give prominent notice with each copy of the Combined Work that</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> the Library is used in it and that the Library and its use are</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> covered by this License.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> b) Accompany the Combined Work with a copy of the GNU GPL and this license</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> document.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> c) For a Combined Work that displays copyright notices during</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> execution, include the copyright notice for the Library among</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> these notices, as well as a reference directing the user to the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> copies of the GNU GPL and this license document.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> d) Do one of the following:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 0) Convey the Minimal Corresponding Source under the terms of this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> License, and the Corresponding Application Code in a form</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> suitable for, and under terms that permit, the user to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> recombine or relink the Application with a modified version of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> the Linked Version to produce a modified Combined Work, in the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> manner specified by section 6 of the GNU GPL for conveying</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Corresponding Source.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 1) Use a suitable shared library mechanism for linking with the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Library. A suitable mechanism is one that (a) uses at run time</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> a copy of the Library already present on the user's computer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> system, and (b) will operate properly with a modified version</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> of the Library that is interface-compatible with the Linked</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Version.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> e) Provide Installation Information, but only if you would otherwise</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> be required to provide such information under section 6 of the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> GNU GPL, and only to the extent that such information is</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> necessary to install and execute a modified version of the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Combined Work produced by recombining or relinking the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Application with a modified version of the Linked Version. (If</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> you use option 4d0, the Installation Information must accompany</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> the Minimal Corresponding Source and Corresponding Application</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Code. If you use option 4d1, you must provide the Installation</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Information in the manner specified by section 6 of the GNU GPL</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> for conveying Corresponding Source.)</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 5. Combined Libraries.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> You may place library facilities that are a work based on the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Library side by side in a single library together with other library</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">facilities that are not Applications and are not covered by this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">License, and convey such a combined library under terms of your</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">choice, if you do both of the following:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> a) Accompany the combined library with a copy of the same work based</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> on the Library, uncombined with any other library facilities,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> conveyed under the terms of this License.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> b) Give prominent notice with the combined library that part of it</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> is a work based on the Library, and explaining where to find the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> accompanying uncombined form of the same work.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> 6. Revised Versions of the GNU Lesser General Public License.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> The Free Software Foundation may publish revised and/or new versions</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">of the GNU Lesser General Public License from time to time. Such new</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">versions will be similar in spirit to the present version, but may</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">differ in detail to address new problems or concerns.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> Each version is given a distinguishing version number. If the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Library as you received it specifies that a certain numbered version</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">of the GNU Lesser General Public License &quot;or any later version&quot;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">applies to it, you have the option of following the terms and</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">conditions either of that published version or of any later version</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">published by the Free Software Foundation. If the Library as you</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">received it does not specify a version number of the GNU Lesser</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">General Public License, you may choose any version of the GNU Lesser</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">General Public License ever published by the Free Software Foundation.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;"> If the Library as you received it specifies that a proxy can decide</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">whether future versions of the GNU Lesser General Public License shall</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">apply, that proxy's public statement of acceptance of any version is</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">permanent authorization for you to choose that version for the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Library.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">The MIT License (MIT):</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Permission is hereby granted, free of charge, to any person obtaining a copy</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">of this software and associated documentation files (the &quot;Software&quot;), to deal</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">in the Software without restriction, including without limitation the rights</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">copies of the Software, and to permit persons to whom the Software is</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">furnished to do so, subject to the following conditions:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">The above copyright notice and this permission notice shall be included in</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">all copies or substantial portions of the Software.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">THE SOFTWARE.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p></body></html> diff --git a/cutelog/resources/ui/logger.ui b/cutelog/resources/ui/logger.ui index 9640b49..c45f0af 100644 --- a/cutelog/resources/ui/logger.ui +++ b/cutelog/resources/ui/logger.ui @@ -28,7 +28,7 @@ - 12 + 15 0 @@ -54,22 +54,18 @@ Qt::Vertical - - - + + + - Create level + Log namespaces - - - - - - Presets + + 1 - + QAbstractItemView::NoEditTriggers @@ -112,7 +108,17 @@ - + + + + Levels + + + 1 + + + + @@ -173,11 +179,6 @@ Show - - - # - - Name @@ -185,26 +186,6 @@ - - - - Levels - - - 1 - - - - - - - Log namespaces - - - 1 - - - @@ -270,7 +251,7 @@ false - false + true QAbstractItemView::NoEditTriggers @@ -290,15 +271,24 @@ QAbstractItemView::SelectRows + + QAbstractItemView::ScrollPerPixel + false false + + false + false + + 20 + false @@ -357,6 +347,12 @@ 0 + + + 80 + 0 + + 60 @@ -379,14 +375,20 @@ 0 + + + 80 + 0 + + Search QToolButton::MenuButtonPopup - - Qt::NoArrow + + Qt::ToolButtonTextOnly diff --git a/cutelog/resources/ui/main_window.ui b/cutelog/resources/ui/main_window.ui deleted file mode 100644 index c2076a9..0000000 --- a/cutelog/resources/ui/main_window.ui +++ /dev/null @@ -1,37 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 861 - 586 - - - - cutelog - - - - - - - true - - - true - - - true - - - - - - - - - - diff --git a/cutelog/resources/ui/merge_dialog.ui b/cutelog/resources/ui/merge_dialog.ui deleted file mode 100644 index d26431b..0000000 --- a/cutelog/resources/ui/merge_dialog.ui +++ /dev/null @@ -1,121 +0,0 @@ - - - Dialog - - - - 0 - 0 - 341 - 323 - - - - Dialog - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - Qt::IgnoreAction - - - QAbstractItemView::MultiSelection - - - - - - - Keep connections alive - - - true - - - - - - - All loggers: - - - - - - - Merge all into: - - - - - - - Qt::Vertical - - - - 20 - 169 - - - - - - label - loggerList - label_2 - dstComboBox - buttonBox - verticalSpacer - keepAliveCheckBox - - - - - buttonBox - accepted() - Dialog - accept() - - - 247 - 303 - - - 186 - 248 - - - - - buttonBox - rejected() - Dialog - reject() - - - 250 - 296 - - - 305 - 249 - - - - - diff --git a/cutelog/resources/ui/settings_dialog.ui b/cutelog/resources/ui/settings_dialog.ui index 627ff27..c20eca4 100644 --- a/cutelog/resources/ui/settings_dialog.ui +++ b/cutelog/resources/ui/settings_dialog.ui @@ -6,35 +6,25 @@ 0 0 - 614 - 392 + 695 + 438 Settings - - - - - Qt::Horizontal - - - QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - false - - - + - - 3 + + 1 0 + + 5 + Appearance @@ -57,59 +47,144 @@ + + + + Qt::Horizontal + + + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults + + + - - 10 + + 4 0 - - QFrame::StyledPanel - 0 - + 10 - - - - Lo&gger table row height + + + + + 1 + 0 + - - loggerTableRowHeight + + 1 - + + + + + 4 + 0 + + + + + + + + + + + + - - 5 + + 4 0 + + + + Font in logger tables + + + + + + + Font in text edit windows + + + + + + + Table row line height + + + + + + + Dark theme by default + + + + + + + Time formatting string + + + - + - Indica&te exception with + Indicate exception with + + + + + + + + 1 + 0 + + + + 1 + + + + + + + + 0 + 0 + - - excIndicationComboBox + + 1 - + - + 0 0 @@ -131,152 +206,128 @@ - + + + + + 0 + 0 + + + + %Y-%m-%d %H:%M:%S.%f + + + + Qt::Vertical - 0 - 0 + 20 + 40 - - + + - Font in te&xt edit windows + <a href="https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior">Help</a> - - textViewFont + + Qt::RichText - - - - - - - 5 - 0 - + + true + + + Qt::TextBrowserInteraction - - - - Font in &logger tables - - - loggerTableFont + + + + Qt::Horizontal - - - - - 0 - 0 - + + + + Qt::Horizontal - - + + + + + + 20 + + + 10 + + + - + 0 0 - + Case sensitive by default - - - Dark &theme by default - - - darkThemeDefaultCheckBox - - - - - + - - 1 + + 0 0 - - 1 + + Open by default - - + + - - 1 + + 0 0 - - 1 - - - - - - - - - 10 - - - - - Case sensi&tive by default - - - searchCaseSensitiveDefaultCheckBox - - - - - - Open by defa&ult - - - searchOpenDefaultCheckBox + Wildcard by default - - + + - + 0 0 - + Regex by default - + - + 0 0 @@ -286,20 +337,10 @@ - - - - Wi&ldcard by default - - - searchWildcardDefaultCheckBox - - - - - + + - + 0 0 @@ -309,10 +350,10 @@ - + - + 0 0 @@ -322,25 +363,28 @@ - - - - Rege&x by default + + + + + 0 + 0 + - - searchRegexDefaultCheckBox + + - + Qt::Vertical - 0 - 0 + 20 + 40 @@ -348,178 +392,266 @@ - + 10 - - - - Server &listen address - - - listenHostLine + + + + + 0 + 0 + - - - - - - - - - - - - 19996 + Default serialization format + + + 0 + 0 + + - 127.0.0.1 + 0.0.0.0 - - - - Single &tab mode by default + + + + + 0 + 0 + - - singleTabCheckBox + + Server listen port - - + + + + + 0 + 0 + + - Server listen &port + Server listen address + + + + + + + + 0 + 0 + - - listenPortLine + + 19996 - + Qt::Vertical - 0 - 0 + 20 + 40 - - - - - - 10 - - - - - 0.0075 + + + + + 0 + 0 + + + + Extra mode by default - - + + - Console &logging level - - - logLevelLine + - + - - + + + + + 0 + 0 + + + + + pickle + + + + + json + + + + + + + + + 0 + 0 + + - Enable benchmark + Single tab mode by default - - benchmarkCheckBox + + + + + + Qt::Horizontal - - - - 30 + + + + + + 10 + + + + + + 0 + 0 + + + + Console logging level - - + + + + + 0 + 0 + + - + Enable benchmark + + + + Qt::Vertical + + + + 20 + 40 + + + + - + + + + 0 + 0 + + - &Qt event sleep period + Benchmark record interval + + + + + + + + 0 + 0 + - - loopEventDelayLine + + 30 - - - - Benchmark record in&terval + + + + + 0 + 0 + - - benchmarkIntervalLine + + Light theme is native style - + + + + 0 + 0 + + 0.0005 - - + + - Li&ght theme is native style - - - lightThemeNativeCheckBox + - - - - Qt::Vertical - - - - 20 - 40 - + + + + - + @@ -527,21 +659,6 @@ - - listWidget - searchOpenDefaultCheckBox - searchRegexDefaultCheckBox - searchCaseSensitiveDefaultCheckBox - searchWildcardDefaultCheckBox - listenHostLine - listenPortLine - singleTabCheckBox - logLevelLine - loopEventDelayLine - benchmarkCheckBox - benchmarkIntervalLine - lightThemeNativeCheckBox - @@ -551,8 +668,8 @@ accept() - 235 - 253 + 225 + 420 157 @@ -567,8 +684,8 @@ reject() - 303 - 253 + 293 + 426 286 @@ -583,49 +700,14 @@ setCurrentIndex(int) - 54 - 39 - - - 235 - 48 - - - - - listenPortLine - textChanged(QString) - Dialog - server_options_changed() - - - 312 - 57 - - - 346 - 6 - - - - - listenHostLine - textChanged(QString) - Dialog - server_options_changed() - - - 585 - 45 + 92 + 200 - 296 - 5 + 230 + 182 - - server_options_changed() - diff --git a/cutelog/settings_dialog.py b/cutelog/settings_dialog.py index cf43198..b425a7f 100644 --- a/cutelog/settings_dialog.py +++ b/cutelog/settings_dialog.py @@ -1,45 +1,41 @@ -from PyQt5 import uic -from PyQt5.QtWidgets import QMessageBox, QDialogButtonBox -from PyQt5.QtGui import QFont, QIntValidator, QDoubleValidator +from datetime import datetime -from .utils import show_info_dialog -from .config import CONFIG +from qtpy.QtGui import QDoubleValidator, QFont, QIntValidator, QValidator +from qtpy.QtWidgets import QDialog, QDialogButtonBox, QMessageBox +from .config import CONFIG, MSGPACK_SUPPORT, CBOR_SUPPORT +from .utils import loadUi, show_info_dialog -uif = CONFIG.get_ui_qfile('settings_dialog.ui') -SettingsDialogBase = uic.loadUiType(uif) -uif.close() - -class SettingsDialog(*SettingsDialogBase): +class SettingsDialog(QDialog): def __init__(self, parent): super().__init__(parent) self.parent_widget = parent self.server_restart_needed = False + self.time_format_validator = TimeFormatValidator(self) self.setupUi() def setupUi(self): - super().setupUi(self) + self.ui = loadUi(CONFIG.get_ui_qfile("settings_dialog.ui"), baseinstance=self) self.applyButton = self.buttonBox.button(QDialogButtonBox.Apply) self.applyButton.clicked.connect(self.save_to_config) + self.restoreDefaultsButton = self.buttonBox.button(QDialogButtonBox.RestoreDefaults) + self.restoreDefaultsButton.clicked.connect(self.confirm_restore_defaults) + + self.listenHostLine.textChanged.connect(self.server_options_changed) + self.listenPortLine.textChanged.connect(self.server_options_changed) self.setup_tooltips() self.load_from_config() def setup_tooltips(self): - self.loopEventDelayLine.setToolTip('Determines how fast UI updates. ' - 'Recommended vaules: between 0 and 0.0075.
' - 'Smaller number means smoother UI, but ' - 'might hinder performance of some things.') - self.benchmarkCheckBox.setToolTip('Has effect after restarting the server, ' 'for testing purposes only.') self.singleTabCheckBox.setToolTip("Forces all connections into one tab. " "Useful for when you're restarting one " "program very often.") - self.singleTabLabel.setBuddy(self.singleTabCheckBox) # @Hmmm: why doesn't this work? def load_from_config(self): # Appearance page @@ -51,6 +47,9 @@ def load_from_config(self): self.textViewFontSize.setValue(CONFIG['text_view_dialog_font_size']) self.loggerTableRowHeight.setValue(CONFIG['logger_row_height']) self.excIndicationComboBox.setCurrentIndex(CONFIG['exception_indication']) + self.timeFormatLine.setText(CONFIG['time_format_string']) + self.timeFormatLine.setValidator(self.time_format_validator) + self.timeFormatLine.textChanged.connect(self.time_format_valid) # Search self.searchOpenDefaultCheckBox.setChecked(CONFIG['search_open_default']) @@ -63,12 +62,18 @@ def load_from_config(self): self.listenPortLine.setValidator(QIntValidator(0, 65535, self)) self.listenPortLine.setText(str(CONFIG['listen_port'])) self.singleTabCheckBox.setChecked(CONFIG['single_tab_mode_default']) + self.extraModeCheckBox.setChecked(CONFIG['extra_mode_default']) + if MSGPACK_SUPPORT: + self.serializationFormatCombo.addItem("msgpack") + if CBOR_SUPPORT: + self.serializationFormatCombo.addItem("cbor") + i = self.serializationFormatCombo.findText(CONFIG['default_serialization_format']) + if i != -1: + self.serializationFormatCombo.setCurrentIndex(i) # Advanced page self.logLevelLine.setValidator(QIntValidator(0, 1000, self)) self.logLevelLine.setText(str(CONFIG['console_logging_level'])) - self.loopEventDelayLine.setValidator(QDoubleValidator(0, 1, 9, self)) - self.loopEventDelayLine.setText(str(CONFIG['loop_event_delay'])) self.benchmarkCheckBox.setChecked(CONFIG['benchmark']) self.benchmarkIntervalLine.setValidator(QDoubleValidator(0, 1000, 9, self)) self.benchmarkIntervalLine.setText(str(CONFIG['benchmark_interval'])) @@ -84,9 +89,9 @@ def save_to_config(self): o['text_view_dialog_font'] = self.textViewFont.currentFont().family() o['text_view_dialog_font_size'] = self.textViewFontSize.value() o['exception_indication'] = self.excIndicationComboBox.currentIndex() - new_row_height = self.loggerTableRowHeight.value() - if new_row_height != CONFIG['logger_row_height']: # to prevent resizing unnecessarily - o['logger_row_height'] = new_row_height + o['logger_row_height'] = self.loggerTableRowHeight.value() + if self.timeFormatLine.hasAcceptableInput(): + o['time_format_string'] = self.timeFormatLine.text() # Search o['search_open_default'] = self.searchOpenDefaultCheckBox.isChecked() @@ -99,9 +104,10 @@ def save_to_config(self): o['listen_port'] = int(self.listenPortLine.text()) o['console_logging_level'] = int(self.logLevelLine.text()) o['single_tab_mode_default'] = self.singleTabCheckBox.isChecked() + o['extra_mode_default'] = self.extraModeCheckBox.isChecked() + o['default_serialization_format'] = self.serializationFormatCombo.currentText() # Advanced - o['loop_event_delay'] = float(self.loopEventDelayLine.text()) o['benchmark_interval'] = float(self.benchmarkIntervalLine.text()) o['benchmark'] = self.benchmarkCheckBox.isChecked() o['light_theme_is_native'] = self.lightThemeNativeCheckBox.isChecked() @@ -126,3 +132,37 @@ def display_warning(self): m.setWindowTitle('Warning') m.setIcon(QMessageBox.Information) m.show() + + def confirm_restore_defaults(self): + m = QMessageBox(QMessageBox.Question, "Restore to defaults", + "Restore settings to the default state?\n" + "You'll need to restart the program.", + QMessageBox.Yes | QMessageBox.No, self) + m.setDefaultButton(QMessageBox.No) + yesButton = m.button(QMessageBox.Yes) + yesButton.clicked.connect(self.restore_defaults) + m.show() + + def restore_defaults(self): + CONFIG.restore_defaults() + self.done(0) + + def time_format_valid(self, fmt): + if self.timeFormatLine.hasAcceptableInput(): + self.timeFormatLine.setStyleSheet("QLineEdit {}") + return True + else: + self.timeFormatLine.setStyleSheet("QLineEdit {color: red}") + return False + + +class TimeFormatValidator(QValidator): + def __init__(self, parent): + super().__init__(parent) + + def validate(self, fmt_string, pos): + try: + datetime.now().strftime(fmt_string) + return self.Acceptable, fmt_string, pos + except Exception: + return self.Intermediate, fmt_string, pos diff --git a/cutelog/text_view_dialog.py b/cutelog/text_view_dialog.py index afed2cc..726f542 100644 --- a/cutelog/text_view_dialog.py +++ b/cutelog/text_view_dialog.py @@ -1,7 +1,7 @@ -from PyQt5.QtGui import QFont -from PyQt5.QtWidgets import (QApplication, QDialog, QHBoxLayout, QLayout, - QPlainTextEdit, QPushButton, QSizePolicy, - QSpacerItem, QVBoxLayout) +from qtpy.QtGui import QFont +from qtpy.QtWidgets import (QApplication, QDialog, QHBoxLayout, QLayout, + QPlainTextEdit, QPushButton, QSizePolicy, + QSpacerItem, QVBoxLayout) from .config import CONFIG diff --git a/cutelog/utils.py b/cutelog/utils.py index a0ec441..3f06c32 100644 --- a/cutelog/utils.py +++ b/cutelog/utils.py @@ -1,5 +1,6 @@ -from PyQt5.QtCore import Qt -from PyQt5.QtWidgets import QMessageBox, QDesktopWidget +import qtpy +from qtpy.QtCore import QMetaObject, Qt +from qtpy.QtWidgets import QDesktopWidget, QMessageBox def show_info_dialog(parent, title, text): @@ -30,3 +31,19 @@ def center_widget_on_screen(widget): center = QDesktopWidget().availableGeometry().center() rect.moveCenter(center) widget.move(rect.topLeft()) + + +# So .ui file loading is pretty hard to get to work with both PySide2 and PyQt5. +# This is the only way I was able to figure it out. +# loadUi function is pulled from qtpy, but modified to work around some PySide2 +# nonsense. +if qtpy.PYSIDE2: + from qtpy.uic import UiLoader + + def loadUi(uifile, baseinstance=None): + loader = UiLoader(baseinstance, None) + widget = loader.load(uifile) + QMetaObject.connectSlotsByName(widget) + return widget +else: + from qtpy.uic import loadUi diff --git a/screenshots/main_dark.png b/screenshots/main_dark.png index 4628213..1de9555 100644 Binary files a/screenshots/main_dark.png and b/screenshots/main_dark.png differ diff --git a/screenshots/main_light.png b/screenshots/main_light.png index 3b65fa2..5112e06 100644 Binary files a/screenshots/main_light.png and b/screenshots/main_light.png differ diff --git a/setup.py b/setup.py index e568cdb..5c46697 100644 --- a/setup.py +++ b/setup.py @@ -5,14 +5,26 @@ from setuptools.command.install import install -VERSION = '1.1.9' +VERSION = '2.0.0' def build_qt_resources(): print('Compiling resources...') - from PyQt5 import pyrcc_main + try: + from PyQt5 import pyrcc_main + except ImportError as e: + raise Exception("Building from source requires PyQt5") from e pyrcc_main.processResourceFile(['cutelog/resources/resources.qrc'], 'cutelog/resources.py', False) + # Rewrite PyQt5 import statements to qtpy + with open('cutelog/resources.py', 'r') as rf: + lines = rf.readlines() + for i, line in enumerate(lines): + if 'import' in line and not line.startswith('\\x'): + new_line = line.replace('PyQt5', 'qtpy') + lines[i] = new_line + with open('cutelog/resources.py', 'w') as wf: + wf.writelines(lines) print('Resources compiled successfully') @@ -37,7 +49,7 @@ def run(self): author_email="busfromrus@gmail.com", url="https://github.com/busimus/cutelog/", - requires=['PyQt5'], + requires=['PyQt5', 'QtPy'], python_requires=">=3.5", classifiers=[ @@ -45,7 +57,6 @@ def run(self): "Environment :: X11 Applications :: Qt", "Environment :: MacOS X :: Cocoa", "Environment :: Win32 (MS Windows)", - "Framework :: AsyncIO", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",