From 06c823aa671ca01161d1eb9b9742d805e7b4b8b5 Mon Sep 17 00:00:00 2001 From: miruka Date: Tue, 2 Jul 2019 13:59:52 -0400 Subject: [PATCH] Build system, messages support and more --- .gitignore | 10 +- .gitmodules | 3 + .pylintrc | 362 ++++++ Makefile | 1098 ++++++++++++++++- README.md | 16 + harmonyqml | Bin 0 -> 416776 bytes harmonyqml.pro | 68 + live_reload.sh | 10 + run.sh | 3 - run_live_reload.sh | 8 - src/events/rooms_timeline.py | 8 - src/main.cpp | 23 + src/matrix_client.py | 124 -- src/{ => python}/__about__.py | 0 src/{ => python}/__init__.py | 0 src/{ => python}/app.py | 37 +- src/{ => python}/backend.py | 19 +- src/{ => python}/events/__init__.py | 0 src/{ => python}/events/app.py | 0 src/{ => python}/events/event.py | 0 src/{ => python}/events/rooms.py | 0 src/python/events/rooms_timeline.py | 32 + src/{ => python}/events/users.py | 0 src/python/html_filter.py | 153 +++ src/python/matrix_client.py | 182 +++ src/qml/Base/HAvatar.qml | 11 +- src/qml/Base/HButton.qml | 5 - src/qml/Base/HListModel.qml | 93 +- src/qml/Chat/Banners/InviteBanner.qml | 1 + src/qml/Chat/Chat.qml | 146 +-- src/qml/Chat/RoomEventList/Daybreak.qml | 2 +- src/qml/Chat/RoomEventList/EventContent.qml | 2 +- src/qml/Chat/RoomEventList/MessageContent.qml | 17 +- .../Chat/RoomEventList/RoomEventDelegate.qml | 30 +- src/qml/Chat/RoomEventList/RoomEventList.qml | 16 +- src/qml/Chat/RoomHeader.qml | 4 +- src/qml/Chat/RoomSidePane/MemberDelegate.qml | 2 +- src/qml/Chat/SendBox.qml | 2 +- src/qml/EventHandlers/rooms.js | 37 +- src/qml/EventHandlers/rooms_timeline.js | 12 + src/qml/EventHandlers/users.js | 7 +- src/qml/Models.qml | 14 +- src/qml/Pages/RememberAccount.qml | 9 +- src/qml/Pages/SignIn.qml | 16 +- src/qml/Python.qml | 15 +- src/qml/SidePane/AccountDelegate.qml | 2 +- src/qml/SidePane/PaneToolBar.qml | 4 +- src/qml/SidePane/RoomCategoriesList.qml | 11 +- src/qml/SidePane/RoomDelegate.qml | 38 +- src/qml/SidePane/RoomList.qml | 36 +- src/qml/SidePane/SidePane.qml | 12 +- src/qml/UI.qml | 9 +- submodules/SortFilterProxyModel | 1 + 53 files changed, 2264 insertions(+), 446 deletions(-) create mode 100644 .gitmodules create mode 100644 .pylintrc create mode 100755 harmonyqml create mode 100644 harmonyqml.pro create mode 100755 live_reload.sh delete mode 100755 run.sh delete mode 100755 run_live_reload.sh delete mode 100644 src/events/rooms_timeline.py create mode 100644 src/main.cpp delete mode 100644 src/matrix_client.py rename src/{ => python}/__about__.py (100%) rename src/{ => python}/__init__.py (100%) rename src/{ => python}/app.py (75%) rename src/{ => python}/backend.py (90%) rename src/{ => python}/events/__init__.py (100%) rename src/{ => python}/events/app.py (100%) rename src/{ => python}/events/event.py (100%) rename src/{ => python}/events/rooms.py (100%) create mode 100644 src/python/events/rooms_timeline.py rename src/{ => python}/events/users.py (100%) create mode 100644 src/python/html_filter.py create mode 100644 src/python/matrix_client.py create mode 160000 submodules/SortFilterProxyModel diff --git a/.gitignore b/.gitignore index b8d40a74..71e0f755 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,14 @@ __pycache__ .mypy_cache -build -dist *.egg-info *.pyc + *.qmlc *.jsc -.pylintrc - tmp-* + +build +dist +.qmake.stash +Makefile diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..be99fc84 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "submodules/SortFilterProxyModel"] + path = submodules/SortFilterProxyModel + url = https://github.com/oKcerG/SortFilterProxyModel diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 00000000..e5ae7c5d --- /dev/null +++ b/.pylintrc @@ -0,0 +1,362 @@ +[MASTER] + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +extension-pkg-whitelist=lxml.etree + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=.git + +# Add files or directories matching the regex patterns to the blacklist. The +# regex matches against base names, not paths. +ignore-patterns= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Use multiple processes to speed up Pylint. +jobs=6 + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Pickle collected data for later comparisons. +persistent=yes + +# Specify a configuration file. +#rcfile= + +# When enabled, pylint would attempt to guess common misconfiguration and emit +# user-friendly hints instead of false-positive error messages +suggestion-mode=yes + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +# +# C0111: Allow lack of literal """docstring""" (e.g. if assigning __doc__) +# C0326: Allow aligning things like variable assignements +# C0412: Remove annoying "imports are not grouped" because of :Isort with from +# W0123: Allow eval() +disable=C0111,C0326,C0412,W0123 + +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules=pyotherside + +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes + +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 + + +[SPELLING] + +# Limits count of emitted suggestions for spelling mistakes +max-spelling-suggestions=4 + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install pyenchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[SIMILARITIES] + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + +# Minimum lines number of a similarity. +min-similarity-lines=4 + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes= + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging + + +[FORMAT] + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=79 + +# Maximum number of lines in a module +max-module-lines=1000 + +# List of optional constructs for which whitespace checking is disabled. `dict- +# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. +# `trailing-comma` allows a space between comma and closing bracket: (a, ). +# `empty-line` allows space-only lines. +no-space-check=trailing-comma, + dict-separator + +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + + +[BASIC] + +# Naming style matching correct argument names +argument-naming-style=snake_case + +# Regular expression matching correct argument names. Overrides argument- +# naming-style +argument-rgx=[a-z0-9_]{2,65}$ + +# Naming style matching correct attribute names +attr-naming-style=snake_case + +# Regular expression matching correct attribute names. Overrides attr-naming- +# style +attr-rgx=[a-z0-9_]{2,65}$ + +# Bad variable names which should always be refused, separated by a comma +bad-names= + +# Naming style matching correct class attribute names +class-attribute-naming-style=snake_case + +# Regular expression matching correct class attribute names. Overrides class- +# attribute-naming-style +class-attribute-rgx=[a-z0-9_]{2,65}$ + +# Naming style matching correct class names +class-naming-style=PascalCase + +# Regular expression matching correct class names. Overrides class-naming-style +#class-rgx= + +# Naming style matching correct constant names +const-naming-style=UPPER_CASE + +# Regular expression matching correct constant names. Overrides const-naming- +# style +const-rgx=(__[a-zA-Z0-9_]{2,65}__|[A-Z0-9_]{2,65})$ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + +# Naming style matching correct function names +function-naming-style=snake_case + +# Regular expression matching correct function names. Overrides function- +# naming-style +function-rgx=[a-z0-9_]{2,65}$ + +# Good variable names which should always be accepted, separated by a comma +good-names= _, a, b, i, j, k, v, w, h, x, y, z + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# Naming style matching correct inline iteration names +inlinevar-naming-style=any + +# Regular expression matching correct inline iteration names. Overrides +# inlinevar-naming-style +#inlinevar-rgx= + +# Naming style matching correct method names +method-naming-style=snake_case + +# Regular expression matching correct method names. Overrides method-naming- +# style +method-rgx=([a-z0-9_]{2,65}|on[A-Z][a-zA-Z0-9]{1,65})$ + +# Naming style matching correct module names +module-naming-style=snake_case + +# Regular expression matching correct module names. Overrides module-naming- +# style +module-rgx=[a-z0-9_]{2,65}$ + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^ + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +property-classes=abc.abstractproperty + +# Naming style matching correct variable names +variable-naming-style=snake_case + +# Regular expression matching correct variable names. Overrides variable- +# naming-style +variable-rgx=[a-z0-9_]{2,65}$ + + +[IMPORTS] + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=optparse,tkinter.tix + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=99 + +# Maximum number of attributes for a class (see R0902). +max-attributes=99 + +# Maximum number of boolean expressions in a if statement +max-bool-expr=99 + +# Maximum number of branch for function / method body +max-branches=99 + +# Maximum number of locals for function / method body +max-locals=99 + +# Maximum number of parents for a class (see R0901). +max-parents=99 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=99 + +# Maximum number of return / yield for function / method body +max-returns=99 + +# Maximum number of statements in function / method body +max-statements=999 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=0 + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +# Catching this is safe enough in Python 3. +#overgeneral-exceptions=Exception +overgeneral-exceptions= + + +[TYPECHECK] +generated-members=sh diff --git a/Makefile b/Makefile index 70614f63..8f137c2c 100644 --- a/Makefile +++ b/Makefile @@ -1,53 +1,1057 @@ -PKG_DIR = src +############################################################################# +# Makefile for building: harmonyqml +# Generated by qmake (3.1) (Qt 5.11.3) +# Project: harmonyqml.pro +# Template: app +# Command: /usr/lib/qt5/bin/qmake -o Makefile harmonyqml.pro CONFIG+=no_embedded +############################################################################# -PYTHON = python3 -PYLINT = pylint -MYPY = mypy -VULTURE = vulture -BANDIT = bandit -PYCYLE = pycycle -CLOC = cloc +MAKEFILE = Makefile -PYLINT_FLAGS = --output-format colorized -MYPY_FLAGS = --ignore-missing-imports -VULTURE_FLAGS = --min-confidence 70 -BANDIT_FLAGS = -PYCYLE_FLAGS = -CLOC_FLAGS = --ignore-whitespace +####### Compiler, tools and options -LINE = "\033[35m―――――――――――――――――――――――――――――――――――――――――――――――――――――――\033[0m" +CC = gcc +CXX = g++ +DEFINES = -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB +CFLAGS = -pipe -O2 -w -D_REENTRANT -fPIC $(DEFINES) +CXXFLAGS = -pipe -O2 -std=gnu++11 -w -D_REENTRANT -fPIC $(DEFINES) +INCPATH = -I. -Isubmodules/SortFilterProxyModel -I /usr/include/qt5 -I /usr/include/qt5/QtQuick -I /usr/include/qt5/QtGui -I /usr/include/qt5/QtQml -I /usr/include/qt5/QtNetwork -I /usr/include/qt5/QtCore -Ibuild/moc -I /usr/include/libdrm -I/usr/lib/qt5/mkspecs/linux-g++ +QMAKE = /usr/lib/qt5/bin/qmake +DEL_FILE = rm -rf +CHK_DIR_EXISTS= test -d +MKDIR = mkdir -p +COPY = cp -f +COPY_FILE = cp -f +COPY_DIR = cp -f -R +INSTALL_FILE = install -m 644 -p +INSTALL_PROGRAM = install -m 755 -p +INSTALL_DIR = cp -f -R +QINSTALL = /usr/lib/qt5/bin/qmake -install qinstall +QINSTALL_PROGRAM = /usr/lib/qt5/bin/qmake -install qinstall -exe +DEL_FILE = rm -rf +SYMLINK = ln -f -s +DEL_DIR = rmdir +MOVE = mv -f +TAR = tar -cf +COMPRESS = gzip -9f +DISTNAME = harmonyqml1.0.0 +DISTDIR = /home/kana/prog/python/harmonyqml/build/obj/harmonyqml1.0.0 +LINK = g++ +LFLAGS = -Wl,-O1 -Wl,-rpath,/usr/lib +LIBS = $(SUBLIBS) -lQt5Quick -lQt5Gui -lQt5Qml -lQt5Network -lQt5Core -lGL -lpthread +AR = ar cqs +RANLIB = +SED = sed +STRIP = strip -.PHONY: clean test +####### Output directory -clean: - find . -name '__pycache__' -exec rm -Rfv {} + - find . -name '*.pyc' -exec rm -Rfv {} + - find . -name '*.qmlc' -exec rm -Rfv {} + - find . -name '*.jsc' -exec rm -Rfv {} + - find . -name '*.egg-info' -exec rm -Rfv {} + +OBJECTS_DIR = build/obj/ + +####### Files + +SOURCES = src/main.cpp \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.cpp \ + submodules/SortFilterProxyModel/filters/filter.cpp \ + submodules/SortFilterProxyModel/filters/filtercontainer.cpp \ + submodules/SortFilterProxyModel/filters/rolefilter.cpp \ + submodules/SortFilterProxyModel/filters/valuefilter.cpp \ + submodules/SortFilterProxyModel/filters/indexfilter.cpp \ + submodules/SortFilterProxyModel/filters/regexpfilter.cpp \ + submodules/SortFilterProxyModel/filters/rangefilter.cpp \ + submodules/SortFilterProxyModel/filters/expressionfilter.cpp \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.cpp \ + submodules/SortFilterProxyModel/filters/anyoffilter.cpp \ + submodules/SortFilterProxyModel/filters/alloffilter.cpp \ + submodules/SortFilterProxyModel/filters/filtersqmltypes.cpp \ + submodules/SortFilterProxyModel/sorters/sorter.cpp \ + submodules/SortFilterProxyModel/sorters/sortercontainer.cpp \ + submodules/SortFilterProxyModel/sorters/rolesorter.cpp \ + submodules/SortFilterProxyModel/sorters/stringsorter.cpp \ + submodules/SortFilterProxyModel/sorters/expressionsorter.cpp \ + submodules/SortFilterProxyModel/sorters/sortersqmltypes.cpp \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.cpp \ + submodules/SortFilterProxyModel/proxyroles/joinrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/switchrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/expressionrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/proxyrolesqmltypes.cpp \ + submodules/SortFilterProxyModel/proxyroles/singlerole.cpp \ + submodules/SortFilterProxyModel/proxyroles/regexprole.cpp \ + submodules/SortFilterProxyModel/sorters/filtersorter.cpp \ + submodules/SortFilterProxyModel/proxyroles/filterrole.cpp build/moc/moc_qqmlsortfilterproxymodel.cpp \ + build/moc/moc_filter.cpp \ + build/moc/moc_rolefilter.cpp \ + build/moc/moc_valuefilter.cpp \ + build/moc/moc_indexfilter.cpp \ + build/moc/moc_regexpfilter.cpp \ + build/moc/moc_rangefilter.cpp \ + build/moc/moc_expressionfilter.cpp \ + build/moc/moc_filtercontainerfilter.cpp \ + build/moc/moc_anyoffilter.cpp \ + build/moc/moc_alloffilter.cpp \ + build/moc/moc_sorter.cpp \ + build/moc/moc_rolesorter.cpp \ + build/moc/moc_stringsorter.cpp \ + build/moc/moc_expressionsorter.cpp \ + build/moc/moc_proxyrole.cpp \ + build/moc/moc_joinrole.cpp \ + build/moc/moc_switchrole.cpp \ + build/moc/moc_expressionrole.cpp \ + build/moc/moc_singlerole.cpp \ + build/moc/moc_regexprole.cpp \ + build/moc/moc_filtersorter.cpp \ + build/moc/moc_filterrole.cpp +OBJECTS = build/obj/main.o \ + build/obj/qqmlsortfilterproxymodel.o \ + build/obj/filter.o \ + build/obj/filtercontainer.o \ + build/obj/rolefilter.o \ + build/obj/valuefilter.o \ + build/obj/indexfilter.o \ + build/obj/regexpfilter.o \ + build/obj/rangefilter.o \ + build/obj/expressionfilter.o \ + build/obj/filtercontainerfilter.o \ + build/obj/anyoffilter.o \ + build/obj/alloffilter.o \ + build/obj/filtersqmltypes.o \ + build/obj/sorter.o \ + build/obj/sortercontainer.o \ + build/obj/rolesorter.o \ + build/obj/stringsorter.o \ + build/obj/expressionsorter.o \ + build/obj/sortersqmltypes.o \ + build/obj/proxyrole.o \ + build/obj/proxyrolecontainer.o \ + build/obj/joinrole.o \ + build/obj/switchrole.o \ + build/obj/expressionrole.o \ + build/obj/proxyrolesqmltypes.o \ + build/obj/singlerole.o \ + build/obj/regexprole.o \ + build/obj/filtersorter.o \ + build/obj/filterrole.o \ + build/obj/moc_qqmlsortfilterproxymodel.o \ + build/obj/moc_filter.o \ + build/obj/moc_rolefilter.o \ + build/obj/moc_valuefilter.o \ + build/obj/moc_indexfilter.o \ + build/obj/moc_regexpfilter.o \ + build/obj/moc_rangefilter.o \ + build/obj/moc_expressionfilter.o \ + build/obj/moc_filtercontainerfilter.o \ + build/obj/moc_anyoffilter.o \ + build/obj/moc_alloffilter.o \ + build/obj/moc_sorter.o \ + build/obj/moc_rolesorter.o \ + build/obj/moc_stringsorter.o \ + build/obj/moc_expressionsorter.o \ + build/obj/moc_proxyrole.o \ + build/obj/moc_joinrole.o \ + build/obj/moc_switchrole.o \ + build/obj/moc_expressionrole.o \ + build/obj/moc_singlerole.o \ + build/obj/moc_regexprole.o \ + build/obj/moc_filtersorter.o \ + build/obj/moc_filterrole.o +DIST = /usr/lib/qt5/mkspecs/features/spec_pre.prf \ + /usr/lib/qt5/mkspecs/common/unix.conf \ + /usr/lib/qt5/mkspecs/common/linux.conf \ + /usr/lib/qt5/mkspecs/common/sanitize.conf \ + /usr/lib/qt5/mkspecs/common/gcc-base.conf \ + /usr/lib/qt5/mkspecs/common/gcc-base-unix.conf \ + /usr/lib/qt5/mkspecs/common/g++-base.conf \ + /usr/lib/qt5/mkspecs/common/g++-unix.conf \ + /usr/lib/qt5/mkspecs/qconfig.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_concurrent.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_concurrent_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_core.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_core_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_dbus.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_dbus_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_edid_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_egl_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_fb_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_glx_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_gui.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_gui_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_input_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_kms_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimedia.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimedia_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimediawidgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_network.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_network_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_opengl.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_opengl_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_openglextensions.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_printsupport.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_printsupport_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qml.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qml_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmldebug_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmltest.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmltest_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quick.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quick_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickcontrols2.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickparticles_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickwidgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_service_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_sql.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_sql_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_svg.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_svg_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_testlib.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_testlib_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_theme_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webengine.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webengine_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginecore.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginecore_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginewidgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginewidgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_widgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_widgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_x11extras.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_x11extras_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_xml.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_xml_private.pri \ + /usr/lib/qt5/mkspecs/features/qt_functions.prf \ + /usr/lib/qt5/mkspecs/features/qt_config.prf \ + /usr/lib/qt5/mkspecs/linux-g++/qmake.conf \ + /usr/lib/qt5/mkspecs/features/spec_post.prf \ + .qmake.stash \ + /usr/lib/qt5/mkspecs/features/exclusive_builds.prf \ + /usr/lib/qt5/mkspecs/features/toolchain.prf \ + /usr/lib/qt5/mkspecs/features/default_pre.prf \ + submodules/SortFilterProxyModel/SortFilterProxyModel.pri \ + /usr/lib/qt5/mkspecs/features/resolve_config.prf \ + /usr/lib/qt5/mkspecs/features/default_post.prf \ + /usr/lib/qt5/mkspecs/features/warn_off.prf \ + /usr/lib/qt5/mkspecs/features/qt.prf \ + /usr/lib/qt5/mkspecs/features/resources.prf \ + /usr/lib/qt5/mkspecs/features/moc.prf \ + /usr/lib/qt5/mkspecs/features/unix/opengl.prf \ + /usr/lib/qt5/mkspecs/features/unix/thread.prf \ + /usr/lib/qt5/mkspecs/features/qmake_use.prf \ + /usr/lib/qt5/mkspecs/features/file_copies.prf \ + /usr/lib/qt5/mkspecs/features/testcase_targets.prf \ + /usr/lib/qt5/mkspecs/features/exceptions.prf \ + /usr/lib/qt5/mkspecs/features/yacc.prf \ + /usr/lib/qt5/mkspecs/features/lex.prf \ + harmonyqml.pro submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/valuefilter.h \ + submodules/SortFilterProxyModel/filters/indexfilter.h \ + submodules/SortFilterProxyModel/filters/regexpfilter.h \ + submodules/SortFilterProxyModel/filters/rangefilter.h \ + submodules/SortFilterProxyModel/filters/expressionfilter.h \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/anyoffilter.h \ + submodules/SortFilterProxyModel/filters/alloffilter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/sorters/rolesorter.h \ + submodules/SortFilterProxyModel/sorters/stringsorter.h \ + submodules/SortFilterProxyModel/sorters/expressionsorter.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h \ + submodules/SortFilterProxyModel/proxyroles/joinrole.h \ + submodules/SortFilterProxyModel/proxyroles/switchrole.h \ + submodules/SortFilterProxyModel/proxyroles/expressionrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/regexprole.h \ + submodules/SortFilterProxyModel/sorters/filtersorter.h \ + submodules/SortFilterProxyModel/proxyroles/filterrole.h src/main.cpp \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.cpp \ + submodules/SortFilterProxyModel/filters/filter.cpp \ + submodules/SortFilterProxyModel/filters/filtercontainer.cpp \ + submodules/SortFilterProxyModel/filters/rolefilter.cpp \ + submodules/SortFilterProxyModel/filters/valuefilter.cpp \ + submodules/SortFilterProxyModel/filters/indexfilter.cpp \ + submodules/SortFilterProxyModel/filters/regexpfilter.cpp \ + submodules/SortFilterProxyModel/filters/rangefilter.cpp \ + submodules/SortFilterProxyModel/filters/expressionfilter.cpp \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.cpp \ + submodules/SortFilterProxyModel/filters/anyoffilter.cpp \ + submodules/SortFilterProxyModel/filters/alloffilter.cpp \ + submodules/SortFilterProxyModel/filters/filtersqmltypes.cpp \ + submodules/SortFilterProxyModel/sorters/sorter.cpp \ + submodules/SortFilterProxyModel/sorters/sortercontainer.cpp \ + submodules/SortFilterProxyModel/sorters/rolesorter.cpp \ + submodules/SortFilterProxyModel/sorters/stringsorter.cpp \ + submodules/SortFilterProxyModel/sorters/expressionsorter.cpp \ + submodules/SortFilterProxyModel/sorters/sortersqmltypes.cpp \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.cpp \ + submodules/SortFilterProxyModel/proxyroles/joinrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/switchrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/expressionrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/proxyrolesqmltypes.cpp \ + submodules/SortFilterProxyModel/proxyroles/singlerole.cpp \ + submodules/SortFilterProxyModel/proxyroles/regexprole.cpp \ + submodules/SortFilterProxyModel/sorters/filtersorter.cpp \ + submodules/SortFilterProxyModel/proxyroles/filterrole.cpp +QMAKE_TARGET = harmonyqml +DESTDIR = +TARGET = harmonyqml + + +first: all +####### Build rules + +$(TARGET): $(OBJECTS) + $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) + +Makefile: harmonyqml.pro /usr/lib/qt5/mkspecs/linux-g++/qmake.conf /usr/lib/qt5/mkspecs/features/spec_pre.prf \ + /usr/lib/qt5/mkspecs/common/unix.conf \ + /usr/lib/qt5/mkspecs/common/linux.conf \ + /usr/lib/qt5/mkspecs/common/sanitize.conf \ + /usr/lib/qt5/mkspecs/common/gcc-base.conf \ + /usr/lib/qt5/mkspecs/common/gcc-base-unix.conf \ + /usr/lib/qt5/mkspecs/common/g++-base.conf \ + /usr/lib/qt5/mkspecs/common/g++-unix.conf \ + /usr/lib/qt5/mkspecs/qconfig.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_concurrent.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_concurrent_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_core.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_core_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_dbus.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_dbus_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_edid_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_egl_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_fb_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_glx_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_gui.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_gui_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_input_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_kms_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimedia.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimedia_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimediawidgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_network.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_network_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_opengl.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_opengl_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_openglextensions.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_printsupport.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_printsupport_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qml.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qml_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmldebug_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmltest.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmltest_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quick.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quick_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickcontrols2.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickparticles_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickwidgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_service_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_sql.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_sql_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_svg.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_svg_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_testlib.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_testlib_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_theme_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webengine.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webengine_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginecore.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginecore_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginewidgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginewidgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_widgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_widgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_x11extras.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_x11extras_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_xml.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_xml_private.pri \ + /usr/lib/qt5/mkspecs/features/qt_functions.prf \ + /usr/lib/qt5/mkspecs/features/qt_config.prf \ + /usr/lib/qt5/mkspecs/linux-g++/qmake.conf \ + /usr/lib/qt5/mkspecs/features/spec_post.prf \ + .qmake.stash \ + /usr/lib/qt5/mkspecs/features/exclusive_builds.prf \ + /usr/lib/qt5/mkspecs/features/toolchain.prf \ + /usr/lib/qt5/mkspecs/features/default_pre.prf \ + submodules/SortFilterProxyModel/SortFilterProxyModel.pri \ + /usr/lib/qt5/mkspecs/features/resolve_config.prf \ + /usr/lib/qt5/mkspecs/features/default_post.prf \ + /usr/lib/qt5/mkspecs/features/warn_off.prf \ + /usr/lib/qt5/mkspecs/features/qt.prf \ + /usr/lib/qt5/mkspecs/features/resources.prf \ + /usr/lib/qt5/mkspecs/features/moc.prf \ + /usr/lib/qt5/mkspecs/features/unix/opengl.prf \ + /usr/lib/qt5/mkspecs/features/unix/thread.prf \ + /usr/lib/qt5/mkspecs/features/qmake_use.prf \ + /usr/lib/qt5/mkspecs/features/file_copies.prf \ + /usr/lib/qt5/mkspecs/features/testcase_targets.prf \ + /usr/lib/qt5/mkspecs/features/exceptions.prf \ + /usr/lib/qt5/mkspecs/features/yacc.prf \ + /usr/lib/qt5/mkspecs/features/lex.prf \ + harmonyqml.pro \ + /usr/lib64/libQt5Quick.prl \ + /usr/lib64/libQt5Gui.prl \ + /usr/lib64/libQt5Qml.prl \ + /usr/lib64/libQt5Network.prl \ + /usr/lib64/libQt5Core.prl + $(QMAKE) -o Makefile harmonyqml.pro CONFIG+=no_embedded +/usr/lib/qt5/mkspecs/features/spec_pre.prf: +/usr/lib/qt5/mkspecs/common/unix.conf: +/usr/lib/qt5/mkspecs/common/linux.conf: +/usr/lib/qt5/mkspecs/common/sanitize.conf: +/usr/lib/qt5/mkspecs/common/gcc-base.conf: +/usr/lib/qt5/mkspecs/common/gcc-base-unix.conf: +/usr/lib/qt5/mkspecs/common/g++-base.conf: +/usr/lib/qt5/mkspecs/common/g++-unix.conf: +/usr/lib/qt5/mkspecs/qconfig.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_accessibility_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_concurrent.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_concurrent_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_core.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_core_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_dbus.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_dbus_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_devicediscovery_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_edid_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_egl_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_fb_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_fontdatabase_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_glx_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_gui.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_gui_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_input_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_kms_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_multimedia.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_multimedia_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_multimediagsttools_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_multimediawidgets.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_multimediawidgets_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_network.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_network_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_opengl.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_opengl_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_openglextensions.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_packetprotocol_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_platformcompositor_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_printsupport.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_printsupport_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qml.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qml_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qmldebug_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qmldevtools_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qmltest.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qmltest_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quick.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quick_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quickcontrols2.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quickcontrols2_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quickparticles_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quicktemplates2_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quickwidgets.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quickwidgets_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_service_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_sql.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_sql_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_svg.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_svg_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_testlib.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_testlib_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_theme_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webengine.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webengine_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webenginecore.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webenginecore_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webenginewidgets.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webenginewidgets_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_widgets.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_widgets_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_x11extras.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_x11extras_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_xml.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_xml_private.pri: +/usr/lib/qt5/mkspecs/features/qt_functions.prf: +/usr/lib/qt5/mkspecs/features/qt_config.prf: +/usr/lib/qt5/mkspecs/linux-g++/qmake.conf: +/usr/lib/qt5/mkspecs/features/spec_post.prf: +.qmake.stash: +/usr/lib/qt5/mkspecs/features/exclusive_builds.prf: +/usr/lib/qt5/mkspecs/features/toolchain.prf: +/usr/lib/qt5/mkspecs/features/default_pre.prf: +submodules/SortFilterProxyModel/SortFilterProxyModel.pri: +/usr/lib/qt5/mkspecs/features/resolve_config.prf: +/usr/lib/qt5/mkspecs/features/default_post.prf: +/usr/lib/qt5/mkspecs/features/warn_off.prf: +/usr/lib/qt5/mkspecs/features/qt.prf: +/usr/lib/qt5/mkspecs/features/resources.prf: +/usr/lib/qt5/mkspecs/features/moc.prf: +/usr/lib/qt5/mkspecs/features/unix/opengl.prf: +/usr/lib/qt5/mkspecs/features/unix/thread.prf: +/usr/lib/qt5/mkspecs/features/qmake_use.prf: +/usr/lib/qt5/mkspecs/features/file_copies.prf: +/usr/lib/qt5/mkspecs/features/testcase_targets.prf: +/usr/lib/qt5/mkspecs/features/exceptions.prf: +/usr/lib/qt5/mkspecs/features/yacc.prf: +/usr/lib/qt5/mkspecs/features/lex.prf: +harmonyqml.pro: +/usr/lib64/libQt5Quick.prl: +/usr/lib64/libQt5Gui.prl: +/usr/lib64/libQt5Qml.prl: +/usr/lib64/libQt5Network.prl: +/usr/lib64/libQt5Core.prl: +qmake: FORCE + @$(QMAKE) -o Makefile harmonyqml.pro CONFIG+=no_embedded + +qmake_all: FORCE + + +all: Makefile $(TARGET) + +dist: distdir FORCE + (cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR) + +distdir: FORCE + @test -d $(DISTDIR) || mkdir -p $(DISTDIR) + $(COPY_FILE) --parents $(DIST) $(DISTDIR)/ + $(COPY_FILE) --parents /usr/lib/qt5/mkspecs/features/data/dummy.cpp $(DISTDIR)/ + $(COPY_FILE) --parents submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h submodules/SortFilterProxyModel/filters/filter.h submodules/SortFilterProxyModel/filters/filtercontainer.h submodules/SortFilterProxyModel/filters/rolefilter.h submodules/SortFilterProxyModel/filters/valuefilter.h submodules/SortFilterProxyModel/filters/indexfilter.h submodules/SortFilterProxyModel/filters/regexpfilter.h submodules/SortFilterProxyModel/filters/rangefilter.h submodules/SortFilterProxyModel/filters/expressionfilter.h submodules/SortFilterProxyModel/filters/filtercontainerfilter.h submodules/SortFilterProxyModel/filters/anyoffilter.h submodules/SortFilterProxyModel/filters/alloffilter.h submodules/SortFilterProxyModel/sorters/sorter.h submodules/SortFilterProxyModel/sorters/sortercontainer.h submodules/SortFilterProxyModel/sorters/rolesorter.h submodules/SortFilterProxyModel/sorters/stringsorter.h submodules/SortFilterProxyModel/sorters/expressionsorter.h submodules/SortFilterProxyModel/proxyroles/proxyrole.h submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h submodules/SortFilterProxyModel/proxyroles/joinrole.h submodules/SortFilterProxyModel/proxyroles/switchrole.h submodules/SortFilterProxyModel/proxyroles/expressionrole.h submodules/SortFilterProxyModel/proxyroles/singlerole.h submodules/SortFilterProxyModel/proxyroles/regexprole.h submodules/SortFilterProxyModel/sorters/filtersorter.h submodules/SortFilterProxyModel/proxyroles/filterrole.h $(DISTDIR)/ + $(COPY_FILE) --parents src/main.cpp submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.cpp submodules/SortFilterProxyModel/filters/filter.cpp submodules/SortFilterProxyModel/filters/filtercontainer.cpp submodules/SortFilterProxyModel/filters/rolefilter.cpp submodules/SortFilterProxyModel/filters/valuefilter.cpp submodules/SortFilterProxyModel/filters/indexfilter.cpp submodules/SortFilterProxyModel/filters/regexpfilter.cpp submodules/SortFilterProxyModel/filters/rangefilter.cpp submodules/SortFilterProxyModel/filters/expressionfilter.cpp submodules/SortFilterProxyModel/filters/filtercontainerfilter.cpp submodules/SortFilterProxyModel/filters/anyoffilter.cpp submodules/SortFilterProxyModel/filters/alloffilter.cpp submodules/SortFilterProxyModel/filters/filtersqmltypes.cpp submodules/SortFilterProxyModel/sorters/sorter.cpp submodules/SortFilterProxyModel/sorters/sortercontainer.cpp submodules/SortFilterProxyModel/sorters/rolesorter.cpp submodules/SortFilterProxyModel/sorters/stringsorter.cpp submodules/SortFilterProxyModel/sorters/expressionsorter.cpp submodules/SortFilterProxyModel/sorters/sortersqmltypes.cpp submodules/SortFilterProxyModel/proxyroles/proxyrole.cpp submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.cpp submodules/SortFilterProxyModel/proxyroles/joinrole.cpp submodules/SortFilterProxyModel/proxyroles/switchrole.cpp submodules/SortFilterProxyModel/proxyroles/expressionrole.cpp submodules/SortFilterProxyModel/proxyroles/proxyrolesqmltypes.cpp submodules/SortFilterProxyModel/proxyroles/singlerole.cpp submodules/SortFilterProxyModel/proxyroles/regexprole.cpp submodules/SortFilterProxyModel/sorters/filtersorter.cpp submodules/SortFilterProxyModel/proxyroles/filterrole.cpp $(DISTDIR)/ + + +clean: compiler_clean + -$(DEL_FILE) $(OBJECTS) + -$(DEL_FILE) build/moc build/obj build/rcc src/python/__pycache__ src/python/events/__pycache__ build/resources.qrc build Makefile .qmake.stash src/python/__pycache__/__about__.cpython-36.pyc src/python/__pycache__/__init__.cpython-36.pyc src/python/__pycache__/app.cpython-36.pyc src/python/__pycache__/backend.cpython-36.pyc src/python/__pycache__/html_filter.cpython-36.pyc src/python/__pycache__/matrix_client.cpython-36.pyc src/python/events/__pycache__/__init__.cpython-36.pyc src/python/events/__pycache__/app.cpython-36.pyc src/python/events/__pycache__/event.cpython-36.pyc src/python/events/__pycache__/rooms.cpython-36.pyc src/python/events/__pycache__/rooms_timeline.cpython-36.pyc src/python/events/__pycache__/users.cpython-36.pyc + -$(DEL_FILE) *~ core *.core + + +distclean: clean + -$(DEL_FILE) $(TARGET) + -$(DEL_FILE) .qmake.stash + -$(DEL_FILE) Makefile + + +####### Sub-libraries + +mocclean: compiler_moc_header_clean compiler_moc_objc_header_clean compiler_moc_source_clean + +mocables: compiler_moc_header_make_all compiler_moc_objc_header_make_all compiler_moc_source_make_all + +check: first + +benchmark: first + +compiler_rcc_make_all: +compiler_rcc_clean: +compiler_moc_predefs_make_all: build/moc/moc_predefs.h +compiler_moc_predefs_clean: + -$(DEL_FILE) build/moc/moc_predefs.h +build/moc/moc_predefs.h: /usr/lib/qt5/mkspecs/features/data/dummy.cpp + g++ -pipe -O2 -std=gnu++11 -w -dM -E -o build/moc/moc_predefs.h /usr/lib/qt5/mkspecs/features/data/dummy.cpp + +compiler_moc_header_make_all: build/moc/moc_qqmlsortfilterproxymodel.cpp build/moc/moc_filter.cpp build/moc/moc_rolefilter.cpp build/moc/moc_valuefilter.cpp build/moc/moc_indexfilter.cpp build/moc/moc_regexpfilter.cpp build/moc/moc_rangefilter.cpp build/moc/moc_expressionfilter.cpp build/moc/moc_filtercontainerfilter.cpp build/moc/moc_anyoffilter.cpp build/moc/moc_alloffilter.cpp build/moc/moc_sorter.cpp build/moc/moc_rolesorter.cpp build/moc/moc_stringsorter.cpp build/moc/moc_expressionsorter.cpp build/moc/moc_proxyrole.cpp build/moc/moc_joinrole.cpp build/moc/moc_switchrole.cpp build/moc/moc_expressionrole.cpp build/moc/moc_singlerole.cpp build/moc/moc_regexprole.cpp build/moc/moc_filtersorter.cpp build/moc/moc_filterrole.cpp +compiler_moc_header_clean: + -$(DEL_FILE) build/moc/moc_qqmlsortfilterproxymodel.cpp build/moc/moc_filter.cpp build/moc/moc_rolefilter.cpp build/moc/moc_valuefilter.cpp build/moc/moc_indexfilter.cpp build/moc/moc_regexpfilter.cpp build/moc/moc_rangefilter.cpp build/moc/moc_expressionfilter.cpp build/moc/moc_filtercontainerfilter.cpp build/moc/moc_anyoffilter.cpp build/moc/moc_alloffilter.cpp build/moc/moc_sorter.cpp build/moc/moc_rolesorter.cpp build/moc/moc_stringsorter.cpp build/moc/moc_expressionsorter.cpp build/moc/moc_proxyrole.cpp build/moc/moc_joinrole.cpp build/moc/moc_switchrole.cpp build/moc/moc_expressionrole.cpp build/moc/moc_singlerole.cpp build/moc/moc_regexprole.cpp build/moc/moc_filtersorter.cpp build/moc/moc_filterrole.cpp +build/moc/moc_qqmlsortfilterproxymodel.cpp: submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h -o build/moc/moc_qqmlsortfilterproxymodel.cpp + +build/moc/moc_filter.cpp: submodules/SortFilterProxyModel/filters/filter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/filter.h -o build/moc/moc_filter.cpp + +build/moc/moc_rolefilter.cpp: submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/rolefilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/rolefilter.h -o build/moc/moc_rolefilter.cpp + +build/moc/moc_valuefilter.cpp: submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/valuefilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/valuefilter.h -o build/moc/moc_valuefilter.cpp + +build/moc/moc_indexfilter.cpp: submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/indexfilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/indexfilter.h -o build/moc/moc_indexfilter.cpp + +build/moc/moc_regexpfilter.cpp: submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/regexpfilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/regexpfilter.h -o build/moc/moc_regexpfilter.cpp + +build/moc/moc_rangefilter.cpp: submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/rangefilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/rangefilter.h -o build/moc/moc_rangefilter.cpp + +build/moc/moc_expressionfilter.cpp: submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/expressionfilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/expressionfilter.h -o build/moc/moc_expressionfilter.cpp + +build/moc/moc_filtercontainerfilter.cpp: submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/filtercontainerfilter.h -o build/moc/moc_filtercontainerfilter.cpp + +build/moc/moc_anyoffilter.cpp: submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/anyoffilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/anyoffilter.h -o build/moc/moc_anyoffilter.cpp + +build/moc/moc_alloffilter.cpp: submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/alloffilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/alloffilter.h -o build/moc/moc_alloffilter.cpp + +build/moc/moc_sorter.cpp: submodules/SortFilterProxyModel/sorters/sorter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/sorters/sorter.h -o build/moc/moc_sorter.cpp + +build/moc/moc_rolesorter.cpp: submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/sorters/rolesorter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/sorters/rolesorter.h -o build/moc/moc_rolesorter.cpp + +build/moc/moc_stringsorter.cpp: submodules/SortFilterProxyModel/sorters/rolesorter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/sorters/stringsorter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/sorters/stringsorter.h -o build/moc/moc_stringsorter.cpp + +build/moc/moc_expressionsorter.cpp: submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/sorters/expressionsorter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/sorters/expressionsorter.h -o build/moc/moc_expressionsorter.cpp + +build/moc/moc_proxyrole.cpp: submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/proxyrole.h -o build/moc/moc_proxyrole.cpp + +build/moc/moc_joinrole.cpp: submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/proxyroles/joinrole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/joinrole.h -o build/moc/moc_joinrole.cpp + +build/moc/moc_switchrole.cpp: submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/switchrole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/switchrole.h -o build/moc/moc_switchrole.cpp + +build/moc/moc_expressionrole.cpp: submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/proxyroles/expressionrole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/expressionrole.h -o build/moc/moc_expressionrole.cpp + +build/moc/moc_singlerole.cpp: submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/singlerole.h -o build/moc/moc_singlerole.cpp + +build/moc/moc_regexprole.cpp: submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/proxyroles/regexprole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/regexprole.h -o build/moc/moc_regexprole.cpp + +build/moc/moc_filtersorter.cpp: submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/filtersorter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/sorters/filtersorter.h -o build/moc/moc_filtersorter.cpp + +build/moc/moc_filterrole.cpp: submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/filterrole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/filterrole.h -o build/moc/moc_filterrole.cpp + +compiler_moc_objc_header_make_all: +compiler_moc_objc_header_clean: +compiler_moc_source_make_all: +compiler_moc_source_clean: +compiler_yacc_decl_make_all: +compiler_yacc_decl_clean: +compiler_yacc_impl_make_all: +compiler_yacc_impl_clean: +compiler_lex_make_all: +compiler_lex_clean: +compiler_clean: compiler_moc_predefs_clean compiler_moc_header_clean + +####### Compile + +build/obj/main.o: src/main.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/main.o src/main.cpp + +build/obj/qqmlsortfilterproxymodel.o: submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.cpp submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/qqmlsortfilterproxymodel.o submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.cpp + +build/obj/filter.o: submodules/SortFilterProxyModel/filters/filter.cpp submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/filter.o submodules/SortFilterProxyModel/filters/filter.cpp + +build/obj/filtercontainer.o: submodules/SortFilterProxyModel/filters/filtercontainer.cpp submodules/SortFilterProxyModel/filters/filtercontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/filtercontainer.o submodules/SortFilterProxyModel/filters/filtercontainer.cpp + +build/obj/rolefilter.o: submodules/SortFilterProxyModel/filters/rolefilter.cpp submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/rolefilter.o submodules/SortFilterProxyModel/filters/rolefilter.cpp + +build/obj/valuefilter.o: submodules/SortFilterProxyModel/filters/valuefilter.cpp submodules/SortFilterProxyModel/filters/valuefilter.h \ + submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/valuefilter.o submodules/SortFilterProxyModel/filters/valuefilter.cpp + +build/obj/indexfilter.o: submodules/SortFilterProxyModel/filters/indexfilter.cpp submodules/SortFilterProxyModel/filters/indexfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/indexfilter.o submodules/SortFilterProxyModel/filters/indexfilter.cpp + +build/obj/regexpfilter.o: submodules/SortFilterProxyModel/filters/regexpfilter.cpp submodules/SortFilterProxyModel/filters/regexpfilter.h \ + submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/regexpfilter.o submodules/SortFilterProxyModel/filters/regexpfilter.cpp + +build/obj/rangefilter.o: submodules/SortFilterProxyModel/filters/rangefilter.cpp submodules/SortFilterProxyModel/filters/rangefilter.h \ + submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/rangefilter.o submodules/SortFilterProxyModel/filters/rangefilter.cpp + +build/obj/expressionfilter.o: submodules/SortFilterProxyModel/filters/expressionfilter.cpp submodules/SortFilterProxyModel/filters/expressionfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/expressionfilter.o submodules/SortFilterProxyModel/filters/expressionfilter.cpp + +build/obj/filtercontainerfilter.o: submodules/SortFilterProxyModel/filters/filtercontainerfilter.cpp submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/filtercontainerfilter.o submodules/SortFilterProxyModel/filters/filtercontainerfilter.cpp + +build/obj/anyoffilter.o: submodules/SortFilterProxyModel/filters/anyoffilter.cpp submodules/SortFilterProxyModel/filters/anyoffilter.h \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/anyoffilter.o submodules/SortFilterProxyModel/filters/anyoffilter.cpp + +build/obj/alloffilter.o: submodules/SortFilterProxyModel/filters/alloffilter.cpp submodules/SortFilterProxyModel/filters/alloffilter.h \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/alloffilter.o submodules/SortFilterProxyModel/filters/alloffilter.cpp + +build/obj/filtersqmltypes.o: submodules/SortFilterProxyModel/filters/filtersqmltypes.cpp submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/valuefilter.h \ + submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/indexfilter.h \ + submodules/SortFilterProxyModel/filters/regexpfilter.h \ + submodules/SortFilterProxyModel/filters/rangefilter.h \ + submodules/SortFilterProxyModel/filters/expressionfilter.h \ + submodules/SortFilterProxyModel/filters/anyoffilter.h \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/alloffilter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/filtersqmltypes.o submodules/SortFilterProxyModel/filters/filtersqmltypes.cpp + +build/obj/sorter.o: submodules/SortFilterProxyModel/sorters/sorter.cpp submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/sorter.o submodules/SortFilterProxyModel/sorters/sorter.cpp + +build/obj/sortercontainer.o: submodules/SortFilterProxyModel/sorters/sortercontainer.cpp submodules/SortFilterProxyModel/sorters/sortercontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/sortercontainer.o submodules/SortFilterProxyModel/sorters/sortercontainer.cpp + +build/obj/rolesorter.o: submodules/SortFilterProxyModel/sorters/rolesorter.cpp submodules/SortFilterProxyModel/sorters/rolesorter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/rolesorter.o submodules/SortFilterProxyModel/sorters/rolesorter.cpp + +build/obj/stringsorter.o: submodules/SortFilterProxyModel/sorters/stringsorter.cpp submodules/SortFilterProxyModel/sorters/stringsorter.h \ + submodules/SortFilterProxyModel/sorters/rolesorter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/stringsorter.o submodules/SortFilterProxyModel/sorters/stringsorter.cpp + +build/obj/expressionsorter.o: submodules/SortFilterProxyModel/sorters/expressionsorter.cpp submodules/SortFilterProxyModel/sorters/expressionsorter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/expressionsorter.o submodules/SortFilterProxyModel/sorters/expressionsorter.cpp + +build/obj/sortersqmltypes.o: submodules/SortFilterProxyModel/sorters/sortersqmltypes.cpp submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/sorters/rolesorter.h \ + submodules/SortFilterProxyModel/sorters/stringsorter.h \ + submodules/SortFilterProxyModel/sorters/filtersorter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/expressionsorter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/sortersqmltypes.o submodules/SortFilterProxyModel/sorters/sortersqmltypes.cpp + +build/obj/proxyrole.o: submodules/SortFilterProxyModel/proxyroles/proxyrole.cpp submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/proxyrole.o submodules/SortFilterProxyModel/proxyroles/proxyrole.cpp + +build/obj/proxyrolecontainer.o: submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.cpp submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/proxyrolecontainer.o submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.cpp + +build/obj/joinrole.o: submodules/SortFilterProxyModel/proxyroles/joinrole.cpp submodules/SortFilterProxyModel/proxyroles/joinrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/joinrole.o submodules/SortFilterProxyModel/proxyroles/joinrole.cpp + +build/obj/switchrole.o: submodules/SortFilterProxyModel/proxyroles/switchrole.cpp submodules/SortFilterProxyModel/proxyroles/switchrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h \ + submodules/SortFilterProxyModel/filters/filter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/switchrole.o submodules/SortFilterProxyModel/proxyroles/switchrole.cpp + +build/obj/expressionrole.o: submodules/SortFilterProxyModel/proxyroles/expressionrole.cpp submodules/SortFilterProxyModel/proxyroles/expressionrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/expressionrole.o submodules/SortFilterProxyModel/proxyroles/expressionrole.cpp + +build/obj/proxyrolesqmltypes.o: submodules/SortFilterProxyModel/proxyroles/proxyrolesqmltypes.cpp submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/proxyroles/joinrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/switchrole.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/expressionrole.h \ + submodules/SortFilterProxyModel/proxyroles/regexprole.h \ + submodules/SortFilterProxyModel/proxyroles/filterrole.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/proxyrolesqmltypes.o submodules/SortFilterProxyModel/proxyroles/proxyrolesqmltypes.cpp + +build/obj/singlerole.o: submodules/SortFilterProxyModel/proxyroles/singlerole.cpp submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/singlerole.o submodules/SortFilterProxyModel/proxyroles/singlerole.cpp + +build/obj/regexprole.o: submodules/SortFilterProxyModel/proxyroles/regexprole.cpp submodules/SortFilterProxyModel/proxyroles/regexprole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/regexprole.o submodules/SortFilterProxyModel/proxyroles/regexprole.cpp + +build/obj/filtersorter.o: submodules/SortFilterProxyModel/sorters/filtersorter.cpp submodules/SortFilterProxyModel/sorters/filtersorter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/filter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/filtersorter.o submodules/SortFilterProxyModel/sorters/filtersorter.cpp + +build/obj/filterrole.o: submodules/SortFilterProxyModel/proxyroles/filterrole.cpp submodules/SortFilterProxyModel/proxyroles/filterrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/filter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/filterrole.o submodules/SortFilterProxyModel/proxyroles/filterrole.cpp + +build/obj/moc_qqmlsortfilterproxymodel.o: build/moc/moc_qqmlsortfilterproxymodel.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_qqmlsortfilterproxymodel.o build/moc/moc_qqmlsortfilterproxymodel.cpp + +build/obj/moc_filter.o: build/moc/moc_filter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_filter.o build/moc/moc_filter.cpp + +build/obj/moc_rolefilter.o: build/moc/moc_rolefilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_rolefilter.o build/moc/moc_rolefilter.cpp + +build/obj/moc_valuefilter.o: build/moc/moc_valuefilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_valuefilter.o build/moc/moc_valuefilter.cpp + +build/obj/moc_indexfilter.o: build/moc/moc_indexfilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_indexfilter.o build/moc/moc_indexfilter.cpp + +build/obj/moc_regexpfilter.o: build/moc/moc_regexpfilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_regexpfilter.o build/moc/moc_regexpfilter.cpp + +build/obj/moc_rangefilter.o: build/moc/moc_rangefilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_rangefilter.o build/moc/moc_rangefilter.cpp + +build/obj/moc_expressionfilter.o: build/moc/moc_expressionfilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_expressionfilter.o build/moc/moc_expressionfilter.cpp + +build/obj/moc_filtercontainerfilter.o: build/moc/moc_filtercontainerfilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_filtercontainerfilter.o build/moc/moc_filtercontainerfilter.cpp + +build/obj/moc_anyoffilter.o: build/moc/moc_anyoffilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_anyoffilter.o build/moc/moc_anyoffilter.cpp + +build/obj/moc_alloffilter.o: build/moc/moc_alloffilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_alloffilter.o build/moc/moc_alloffilter.cpp + +build/obj/moc_sorter.o: build/moc/moc_sorter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_sorter.o build/moc/moc_sorter.cpp + +build/obj/moc_rolesorter.o: build/moc/moc_rolesorter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_rolesorter.o build/moc/moc_rolesorter.cpp + +build/obj/moc_stringsorter.o: build/moc/moc_stringsorter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_stringsorter.o build/moc/moc_stringsorter.cpp + +build/obj/moc_expressionsorter.o: build/moc/moc_expressionsorter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_expressionsorter.o build/moc/moc_expressionsorter.cpp + +build/obj/moc_proxyrole.o: build/moc/moc_proxyrole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_proxyrole.o build/moc/moc_proxyrole.cpp + +build/obj/moc_joinrole.o: build/moc/moc_joinrole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_joinrole.o build/moc/moc_joinrole.cpp + +build/obj/moc_switchrole.o: build/moc/moc_switchrole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_switchrole.o build/moc/moc_switchrole.cpp + +build/obj/moc_expressionrole.o: build/moc/moc_expressionrole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_expressionrole.o build/moc/moc_expressionrole.cpp + +build/obj/moc_singlerole.o: build/moc/moc_singlerole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_singlerole.o build/moc/moc_singlerole.cpp + +build/obj/moc_regexprole.o: build/moc/moc_regexprole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_regexprole.o build/moc/moc_regexprole.cpp + +build/obj/moc_filtersorter.o: build/moc/moc_filtersorter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_filtersorter.o build/moc/moc_filtersorter.cpp + +build/obj/moc_filterrole.o: build/moc/moc_filterrole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_filterrole.o build/moc/moc_filterrole.cpp + +####### Install + +install: FORCE + +uninstall: FORCE + +FORCE: -test: - @echo - @echo pycycle ${LINE} - @echo - - ${PYCYLE} --source ${PKG_DIR} ${PYCYLE_FLAGS} - @echo - @echo mypy ${LINE} - @echo - - ${MYPY} ${PKG_DIR} ${MYPY_FLAGS} - @echo - @echo vulture ${LINE} - @echo - - ${VULTURE} ${PKG_DIR} ${VULTURE_FLAGS} - @echo - @echo bandit ${LINE} - @echo - - ${BANDIT} ${PKG_DIR} --recursive ${BANDIT_FLAGS} - @echo - @echo pylint ${LINE} - @echo - - ${PYLINT} ${PYLINT_FLAGS} ${PKG_DIR} - @echo - @echo cloc ${LINE} - @echo - - ${CLOC} ${CLOC_FLAGS} ${PKG_DIR} diff --git a/README.md b/README.md index e69de29b..bdcd9386 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,16 @@ +# harmonyqml + +## Dependencies setup + +### [pyotherside](https://github.com/thp/pyotherside) + + git clone https://github.com/thp/pyotherside + cd pyotherside + qmake + make + sudo make install + +After this, verify the permissions of the installed plugin files. + + sudo chmod 644 /usr/lib/qt5/qml/io/thp/pyotherside/* + sudo chmod 755 /usr/lib/qt5/qml/io/thp/pyotherside/*.so diff --git a/harmonyqml b/harmonyqml new file mode 100755 index 0000000000000000000000000000000000000000..91eee64648580606be3d4fe99d55e5dcec2ca3da GIT binary patch literal 416776 zcmeFad0br8`9D5n9b+t`jfzX-sHnJ>$qL%)kU+c`5+|FXZa{zplx2h=5?2(W8AlZN zxTCE#ZWU9tsanOvn5flKt!>n*RBLl5sKGTfRr$T2=bStDxo~f4Ki}V<;>+B5-uF4@ zJm)#j^PK0Ld*;ri1x2$)q@|7Y>Aw-a6Mbp;oc%zU5%sUnXUreNH2o9y<@k2Tzeo5E z_YpdZF}g$d!j5az2qt~j)vrh&HAv;w==*C%gh3GeO!P-rDrf(N^+$E> zx=fMQ)fZ4Sl^abTI~48f2&)hJdgnJv5bG+-aeEzFMIAGBIdwhrJw;kqS&noQZB)`m zTl1OGy52EKl`|%*t5uGqpmIHTsB%3It8&)0MeEDDTKXhz`u_!e|Ai4@P(+96;>+iM z?JM!pU*w}$1%2*)MfI=u71b~6dSC{#`K+r|ZXU|n7NK}{^{*ZV-+bMkmtH!KQMFiC zYutZYQ@v!`l%LjA99vUe*VKG$bI!D5r%gGovHrM8-0uk}Mm;!r?jqmQ9}YZRzt^Y@ z&p&_Nk_Vs2zCBuS$KOb9l7Z?Y9{MAGtuELz{&17-Q@>V+C#3~~K7(M!EkQtz(4R-* zI!b>YjcdV$xi`IaUh#o53*P*A&*ZnaKK{KI7TR@_=d~ZX<2OO6Zu|w~-SPXzx#L&t;f|M1bjQv8-SI;_ z@Z}gEH#u*GlHKs1!eHF+i9d12cY~j}@t<_KJ3hmsU%ejnS9sK89N=F6#~$PIA&lEi z&I~w%8-9XEzbavyZv0z4#_>Q8yQ(|by`G3ie_!<&$HP3v@fU}<*FOt>oe@3|T{{s`Ln?0}ekbi%VxO$g|e;w{&&kuXp?W4Q7 z%TwS{{{k zx43$`N4p1k_{B*cao&$a)=fVd9&*0w5yzhJ@Qd`(?)9JRVQ;T_$aAs>KIl<@l}Da4 z^-yYlSe$fz+?XUw?`b?>=9?q_Ne~}__do|{mi5O zLXZ0I@vygSkN*D1V?Nr)W4zw;(0_x6{rEh_cf7~AJmz6P+dSgQtsdO+q> z`5O=ZH$CFmB#-gE-DBPKj z!^1Dudhl=Yh(EO+^XAPS{`*G{eIDhZ&#@l)#)}^7-xECSJRkPyHeSE*h$nY=*x~aY zcCwd;9e#)U-Nt3UNB*#{NB;b8kNN0L4|$RvaeIYFJlWf0e2?`Q$Gbe{{YnqJz0G5M zpYiC|a~}0%dW_@cP_osU*-{q&+-_T`#jch*CQgi=|Aq_r!|n@%`Xn{kSF61_xjU3`nAGCZ)-j5 zaHL0nuk@(rQ?GIKu%A~v{Qd79{x#Oap7-<6XC;*HrvD>7;>i^relh4#|0QGG>o4pb( zap^%1{`+8`0X*#*|75-+C%B981BT%nJo@{Xu4mnlda69;Umu>Q%!^H(*Hm48EMJQ(R$E_J(ikgih?SJ+`zJS5>$|7V4NaW~GA|mfsV*;zRoB-|scfz+FIes?ak-Zt z^0+ZGR4~6f5-G2?B&e;iTbMF$UTsZ5bF`tdu@Mar@9fYt0vD7wR7YbAVhz=G%Oar= zK{M;?VwKIY$n<%qE;*;NJhot335nuTpz=J_vw-i0Caa>g(fYc|x|kNTrg7T5{K_Rw z%jVC{Wf2-0>KnLUPId?s31u@!-LmSs%K5XW&(ktlQgA83LPZ?+hV(I~a(P)zQ(3IC zAhLwZa(5$T4ULrz3u0xlrpEk9N|jUR#n9{N=hfB})-A0sh@frNan)E9Umw%@ zQH5uRhO`@+R9;`xR9iQP@>dHpdRzalNZa6X< zBQd8kR;KQ;{5hl@5-?=}!y2XzSI(>|t6NrCp{-=t7(;E!u!h|!TaX$|rIAoJ^KlyFwDN{ZwjGB{ zxOP3Ks;sdf)%%5o%CDrM+2$v`Eu{ouU@2^vvCh=SI^1j7nY9y2{|)6pnU*grYg>U4 zwj68z?3{V0l{HkC)x})970Pa`Z)zy7oK;;@>7w0G2*%M+xvaV|1}mStpd>VHK2xOb z`nrWHqHsKAX;P?E2PH_Zyr9G}9K+oz8_%aJrBe+xp3pRe*jRPB?KcHF6wa-TonPOe z!?B9bGwT~FQ{i!TD0g1o64*sqc?^Epykbs$MP<#T?8c^Ow7wx$S&`pRwk)rl`qijZ zkvp#l9nUX|m4!l$Rb>s86(w~|H8lmKNgeU5p61Ro${MSfb#et{5RbrqG( zR4{iQjTi-rX_d_ovQdort}33CU0W7i05{=&F05a`qfaeNnO7LAtWDjbN~{POno?2S zSYBUOhf;;L(HaC#3}l4*v0!q^kT9mCn^|8|QwI0Tg>@FymzTl1$SBoE7I6AJSP~|y z(Bx=Y44toAu%a$j);v`6)6sOaz7eV;C6aY)A^N4=c#ZE=w5bMNX@Rw)J~|Z$`>c!=E~|qjN1E!&W0>n;pamQ$b9we4 zC!933K|AT(`i9!Fn(7NGD+sTsTuNh`J#WT}SS727%`P>tp~~e5mr4-!&S~=s2!RZt zDd*)?U;?Y0U*8miQ^IbSbC>MGw>Utwsfmuq#z+ZHS>5*uUJu6R_pM19(3dymX%GT;no2xm5ey&vT5_?G$G%?NKq7< zJioHMsezItvIOpydw9sHhPANOxj3P&b6Qg!+CP^qwMJVp@baRzS65TxbdmK#VIqu$=0)G##28t6vmbnqvhWOXJYw zLL_+@j>@vynxR3$)hR+15Y0+2hID$tq!Q}hX@~>$4TaT8Z(b%oZ7Bz}yz=tOXsmI5 z{rLseL#m@5%$_uv0zngIa65CIQx+?)$|*04#+ndx**BC$sXi+|!PHe5i>TN!gk`pe zOjDQElr1AI42!4em9BMaIfi9HWnE)65{l|n&fy%jY?V0hXjNB7)R+=QW2zH5J?)Bw z%Qjfc7`y~^%u4l9$E=i!I#wmpy=ju2jn#n)dBYUDE1kg_hVf6WrI8TYt%mpH^6>E7 zKW*MD(r6+1REXhIqa2^uG+ZZKw+WmrS!KafD=Gds!ik$;=qGy#20Bs+M@D{97qh2G zOEq5l4dptF6LAE&ysLet?1J;GA*L~R(!5w`>dYaiGHdsVeR^Z{5~MiGF#o$*VQOr1 zV)e@6Q{8k=6V8j3)Ka=p)(D-cnBdjtoQC@IXVy1Cxh^e>sbo@v>r_Ie#5_W24J9*3 z05}I&UQjKJA&0DkOrro&k+Y>%IlEHM)Fn+76_mXWcTW$8&Z)stcOlk7Lkl5NaZ8T2 zrzka9(-1M({hpkSlnV|(ri7q_lzKTWmj%|+4R+EDv7aN|4i0N*6d3|jZ=_opFO#r&TDf{7!#JagForkik zD$6P=8(8LQHt5i)4b|`_m1uA%u>+T`w}|IkrNC6;JIPABR9K|D9>W&OuCBuZJ%&l4 z(Zdt$CPUMajSWeESh;p;Hm#u&gI86clN;qZQ_8FAqY9es7DA@$yi-rNZi@rdOGcnM z98*Bf(uT@PRvH#HPD`?rvEfD(nGKV}@`Kl|lcrkhk>QMbeIV4}J~4TD`=m)S(Vx{& zU%Sgx-(#RS`^;DQmmPpq_L-V8or?4lD7Ut{wvxhvUR*g%Rj+K_++`BEOCj6K|Kcwm zJ<45Li5YDU>}hDoph1)o&dOfJd}&6v7IkX4l{qpc}35kw2H!@H~OhJM&*7* zU}u8^i@oVZD|M?jw{$;;W+4v4LuTFTYD_8BK1hlPNDHNsSlKe_x9bErt+8oIZM6=R zc3cjHC`zW(B6mWR&AV0>LZqw9$6nSPL<|*TG5J{p4_Y?eR#~yf{NWbyLpfMTVrp0G zijy1ao1!`xd5zTM2A-x>e&{h(r91$`;!OPk=ov}Pm#M5YRb+B`Z4`0HWh_J4wq07~ zyri5|@&BeQuX?9d*I~1{x&k{XdW(Rpav}COloNTH12!djUx^cPD>iy1Hdcmh_0lU4 zPHBt|&+|wGOhih*;z5O1mnf!D?3-VY?Sdh>joL~blFYNYxu*D@3)lbFk3E4KvGT|u4$8$v!NH_nG>@q>~5QI!gyNAOsh6W%jyFfO_qS#YhD5M|tEyEHOkM?&NhNqx8wFFlYE8-T| zlyX#JV7F&I<_J+8csQD}Hub#Rqkpt4qHRsjJwK0fw8XJ2nB=khi|r6vE?9Y!^>B2W z(t@6`gi#NFYHH6GnCQzO8gH_xlAZx~5;$k=YSr%15o+Oj7#Jht|?ccL!^Go*4-Cujse5AB*zs!G%g$boU7tt z`N>7}oIFI2(xb5|6ssUQo9M<^MfuT36FCjNS$G;YNlHq}o14p)R4)%r3YC;BudOcO z$*Y9c{3X?Nyat>LV!7B3t*x%Z@&S&6B4s7Zn#vj~O3KR5YpQOj99~;!I@o9$bk;Pq zO|;+W)+9HH8+>wnSEnD zHgWOjr(}6Hs;E03Pms9=OlVc`bWOp4bTd#=tdT3r zz>*TGQy)63Evv5c(FEozsjR>=JltIZP4bB}Ky?+qlV{E>nT$c57b}_SJGrQE#>|pQ z$AzY(K2E|pHVf8haWP6v@y#qQ&YMwK5;|@&7d|c&^8K`_v4LJIfOB^v@U@^(_}~3M zx=a6$#2X~&-!c5J!p7>)V>HLmTKxJxm7_X#(^soT!pGr%>%RIl^xqL&R>`1RR5B=p zxMjP9+ILi4RD&hAg%Fn;uWDfg-ictzysOrzHr1Lf1JU$;1-m8dv*M=vqjc+psFJD{ zi&Ie+rZ~n7>!;PGlF->ht0wzuYv0DGg*5y}|Efc-_roe9+_ujWz9GjT6#ie6MMGLUlDxWRLc} z4VwPapp_)fIO7<&kG^viJMwy*Y~IcHPtE_vqvxW*QNDh`e-99gf6vSA1;5|-AI-1i z8!6;V^R=R0;-^1#e?;njr+!ZfjQLN&r8^$a_O0%C;5K)>-vjTt z-Gl#5cRX;nJD%O?jtA~>$NN3-o_pQ-yMF18cl^p7kKX5wciiueN7uOHkq6xIe&JuU z$N}|VkFaNnM^@SONW8}bkHkIrJ@Cj??)<@oJHA@@g_I}Q?#{o)18=#;oqw~ie_4NV zhdY1Hb?*3P4?J?cJOAn%-0@!FcT%2i;dc`66n-c17U6diFBSeJ@v!hOi3jg+moq5* zPV$HEa_27<{wVodgg;8WRQR35!@}<*9u$5jai8!ziT8To1HvCAf7P$u`_(J_RPuKV zKb3f=@KXo=phx`=x#I)EuV1p98rLntuO(hA{8!>zJn&-SzYcy6yjb|P|!TH;m0uO)5>zm|BG@M{My{959M@N0=z3BQ*3D&f}>uM&POaYOjE#IuB7OWZH~ zSK_7z?i2ni`J*1VDg0XUZx((n@ioG)9k}poiJQW&CGKmp{hhueY5nyIzm|BZ@L!4d zdf=tPe;xcDc&YGf$)7F!THT zJA_|LJSzNJ;t}E363-TXE%AWxUy1j7;C|u1lE2vl?-zb8`Fn(4OT0_?wF4J^E%AQg z*An*&zrM?IYFtg>*AlN1{ws0Q1FsVP>)`jmtAt-m{v6@g67LdzE%6-TzY_2Ez*h^u zmi)cKuO%K8el78c@L!4ddf-*UuO)w%@N0<=2)~y27U9E(RC7vVvTH+bPeDO8yoP zd_efMVP@v!h;iEsA6JB43MepC3h#G8d*OT1Y4uf$CcJSzNJ@~;zqEpealUy1j6 z;N8NnC4Z;zYl*iAzm|BZ@N0>Og=ZxMbi@lxTx z67ToGn}uIX{%+yd688)LmAL7FZx((n`PT@)miQ{+*AlN1el2lB__YHUel77T;nxyh zCHz|AYlL4*e3kHPiB}1~mbfAOTH;y4uO;pmel78!@L!2{c;J5Fzmnhdz&8uOmi(KA zUrXFC{958c;n#Tej{PV6RN^fjxKH@0gWm)93IBEQd*Bh_*OGs;@N0=jg#Su>iwE8% z{95u42)~y2D&f}>uM++%@c|FKMfkPk-z@xE;sN2m67ToGdxT$0{x0Fy67LXxE%B)E zYl%mMUpsK&*AkBkzm|B1@N0>83BQ(jhwy8OM}=QYJRDO8$Niyhr%8j}ZI;!7uTs z;KwW0QhynOU*gSze_4tfXCMT>#9IXaZv}sr;FtI+!5a-YNKJTgjb~VGX($Vg1=kvOFT>PKO*>h1i!?y1^=aje~aLkctr4@B=`pezr>3Lf2H8}-DK-o z;#GqG9l;+E{1RVtgqK5B@g9+nNqmc_hfWS!f4v^K>4l4SWj*~K_<#rQ z6ZxU6$M1m$Jn*2%-()>Lk-tg2ROD9@kBWRr;>{j-_*eG0NPfcu4~YCk@(+kS_Erpv zHNIUUKa}{Y`|Nflo-OhmiANuD=MRYaeUfDixCRCO2Z5K0ee7=q-YM{-1RfT8lX$nt zCneq@`X%wO7~gY6{k@`oiI)ofJ8-eDEAiq-m43#c?h&H?Qi0Pw>#s`S$5|k*QGtg9 z-YoD%0&fvG{T`R~*CFt8ED+b#0&f#|r@(Iz_!@!VDDW4Ax-2%T?;F|^h zkidHc{; z)J^@Z5%_*7)aUCGI9`#P`dcS(yvjHA*DY|o3ODt)S>QiOq4?cGfln0p7J(lm@Lquj z1#Sxb5P|m#{7``p2>dXC`yR9HHcQ}sfgdUGfWVIyc!t1_5qMDG#|k`4;6D|3w!o(d zJV)SD1s)doG=UoepDyr-z;gs%Ebv@`mkRuNfmaFq1c65d{xg9$3;gE-ZxQ&30$(NY zu)sS6o+t3t0-qu9PJyeDRyWrOyg=}G3H)S%uM@Z-@NR(@3VgG`iv->y@HqnCBJha7 zdj&pE;HJRm3%p<83j{tO@Pz{Rt+nm{G=cjCzF6P^ffoxrL*Ty;@QVdLAn;2B?)$B6|1ARd3;Z&H2Lyh(z%vBiD)6AdR|-5!;8zGd zTi{m;JV)TG1RfT6T;PVluM&7f;0b{j3;b$gD5_X>QCz)gWaAn<;HKPd14fp-bq_qc8Uj|to_@U;RD2>fw@X9)ZWfd>Wtq`PQ4e_7zG1^$Y_I|cqnfv*wxs{-#5_-g`RC-6TDyj$R}3w*P{-w=3@ zz~2=37J>g&;JpI>o4`$hZxMLEz~2)1fWY4txbF$u{{Jp;zrf!YctGI20?!cmKLj2W z_y+>d68MJ#&ldPU1)d}De+fJ+@T~$j1a1mEBJgbjFBW*8z)J=GvB0YY{)xb&0{>Lt z%>v&p@D_ph3w)KpKNEO|z`qdqYJq<#@J@k$CGa%@|61T(0^cFPkzM2{mn%=A@6?@n|!)0Y!Hp6DRc7ZAM%(E+9#i2f1L zKBmthnvMn}`@aKl*b<@xME5d%I?;O)-NW>JqW2=Yo9R=C{xQ*AOwS;C0@0mJA5Zk& zM0YSfiRgWZZejW;qW2{_%Jd;bXAoV=^!`NeM|6bgy@=kQ=rGgch(3VmY^FyLeIU_6 zrgu&R{S%@COn*-FM5296ZzK93qWiz4{(nGpkmz2f-zNHCqI;Nro#;b|?q>RBq7Nmy zi|O@5XA<4X^ixD1Msx?$Yl%Lb=oY3QB>D)VqfFmRbQaO2Oy5TIkwizBzMkl#hz>J- z712i%oz3*+L?1(Rkm(DEK9=YJ(+xx)N3@UWbBLx#_{sinc>IaZCc2mD(}@ld-NW>J zq9+mE&GacmPbRvH=@~>%A-a?4h(4a^Fw^6RK7r_LrbiI{Goph`@B9hqpA#Km`g5XBB-+RHHlj}=y8k~s{zQj~ z?q&LIqVtIEVfuBVXAs@Z^vgugB)W^~^+eOAY_gN-r-&{fx`XMpM9(6+h3N;0KAGq! z)Atf>5M9djZA2Fm9bx)C1^OB09+Q1w_vwI>2-T(Q}FRF?|lv zrxM-2lgFRv2+_SvpHB2VqI;O0PxO4EyO}f%Jd;b7ZY8|^!`Nug6Ig-dl7v)(P5^?5q$>H*-Vch`b?sOOz%7p^jSm) znEssTvx)XGy^ZJ+qWk~N<4<%c(Y;K+O>`O2Jxsq&^b(@GnSPn*a-zGKUQcud(Va{` zMRX<69Zat!dMVK@Og~8UGNPkQ-%B)2K*>_3ZzH;z=m^u-6MYWRVWzJl`dp&3nZBIp z8lr5ba}n8_|~%-M@p!pXe5%dzpTl=*x)iVfuBV zFDJU2>6eLaCAy30^+dN3-O2P*M6V>egXy(IUqN&W(+?7TCDBo)?2rv_mgxSkdHjj)Ai9_7 z(}}*0=pLr$6Ma3=-AtcC^bJIJF+GFm8;R~@`go#mBD#a=NkrdFbPLl*5q%5MQKkJ7j_BKo&SrW9(RUCXWP0cRpzkC)!1U)t-$k^K>1{;c zO?3ZPJpM#?65Y%6+eF_(bPv<76MZky-Auns^e>6-VtPH%zaqMm>8FUkkLV7j*Ao3} zqFb1Lkm&n~jxv2O(QAkiSGZB$DimfqI;P>o#@Ai?qPa9(QAqBX8IJOe@k>1(=&*Eoaj!b zk0<&GqC1$LMD&wHw=jJa(Z3@)%Jd;buOqsY>HUfRJ<$=S_agc!qQgwz_Ty2$r5%HZ zZPV8g6Ntur{ws=aH%-Jj1J_>g8}awe0oZ*}e5=`y@h^%Gnpr>c`HJE@%pk6Pf5n|S z@sG`!xY_qo2bJ?tU(e%1K6dh&yeRCDx zA2fSmrBr`0aFQp=_;z!%#>0$nHCMrUi7#988Je$C^JQqhQqAWFjgD+I>yhx_3;CJF zMm#?g%c6@i{pQgu%y#nzBm;zGo4=rH@F`&44Kt;NHo;KL&p#g=ENs6d!~FMn9J^jf zRiVlQ`MTZw3+@)hzou^PN8D3@Q=3KYHJOI_H7ci(cos!T|Ug67AN-AMc_)10i^ zI)h4I!EIffVYX9SCUK*!F1~IztGKOCsjWvaq~>O>ZRKjD^G0GFh0es-mEGwpDM&o! z$3M@G!arsn4S&L7YXOv495C8X4y=4VeI*4fW7CU)L-Ty*W@fyT>ubNT*(CiM?H5*= zgS+#GVsj}h0!YOCL?K}_vnP#svdsgo;}1b|$)8kTPeGP#B>q6PnaANXiM<>xw05VZ zx7EPo`dfdRmcDWcKH1W7{HOI@>w0k2GglV4Dji(ZhvY1R+Mmg!kZGR9@;sAC<;@5Y z7|5VGOMeO*@psKa=!M{jc@lLD!?N`YYWt$hV)I)BS~9(_aP8aBK_4&B-m{*VzE^^5^c_IIK#{%aKP zdySA|G;$*$&zO7klaXJVVNL*U)+@nP8#AD`zS|1pFPd2l?=X9}Q?1`o!-t_Elkzd{ zR^Bsdq=zmH32AWiZWyNb4uy!+XY*DKKL(hbVLvoYqU;IFCys!5B^%&HnK^~=znd>( zD5#0O&^OZ6@vPmA=Dl2O&^!m#pwC9UkL0W}Uq*E6`yEvrQFn^sADT}Pc&~XJBra@+ zUrog=vqRUAW%IRzFL^#Jsxbb7N%BrkKjty z*{n-+ja4H{@tWry^Dd2yAwk$!{(elFukR^p?{a-_8_cBd145!2*+R(8gq*FB7YS)2 zq(~!=14&XGVQowUN_X!9N|N17Hbw4aj@O^EsPm_?(gw|2I+YTx#g$a>JJ#EFbNd)o z&0=cqIjZPgjT8{_2=Tt6k;#PIK*;Ykaxfv6QK|bik`5#p(>8Ry26vKSEe1%O7i;h% z0#DJLw3|k~3F_f22CW=vE`3r1`CF8r8ctA<`2~y`Rs{?E(maAI*lym93XJxP1LhTA zCQ(n+BlRMCz*h4(TnT@YuB@*EVPNzrXzoRyaPKyKFJShJhRuAS?tV$u0lqAAoBk9q zgWSsdW>u=TyQst#s^x`Gl$90X9*NzCJJiRIwGWI!#!9wy43)+G8#VudOm8sTba#t% zxyPv-Nvwj|%A;Ub2ol@Pqcy_~VCcKg9N(t{;E#cub*P0R-ZZXlhxzF?l7=JRWHe~b zWqhlu^I#Fd}$-%+U*HrgS)L~q|1@c?~EHtY97>dyAJX39= z`70ZeQY1!_H+5j^2n^Q_^BbszuK&dFv~}ag`?z7WkN%kMW2VY5()0Ui@_d6BAw_oR zrK0#wBaU=)yLlJ7L^r?IwS3Cgf6=WCkjVUw&2)Pn8gIl$lJH!UuJ4uYp5+nSM~d&$ljsFH{;or+;HVUPm&}W0u{XBVe$1 zX~%}8wsa)Vv&?_lr+kU`8_$1wlJWe&NF(h<oxwSnas%HMa5vwal%>RFT;Twuii!w-j6ei9o;19k7#!NK^8^r@LG zd?Y<6I^(Pj&hkcLEO~D%y>;hcYz#STY!q6?d~=eW0Vn^8x|S+=Ivfh{wOo3huW8%{ z+*Bi$>_g=0u-iz!1KC6oqjh_*Z=1OP^seudPZh?$L^r>EE=Z%%`mxiGazfq4rtZjz zGugWR#-{wt3?4RoAYWr=3xK8LL0AtQFKDhN(`{b}KZ+-d;{V#jUyv<~KTqm|>4VpI za2`A`4@*i^f)4@ukc|%+gHuP08s$3&{}o~388(k0$8CKfNG{W_o!I1sTYhGa?Hc32 z6K1#AU>1JF%2fIyeI)mV4my;6hw1Za1c6=aGyA{j({Z0;6qLEZxa{N2(2j^nZJA`P zq3)vghci3z$&5lQBT;~G63Z-wAsL(6GFxy1@F0C&h0pX?lqfAF+S;U`F(_3``I%M3 zK}eK740f~-i3-D9AyjBF8gxItfg1#Sgvh~2bNg(B8wytK5d=RaK;GbAh>hmpVCbdL z>xJ=N=Gkg&8kK3)=cfv&VG5_Hsnlq1Cy9&V+c4QbSy$@OT=tr#jzuV*6Y0@6=pt`g@mgN@%zu)_f8u}TSNi-56*CgKM)~4V2uAsZ@vn@; z6Es?hS)&ktCmXptV#npKj|EeMh!q2^;Mk{ckur~zi7LplacKt!c@Gbe5$3Z+62re^Fq=?G+O+CZ;$K$7AfixyBA zG9TocC<1LY>u7S`)ZGmsRJ2Skdbi2(oZCi_R=7I8QoJci6qo_XJ4 z(H&&Z$sKSQ9gp)C(vDhT{2L^8<%^Nj9oU1b-)KLk$H?t#%IG^m*_}Oo{@BQUH+Gnj zm^omy_W3zA#+vB_dp0#!^+K-Pcbnch11g4@Ca-)?w3oNe4=edSO=5+cUWi}=ZxJ@~ zN)O5N@f4ppsVM$|+4N89;zlDe(rAwa65#-xWJ2ozPvJ+U#db5|M^i61bf9HKJ98s7 zX<@6-(!=ygqjD~2HWCXn(c{SzI3I5s z4NFM-U_I`0uT+_(!Cd15k&WjLa6YNkFR+V29{tccB|I2Sq3c zE`>^I6+zK2{+${bT22Iqbr7)!0f<%tsQ!V!>lSyIKSGOG4Ing{jpPJaeg@(jXcZMZ zo2+AZYo{_0o7?tI(?q=sHWpKymbvI3Jgnw~rD`4bchDp|DQlEc)?tu6X!#Iw#THVo zFz*M@oxXd_B@l~xbsGec`a{>;?M>76Z6%M;L+?^ycr*c2xNw4h0;Y2iR83#%Ig9U zBJZpX=6PC-moNw&Rz3{-DR$V;qN4Wt;#5vcY2)uvuB|(^hpI;F6HZI__JDMxjhoc& z1G6MoLmp9om8?Jg$&;g!4(FU7jqOjq6Z>K!4^dbYMtATKQ#yo9Nv{~ydPl7F z%b=IO*UbIjR-=14rOh2QKj+2&s?r7oE*k9D5E!>(sE19|DoMmf?6_f9ejhjAZ8R=^cskAmP62@ciCHZJV!PGX$#}u z>M?KqI453|Io@HFSroIbAU{fkC(x4~dYnvgi&Iz3)=%zGvo*pgZ%$>Hne4I@dlRUQ zwij^kbC}Fv2lbS<#@O$tIs85&b~wq8kg2^nePt)Hx4w{56gSzt^3JC9pYZ3m(3`%O zv|aLsMq&FinJp+5dfmK;hul|qg38R(+X|p!BN0Jlq6JnWl0hFb5+ih^|EZCnu(k5* z^tNo`RD%CQ$zB*Y&7&Vr^Cf?dTWVgVxZn4Rx%U=j1nuayv{<%>!uV^X;WzbM7XONZ zrpv4_hLSW)-DhG$JC1s2&Z2A!yBRm3k7UZDjQD%F2i1>4|9s}0%TgBoBCB(mL!E)x zV$!r938&G%m?q(+`us!>9?dDM>L%Y-Df%Nhx}6b!7tEvXDdy& zAtRv7!2AUF`tC5l{wrAG8D4l5yT6I(C@OFh9zJ0=F0=13$NU9@@R>-e&d*O1X;`xx=0D6^EdVqn@ntk1-R(ZGfqsAAION~mej~R(hOM$JBR3h_o|pmA&&(|5(s4MHjzhUMnUVCib^vHKF=ss5 zL^Pp1Jjx{ zn=@ZJ{{i0*6eWUraA|J%PVmg(nI?W_ra$!h9GY-?_NRUIzw~8bek)AO!rJ@GymesY zE#8ChT!;EV?W3kZ~-{ z9<-upL&#f;8d;wF^e2fU0jAGXIL}5~G=q~&<_Hcm3p0z+un~`>rpWXwOHl(vLAg)O zzjM_%%Aov{&OJHeX)*M{wQe`>(YAQxUz9Wvm^em*^l`<-Fg)^+Z1Z;74CcXD*$6OE zfZphW2 zT=!@A;etWEkIy=|q=&*0vKTddg%pU4m4mS(d0Hkd72QM41q$2eV!vTlp!I{1#%?e} z-jKCM9Mf(oDaGHP*LqB5T5NVvqJpM)ELu^;ocNSXvjBl-P9ifixfL@o$w_%d@)k&% z%4;rQecyo)kxU3YB^pGe?PEWzA-(NPEYC@5n0<4G8k*|?krYrL&cC!Zra0Q0gXU<= z8Ja%~N5V|S)qKk5Sgaa)oHab5YrrE;)Ubigg$gEA4MDEqkE2NttA>x9HN2{8z^)l; zxJ=g&T%QgR=khwns=DtN^r1ZXN1cQ8>j74)7Mywlj5RY71>!69%?0HJ$@r zw!QrX+mFCza~O$2aJ&?Y840V0^%EVUoe6SC4|jL;5G7e4*~kNzIvZKRVx%iUujZTF zsW5QpW*n>7(#`UH9Rietw8!UKjs#qo$45$@cc7!-aUh3CK95UVW8)_IcAma11%g9L z{<@yqF&r#;Y@uap>23ESxC_I$mSTO%s@|emT8*O`y>aFhc3oK4-5 zp8fs?9W>KkRqX_=ri13$x@pwtYS5?cqfR*Ox(1}1M?8x;h{CpIdk8(A9x?xd@8uCkgKd`{k?)MK zA&#(W64O4P#WSPTLr0+09`WJ|XCn@ecz|z8j~MIlh#h-5RQyknwnsetnl)r185gEB^w!7u7_PWqQ)y-N$?JCGG3T4C|gQzQ}G?T;T@s#@udV2zbZhgfI%90?-i{P zUT-3=7m{Z?CI3lkVj%P7vFYT}+;28%DLLsg!#vTFoYfAkSP2W=JeY6dlQk_OzFSi7 zPL119cOVt!s9=^YwHm!~=9^7wxKNk!^|9u9Kq|gt(SVEyA}bU8w__3T5WXQGTIv8v zE{1JO#P?@kR^CoEh-Jjz95ciQXAM-LJwsfiYarWD&9DDoW{6ieSm7o$LmZ`R40_BE zz4$_g$S7U~Ib?<~dD^j}kjD)11opy3HTQyan<4H%UD|Lt@7>i5ksbS9GsJFSvt7?J z4zUPW?{xP^IY2vRh%t^H!X}{l!5A+B^bGNa@sGqLeWXi#*cAG{TBppJ+)Xl z(`9yD%5Qf!>j3HfB@yq^+g|+sHjVH9bgQO#ovk9tX}WcIiEGyL7r3l2#^=d{^}-gh zh+@J7u7QIIM`PE8?Ga85OaN)wv@#17Qa8V-XDzJ|%mR+AM@{BR@-xp5dZNxogiU9dzvY|uB$eK_ zr^BZ2#1~eC09S#uvYrg{$&J>K4Y%oMoCP1?g3259*feu#Yit}gttH=QSCao5UoKVw zRWEGMuxo6<9! z>w(!c;$#n7m~lvH*Lw~df*eM zVZ2S><4IZ7zn)J?ZF$BGc3sLdMw=}f^8a7f1AcSQr|8kx z+y@Mo73U#}Vw=NkM5f}1GpqJHjp-}OBrz;nDr)HzJv~}diL6>TVxB{?*p28&rX+X; zH@R_-^}yZu4vC0gSJT%{IAD-QUVD!00-s#g1K&6$Po~^}%$If4!KFEVvPnzHmBx>= zB-f2-$<@t0`6f56_I<^A;9D{bdp)p?4TB~bk~+hd+FB26tX9K?j;KKzYpw;fw4;z7 zQt`?)^Sad)JP0 zS$nQSRn=To7^h4400BJ{ikSD)odAw4E$s+>oxBexpi<9o)I+1C{P+To1(W?BI@-|Z z6p(KD%*TF*S|VTAo=nf#>_xeG9o;_~?WbfEH)C{j=D$T@adR=<%+WOmX|@$NkEfga z=xQ-7Id1-hZvOpas&<7aMB{|{7&keCNnY@o8%LPTD93#3NhKAhRN>_D+>~rZv8}b( zk{99}-|+TyYLU=vkQ518^8EofUX}fsC7Ksq#>|$yE=jyYTMn8z7F+UlKJhw~L%Zpo zVAEj$zM7o;AGg{v%xzB)P8`4H;TWnnzqy$?VCl*E^k93KX0`P9=!&%TWAP0o7wI|D zm`&g%*`O6n@ z!Q@)k9%=oIwb)e4ySa{xwwiZ->#&;lJ#6A}uu*OPaOQkX?;(wRzpsb1gR2 z(=&G939)1BNQ3AHt#0rs!#v(mfV7&EeA2b|y1;IZ0?EU^aF_RkwS<$r$A9T2LzraH z3Vl-ZDpMyJ!pWb(TZc<7OSQO^%EHN*;no#27h1f@U%AGg3^nx}%WOPnk>q{5(6pMK zzj;g!uhKcar)RhfIc5)dNh3MQQ|XZGFbhZDC|*8bu~BW|~|kkYSFzs%r!<~JXGWjpmHeA#4(fd`pN+l|F&`2KJ>ng8#w$*&Ho2`Cm@3oZE zEjH?XPI6!Hnjb!bDsjeZ00|Ub-_zG#eci^_P025DmFN5Ee6jUC-ex2IvrHpS2Uh72 zt2ly{pIOD{uReN(&R_A-D;%W4VBoN^eTphS}(RB0)_s_?oK zoDaur@~QbgA}^h*!k1&jxhkB@Ivf=gwl4?Mb~;w&H=kh6^fo%jWh6#r@>wdZKw!de zsoXCcDJQaImco3JO?n{?eBe;G<1AGXN!)%h7Bt_P9X#z_l!@<$&{oJjsDX0$)Y()6 z=hL{>L30t>r*nPp{svcQ6eF8DOSJ;0gD5Qyny1pE5}c(9r?0FBD9%#dv`=b%Kxe70 z07;RvN*tt`JW+KG=N+3Jhp1X01D&I4LX{mN(Vh1&a@mqWb$&_p`^1MRL>x*-*Q}#c z7_=AF%{}>fH6NW~9&vh#1{CYSGU~o{YHE&=I53mGJVN7I6rXJFiS!5slezUwG_dA_C{max;Kw2AiN+Sk7echDAcypDhn_Ahsl?W?ZsevRjff4hEVG$!a;Nl}s2_2d zupTTF;^~|aU>ZNHQyXMi=7oB$u*OF|Fwa4R6a^2Xfax5YpZ{0M-}!}8Jr2pA<(szT zv0|E~)hV}I5d%fzSAevwY9q%XE@*9#HQ05jK^kwC07}JS-uKY@`5&H#_|4?~%Ba~x z$Ta-sEZw}{!>A9SLn*dV`{_`MR$P`!Oh<7IIx)@iFzP3rD)=SO3N&z*@u{439j10N zYDmKx!Ci+@D?d__7Zod`hPBcuX)5I~YKTW2JPd3$hs*PjTPUF0J#3?Z?(E?qlyIOC zODbX1x{>b1&PIf3_|0GPP41K)H0Se>f8r2<5a7>zra&3B-~2VE2JV|4A8FK6osu6i zT=FU|y(`Jb>`LSibOVb`+uz4?s&Yl2ig?1Gkl^3iMsS{>-c3n!Vqs`+0 zr8N3yq}`TA5iF2=iiq+E<)Wm<6Hu{MqZH;+r!X}RVa5&@=J9zcbFqZE2apyfhLh`7 z-rGnu+o6q)sIeexe@%j1%>FgntUzHczFX}ifC6_FwRlwQ6Ra} zv$)c;P$^ROAm`Cm%D%)|w`KXM5c}?Z7UX{L!k|&H zEp;l$A=B{fT!UqB9wGL2oU{( z_dGLMJ#-6Hi-$Dg2(icWP1~i?+x(6Ydl`+ht>QW!XDb-|JT)s053v)RW0N*~YzBWx zqq{4~@0{yYk3;enzG+Jyn{S8MCa2V7toFokCAZ53tq?oKu1opf81rC2IDdTxdf~pMz9Z3ssog5TIEp z+E!yRB&d2#u-MtFe2|u%;yc6Wkoho5YZFC&Yo)>a@#;@y-lxn_hKb}C%~{DWzFtC& zAB&rMMASMCCwMKX$2c4R!Xfn(OKQvh#+m;pO4X%?ZM69sLt3MMMttQR0RB?X+0JL; zv-z1g)cDRlqz+ai#aBz1Mkjk|>Jd8i;(jiJPqr`%hYOQu3llSJLGqk~a~yXQg3RYi zFVyjM6c@fw$JeiCTk$nDdrZb7U^~A41ff#|?QxW>((LhVCk1UQzJ5;=E51#e*mEeY zbu-k&&Zh=#udSfa&Fd4=&y`#bpIl6Ao3s0W13ARR3Q>C3CbspIU6|O*xannL2RR!b z&$_2zM^gWprw7NVUSii}nb^4uX%lN#@(fc9y#!aVzwA)V(OkwcN?VL! zirL7JQp^lnF?%?zcBeH$f4x&GW)&A!iWzNQ04k-GKR9x>y_{!B1}Q}*Ra}Ycv?^kv z^-r9wzs)`aH55BqALnTOo0C(m$7WjNf$xKoso6mSz01j0|igItVx7z&X1Iz)BNM6958rq&-2Vbr$!lZ?nJNd_t z-P-e;XIN~>Jw7E4hl)G_Jo(iS37~_4^Ih zvqR=3;7EQ73mP(prx1QOAKr2BPa^!jf4k}0Z|=>_k=#dugAz>J2Sl#;>2*{bY&73z z@ejPX>3WmJmh9s`I^=i|H)sW~pCW_(UU%O0sc z-GeROWSl+KA>}BN@<*=z={L7_Xf-4!us(;@on>xh4$@IE2i>8gtRG|CWwDV`vy+b^ zcn;U6wulDJtK-41I35hG*Kf{F$@V(i`A`mBTc)$Ni0fe#@M5gZfomP3{_U>p_K(bK z4O?=pYrS%uZ+8?><9r0`Y^YZKX1&FmoXl}xXy3F}4b7$__1!pn;X3}Q+8SJI)0*0O z4HZxI=-U2a9=8P?$yKOhxNXYkXOHQMlvvc$oMe^j0S~{q(rPsMh3hP$WjotqQ&Hj+ z@S5Y=AukRzTz#v$#)e!kVR}>YN?ezA;Qccnsdt*y(5cqviNCu=}1Sh`WVE=4q6F~-mHM^ zryv~F8^#N6o_TPjZ)slqw5XBTyBMDVNAQ1DVf>0!RDWXh>5QI+w@TjJLP&gNFIs~P z16l@i4SXH1(o`>XejaaQ!P`aDi%#*vE4eN$0DxMYiwFy2%4X9j2*o{?mZVINj9zY4{9~U?+oB0Wb@Hw)5;8e z!yFIUQZHR)aY#Itfl5HQE+rfnO#I}=2S(z($1C|B{XCH+8&y~oe}aCM$9^yCwW!>Z zZh?~S4wPr<3O8-c-hU7#9zaK09_C*Vu|PbkjxgMBax@=n6tZ$en?OG-( z1(`N0nW!*iQdJ3=s5V0lby-ohzyG7m^Pl^`&bb76S6T*TSOq zWm)u=E}ZT^IqSuf&r9R?mM!01zj^G8QuHuUkj1Z^Yd^Cmpl+w@+ds2!kH>qVdjdtd zAI1){*Hd`^uF<-|kN5xK)Dd1nUYPs$rash{Q`BCW<80|XRaK5hOY`m9c1wGE)o-AF zyf+DN%uDs;I#q$;QGbJd`@hzYlTizJd#u2B298OEUOy}Jb>5jqq9q3-gP%zd{cqhK z;P)(9?^moWWoLjqk&%6=eL|Gor zPmIy$?b>HHBkRZi$7cVE4(0K|NsIYmemOn8qtS@ZY{u&vsp>cEMLQkRdVzKy63;Ma z>V=N!Z3p|+(ta;`EtYj3ui*h~B%W@8xJLXTx)inZMHGD#UvkpB0@T2ZAaO>Fn!aD( z!Mjmw1GseyXd}_OifU_rnl5;+Jzm#{H+Cf={>wf3bGqh&Td8DmyVxq}(d82=}jMGsutQc|kmY1AwJQ+z7-Y;}d)0S8d=`=~rIQ z^(=tFDU(6WgDR>5turR1sRM>B+P)4@FTYf5>21}3Q|IXr3eeh(T4iV%qO?FNdT)4o z8(zX}?Y!aF^4b!E|BZ2r)WEIiY@F=a-25JynZK-3M(e$>nffcsC;4jL>i{Ic~ByeH^jzU6B zwpx7LR*c@2v7;3>o@UG`x2l9K-og|E5j!+mrfb_CeGKu{!Y*d%Q{6{M|}YyN;b3MZi2!kF9+VA~nD!wyGzj;CZ;`6HgP^3N=$27g) zU(@+8u8PFT!Q7J(8cwD55~Gc~kYmR;adeO`%p}8KO`6#^Zifj1M3_K`Ab0Md4#$lQ z97Yb*x6-WgWG<70A<|T|ES^K-#7tz+v zUyRk(UYLuS>v`Oxc-S`~oqjJ#**o94pGxJjy+>g0$y-2oSnafNI~;9T_)`;EAtyau;mw`9q58vN2rp}|E1Da@=R;7A4V`h$m@I5?Nw z00vF(!3XJP8p%z-S~m~!Z-|@IFGiK|4ap-ZoyB#WzJ7HT(HoN!H9g4mhGbCFhu|vT zhK+fS-#5Dhp3U!@y#`xEA{o>7vCPaCITv=ZkZ`?$0ix*|2@-xB2QRGN1W%~D9iEUF zeGo2=pHawwJwYR*GLg@RCy;V5=bAkiakFMKm z-jN^1`{wcc6A)O@R2xeB?b7_VeY`81Uiv?hYQX#8>DwCdSB>^P)}qza8^BQ` zS`|OH#y<-&rjXvMzXN${GkId}=B6C;oeRnO@PhZx^*g#xxmUF-e(_)*NR5e;erJ6d?FgGZS)r$}GB?mOcQ%C#Wv}{vCrh3qWcZ)a8Hur%bP*recck@KJOXkYgn;|o1 zRo_!oXL|nnzTH)PT*qx-HL}8zvxjIe%mQOj^Fv&K|fFPJ#|z>D&*gb zf{t2vl%b=~n--f(;AHuvB>bPr`?2})^*efYy#Bm-(DU04YFi&0jiVb)WAe0$Fb~_7 zcNA1)cM`8U4~CtEL0 zwV1wgIb|!Y^n-e)nB3tl@vlfZ@Y6TUiO65*_YAg>!;kBpd!!P3(~Z`RLHwi+lFaL<0leckf=bY3n8?@W z2Ig$KwlH^lUiyt2laFxB$6b6yD2DX%3uG<4xq!Ha!YwpIt0OdT!BY8c)H`U;)*r_X z;kG=y9J?KFU8b7%Lp+1lV25qpP3h+GmmL`GN;p2t3t#x7vm$?MeL&=Y0tQF! zqsd~LV%lyUKQ9UY7)l%Q0jMxG#z^dA#P{8R-_uO}v=ZCHP+IekO6&t}TE}nd&Ynm; zoMdd8LAgFY&IkhSJ_zWh8G%U($|AJ^+B72rTNK2U4J1HJ@fkVz*rh&(iH|FsL60w@ z3XR}nP@%>6*sDI4^2_2K5|TVEuJUwJO^^psoSGzgI>6|Zr&Co-@^skpbSsqPDODdy zo~Zgr^7N>WuJR=IrQH)+f{sYPu^T_9xNl;{_@ig|=_j}_9(nN|R{emH*egFiHhwDR zk;Qyd#TQ5Kz)zLsj-{GZc_c6JaQS;)V~vsYHp4L(9p>K`6AD)Eqb@f_;->(B%MnI> z(=ep*eYxTD{g4k^J!9?qkTl`vTjKwDj>Z=G0?tRmPt~5xUPgQ*c4L&oYk3fX;$ILS z1XE>bBdQ%cROVw;FrGz)I7C3eu+NPj%X#9z%#9zvgG#UJ^Cw3(l7$bq=kl+O=l?ar zNSiMD|24Y5mbwpr!A~qO3w{zddjq}y5&HQWD)Jj?{n!*+9~hz^QEi zxqQK|_fa$|!+Srt(f7u-=3(ISf` zQLeYKxYng^{kqkqT5DAhF@z=V;?ipC0$Qx|5)c&G6v+4UIWzD3&fI$warxu-Jio8c zBRB6XXU;Zfwlim<_+wlw(tUgkf1Fwr>3&)f{y4iN()}D3y=Y{l`^6*U$#Ih*&B?l- zQ0<|C!*wTV8Xo0$({Md?ZyFxsC$i04b9j;Y9&CO~%x~QMjx@g$%(;KNWtG34OdgjXFD}i4hR3nvc1vTY70t^-jh)wOdmE>v zw0A^X?ZNR9lbTV{c=D3G%EV$eulpPDOKbnxU1|Ta)b@WKdbzok#4dRgwp6i^a$H_= zIQDhNMH9z$^*7R{cd=BK`zhAvJY7HEsgJst9KaS(497(SIPK9NQtQ*cwD}%!4$$(B zyV&3FsZ0*XwgqPgy*bc!#1jyB!nhNZP4k!e;hqm9iGXYIW>8& zUS!voIeoG}W+Omhca1{Lg<08E9XKbU{`HSf84HWVcQ*KThZd zH_h6{vr6#Xqe#!{r&=Xm4Pmgv9=gN?-9S^A$p$2TaQ)1Se*U+HYw{W(o%YclGJkrS$(x(T4YK}a*>`ik!f&3_5M$Hwa~ZjgsTIR-lF(GaM|_!WU<$FEA&j}39euK;&GBk8_+%!q6C z7##u`9ReAh3S=~ZwAW&J%N5H)iX}Ot#FD*Lg0eqcWItoDRpRv!2214Y5{0^fSHetc zhujZDd0bWd; z&J}2u71oYOx2GSne~J6q&p651m$V$$A%RB*c0XhrhC0= zBEOfdQp0uiOqK%fq;5$cIkS0flp`V^nhkCB%2trC`g$Os~D>_uub>&M`>^rKK+ zL-UuM5!0nI=|}yHsOnn|y?~+=bTEo?K7~O=`R%2sALz#*d>J`Ru=L{zIEkPUiyTKk zjyYGdEm|D?*k5OBLQ?hPw*c+vM=V7@2C#soA0v%^#8dQRaH@W+%B&w$3ZoyCrxq`NBt6iNsYX9SAfgl+NY4}?qoH8Kj9@J3Tlz8id-Y?2RU)%~#M{!3 z!Rib#-ZRV~msvkzs_QV(i>PX!qZQ>hLq$I}sKYTK3-zOyOwUSaKc-sxQGd25fJKg@ zAN!pn*%mF1ezfS?nvhieI2@UdeiWtXM|T#m^kcHoj|nOI5x4cj3@I`Jky!^7z-UD@ z&q+(RT7)R`R##u;q z$*MaTLiDAzS!dhxjJ`Ts=ArNF>_XA%y8g(q<{6!l=^Y{(!J!Q^rWAeR9_o6$LixeXe{{YJo9_?5f5!F7C{p1YkDst!`PdaG4T(F&ueC~0AJCs!!kXpR{wIXN z62H_X%zDLAIO;-g(HN{(qGHYc^~yUT2$p(*XwYgb7-Fo(-*!k!RBb&Pe?U`KLF2e^ zdzqRSu3N60EQ{Y-01!Ow^-DkGxy04=(TXAS(?vSlqO9(hI$QMSUY%{$FH|^7Z{9f# zYEghR-%h2jU;f4dtfcj3*VivU&-~*TMBZ1I89#ddks?fEU#tPU75ie1*|nMNiypRX zGuxNJ>NDEMq(A@2WM6p8{P!?tFfdV7^Bt9BrFyNHS_6yoG_?&{b0>cT`%-zTFArxP zl8a&tok4fJK7Qv!Xl*ERo~DEeZN<><@Vs0DShXma#rxXw1~nw0VAcL42- zN2%+YlUTsg7p`k;eTk>&%V1kyAYty9{mA+2nTD_*p%b+?<8->NrC-OoyR_nEMxvSvkY}6*j8v{baB>%iBCbhE&13)$-nk=`Af(BrKQBky8hO-4p(= z)fdr|kNs%kB%Z&_xuQ$f73aYzIcLBt;z;;X4jNJ;(2x|wLZW(0NgfEAU4<9B2kJw# zrudX`cmezJC_FFPsRrpb?UQhZ#r|>vKR$T+HD882^Iqhu4bJt|ZH&Id}t2`d@-(JC;gcu7^EXhj!#MI&ZRVRm&-U}tuEMGLMQN5m)D4g2R6@RUkkhCRp+uKpi& zqxfIdop1ydxt83HPkF~urFH^jiMUS97fH;7BkC0B3eEtg495}dpgqfqSIsQ1tnYhG zMfMKZ=V-;jo8s9k;oqXp1XskzuRN=)cyi8FM@F8FcZobZx=YQcb80@D-Raf2qq`WR zI|snCDyA%LeinLARy-x=szcb0NBx)=pE4|`GJ8GlD%AI?iMPj2&cWZRKY~%BVvkCG z#gzAue{f^Geh7*njsunZGQZ5<)$Q!tzXmiQq$ZB`XPso#fEIP~SojzGgIyu9OwE+v z^(q&{8$G~D_OWH~;4O!cd*ckR>dfSc1p~V!I{S&;*dHYgxz%4JULNpH>6Q%`t8ng{ zvjR69;>GV*eOP>aUR4k5xAT0w2UB_@rFuhI^7yW0#oel22r{a_AUympeBpWWcRYVi zOwXy=Su}h9c>VBbQ%9br#uI2k_gHJZnzA#oNnI{vNX)FNPKiTJDfI^^bn^V1#G%dW ze0^}?m-z5Y+J?VJX88Tn;cNf2io^~%$TAm0o0d$ztt<=9^Eq_u;`tQbP`A9+Y6~!{ z;4PgSek(%5y(%>ja*Nk5EVxfFTUI}MQ#R4n`4Oa6()sdhwT3py__EidYoN|5 zAYWq%ITA|39oA9{pk*zk%X2y&LlmS&P9Z3XC!dj4 zH^v{scpp87e(Lgk`~>*o^p%Yu_~I0)-Ke!q4I`f|%PLC_F0X^D_P1a~Dg5vvbsylb zcvEA;KBY8!PvNH`@$b^-yCQjh9*_V?_4r8AgTUPYSD<&DPC`BnXKO*dvrRosT914gkRmD47EnU)(KX0>0@Pl!I@0#I>~GyOIgek21L8Jx@L} zouAXxFcI@r1%pcyOLc(T1oCMUap$Q&#Eh(}E2$eKFJ6C3!3O@KwXc($EFJ2CxYbE0jQ6=MD^2nU+D77i>q@Y z!>VDHkta8tAt`#`9}h;s{g85dQU5p0dcdr9GbVcr2=p!f)0zM5#(y4S?%BvCJ5Ob)TSDt7 z_ti1K(*8WW<^>-+xaKUU($gaygEcph%`Lae`W(6CR$1Iw-Lv^{*>|XEgwb7sn?Q|K z2XJ1MI6T>{W^s1Sw(QIQyP>8-c04Rly;3%G_X#J&-P7&07;tYB4hLks5p$2=B2x2L zVamNPGoy!;MKX0gcjajR}BXMOQ~O8@f<5?CeJYaM;VJ=nn4Bny5#ouRp0>>4^?2?xAG-wnycdY@>O7X zD1;s^s1{!cCkZHD2wen}*7(k9$2Kz#1p4mk!FZPeWj+IPg_<-yc-$ra4xjjcVOR+D zU@jWPm!al&_{yLM6)vb>2`K16Qb757@M{6(>p_2^W)9?mh7pXC2?GznDy)~z(w+kqrRuW@-e8Yv|8Wj0$VA-*z1;JV~pjDX{Z)(SVqt}xr;g*pT2+gM5G~p z?YkJ!IoXhjiugwMkpX>QCT1MZzbeOA$eFBKHP7-`99^WWmMkVjTS4O+g=(he>VJ7Xu;{q+P3zGy~U>8onXNp~T0sYyx3z6DM z*krSWG!&m=0>%PtU;-L~5#h~~fUQV=5DJ9deYrCtybj)2K<5jq!2c|%lQtsk@Ai$Z z(l^lI-X1QpHWshuYxy#as>YWudDu_i7T@ZEy2kHj*9s_~=Ys{5mV87Vg0IjX`rMDy zzUqz(D_u^#hEF4Z!1g&|%fG=D*%Kl%aN*nIMB;|5$G?&uC(6I{ZM62e6O z0xgukfD7f1&s6zCm=JNkYB#}{`*Q&zkoD^>)!bLIMEL**11*14%0%^duI!aB`y7Yr zXE)eXKZ37->JzNN<~A4DH3E!OKZ~Kt8V%18aE9vL)C7F``=>!X_az`K)cdXQd$s8L zoNllj`X&Le;RRQE!EE?$7n4MQNnaO}kJoF&j6C1Or@_F)gO-=)_H&_i!KbvovW&(3 z?SmVoGPcWk|47x~OU_}c^?d|xqpW9nYzE-(a6iC1=~xkZEeO^mhx=L}GfQv>Y9{87w*BE8*Wrr)n8wl+QoF#Qr4*g%JcNFFl|lDU8rhy~K>o(y~+GVWyXfQqHyk{ekHth4W7N=}d30ErDJBG^Rh3o<5xE4+tk5IQ^Nv zNUWPn@gB?=wq1+HB4FpyNN>L*owCoFv5%3JRpAY$_m?G+!@7SkJy&?`P<%JjzxXn} zfm&u13+r4|&u2!SKyqjs&Gh$$r%w9OOfOC6bswgGBD{7m>LPFiBL~jLqfoxHly@lm zkm-C)nKML-6HAzWq8>@?^v9T9FUsPSznSTW811&;%wT$Xx-6$K{j>CTf5Y^TL`faG z1~NSZ-}Ywu(ZWxMuJ%m-I-SqW#Yq1{dii&mesl(bEnvo3-;zO21Ak_ER(ksNOg~!) zaLQlG^il|b=EGvp$xQz^9nMguKPtW0)u4l!ajH~sIMki#Z;6E63R?#w8_G9?+0%kL}5WCB{M!fg@6P07vDT zrG?szTNmmolLy{Emgh5Hr~{7V*wpV)d~z?G5eX0mLM=dYshl(PU|h0mpN2Ir#bHA! zPa7msgq$|uo;Ob$K7#Sr@iA0sDgSJW*B|l45jbf(Jox;OpMCh*)VM((X05`{h{UI* z&-VhN^D*}UM(fqeBXA1TUXHWmnUs7S??h^2*!K31c%qTI?)cQ=L{%Olbye2^Wo){3 z^)_K+RnJdA0S+p9h6fc8R!iv|oKy%29;S{hD)K9047%5=f=~G8dbJ&(!r2?*!G!Sz zwG75&kU?3pPkG&H#KZ#<`PMPgWt;{;3ho(_?61EhL+4*L0&?d5HARL4>!XmCSd3Gy znuab2Qrl$=#WSWLFL`*)PKaY5iWLvV(a%s3MxHMW91E!vF%T`lR1Ty65z`0pU~|2C z4E70N7Y#wOnuP-RKok_nOwB{qBDfPvxzW%+1WMR#QOqR#7G;Cna#n0=oP3m=60Z7% zIVI$?H0CIBy*gkJ5094CHOwAbmgqw%<^|^=ky;+!`clk`)V+<*a2`QPs>P7LH{Ybk zo0d(ML(ytPIM`f;s3n`rptC!`97N5y7uos9Mw|s5ZUXfYAuPrkiLc9eFx;X>9R+xo zLe6X_d1+qF;;zOC;;YDYY-i5#S{w4bCVXkVkpp0`uWTUMw?z%1gqj*x$?f~)_xZ=8 zLikkS)D~4Z5M@Aav^23?C`RzNma4scYNOSWP+!%D;8IzlI!j#C&Yt%?_CXPw(d*&U z4Uy#maYGG*J{$rPa2z*pU+|t$8ak@yP$1salyxdn>USS7f&F=>x&)|tI{-%=NrV#1 zcnG(w8P^lHsPYfd*8%$1_@$cf4ql5MnscG1CFHhaTk>FA4y{{P)lY53K%e*$s(BhZ zhuA1f$FBzd`Tz+BQYFCfb8xT2;q8d4+6iKDoIIbL!ne!F(&x!VwPpZ;4k^Hc$h;20 zcxC!*iHTK_#G&2{k)fV{TAaKQR3dj0dvf{VnyyLz!N*k0PW<_zzE6t_iQn<`Pl7zE zmxYX;V2<3IM?e~!Q?^5_!Y`_D6!_b&5~k+hMtFD3j^Tt5NEH$(b6mC$Z7OKh_~4*h zO{Mu^x#|!6+qStNO8Be&d#0>0ZXGy*>xf8{xWCJP1S5nBfd5P_^(@&XJ_YG;e~3>( z_}cm_qd1XV2Hs`ia{meST|15__JCr2FG;J^D9(&$tBU%nO<9br6VGmn7w;q)qiiyY z%>&KHkPiQW<^l0!&-fIW&G?k#=~#j@zXAh2omN~_GgZ?MR*{x#|OQ!70_Z17a2nA=WH=(`Bo%3r7=qU4KaVYYv!j;aMQR>(x-G0POV`cp$7ifq}iZqb)`S*$5}IE){TOGHQHeCCKnRQCMzPc;P#>z-K&OW+p#gA@Zy&9ftMi*dT zgqH5=_d6)Zp3S$J`sy(#NAo%$N+@6cTSK`G>S4wy_^-iNrXum4^h6vI?g0Y!0|7*p zFTsm5+f;F8+o%!l%5|IZV>{8um&es*P!u}*(M|0#APS9yrjda4ss^lOmz*d)Wf=&l zq8pj(yqQGn!9FH_;uY~Nw!O`fq^vKHki(};j8cN3ucm*Dfn-XGP`F z>2dh3&LZ2Aqw}fS&U@;QqoC{n@ICiq!K;cSTtv8LO*F=9UdHkIXFE5y&yFMHSVaOk zSi4qo?5d?a;DH8rs|w5k@@hV7U)c$xnyhYzums$hQ9^Q~VXly8JUY;cF>0W)^e_Ue zYpGt!6rALMl__QCFj3+?V&@jTY*HMQ2ZPa9R0z4S63h_&puR=EL1G#=6 zHMWGE1o?ULi~Hk9lz4MEolm?AKE)gZ%n)-t(dAsO=DTbd&!P)T^>7P!pm}{tvwAnc zxE3{()z1-2dLP=;12E=;?o8x#zyLilYbIj+2b#q4mn9EHAfc+#vc#7hW^V-r{V zm@Tq~S^B0|G%YWYVRnrSvs=^}C{*(w0(&5##Oja8>8qz7+Ybvz0PrN^2%rw7q-6Zm zW5CHYQ-NDgwCZ?`R$1auMR*7>Rkt@pAg15%rwDDFr|toQGVuU_#Bv-Pa5S8cDqxGp zHw0||ol*UO_=7=x$ODuZ@;L7Hrj(l+vixzkgF2R4+|)D~?pzpm=a1yLyIE}md~YpV zdWnSSF7w{I{Byl}9F2rs2KEW@pn@^?lni68nM)p&I?f)eC72&bP|NQn#wSu|L-J@? z=8=d}fU&koeGO#HJhBt!kxME#kL*=orjbig%}gT^JkXv*b_S6Pu!F=&vj`d3(VGptl|Hf^a|;NEv;HCCzgD#;WEZLB zJVsBTh7?5V*5k_>`Tq#gybqCf_B@%_bq?osg@DU>9fvNV=86j zGw2=uxn6Yz=WO|mW|Zvj)b4j9+m3#~E5`bQDO^(h%gdu51=FPe=_y#G_DFzd7qmSH`ydUTr4E*LCxgRU16Lm`wof!r?z=$)rye;X*Fzi8QCwD5O<79t%nbMa~Hg{6(1KxPp4*h>EjY{mTa73yhl zza&*(zeBEGhkyfKC-76x3w*t0*j;tbL9kTq=PLp|t$y@``h8ot!eU5X7v45xB=inqzb!5+NYIx)}L<*{Dh$6Pj z^X!3VBZvoVWe6Pni99BxAPC^XE^PAjK}m^dfO&ykF{3gGgS`7(AT$LFQZPLsLSrN*WMFcz$^lJwS&s?TX)@flSg@-OsOz;78D za|g0&hHs7`eDk%x@a-NhUwCtcmwJ7P^&I$s#hl_kq`oU;VaWHWcEs!9nTU|j^2P&K z)_E!yBucA@zE90>8OilybkdU6%F8J>unfvGEFj7=9vrsej`fxZQt9#f+PL47bpX2+ z;}N!Q4}i}mStwzZ1cRXZ!qf}m;;US>0t*~0(xEB-E`?d%JG&H&V{Pt<>A$>x2KJco ztR-|bhJ{Fc%9UM{rFo@^ZKVeOpMMi3UItN zeD9_S0KT`rW#N1KHXC2vGh|Jew*KET9OHY-vDLVFV6W$^OVQ2!wY**ja^DquoQb#N z2?U;(+aF(H>KKO;0yje*1WmvLT~oaZX*EBodLjk8Ff`Q^z1>{P2w7_jDC z1-I)e+*7UZRTzmkV*3l%BWL$UsY0$v-qA&(c(a72ulhjBurO4)10ln~2m!BWY`&gn zFT>VDd>J5>M(%ECeodW^osN)Q=x-+!$*dsaKLav7hw~Y}QvtqWe*yie$l>RFSi#oh z^=tAI!40{MJ<90n9q(AWx^^>~x7tq*?`zN4<`qxxTXm=zRAY(hUDeU1hfXn2);EgxZQs5QZ@bXj_&`*sT=)*gi7zOL8RCt&#_*!WJ6wzYi*zVQ@%;{m>LwXct_?~j=Q-&B1`v%(b#Z1sPk=n}MLm>A@$33Fx? zVS;-ZI?fl7+UwB2)lHaBAfS9=*_L4?VziIt{F@agASa;^58gecubxaRE++_~ya%i^ z)vK1xnGt6bg8`x{UkwBhn1*{BIxTB{G%T<7M*5Z&Xc*}?ojp%=k#Z%GdzLl-LmjrK z)~)AZ0`ze$q@UtXT11hD)+Fh zcq}20Gui6TuvoMf+#ABCKzMDLf; z+zboqe3YYE$i=Yj+xL|D5?XAnzpsNN*njFc7r<}7_pN>({R&e@@o%U|Y!b0ty>_m! zWJm${kFm-cIIrMoL?DlNav!{gwo=^)|M0p5?!|h-<%oWemaUzOh`yT~%O36{_85uV8DEuO}iiQk#b~%4DQ@ zzOR@6&DDck_%s>)VmQ_5{Gc*12*F>VD+kp9;T6_UU zL*gHz5UN5h4b`8@<-cc9y`uhd6k1<47ZY6dqLhr()**vWa>dIc&mz4tu}$}1p3_k; zmeEk)^^^&6+jwNYA5%MW-O&PaHuU*_>R$E|@O%OXz)0;Js5J+{V4HYCr1k=&QM9-+ zt0q$)ici6X`nm_Hf2f%+vRA(xm6f%q1^=-JyaFv*qz@c^J+}v3h4N*P^4UjO86Hw^ zgptP)U4EGiP|#-#DGYGiXTNmZ@{q;`U*?Dl$>>qPl9Cw<%6uF;6Ng)Xlm-r05|O2P zn|m`Y~w{Qc}*uvS;!jJ;B8z&d!yR1SZwe@@IN>RCbD>;$cE09S2y&^CHk-A?U zgtV)dvOD@)dZnjfzbf%B@9rI9%=P$Z%_pwzfqm#XU^K@aby;`Qas?mq(az}y;87oS z{AbLFR@9#WLk7(7`Zdo-PxC~02JCeOH`@07m$5Q3Q4-4;+?5UE7QF~?&@ye z9hHK+y19F3#LVT}wanyQ-Azykb5}P~I~YDSxRMJuW_E$|u$&}!VF|8?sns|uNn(WW+XZbql%>% z=W~z=u-+@gT1&69YI-RkL<^~tdIm|d-wWAMTQzg;v9vX&Cd>XA^QoZmkQI0wl3Jm0rN0EeQnjsM_r7mL4ZYV)v!d#9BtJd zgmR3jmoap(EELszIDv6 zdC_H$gZWvK8Dh?OSw7YrK8dF+p_i7pbLhhy7;s>$AV-ax^K2tdOXMx~zuodn8 zg)6}bJ~L_eIKbLf?OyZ3E@}4?6l+tvYux@jExrFXV7ser9XU0n5l2T#B{S5KNNvQ? z?#UROEf$Z!XQBC{~>=PJ!!fzr@?h-}74ZJ}FCij6t>nWw&f&S1_iiAD_OI`f~B zDd~FB1$*pc{gGKy7_46rwo#&l`cc;aYc0LbDiOlcLh7O}N0PS3CM->)_A zvLB|_oMYbzP{AAl3gc~+PGo_R=b6l>E` zKjHT5JEdnk^N>9p3Y}TAnTI^{54RD=-u+QBg{X}4kPQqU6Y}O`e1?|#&d$EHw0vw! zeW8o_$?2G%BDMWdG!y3EKGO!~A4_J4xjheg)0OB8(p!B?y}DC?wQs3!3}N~6kXcB| zG!L=$HBS}ptzqdE*%YV$Z8uj@9(;7VKC@ptkJBH1(-2a=b~6xBE!7-bVi8^DLet6 zDHNU!tc)2G*;(^u(@0KABbL7AsV|=P8SYOE-Fb7R%i>~Tv6ejEckCEcPMbGR!8Wpm z`AB@GVE(w&_GRPftHJzuLC$D2l)%BfUkc{7zK(MnA100aSPu%Z_VxACzXgQ&`uZl4 zQtY%28~{6g4K^3WPJ10JJ8kb*S!l!R}ZB0HLu*{$>I@6XWFMn#6H2Gc>Yg3c=c2Ubq*W^FtY7h`~E1G;% zN+XUw>?@h!bSHJc;sI<`SuDO$?_3#8i%Hv3IZcy~bY)YJE}PGCz7O*`PrB@JFrOls zA?Ege#XjzM(a9Pwu-_)_N=09j_Y7faP41*}ki`9pV7}2_rpD0Y1=#NpJw5<{g82q7 zID|9B|K>StTY*o1z{*ozdyTfSF7`5~%C2`E2o+%N$p!3(R7 z59#jbMk(6Mk5V*7K=~1KItVCzD6yN``e?Xb_T#ps#mjj($KlS+_|#JPwq<7^1v_32 zBf(kh+~`Mhdllt@ui?*CXd7R$SVcTqeEAqS@p2AAZ3|dW0mjHNR|z!wz2a~*SM?Kc z@O$NF7quTg{rTlYt!HqOhOL60y%RNhRtykht#LC^Gx^i`C$+I<$En(7>jYW?bA zD1&b}sDz62DLy4q){33vR9d{G=Umzz5ZVwg>3$RsBV~>L3mN50zZ_qFyd*1j-53{C zsenR^qHzMs=Xsuh@_GL4BNop`S}}57cO#8GFAGxgJWrqnJf9B$tR_515VXIbZ4hw2#Zy@X|Evz^*GIP>>d=z9} z?fv4bjCknnwhbGpNHQ0~+}S&!ITPGG^$Lo~V$u7<+KkZD!%~7UKK@^(5{0VHlqmFe zTb-#DvrBTS4~Xp*dVMhk$i(L(O|d-h!Ho3fsojGTBfiPhp5fM)UmJmGZZVWnI%f@T zjizi&{Ort2YYvAtYsg{ zwRccrts?I($TPhyyVe_UQl>_0qIInoM8>K5XQ=s;sbHwN2Y9v0(P<8FFP2d=jHJp; zS*-J*>)un4RNI*MbbxEj`}{W(Hl~HoHaNOayPhpL5sMm7!h3Ub8!+y1VO;wq%i6Nk z8$HwgV%}Y7CB1~%kROR+L|m_Jy?H8QS#_|17V|b{l#J2ec78Ffzei>4?WXL%aG^I8 zyLV>Bei&0v`o+9HVi{6(!a$qr7t<~OuC10&amy~paFEWQLUn{GR_I-Z(I8#Jj5c=j zi?QV*?^PKY(&h2Rmqzs7KgG7DmVkzE>DeH~{H3S2AY-r2Q+N2qyxm)o*mTog%$p+g zW#*eU(!W93Pzf{#n?)X}wTvF`Wq_NW@;Y=dy{AAj!I0stvlX9h6?)%^bxY*~{MG!j z-e+x%Lbv(Fh;Pg*M%lJ;ILoP^ad-kFWV&RHP7N{@j5WSWdUiU#yZLavmjnk)7Ok1Z zdPD{A-rGpz+>C!QqyHvmI3x5TroWW|(u2&nK`J;=;Od$FFAP#Crlgwb9WgYeq)%e{ zCK-mDplIbx-wF7fpjj03WBQpeNvRa{V#W+X$gyGDn~}bUq`M^lml?08Q}7zoZx9L` zR{Wjmho)0@7tq9>Om$=vrk!lxO#4b$ShB8S&hXyK>gim>sS#jLkCbr4Q| z^|b}_(A0o;46LX+QO2k-1=E7CH+ZiD>!2X?O}Baae&5T8?~U}zWUR9Iv#Mse#-fe- zKNU0x>KGxgh}HAqQgpbk^b`fgD|uTI9pnPot}`QAN1~Rq>;^j2h_fs=ZFGIajPw0v z|Axh^_Ln^fv#HAZh5GpyS;-~-6Hn;pU>MnIy!5gQ3a0vgv-hBCWzxKy(1MQv>zem6 zezWE9Ze3R@F4sJzh2QKltbTFizEj2%?KfLams@04e;P;dgBhN0cOnACS6bU!htJ|Ubd{*iyeDf}%6VRpxRk_-Rywt@qBx<_!n(Ga-?(Css zTj;DvE&X=sPJI~Kr}wO|^l#8(=xh9FJbx6aWBi`x;(55i6;Eo#vAjiJFF^gPmr~P$ z_#maH!eJEmxr`KHc12|Hnw^>~Qe&VRzQb$JFS4`L|3N| zR!COaG%luwVf!J4#z(mT2aU&b{NTl_m1-r(^^v&ce?VeCQCKcs=|&FtS_jlPw(B%f zmbsCBx{=EI#|!QQGt|eTIq>U;n>4NqKwk^#nBM^n^J))n{j{i8J}1-Hs~gb>*vrnh z2woAQLCn7ra$w>Bah1sZ>htU@6puI6O80=|;51%a@G^e+AOGgYEdL|^AK+JQ1{$b? zuA8s^1MR7-f2Lp#GJpYEWF&|8fDwD}TuDU?5;)MK->J$kNV!heUhLPt4Ll-?Ms_hv z)4auN_Gcu<-wLU^Bwv3lqr}S+pR%7O@K)Xtr9d2StaU~l9IqP7IO#8ztuOr_GG2n3 zrL2z+X8KT*4*%m3ShWWI*{Yw-a=*eNnDy1h)kGXh!yaP$AHVt!jxz8+9)THz)T zA6K16^$C5Cr&gT=<}o_uRQ0;dKJb^{{p+%UPG$XtzT@!;_>}u_?XtZp`J0S}4b@$; zE2*CvrdMJgL0snt!EJ&eS#>{s(DkX9$4ovWR1Y1gNFJ9*;S`Dg>1#Z)p$m(6kW}Y8 z`${L{lk?mnId2;&S}cBx@L&Uk5`n;Y=01d~UL<`#T8C=HienLHey{!{Y-Ku6@OE;j z)1{10+~c$)L}$;scOtbrNk({r*Njj9oFuLmo67N44zim_OIZ0C(qbGyM{;@>SF;5I z{vr+|TRHw);rax>Xt^s-AQN!q1J^**K)~X>OvB>5ZUUxsvZ*ER$|zfjSK*{=(=Gb= z5BDpW##$&V`+stfZHnE8Vqu942icum)HaJJqdpBX6yEKT!9InUEeb+*BS)t+VjZHz z)qavGL>b2mKHe9~=Vh10{}2}ILzuWaK-!kdX~%!>0#!>k4e6Nw7mD6C=2zeBvd6*v zOvwx}uNoI(y~1t$MQPl}`h00uD*8u9`5`PVq|PcAN#?vqblh;~ua5REa$O)E!>6yk zC91t?2OT7%8^(Cv6bQAq44=OC#;HmrYO$DB{3Qz1iuUHf*jiw|f`t6TYprF}-V#*} zSkzt(OO(#hUad~j=T)bhwDv-AjbfEJ+6(ju^0OPYc%(xBZkn@w9~ZT#3{P5n4TURV zk=clkm8HF=k(nutSUOOmCQGI*pKgx!zTT~S`SLp6lq&3r)#h4c->$*UK`90 z{9eqL%yZe}VE&L~hL~5uQusD;klXkH(zuWH6PODagX(MV$ssJQy+MY)# zG(94;Y0u#+X0IaE>!0Wb^$2m8X&$9A+VeMEU$_^<7tY81t6*rz+#_bX;yTZA)-qgw zQXu&H(n^oG$F*6>R(iw~z}nRwvE_zc>JckYEbKEGdc^zgaJN*3JEupy@!#+35$C5g z;^@^0k{Rk%q}H|P$GI+P11*=d5;aQNZly=KvS~<{P0#Pe{BQLxdmPMfk<1Wt+n%54 zvTc+#ODIuyeU{cE;vp>Go*#jvz@AfkF&JYV<=XSZqmC`zAD_NGFH!?dJE)w|o?qg+ z>YQr1>Xgu)7pbp4)v^Ty(AkRizT@_wm+mJSrDd6Fqa z8Tq*Oe68ye@^8x}q)6S20N!M*FCW_t^zW{0?n{@=SgCF9mSH%uMk0gx#_QX_{9lq8 zVs6{>c5a_rFKp8`u}FQqGQirm=hug@e0x3}NyeTV?}$ikPoA0w>w%f>!S>ny8Tm}W zch>_iv^ARt^Bn8{<_A7{oXr=7$QtYK_Mcv^&sVnieEHUYqZvrR+>HI_GPm+%sqEOs zzX^ozvHn9`Q6G#?zyH|tp|b#MSFQiHxw~Zj-$Ai9t$(#^Ud|Bn;!yb3$J#=)J|DU; zr4g(Dl&F!C8QRcDt=oUDr;>zI&guB{?OTZ&Ep2DE{@v++6IR@rE}PxI7xTYg=d#Da z{5Hu9F}M5A9G7huT2{G4-TjePP;kueKgWl#{Qh$!lG5fw>GuD19{Go4&X*&9zo!l~ zE&2Avzy9K1p3SCHOIZ0!cpv!ld1D>FLPS_9h_>0S*#Es;R(BLvC*r`VIOpBQ{sY!7 z+y85K&HkfUoA&=8w}-N~r%)JiD9mI((t^M6TZh`Fu5-?$R}6rX;tgZ=+^fVHo`*N3ot z{hf}aH2V)b?%V&W2zOfO}J@^b! zJSs#nqv7u5N+nyQ;xKosj3PdBTTy)aVp%vGCL>t7;y(^pyQ=slHM^wvy-}=9#s8h# zwa?*>n%QVFU3(9Q!c6M(%r$N!j^h7OGDG$8?|u18!jC&Tym=L$p?vOqKTx5xg=}9q z*;-8Pjn5R!Pm$WbY%*c~?bU5y{;_0+nA`UW=DQMo$Qo{n)ari)So?~9V+czteityz0eqnBu5b3!uCm|jDEo*Itu$u--K}_^ zRCE+QBDLFM<`Z+;VCFo@w3uo6W>0W?S-E5T{`k){W|oDpG&6J603-!$d=GohAsZWD zOe{7&LEA!`aSQ+(Hrl?~ySZxht)q{f(~)^@HmMfEd}JO#lJDvJn-GyL)bvoEtMMs_ z{Np_$;(Pj@gUa}lB}_MU625}{e#bxiCDfwd-H~r$Q~e}`V)NiX*Kf5|o(Cu&z(mS1 zM~fPP8a!($f14b|L63T2h5lgqRu#W-Lge&F@F@z)va=o9Cl#vI7-fb$A-#)4C^C9NIcsD5t(-|(=8 zCpE{v1BC1SlNtnD#JQ|FteI`7%2Nk|Di+@Nb#iE>+8y5>{L~R#aQR5Q+@NZSY~Pk( z+={!;^2Ztl+HH*|QOwA&%B%^y`k;)2694JmqsjZi&PhQilmv{r$WNM{E zEeuNZS(m9qk-F2ADDqy)=-gDIt_Wa!oYCPGm%FGE;kT^)&+DYfU>?INJ&@UNgn8 z!oU>VJ5P9=id%_#z%S-KmeCc=;5O3~!x{h!S?}G9dRU~!`Nh0mTQgx_qy_~gj)k_T z^pic2=^g!T8$8?5}pqHe~GkhL2-i9F_v#bShDnyCKra3LM~?k4xa4)GC!5mpfEm z3R{)lg3ZT9r-J6={TcgKk-E*4Et2v7e{!4(nm>PP#m;=N%ybU#j*R`YL_KRtlz5kjjZekWNbwJTF>O1d82i()w0V50 zQ$h3i*o@Z6j1m1z1v5r`@@b|P?4#-JOEqn}0$Z5i?S@+EGAdCkOxY5z9+;L6f5!uLu*uZBWl5iZ#!pH_+2Z%%e;Y{d?8qFANqKtvaxDE?%dICy&E>Y~wJ=eE*T`s=Rm-Z&8%B zYiU^(?3W#vA1^M=i`;@Rj_*WnY3#J3d3oqgi2C~RfC!hFIv}gWd*+h_MUS?$F!VB? zhXv%0LAXoxKlVmOwl2qd)P71N=T*EO*jQQISlyEk#+BeEu$i52xlprGIu+cSI`X!vi70I>EaYSG?prh;I)B zuOCK%WXkJ@XUgk`*Gf0*St+j(0`Do8;;F{t;Um=btIF)<74NdXFGRnLHZPgS_>9d9L;1<~hicOzQ6ROi z{C=Tw&q1f0!!Z!ycH{E9Uae@rx{mKHUi@)8I70qh?=40dL31@J#d7cQ#nNW0?=ABE zFmNP%Z}DiTe(>JnBIW|hFM+An8{a>d4=!pKU2=bLW%Ah4WJfS4a@`uNB}XJL)-hSv zRrm2q;q(x!e-W-0aaq6AQ7&=D8TglC9jH!(8i)R+R$SIaIL~EVRxAZ|T-F11$&(O1 zGfRhLm1P)QO&1lReXg1hrwL5m@8NJ+KOtkD|VJL|20$D6LFf2&~tu zzR(R;2{{<4!`Vg4i293t54|2x<$#|OAG9A*bfxLq8Sgxt>2c1Yo$Bg&!WV8@{EnI2 zJ;{P5`-gAv%fiONbKJJUY*p90-mP~jKBcp8Z%-{T0}c!)4%;xt(p1N)j`mue}D^qKMQ=mIxED>2j3%v z<%4fIU(-(w68g0cx*GH_Ph3O!|AB|=pjhkR4j4B5<>;Wx!B(_bbMOTNLF=GP;w&m} zcy4h%l{etvHKwA)!TyFGi-Y@^BrReWd>_|EFDfp2T0r@#Pl%V#!4>BP>f&?oMU#}m zL6`nJT@GI3aPS3qJck@~5xj@07t)`k>KXbGZ^u*wWj=!a(-GXqLC^*NhU?$B!18a5 zsy-oJKKK>q2I>;fZ<1)mM1!;)bgkGzo{)ta^Z-xDpg}qa&S`m2Obehzoi{K(m=?hgMD4EnBJCq2mGHgcoB@HgO5$sOtN(F zc9WDz2XkE!e{HFFzPi_dw?teS!t!NMY?9j4!GSLQdmH*S2ah!EXb!qc@{vpbD;E9v zYUe^tzlGpqn5k*b23G8LlcW)J!B2F-$1U(tb*}-BioOn3hOh$qO;U;ux>jr{5354? zKhDFdKnIUB?WBywt_EGhDOZaGW0n8HDq{(D^xUgvOd(}JKE>vJ{C z1N``q5_c?QoQ^xjbG1qwzburB_zUIDJm6fxMkkqZa9oI>1kU6z>w|yM)$B)wehofP zO)}s?nGe3R0na1@e#@D`VO6AdQYU-v_ZNIwQooIvocrYfusip2ZQkc@y*Ka~>RZ$N zfLr$5&(+v_;9+95d@UVL0)4A95U3C`d(1R*xzdGjx`Cj_-C+g-jZ*5&Er;edRH?7T z6U3jnbT$=ZVW)gy9_Nzw?q;7@nKpJ0KH zs>hxSEQ#M^Cxoy9`b|!B(_bb1*x^G);r@ zsCpp>H<9%L2VZ_RO~lowr*ZHMlaz^r*HN+|_$mv0RGn+UqoU8jJwjMM2iu#Z6b`!d zzwC1GDTjmErX4^?vw4+7Fl2qPAn4n?m;XWf9h+A@ne;n0?+i)eG)V^wwr$>PE?&n(7Y?=27oVAtlk`gW&V?;3oD z`u6TKTIfKbb$!cr-2*(jU<5YrMgt*JkKM_Np+Yp{Gt{>UrlK{*=AM?OZ(pCPlQQXB zF8LjT|Jni{Ronia)?*(EVfp%Yvq>WT)=b&exBcjX5~@uHL%*IW-)Pzagfx8{>N2js zAn5Dc1gYrgTdrW^=-bzmH2nk*9eKspx5X}Aegc=lD)O_W`i0Z!WiJUQ?^uQ$tO zt$loMT?)VzNj$3K(t4FEx^o@T9g~hs^F&Rnh0F&?@_l)%sC{R2l{hPla{kL+wCqlAMeAN5QyabiBadD29)dFVTW-`GAr{>+vJXX$K)4|SR<{oG> z1(&HzUm(Zz++uPe{)U<7wt~xH%Jo3 zTI`BgZ(H7tOi~f^E)$itHAFVC)eKW2>YbMnM!q`9l*soy(TUW<^*nW?l)&)e{W7C7 zN>uG`N<_T}TWMwEgBsI(Z(~LndFpK`!B&bgy2nJ-lcq$}dorV&PE^&KR-)coX(g2( zF?GHv5%ZR<%f!=sRbfixdwMA zcWcI)aKHFJdTfoh5_c@BK9&-&CEjhVNaF=lBH!D+l@fOZCEm>FWS6I=8$9w_adL^O zv8F`StI4Q0cyBdmWvy^BmDe%V-IR!V4}OtJv!ZJKpM9AZh-pfNk+0q`CGx$7j4)#A zF;gPu-2*43bemA95~f6VFpk?D_>oNT@v*Q#wi}#-YCE8RRwY@6Pr2e z-+-#>FDCyIlfMm#!TFs3o;J=(Uy5;cU$eHvIjZK%txXLhj~Rw1J}yXEes;$$ouXk`ayZs8}tYC#cS5*dwb&i(Y#mdeK!NAli~R&^PAU%-`HFP;SlwPo>&}IPTA0WJkOCUlQR%csYRXnJ3cuYsapz(A`NHs zEo!7mo2%0#g3=I4tBwQ7SVhg3*^$}>l6y2O>@S&BkKtiWd3&=(P0}fMR1|+4xfM?U z`*cX~B56M;dblq75FqEbQoM{O=RW9mQa)0Pof>G!lBllJd>2ITl>5(>LRsxEb-6rU z&YOl$@VhdxCVudL;)}m+U-NCds)Cwt+gEk1`8K<%-+%^h1d3E92hz{GT!2(pP&Ov% zaGi95m9)PkRUzPyMskaqq#Li>zO$tT5a}WA;gRWEy zK4)c>jw>Bok@%;6V0&~tnOX99?m3g>6BHFBe^RLLhzAGxuc5QS-=LHXjx`^p7?al| z-)WL5XGV`R$u%bV1tuG1pob9@L7+{M{OWu0a5Q|MeD8%Nafjar1^gZ;58*by9|HJ= z0H}J2{0&pP>eRoushg)0_39UzZUaAEN~6*vck+%xPJybDL&+fp z+H>K5D8`j_HytKyNCD!r`85~am7OJUQ2ks~SDkQfDlnh2a!zEKUo8>-{ZRglh6W_QQwLUYh|Rs|xpoM6HY^6+%xW6O;eJj$F)SY=`0dw~p-(kn zh;Kj9YGa@`VX>xGWSaa&hy(f zXqfi%6J=S;hZQl{Ai)g=9F!~}xaGs**#=}umVq}`!+Qwu03b%xt_N!Loy>g%mEs9F z-3`m1xWuPlm%ltLuQHb>D}V}p%``hYs#os7G^MFQ-NgoG=IiA0ELD21q(5>S(lHAX z=9Onn^8St95X@If#|+r4fvwF`_g*SoOoKH3Hi5*3<4xr;;Ll%*$H=4{zf1Gj3F$=J z)R5AqIvY*W3-8O@-40j+IKml0!Q#%I@x<_awI0Pu*`Ew$R)KQ(zKzXN7izhuv^UAy z1fGaKj*Zt}tl$&*9V{s(lWAfYui}Z0oaEJ5Z6U&))l~aCsj=Xdj9^$kawBr8JMA^fSzY5C)*wtZj4;q zA=14geolx+x}O-uALC+??&D+l}ORS&d&Ao}nR<9S(ZtD1Su!f&Ds@$I$ z>`^}00RTHM)qb~X@0Or6jW5Rv*WQhWiEpolT_|IlL&PwpUMF%GyFkdqN#3FxVfXAA zBFCrJ?fHpTn<@5uEU+lYe#`~wtzu{%$5zR@5o|CB_Kf*|D!r-GhQPkRi<)iGJ32$l zp!Xx99MJpbybScR$;{)|X;zz=>HYZpjP#z(R!Q$9HfYmJeM!;BZ774}!aE_!l(knD@h zOuZ+43G<$_vFAEZPfhLqRIKrzdb{+`n2*1@|5l+ZBdXS2k9{+tdLU5MnI=BxZrB+r>l=Ueh++a%dC%|GVkG#7OfxY`uG=sNAqd= z*u9OeGblv;zznG0Mi!CH^}r#MUX~NL<-prtUyQD-KMP%9ZPeN9#l0kTi1;t&UiO!E z*c|(UR?}y`S+S_wlX~@#1%@Tc5peqp^&k*Pl=p=Qinx{ZtR{t$^wm3Mm!K1j9&Sxx zg`&>Ap2#n0&c#}#xeK6GBtBBNXr&Z6(zN+)U&T%NG~1zW1y6~`zM#{VK$hMw9g$du zi)y10tbYPFKjTeHN?@N5t-lwYB=d1)4eMCGu$5S8v7@#ij>6!`2MHqB1oYHQ;_64T zPb{mS)=nMrE9??Z*~IYW&tqx?@+%Wxt3kvcalM&TU)_^+HsH^p%X5kjsV~oFczI^U zZ(p9%E=wH;7%aUNNoPkc&iz$_G049rtokzxiYn_7hdF^(bOYEi0I;Zf2JQb#X*K(ZRU6yGkdf zE(zH0 zjT23a4k60aUr4`I6{GYYt%GSho*4Z5nJP^J_4(6UJFs2wdWKEn$mbwlxK@ni&W z^bSLsKOdI+XzL_l4lu|{j?JrSXm|BzV9)I06_M+X!XI-+beSV0cyWBGSAc-nC;n4O zl-}>h?&?dn)=0JqlAX!k6iBw#NR~NMm;+|cpfUr-&459cC-K|-G(m%{OPW^)E!`8Z zhjyvtJ+Rz2VezlWBW=$r5<84Nqltn&%fjLVYM(=UMl+TeRNz>$!6*hx)=fweOZIpE zS--I0J}?2NhqPpq2LzVv5u_SRb{=~u%m|Z=C0m6*ZA->1W67=p43<_%q9wba*0y9Z zS~Bcch$Ul@z>?*lmG8A=QX{ZrY!#Lano+d1l-7s_Z34P=Uv6Qrmlmmds%}%mRe^Qe z4n~M|`%oCyxItUDRT-^Y{~D5xC`N!~cJ5DMecQT4Befy}s64!Do)N+W>())0Z!Fm^ z)-7vGChPXlgiElFZqx(55!;ta0gc2ID$sks!9h}U;6s)XZ zDiZ*V#wthb9kiGhty0V&O5h9yQbNi|^*YBkkT^InV>h8T%~)W+2S;jWu?eU(1wezv zp-daB-^&27P_%YcKrX$G4_l~sqLBEXRXrq>@>@sAz;)<*PhJ;j@}Tjd!5%)~bGPuG6k*Ef^>;`p)a z_G=+v*!Ju3*}G=H%FxP>wqMgy?AKs+B6QCp^#*0v)Nnvb{lzPj7?>uJgP3HIx4Fea1z zn$PqM_UnG8yY}mo*+@#WU-6j~YrnVea_!frNZv*J)d5^H_Un9^kC^$`G2~`bW2;KV zj=k4a#(q&Lf2jR>5jg%(`&EGkX;y6eRn0AuU_i3%*LPG|N+ z2avYQW~$F3i7fn8BuH{xy(Px%O+-L7D8=8XCG?o_}oz4BLLK z{oStFuUfS7qwQC;!%%1b722=e$m^zts#fjSNNvALGTN^vuO#U|!G7I9CPSZhh>@I} z(S99o8re1bb;|8Oul=eN>Hc{8)fE;ZRCn8ceJytRC)ls@*J9S5!%`}LU2MvVQMMQ%1VwyIR@_9ss__KQmS zL+#fNp#DScR{{;D+OL0b6`aw29nBt-(S98uc59_72A@dCsQufrUjvcL`PZQ=^}X}2 z`>+|k3-;^H%h|Npuggf4YrkSNnR+LT*4L~b4`CnNW&1S*Fl_tP_wrq{UrV8BKiYmh zl`{Vt8O*;%P*s~6rnPFn=4kshEu;NfUq#Y?g8h1vOm1qNr|s9gjP~n#)5xybuRq=V z^V+Z9b3_A)KX(0C2_qA#yKTP?mzDyT??)m`_(MH+Sso}lHMZ zYQHv_eJ;HrV9&p1h;h#}|2myHSU+A#g#{ru?$wt4x(vCrU+1&b_u8*HIA-1j`_)ZI z(feQg)3sld_se9z&SM|kW&3p%VA%HSf=hPIe&wK*A8)_5l{)h;YyXR?+SG7CtM=%lua9o{dF|Kh9MOJ){rWwOMrQkU zspR|w`*kC@pUHk*$@C2N>vX2O_UoQYkd(H5%oC3HyRqK2U-u(<7wy+_aLwQUlG%u{ zUpvXorp8v4irxM{7aIFTrTn4xYbJ2~q4ulOML;TL{dfddy&30UFNkr^WWVlb4)?#v zJ`nQu?rqtxzav-nzgX&f?boV%cFBI70N(lgU;NXxU-!YeI(`22C=J~%+pmRyVcW0A zFW5EvRfbl6wEfCTv0sJ3{Ob+M4rk@9+OJjGeyzx8zb-zXr2ho_b%HeCI8EEH4H@lM zXVb{8*{^-B|9S0KSCQ_IpMSkBCf-+fd;aybGp-*$6+5_6Z6o_YNcZk-*{_XJZNHlF`~CJS>%LvGUpGu; z(|Z4lRJrzRRj*9;YYh$EF59o|fMMIOwdd@b{i;PPKiYm3wQ9e1Bd?np&TQ3wMX~h6 z{(TmH()aJ5Je#Ed1p9RZnGAi__A7=)(!DE=H;wF?{W_)Y=e1vzBHbTvzq-Oggz9eF zudl@}{{;Kh{T%ew4C}{jU|1&m^(oU``?VkRJ>7oIJ&QQ^>t5^HuLDqj7wy+^;F`bx zC9@HK|BKvgYHU@h*zHd~)7UR6;_`$9(?cy#ns@8j4N7*6tbf^@4k{O=;q4vzwZz~#1N@bqZaUaVCz zcY0JkaacA^{!sHh{K4~W2V2xn4)5jSgKIPjSIb*)vlk)e;YsY&n1@@$B(Y`W)a2-1 zb?;QQ+w#FgyZzE}6^S=_rF0Xol$w~?2sK~7?>pGZtxT3ot0?}Uy7zzv{u~}$;|$Mp zTUL}N8lDFNE#&Gdr49-FZm> z-+QfJc9zAj;_1Dr_9nX$(|f5uAWyip9L?+Y9O}WZn$6iIk!Lr1OHo4m#SX`9(r9vM z*F%TqEjb(f!S|HSNW$&uymPCe9iTw5NlVnfCZk>BM|!L`S9oXqkH(M>2nMg{?^T&t1rJV3!*M?V_|?w_ zace+5N_tgo&TTMfkJB7fBiM36z` ze`pHt*wmw zlq~yuR%1yo&lETbsN2a@a3koL?1#(%{X4rt0eQ~~gPRT(bI(6E`~!2jQt1P%?5X(iy^49?>`_rRFLZlzMR-AN zLB$J@NYfa4mwleC*~xcs?U*|pd5%!DV#qOi*~cM>;BU`bW-jS`dO zMu~$buYApnFwS20%(DE&{gGIhaJ7{)sXkc*tG8Qe%{Sg2yb6>=6&rxzO zA>mB*CNP>*MQI(>IN;gt>PDc36QzMM2>!PEBZyFQsLD7e!prjPcNoeD6>p^!>HE*A;Ozx~!%f>U$)oS6s8i~mbxAbR!y=BFTz>9*a z=!d4EVa~sdtd1_^$r(-n!Q`Y7*{!HIE7k*B^C`^Mp#}I`UyX{yF^69fT?nz%4j^{< zM}UNyZbu^2*#Rhd?Nr5S9=%TV^XR_oq$ zMDAtN%!*+BG_vNRN~{q-orK`nmzC;621dVP{C}VeP0iCro7Xq+I-~?46`|W(ne-L} zFx~Zd(p|bro~ui*vUXh&TUoX|Qdr5Q^w2-THl8K> zSvvL}j`d-Cs+H3Br_iv5-9zz(m;Z?B_*r3{^~w{X->Y2_SGpv!Pw1KNS^w8f{l9<$ zk3lKO&z&ZDYkQR~3YPzY`%oGdg`vY~_fDK=xQ3?L;~Lun$c62snt2lG@`*)zQ!%PK zJ~eDk;eq&c%aCSYMwJ$QH<6FPBWj_`sW z`&4x&Ri2f!sINxzi-qnD=r0E86Ml9Fm@ z`zBe|EX{A~F+{Kc+*5)T(yP_oJkX7%xKiB=2%^^EMj=>;;Omd7iMSM>j#qA?P|v`h zVMiJ*?E+alK90biSg4;Dsc~ZZY>vojjFIbb85F4@f2SG^JfF`1>eN<%k>%DxRu6Bi z_4lumxhDJCIab7Dh-kZA{RJFE6DH)lhsp>^i`(0J`U-RAEa+c+D7e7OcqW|K&58G3 zj3?T@{)?Tmw%UTWf!fZvf>&QB)eFa)MD}uGgV#F^ZF%&3YCpqyD%Qf;A`)1(taj-b z@RJ6x&!~jFrG2ne0(c(XRPv7P#x#60F#uMh4Oo$L!;ll@wF5O2#|w2w+w~ILFGgko z3?UGPKTYh8=hluA6X&AkVy^Y&5A93iM>zuEwgQvXWoWvPZL~#Ag4aOl!`WO_5e20E zsQyA>b2&E5iDkRsulTugMpNjrt|&kBQVq{)LiD_^_uvkN{~{kr;#{XoiqH9cbXQkf*9P>E?_Q)iWk$kR%*Qox2Aop0H zw)98zy|mw;MRBtcrk0N2hYQ^=#7k&#|Es+Q_jU7JZN1NeKGK^_-BA;W^!=k}zJas#EA!1gRyrU+ZAPiQ=NE+KSsof6WI~r_T)O4hS zwY!f?8wmbYC;MAFqr^=9)<%)eYSl!?4;0;6WVMOSIL?p$#Aa=sRcKNvnbF{VQNTjs zPFS*_Kl3!|A~Jz5ukM4I!&MRwL*%hi|Bv?6}CPFU_j`Mx6#jrydsJ6f5Wh>xA8pU#ZJYwTkrS zH0&$zYNU6-VRPD52&2IILopL1cr*oR>6)OW=b5vBO&%S65_Eh>9g}0WVA?{3$_bK? zn}&q7ln4)=X~|P}3*`4M3^jc&T?jOd>aW*q-ux21Inud3ig+oP_7p$--J0wyH30$X z>K?mJi`3Np8x&%snW*~`U9c)fp@{;Xgid({T)+Z4rB>>IVBXDX@_xwV{T?AvT;i(O zX+`P`u=%B~n*67ZNA7n~g@t8s_chB_(3YT#hVqNk;dg8D5^6{w9WBX2Nmbe0RG(c&}x_ zoD{X|v%>B-@D0`W!!^vFEUsIN`)Bijm5TlwTa<4UwUBW#G+-8R>%FMJZuHp=q=waW=ovkz zSPm2;mfLs^+f0n!0Pgswlo(tt3eQhsoeeTWz2;HGxP1@_YD(TQ85XFYMR7+ImdB0` zJFz44nqCbxzJ$yh+-xUa{YqY2Pwh8w9O{)&cD6nGFJZqnOfRy4bL8 z4!X$bPk%yZeK%QMQI~H)?=CO4TpZLEwm13Q}Y$SitR0GBmACz2kL z!m$AIcARR2Nzgb9Da(*HnUq%%MpF8L6q^0xP*He0&Oit#)buVCo(6}3vX!x7bv^tw z4<1iA1`zW(9k?_+*e+P`FUi0U9w>yd;Kz>FHjVBmizu;*SaURrs23kGP_2i>suI<@ zEKTlklqC1#CHGSb3xRD7!PyBlu0R;8_0e(6eiMJ5$LtL-w^k$jhYbp&FTf)?C3~gF zct7t;)8u`w$-7SSUafM!-@N&Gwv9Bk0;#bSxDl21>Ql`E2c;`;YOp{jnTx2*!G??7 zq(B+PnZvwIWqzg#EJy7~cc3!62J`NpCT~qIqyHffcDuW7Uu`U=!gx`@A3vedzx{S_$0YP{y+3+(+Q zz(tn?S}?o4xTy;GKQpymxRl}BrH227;TNa2YsWD>$Al+AlY1>15#kft%UjW2B-#_a z?`F3zR(qAr{2oK%r1s5q5Z>41M^-x39xGouM*s3z899@%fRP8o#>gnT-+%mBGjM-A z-4;|aK@Zxyjc76K_d1(ii@x!sV{TGA{tE(G!h1jI5?;sC#o!1kQ4cZLeDA~W-%I-b z1qSYj^lJW5s0;4UUO?9o&(3gy`260y=bHCh%sZVV#{X#Ev(5W<@?7XQ6YfnW#l`w* z#av)w=9p)Vd46G@@0sVr=DET=-!{*C@$}nX$}Qvl-X{#@3=Nvl-}ioR|NPh^G0m6p z{McNWX5jqTgOM8E<-|(%?|6PJoLO%WDb#oaBu726&W~+CkeuGSZm55LY(IRiy5hDm ziCJmIgc$QEZUdBUfD4pjBdFV*S48ZYTF z4$?e1j`VV1NpoFh*ifC!L~^5s4iLYjkuI&xkrAbbbp#7ey} zIHVB<_DO%bGEfD(!H!U?b*o@9` z$L;TUovj#mTKju@SFO`!%-^@elTnHf%I)IEY9#ecJUxD#i!xY;_dhmu_~lP_?qcsm zI-4Ii>0FEEz&deion96*BunOL3fao(^96TczI9%{cOhTmQ_?wiV-ei;fnOcsi%Kf5 zpDr&?;|o_*KrFzgYw<0Tr=_E}PX~^;00#Z{BaM$q;}%J11u z`N@2!MfO6+EhsPzA4Vd$?F0HVt99pxlx>+ z%#s`tnQPTE!m1a(!eBN}m0Q@xHb>2~>TMq>*N)$`$?%89?AkIB)eE`7Zc)k`@)?!T-odQfu#GFv`BZX2ajuSaU0y0q>v zd(|^WV=|l{cQs1c;;Lt6n)&>={iq48&DSSZI47SU_gFP&XBN%IBXx!I8)YQ?H=G~$ z5E+Uc-^WTJ%_t;wh4VyHND;@w^mxJ{et$MGO#OfF`Ee(RfPdZjaXV3yWBR;79=g;F z3F+gQHWGiJHt0Rr9q(znMx|9 zQN?K1XCG?TJ5xpVdS@B&H|H(2e|}td*6}x<9~T7y=m_icOXU2xe|}1aq&q+Ea9UGB zviA9LeFbqpRRgKasMZO{gJUko;MvyB`EkdfXSwC`CDc!T$MiVZ?B#uviVF>b5q|N}$^>P<{LSxaAt%7NCMQDdYKZ7b2D-IEShH{Tmt1znl$cz61ExL#iV9^(21=@oU^C>F|r~ zN5}DN2J*1+Yf?$a@GA$U{A&D~JR*o+MG5?hQ&n4=ugZvD`G7v|Kf@!{J3FA5mH7?$ z)kBJ(UtA-Fgi%PUclO!=x{!|H*MElpzWDVzTeRPRUsnM%(&N_!67w7I>soL>9e!QJ z@HF@}p5a0Kx~&93z)`;53h^S`|FFFDqNW``bu6Swi}c>(uy_%(+yVBfQ3A1d

GWf4zV_Z2Wqtf5-5v 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

)cmr( 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 +#include +#include +#include +#include +#include + + +int main(int argc, char *argv[]) { + QGuiApplication app(argc, argv); + + QQmlEngine engine; + QQmlContext *objectContext = new QQmlContext(engine.rootContext()); + + QQmlComponent component( + &engine, + QFileInfo::exists("qrc:/qml/Window.qml") ? + "qrc:/qml/Window.qml" : "src/qml/Window.qml" + ); + component.create(objectContext); + + return app.exec(); +} diff --git a/src/matrix_client.py b/src/matrix_client.py deleted file mode 100644 index 022b1a2f..00000000 --- a/src/matrix_client.py +++ /dev/null @@ -1,124 +0,0 @@ -import asyncio -import inspect -import platform -from contextlib import suppress -from typing import Optional - -import nio - -from . import __about__ -from .events import rooms, users - - -class MatrixClient(nio.AsyncClient): - def __init__(self, - user: str, - homeserver: str = "https://matrix.org", - device_id: Optional[str] = None) -> None: - - # TODO: ensure homeserver starts with a scheme:// - self.sync_task: Optional[asyncio.Task] = None - super().__init__(homeserver=homeserver, user=user, device_id=device_id) - - self.connect_callbacks() - - - def __repr__(self) -> str: - return "%s(user_id=%r, homeserver=%r, device_id=%r)" % ( - type(self).__name__, self.user_id, self.homeserver, self.device_id - ) - - - def connect_callbacks(self) -> None: - for name in dir(nio.responses): - if name.startswith("_"): - continue - - obj = getattr(nio.responses, name) - if inspect.isclass(obj) and issubclass(obj, nio.Response): - with suppress(AttributeError): - self.add_response_callback(getattr(self, f"on{name}"), obj) - - - async def start_syncing(self) -> None: - self.sync_task = asyncio.ensure_future( # type: ignore - self.sync_forever(timeout=10_000) - ) - - - @property - def default_device_name(self) -> str: - os_ = f" on {platform.system()}".rstrip() - os_ = f"{os_} {platform.release()}".rstrip() if os_ != " on" else "" - return f"{__about__.__pretty_name__}{os_}" - - - async def login(self, password: str) -> None: - response = await super().login(password, self.default_device_name) - - if isinstance(response, nio.LoginError): - print(response) - else: - await self.start_syncing() - - - async def resume(self, user_id: str, token: str, device_id: str) -> None: - self.receive_response(nio.LoginResponse(user_id, device_id, token)) - await self.start_syncing() - - - async def logout(self) -> None: - if self.sync_task: - self.sync_task.cancel() - with suppress(asyncio.CancelledError): - await self.sync_task - - await self.close() - - - async def request_user_update_event(self, user_id: str) -> None: - response = await self.get_profile(user_id) - - users.UserUpdated( - user_id = user_id, - display_name = response.displayname, - avatar_url = response.avatar_url, - status_message = None, # TODO - ) - - - # Callbacks for nio responses - - async def onSyncResponse(self, response: nio.SyncResponse) -> None: - for room_id in response.rooms.invite: - room: nio.rooms.MatrixRoom = self.invited_rooms[room_id] - - rooms.RoomUpdated( - user_id = self.user_id, - category = "Invites", - room_id = room_id, - display_name = room.display_name, - avatar_url = room.gen_avatar_url, - topic = room.topic, - inviter = room.inviter, - ) - - for room_id in response.rooms.join: - room = self.rooms[room_id] - - rooms.RoomUpdated( - user_id = self.user_id, - category = "Rooms", - room_id = room_id, - display_name = room.display_name, - avatar_url = room.gen_avatar_url, - topic = room.topic, - ) - - for room_id in response.rooms.left: - rooms.RoomUpdated( - user_id = self.user_id, - category = "Left", - room_id = room_id, - # left_event TODO - ) diff --git a/src/__about__.py b/src/python/__about__.py similarity index 100% rename from src/__about__.py rename to src/python/__about__.py diff --git a/src/__init__.py b/src/python/__init__.py similarity index 100% rename from src/__init__.py rename to src/python/__init__.py diff --git a/src/app.py b/src/python/app.py similarity index 75% rename from src/app.py rename to src/python/app.py index 2fed9cf3..6a34bbcd 100644 --- a/src/app.py +++ b/src/python/app.py @@ -1,4 +1,5 @@ import asyncio +import signal from concurrent.futures import Future from pathlib import Path from threading import Thread @@ -15,31 +16,16 @@ class App: def __init__(self) -> None: self.appdirs = AppDirs(appname=__about__.__pkg_name__, roaming=True) - self.backend = None + from .backend import Backend + self.backend = Backend(app=self) self.loop = asyncio.get_event_loop() self.loop_thread = Thread(target=self._loop_starter) self.loop_thread.start() - def start(self, cli_flags: Sequence[str] = ()) -> bool: - debug = False - - if "-d" in cli_flags or "--debug" in cli_flags: - self.run_in_loop(self._exit_on_app_file_change()) - debug = True - - from .backend import Backend - self.backend = Backend(app=self) # type: ignore - - return debug - - - async def _exit_on_app_file_change(self) -> None: - from watchgod import awatch - - async for _ in awatch(Path(__file__).resolve().parent): - ExitRequested(231) + def is_debug_on(self, cli_flags: Sequence[str] = ()) -> bool: + return "-d" in cli_flags or "--debug" in cli_flags def _loop_starter(self) -> None: @@ -74,7 +60,7 @@ class App: name: str, args: Optional[List[str]] = None, kwargs: Optional[Dict[str, Any]] = None) -> str: - client = self.backend.clients[account_id] # type: ignore + client = self.backend.clients[account_id] return self._call_coro( getattr(client, name)(*args or [], **kwargs or {}) ) @@ -85,14 +71,19 @@ class App: ad = additional_data rl = self.run_in_loop ba = self.backend - cl = self.backend.clients # type: ignore + cl = self.backend.clients tcl = lambda user: cl[f"@test_{user}:matrix.org"] import json jd = lambda obj: print(json.dumps(obj, indent=4, ensure_ascii=False)) - import pdb - pdb.set_trace() + print("\n=> Run `socat readline tcp:127.0.0.1:4444` in a terminal " + "to connect to pdb.") + import remote_pdb + remote_pdb.RemotePdb("127.0.0.1", 4444).set_trace() +# Make CTRL-C work again +signal.signal(signal.SIGINT, signal.SIG_DFL) + APP = App() diff --git a/src/backend.py b/src/python/backend.py similarity index 90% rename from src/backend.py rename to src/python/backend.py index ca2c75b6..f9fe3c4e 100644 --- a/src/backend.py +++ b/src/python/backend.py @@ -1,7 +1,7 @@ import asyncio import json from pathlib import Path -from typing import Any, Dict, Optional, Tuple +from typing import Dict, Optional, Tuple from atomicfile import AtomicFile @@ -29,13 +29,14 @@ class Backend: user: str, password: str, device_id: Optional[str] = None, - homeserver: str = "https://matrix.org") -> None: + homeserver: str = "https://matrix.org") -> str: client = MatrixClient( user=user, homeserver=homeserver, device_id=device_id ) await client.login(password) self.clients[client.user_id] = client users.AccountUpdated(client.user_id) + return client.user_id async def resume_client(self, @@ -98,13 +99,15 @@ class Backend: )) - async def save_account(self, client: MatrixClient) -> None: + async def save_account(self, user_id: str) -> None: + client = self.clients[user_id] + await self._write_config({ **self.saved_accounts, - client.userId: { - "hostname": client.nio.host, - "token": client.nio.access_token, - "device_id": client.nio.device_id, + client.user_id: { + "homeserver": client.homeserver, + "token": client.access_token, + "device_id": client.device_id, } }) @@ -119,7 +122,7 @@ class Backend: async def _write_config(self, accounts: SavedAccounts) -> None: js = json.dumps(accounts, indent=4, ensure_ascii=False, sort_keys=True) - with CONFIG_LOCK: + async with CONFIG_LOCK: self.saved_accounts_path.parent.mkdir(parents=True, exist_ok=True) with AtomicFile(self.saved_accounts_path, "w") as new: diff --git a/src/events/__init__.py b/src/python/events/__init__.py similarity index 100% rename from src/events/__init__.py rename to src/python/events/__init__.py diff --git a/src/events/app.py b/src/python/events/app.py similarity index 100% rename from src/events/app.py rename to src/python/events/app.py diff --git a/src/events/event.py b/src/python/events/event.py similarity index 100% rename from src/events/event.py rename to src/python/events/event.py diff --git a/src/events/rooms.py b/src/python/events/rooms.py similarity index 100% rename from src/events/rooms.py rename to src/python/events/rooms.py diff --git a/src/python/events/rooms_timeline.py b/src/python/events/rooms_timeline.py new file mode 100644 index 00000000..6679b647 --- /dev/null +++ b/src/python/events/rooms_timeline.py @@ -0,0 +1,32 @@ +from datetime import datetime +from enum import auto + +from dataclasses import dataclass, field + +from .event import AutoStrEnum, Event + + +class EventType(AutoStrEnum): + text = auto() + html = auto() + file = auto() + image = auto() + audio = auto() + video = auto() + location = auto() + notice = auto() + + +@dataclass +class TimelineEvent(Event): + type: EventType = field() + room_id: str = field() + event_id: str = field() + sender_id: str = field() + date: datetime = field() + is_local_echo: bool = field() + + +@dataclass +class HtmlMessageReceived(TimelineEvent): + content: str = field() diff --git a/src/events/users.py b/src/python/events/users.py similarity index 100% rename from src/events/users.py rename to src/python/events/users.py diff --git a/src/python/html_filter.py b/src/python/html_filter.py new file mode 100644 index 00000000..13c59f22 --- /dev/null +++ b/src/python/html_filter.py @@ -0,0 +1,153 @@ +# Copyright 2019 miruka +# This file is part of harmonyqml, licensed under GPLv3. + +import re + +import mistune +from lxml.html import HtmlElement, etree # nosec + +import html_sanitizer.sanitizer as sanitizer + + +class HtmlFilter: + link_regexes = [re.compile(r, re.IGNORECASE) for r in [ + (r"(?P.+://(?P[a-z0-9._-]+)(?:/[/\-_.,a-z0-9%&?;=~]*)?" + r"(?:\([/\-_.,a-z0-9%&?;=~]*\))?)"), + r"mailto:(?P[a-z0-9._-]+@(?P[a-z0-9_.-]+[a-z]))", + r"tel:(?P[0-9+-]+)(?P)", + r"(?Pmagnet:\?xt=urn:[a-z0-9]+:.+)(?P)", + ]] + + + def __init__(self) -> None: + self._sanitizer = sanitizer.Sanitizer(self.sanitizer_settings) + + # The whitespace remover doesn't take

 into account
+        sanitizer.normalize_overall_whitespace         = lambda html: html
+        sanitizer.normalize_whitespace_in_text_or_tail = lambda el: el
+
+        # hard_wrap: convert all \n to 
without required two spaces + self._markdown_to_html = mistune.Markdown(hard_wrap=True) + + + def from_markdown(self, text: str) -> str: + return self.filter(self._markdown_to_html(text)) + + + def filter(self, html: str) -> str: + html = self._sanitizer.sanitize(html) + tree = etree.fromstring(html, parser=etree.HTMLParser()) + + if tree is None: + return "" + + for el in tree.iter("img"): + el = self._wrap_img_in_a(el) + + for el in tree.iter("a"): + el = self._append_img_to_a(el) + + result = b"".join((etree.tostring(el, encoding="utf-8") + for el in tree[0].iterchildren())) + + return str(result, "utf-8") + + + @property + def sanitizer_settings(self) -> dict: + # https://matrix.org/docs/spec/client_server/latest.html#m-room-message-msgtypes + return { + "tags": { + # TODO: mx-reply, audio, video + "font", "h1", "h2", "h3", "h4", "h5", "h6", + "blockquote", "p", "a", "ul", "ol", "sup", "sub", "li", + "b", "i", "s", "u", "code", "hr", "br", + "table", "thead", "tbody", "tr", "th", "td", + "pre", "img", + }, + "attributes": { + # TODO: translate font attrs to qt html subset + "font": {"data-mx-bg-color", "data-mx-color"}, + "a": {"href"}, + "img": {"width", "height", "alt", "title", "src"}, + "ol": {"start"}, + "code": {"class"}, + }, + "empty": {"hr", "br", "img"}, + "separate": { + "a", "p", "li", "table", "tr", "th", "td", "br", "hr" + }, + "whitespace": {}, + "add_nofollow": False, + "autolink": { # FIXME: arg dict not working + "link_regexes": self.link_regexes, + "avoid_hosts": [], + }, + "sanitize_href": lambda href: href, + "element_preprocessors": [ + sanitizer.bold_span_to_strong, + sanitizer.italic_span_to_em, + sanitizer.tag_replacer("strong", "b"), + sanitizer.tag_replacer("em", "i"), + sanitizer.tag_replacer("strike", "s"), + sanitizer.tag_replacer("del", "s"), + sanitizer.tag_replacer("span", "font"), + self._remove_empty_font, + sanitizer.tag_replacer("form", "p"), + sanitizer.tag_replacer("div", "p"), + sanitizer.tag_replacer("caption", "p"), + sanitizer.target_blank_noopener, + ], + "element_postprocessors": [], + "is_mergeable": lambda e1, e2: e1.attrib == e2.attrib, + } + + + def _remove_empty_font(self, el: HtmlElement) -> HtmlElement: + if el.tag != "font": + return el + + if not self.sanitizer_settings["attributes"]["font"] & set(el.keys()): + el.clear() + + return el + + + def _wrap_img_in_a(self, el: HtmlElement) -> HtmlElement: + link = el.attrib.get("src", "") + width = el.attrib.get("width", "256") + height = el.attrib.get("height", "256") + + if el.getparent().tag == "a" or el.tag != "img" or \ + not self._is_image_path(link): + return el + + el.tag = "a" + el.attrib.clear() + el.attrib["href"] = link + el.append(etree.Element("img", src=link, width=width, height=height)) + return el + + + def _append_img_to_a(self, el: HtmlElement) -> HtmlElement: + link = el.attrib.get("href", "") + + if not (el.tag == "a" and self._is_image_path(link)): + return el + + for _ in el.iter("img"): # if the
already has an child + return el + + el.append(etree.Element("br")) + el.append(etree.Element("img", src=link, width="256", height="256")) + return el + + + @staticmethod + def _is_image_path(link: str) -> bool: + return bool(re.match( + r".+\.(jpg|jpeg|png|gif|bmp|webp|tiff|svg)$", link, re.IGNORECASE + )) + + +HTML_FILTER = HtmlFilter() diff --git a/src/python/matrix_client.py b/src/python/matrix_client.py new file mode 100644 index 00000000..63127afd --- /dev/null +++ b/src/python/matrix_client.py @@ -0,0 +1,182 @@ +import asyncio +import inspect +import logging as log +import platform +from contextlib import suppress +from datetime import datetime +from types import ModuleType +from typing import Dict, Optional, Type + +import nio + +from . import __about__ +from .events import rooms, users +from .events.rooms_timeline import EventType, HtmlMessageReceived +from .html_filter import HTML_FILTER + + +class MatrixClient(nio.AsyncClient): + def __init__(self, + user: str, + homeserver: str = "https://matrix.org", + device_id: Optional[str] = None) -> None: + + # TODO: ensure homeserver starts with a scheme:// + self.sync_task: Optional[asyncio.Future] = None + super().__init__(homeserver=homeserver, user=user, device_id=device_id) + + self.connect_callbacks() + + + def __repr__(self) -> str: + return "%s(user_id=%r, homeserver=%r, device_id=%r)" % ( + type(self).__name__, self.user_id, self.homeserver, self.device_id + ) + + + @staticmethod + def _classes_defined_in(module: ModuleType) -> Dict[str, Type]: + return { + m[0]: m[1] for m in inspect.getmembers(module, inspect.isclass) + if not m[0].startswith("_") and + m[1].__module__.startswith(module.__name__) + } + + + def connect_callbacks(self) -> None: + for name, class_ in self._classes_defined_in(nio.responses).items(): + with suppress(AttributeError): + self.add_response_callback(getattr(self, f"on{name}"), class_) + + # TODO: get this implemented in AsyncClient + # for name, class_ in self._classes_defined_in(nio.events).items(): + # with suppress(AttributeError): + # self.add_event_callback(getattr(self, f"on{name}"), class_) + + + async def start_syncing(self) -> None: + self.sync_task = asyncio.ensure_future( + self.sync_forever(timeout=10_000) + ) + + def callback(task): + raise task.exception() + + self.sync_task.add_done_callback(callback) + + + @property + def default_device_name(self) -> str: + os_ = f" on {platform.system()}".rstrip() + os_ = f"{os_} {platform.release()}".rstrip() if os_ != " on" else "" + return f"{__about__.__pretty_name__}{os_}" + + + async def login(self, password: str) -> None: + response = await super().login(password, self.default_device_name) + + if isinstance(response, nio.LoginError): + print(response) + else: + await self.start_syncing() + + + async def resume(self, user_id: str, token: str, device_id: str) -> None: + response = nio.LoginResponse(user_id, device_id, token) + await self.receive_response(response) + await self.start_syncing() + + + async def logout(self) -> None: + if self.sync_task: + self.sync_task.cancel() + with suppress(asyncio.CancelledError): + await self.sync_task + + await self.close() + + + async def request_user_update_event(self, user_id: str) -> None: + response = await self.get_profile(user_id) + + if isinstance(response, nio.ProfileGetError): + log.warning("Error getting profile for %r: %s", user_id, response) + + users.UserUpdated( + user_id = user_id, + display_name = getattr(response, "displayname", None), + avatar_url = getattr(response, "avatar_url", None), + status_message = None, # TODO + ) + + + # Callbacks for nio responses + + @staticmethod + def _get_room_name(room: nio.rooms.MatrixRoom) -> Optional[str]: + # FIXME: reimplanted because of nio's non-standard room.display_name + name = room.name or room.canonical_alias + if name: + return name + + name = room.group_name() + return None if name == "Empty room?" else name + + + async def onSyncResponse(self, resp: nio.SyncResponse) -> None: + for room_id, info in resp.rooms.invite.items(): + room: nio.rooms.MatrixRoom = self.invited_rooms[room_id] + + rooms.RoomUpdated( + user_id = self.user_id, + category = "Invites", + room_id = room_id, + display_name = self._get_room_name(room), + avatar_url = room.gen_avatar_url, + topic = room.topic, + inviter = room.inviter, + ) + + for room_id, info in resp.rooms.join.items(): + room = self.rooms[room_id] + + rooms.RoomUpdated( + user_id = self.user_id, + category = "Rooms", + room_id = room_id, + display_name = self._get_room_name(room), + avatar_url = room.gen_avatar_url, + topic = room.topic, + ) + + asyncio.gather(*( + getattr(self, f"on{type(ev).__name__}")(room_id, ev) + for ev in info.timeline.events + if hasattr(self, f"on{type(ev).__name__}") + )) + + for room_id, info in resp.rooms.leave.items(): + rooms.RoomUpdated( + user_id = self.user_id, + category = "Left", + room_id = room_id, + # left_event TODO + ) + + + # Callbacks for nio events + + async def onRoomMessageText(self, room_id: str, ev: nio.RoomMessageText + ) -> None: + is_html = ev.format == "org.matrix.custom.html" + filter_ = HTML_FILTER.filter + + HtmlMessageReceived( + type = EventType.html if is_html else EventType.text, + room_id = room_id, + event_id = ev.event_id, + sender_id = ev.sender, + date = datetime.fromtimestamp(ev.server_timestamp / 1000), + is_local_echo = False, + content = filter_(ev.formatted_body) if is_html else ev.body, + ) diff --git a/src/qml/Base/HAvatar.qml b/src/qml/Base/HAvatar.qml index be97d8cd..7c3205fc 100644 --- a/src/qml/Base/HAvatar.qml +++ b/src/qml/Base/HAvatar.qml @@ -7,7 +7,14 @@ Rectangle { property int dimension: HStyle.avatar.size property bool hidden: false - function hue_from_name(name) { + function stripUserId(user_id) { + return user_id.substring(1) // Remove leading @ + } + function stripRoomName(name) { + return name[0] == "#" ? name.substring(1) : name + } + + function hueFromName(name) { var hue = 0 for (var i = 0; i < name.length; i++) { hue += name.charCodeAt(i) * 99 @@ -24,7 +31,7 @@ Rectangle { color: name ? Qt.hsla( - hue_from_name(name), + hueFromName(name), HStyle.avatar.background.saturation, HStyle.avatar.background.lightness, HStyle.avatar.background.alpha diff --git a/src/qml/Base/HButton.qml b/src/qml/Base/HButton.qml index 755b7214..cbb00ad2 100644 --- a/src/qml/Base/HButton.qml +++ b/src/qml/Base/HButton.qml @@ -32,11 +32,6 @@ Button { signal pressed signal released - function loadingUntilFutureDone(future) { - loading = true - future.onGotResult.connect(function() { loading = false }) - } - id: button background: Rectangle { diff --git a/src/qml/Base/HListModel.qml b/src/qml/Base/HListModel.qml index 44536ea9..18384ece 100644 --- a/src/qml/Base/HListModel.qml +++ b/src/qml/Base/HListModel.qml @@ -1,85 +1,112 @@ import QtQuick 2.7 +import SortFilterProxyModel 0.2 -ListModel { +SortFilterProxyModel { // To initialize a HListModel with items, // use `Component.onCompleted: extend([{"foo": 1, "bar": 2}, ...])` - id: listModel + id: sortFilteredModel + + property var model: ListModel {} + sourceModel: model // Can't assign a "ListModel {}" directly here + + function append(dict) { return model.append(dict) } + function clear() { return model.clear() } + function insert(index, dict) { return model.inset(index, dict) } + function move(from, to, n) { return model.move(from, to, n) } + function remove(index, count) { return model.remove(index, count) } + function set(index, dict) { return model.set(index, dict) } + function sync() { return model.sync() } + function setProperty(index, prop, value) { + return model.setProperty(index, prop, value) + } function extend(new_items) { for (var i = 0; i < new_items.length; i++) { - listModel.append(new_items[i]) + model.append(new_items[i]) } } - function getIndices(where_role, is, max) { // max: undefined or int + function getIndices(where_roles_are, max_results, max_tries) { + // max arguments: unefined or int var results = [] - for (var i = 0; i < listModel.count; i++) { - if (listModel.get(i)[where_role] == is) { - results.push(i) + for (var i = 0; i < model.count; i++) { + var item = model.get(i) + var include = true - if (max && results.length >= max) { + for (var role in where_roles_are) { + if (item[role] != where_roles_are[role]) { + include = false break } } + + if (include) { + results.push(i) + if (max_results && results.length >= max_results) { + break + } + } + + if (max_tries && i >= max_tries) { + break + } } return results } - function getWhere(where_role, is, max) { - var indices = getIndices(where_role, is, max) - var results = [] + function getWhere(roles_are, max_results, max_tries) { + var indices = getIndices(roles_are, max_results, max_tries) + var items = [] for (var i = 0; i < indices.length; i++) { - results.push(listModel.get(indices[i])) + items.push(model.get(indices[i])) } - return results + return items } - function forEachWhere(where_role, is, max, func) { - var items = getWhere(where_role, is, max) + function forEachWhere(roles_are, func, max_results, max_tries) { + var items = getWhere(roles_are, max_results, max_tries) for (var i = 0; i < items.length; i++) { - func(item) + func(items[i]) } } - function upsert(where_role, is, new_item, update_if_exist) { - // new_item can contain only the keys we're interested in updating - - var indices = getIndices(where_role, is, 1) + function upsert(where_roles_are, new_item, update_if_exist, max_tries) { + var indices = getIndices(where_roles_are, 1, max_tries) if (indices.length == 0) { - listModel.append(new_item) - return listModel.get(listModel.count) + model.append(new_item) + return model.get(model.count) } if (update_if_exist != false) { - listModel.set(indices[0], new_item) + model.set(indices[0], new_item) } - return listModel.get(indices[0]) + return model.get(indices[0]) } function pop(index) { - var item = listModel.get(index) - listModel.remove(index) + var item = model.get(index) + model.remove(index) return item } - function popWhere(where_role, is, max) { - var indices = getIndices(where_role, is, max) - var results = [] + function popWhere(roles_are, max_results, max_tries) { + var indices = getIndices(roles_are, max_results, max_tries) + var items = [] for (var i = 0; i < indices.length; i++) { - results.push(listModel.get(indices[i])) - listModel.remove(indices[i]) + items.push(model.get(indices[i])) + model.remove(indices[i]) } - return results + return items } function toObject(item_list) { - item_list = item_list || listModel + item_list = item_list || sortFilteredModel var obj_list = [] for (var i = 0; i < item_list.count; i++) { diff --git a/src/qml/Chat/Banners/InviteBanner.qml b/src/qml/Chat/Banners/InviteBanner.qml index ba522031..37811ae4 100644 --- a/src/qml/Chat/Banners/InviteBanner.qml +++ b/src/qml/Chat/Banners/InviteBanner.qml @@ -6,6 +6,7 @@ Banner { color: HStyle.chat.inviteBanner.background + // TODO: get disp name from models.users, inviter = userid now avatar.name: inviter ? inviter.displayname : "" //avatar.imageUrl: inviter ? inviter.avatar_url : "" diff --git a/src/qml/Chat/Chat.qml b/src/qml/Chat/Chat.qml index 6bc5cdb0..ccaec67d 100644 --- a/src/qml/Chat/Chat.qml +++ b/src/qml/Chat/Chat.qml @@ -10,27 +10,27 @@ HColumnLayout { property string category: "" property string roomId: "" - readonly property var roomInfo: - Backend.accounts.get(userId) - .roomCategories.get(category) - .rooms.get(roomId) + readonly property var roomInfo: models.rooms.getWhere( + {"userId": userId, "roomId": roomId, "category": category}, 1 + )[0] - readonly property var sender: Backend.users.get(userId) + readonly property var sender: + models.users.getWhere({"userId": userId}, 1)[0] - readonly property bool hasUnknownDevices: - category == "Rooms" ? - Backend.clients.get(userId).roomHasUnknownDevices(roomId) : false + readonly property bool hasUnknownDevices: false + //category == "Rooms" ? + //Backend.clients.get(userId).roomHasUnknownDevices(roomId) : false id: chatPage onFocusChanged: sendBox.setFocus() - Component.onCompleted: Backend.signals.roomCategoryChanged.connect( - function(forUserId, forRoomId, previous, now) { - if (chatPage && forUserId == userId && forRoomId == roomId) { - chatPage.category = now - } - } - ) + //Component.onCompleted: Backend.signals.roomCategoryChanged.connect( + //function(forUserId, forRoomId, previous, now) { + //if (chatPage && forUserId == userId && forRoomId == roomId) { + //chatPage.category = now + //} + //} + //) RoomHeader { id: roomHeader @@ -77,72 +77,72 @@ HColumnLayout { } } - RoomSidePane { - id: roomSidePane +// RoomSidePane { + //id: roomSidePane - activeView: roomHeader.activeButton - property int oldWidth: width - onActiveViewChanged: - activeView ? restoreAnimation.start() : hideAnimation.start() + //activeView: roomHeader.activeButton + //property int oldWidth: width + //onActiveViewChanged: + //activeView ? restoreAnimation.start() : hideAnimation.start() - NumberAnimation { - id: hideAnimation - target: roomSidePane - properties: "width" - duration: HStyle.animationDuration - from: target.width - to: 0 + //NumberAnimation { + //id: hideAnimation + //target: roomSidePane + //properties: "width" + //duration: HStyle.animationDuration + //from: target.width + //to: 0 - onStarted: { - target.oldWidth = target.width - target.Layout.minimumWidth = 0 - } - } + //onStarted: { + //target.oldWidth = target.width + //target.Layout.minimumWidth = 0 + //} + //} - NumberAnimation { - id: restoreAnimation - target: roomSidePane - properties: "width" - duration: HStyle.animationDuration - from: 0 - to: target.oldWidth + //NumberAnimation { + //id: restoreAnimation + //target: roomSidePane + //properties: "width" + //duration: HStyle.animationDuration + //from: 0 + //to: target.oldWidth - onStopped: target.Layout.minimumWidth = Qt.binding( - function() { return HStyle.avatar.size } - ) - } + //onStopped: target.Layout.minimumWidth = Qt.binding( + //function() { return HStyle.avatar.size } + //) + //} - collapsed: width < HStyle.avatar.size + 8 + //collapsed: width < HStyle.avatar.size + 8 - property bool wasSnapped: false - property int referenceWidth: roomHeader.buttonsWidth - onReferenceWidthChanged: { - if (chatSplitView.canAutoSize || wasSnapped) { - if (wasSnapped) { chatSplitView.canAutoSize = true } - width = referenceWidth - } - } + //property bool wasSnapped: false + //property int referenceWidth: roomHeader.buttonsWidth + //onReferenceWidthChanged: { + //if (chatSplitView.canAutoSize || wasSnapped) { + //if (wasSnapped) { chatSplitView.canAutoSize = true } + //width = referenceWidth + //} + //} - property int currentWidth: width - onCurrentWidthChanged: { - if (referenceWidth != width && - referenceWidth - 15 < width && - width < referenceWidth + 15) - { - currentWidth = referenceWidth - width = referenceWidth - wasSnapped = true - currentWidth = Qt.binding( - function() { return roomSidePane.width } - ) - } else { - wasSnapped = false - } - } + //property int currentWidth: width + //onCurrentWidthChanged: { + //if (referenceWidth != width && + //referenceWidth - 15 < width && + //width < referenceWidth + 15) + //{ + //currentWidth = referenceWidth + //width = referenceWidth + //wasSnapped = true + //currentWidth = Qt.binding( + //function() { return roomSidePane.width } + //) + //} else { + //wasSnapped = false + //} + //} - width: referenceWidth // Initial width - Layout.minimumWidth: HStyle.avatar.size - Layout.maximumWidth: parent.width - } + //width: referenceWidth // Initial width + //Layout.minimumWidth: HStyle.avatar.size + //Layout.maximumWidth: parent.width + //} } } diff --git a/src/qml/Chat/RoomEventList/Daybreak.qml b/src/qml/Chat/RoomEventList/Daybreak.qml index fd1da83a..71319dbd 100644 --- a/src/qml/Chat/RoomEventList/Daybreak.qml +++ b/src/qml/Chat/RoomEventList/Daybreak.qml @@ -2,7 +2,7 @@ import QtQuick 2.7 import "../../Base" HNoticePage { - text: dateTime.toLocaleDateString() + text: model.date.toLocaleDateString() color: HStyle.chat.daybreak.foreground backgroundColor: HStyle.chat.daybreak.background radius: HStyle.chat.daybreak.radius diff --git a/src/qml/Chat/RoomEventList/EventContent.qml b/src/qml/Chat/RoomEventList/EventContent.qml index 5b3fdd6e..3ecb92a5 100644 --- a/src/qml/Chat/RoomEventList/EventContent.qml +++ b/src/qml/Chat/RoomEventList/EventContent.qml @@ -16,7 +16,7 @@ Row { HAvatar { id: avatar - name: sender.displayName.value + name: sender.displayName || stripUserId(sender.userId) hidden: combine dimension: 28 } diff --git a/src/qml/Chat/RoomEventList/MessageContent.qml b/src/qml/Chat/RoomEventList/MessageContent.qml index 41f3bd17..c03f3579 100644 --- a/src/qml/Chat/RoomEventList/MessageContent.qml +++ b/src/qml/Chat/RoomEventList/MessageContent.qml @@ -10,7 +10,7 @@ Row { HAvatar { id: avatar hidden: combine - name: sender.displayName.value + name: senderInfo.displayName || stripUserId(model.senderId) dimension: 48 } @@ -38,8 +38,8 @@ Row { visible: height > 0 id: nameLabel - text: sender.displayName.value - color: Qt.hsla(Backend.hueFromString(text), + text: senderInfo.displayName || model.senderId + color: Qt.hsla(avatar.hueFromName(avatar.name), HStyle.displayName.saturation, HStyle.displayName.lightness, 1) @@ -56,17 +56,16 @@ Row { width: parent.width id: contentLabel - text: (dict.formatted_body ? - Backend.htmlFilter.filter(dict.formatted_body) : - dict.body) + + text: model.content + "  " + - Qt.formatDateTime(dateTime, "hh:mm:ss") + + Qt.formatDateTime(model.date, "hh:mm:ss") + "" + - (isLocalEcho ? + (model.isLocalEcho ? " " : "") - textFormat: Text.RichText + textFormat: model.type == "text" ? + Text.PlainText : Text.RichText color: HStyle.chat.message.body wrapMode: Text.Wrap diff --git a/src/qml/Chat/RoomEventList/RoomEventDelegate.qml b/src/qml/Chat/RoomEventList/RoomEventDelegate.qml index 3fb19ade..b81d4556 100644 --- a/src/qml/Chat/RoomEventList/RoomEventDelegate.qml +++ b/src/qml/Chat/RoomEventList/RoomEventDelegate.qml @@ -1,7 +1,6 @@ import QtQuick 2.7 import QtQuick.Layouts 1.3 import "../../Base" -import "../utils.js" as ChatJS Column { id: roomEventDelegate @@ -10,46 +9,47 @@ Column { return Math.round((((date2 - date1) % 86400000) % 3600000) / 60000) } - function getIsMessage(type_) { return type_.startsWith("RoomMessage") } - function getPreviousItem() { return index < roomEventListView.model.count - 1 ? roomEventListView.model.get(index + 1) : null } + function getIsMessage(type) { + return true + } + property var previousItem: getPreviousItem() signal reloadPreviousItem() onReloadPreviousItem: previousItem = getPreviousItem() - readonly property bool isMessage: getIsMessage(type) + property var senderInfo: null + Component.onCompleted: + senderInfo = models.users.getUser(chatPage.userId, senderId) - readonly property bool isUndecryptableEvent: - type === "OlmEvent" || type === "MegolmEvent" + //readonly property bool isMessage: ! model.type.match(/^event.*/) + readonly property bool isMessage: getIsMessage(model.type) - readonly property var sender: Backend.users.get(dict.sender) + readonly property bool isOwn: chatPage.userId === senderId - readonly property bool isOwn: - chatPage.userId === dict.sender - - readonly property bool isFirstEvent: type == "RoomCreateEvent" + readonly property bool isFirstEvent: model.type == "eventCreate" readonly property bool combine: previousItem && ! talkBreak && ! dayBreak && getIsMessage(previousItem.type) === isMessage && - previousItem.dict.sender === dict.sender && - minsBetween(previousItem.dateTime, dateTime) <= 5 + previousItem.senderId === senderId && + minsBetween(previousItem.date, model.date) <= 5 readonly property bool dayBreak: isFirstEvent || previousItem && - dateTime.getDate() != previousItem.dateTime.getDate() + model.date.getDate() != previousItem.date.getDate() readonly property bool talkBreak: previousItem && ! dayBreak && - minsBetween(previousItem.dateTime, dateTime) >= 20 + minsBetween(previousItem.date, model.date) >= 20 property int standardSpacing: 16 diff --git a/src/qml/Chat/RoomEventList/RoomEventList.qml b/src/qml/Chat/RoomEventList/RoomEventList.qml index a467d0e8..a26eaafe 100644 --- a/src/qml/Chat/RoomEventList/RoomEventList.qml +++ b/src/qml/Chat/RoomEventList/RoomEventList.qml @@ -1,4 +1,5 @@ import QtQuick 2.7 +import SortFilterProxyModel 0.2 import "../../Base" HRectangle { @@ -8,10 +9,19 @@ HRectangle { HListView { id: roomEventListView - delegate: RoomEventDelegate {} - model: Backend.roomEvents.get(chatPage.roomId) clip: true + model: HListModel { + sourceModel: models.timelines + + filters: ValueFilter { + roleName: "roomId" + value: chatPage.roomId + } + } + + delegate: RoomEventDelegate {} + anchors.fill: parent anchors.leftMargin: space anchors.rightMargin: space @@ -29,7 +39,7 @@ HRectangle { onYPosChanged: { if (chatPage.category != "Invites" && yPos <= 0.1) { - Backend.loadPastEvents(chatPage.roomId) + //Backend.loadPastEvents(chatPage.roomId) } } } diff --git a/src/qml/Chat/RoomHeader.qml b/src/qml/Chat/RoomHeader.qml index 82265393..720570f7 100644 --- a/src/qml/Chat/RoomHeader.qml +++ b/src/qml/Chat/RoomHeader.qml @@ -3,7 +3,7 @@ import QtQuick.Layouts 1.3 import "../Base" HRectangle { - property string displayName: "" + property var displayName: "" property string topic: "" property alias buttonsImplicitWidth: viewButtons.implicitWidth @@ -22,7 +22,7 @@ HRectangle { HAvatar { id: avatar - name: displayName + name: stripRoomName(displayName) || qsTr("Empty room") dimension: roomHeader.height Layout.alignment: Qt.AlignTop } diff --git a/src/qml/Chat/RoomSidePane/MemberDelegate.qml b/src/qml/Chat/RoomSidePane/MemberDelegate.qml index 3803a525..bab34cb7 100644 --- a/src/qml/Chat/RoomSidePane/MemberDelegate.qml +++ b/src/qml/Chat/RoomSidePane/MemberDelegate.qml @@ -15,7 +15,7 @@ MouseArea { HAvatar { id: memberAvatar - name: member.displayName.value + name: member.displayName || stripUserId(member.userId) } HColumnLayout { diff --git a/src/qml/Chat/SendBox.qml b/src/qml/Chat/SendBox.qml index 0fadaede..3a70b92d 100644 --- a/src/qml/Chat/SendBox.qml +++ b/src/qml/Chat/SendBox.qml @@ -18,7 +18,7 @@ HRectangle { HAvatar { id: avatar - name: chatPage.sender.displayName.value + name: chatPage.sender.displayName || stripUserId(chatPage.userId) dimension: root.Layout.minimumHeight } diff --git a/src/qml/EventHandlers/rooms.js b/src/qml/EventHandlers/rooms.js index 5e137781..1d19410f 100644 --- a/src/qml/EventHandlers/rooms.js +++ b/src/qml/EventHandlers/rooms.js @@ -1,26 +1,28 @@ -function clientId(user_id, category, room_id) { - return user_id + " " + room_id + " " + category -} - - function onRoomUpdated(user_id, category, room_id, display_name, avatar_url, topic, last_event_date, inviter, left_event) { - var client_id = clientId(user_id, category, room_id) - var rooms = models.rooms + models.roomCategories.upsert({"userId": user_id, "name": category}, { + "userId": user_id, + "name": category + }) + + var rooms = models.rooms + + function roles(for_category) { + return {"userId": user_id, "roomId": room_id, "category": for_category} + } if (category == "Invites") { - rooms.popWhere("clientId", clientId(user_id, "Rooms", room_id)) - rooms.popWhere("clientId", clientId(user_id, "Left", room_id)) + rooms.popWhere(roles("Rooms"), 1) + rooms.popWhere(roles("Left"), 1) } else if (category == "Rooms") { - rooms.popWhere("clientId", clientId(user_id, "Invites", room_id)) - rooms.popWhere("clientId", clientId(user_id, "Left", room_id)) + rooms.popWhere(roles("Invites"), 1) + rooms.popWhere(roles("Left"), 1) } else if (category == "Left") { - var old_room = - rooms.popWhere("clientId", clientId(user_id, "Rooms", room_id)) || - rooms.popWhere("clientId", clientId(user_id, "Invites", room_id)) + var old_room = rooms.popWhere(roles("Invites"), 1)[0] || + rooms.popWhere(roles("Rooms"), 1)[0] if (old_room) { display_name = old_room.displayName @@ -30,8 +32,7 @@ function onRoomUpdated(user_id, category, room_id, display_name, avatar_url, } } - rooms.upsert("clientId", client_id , { - "clientId": client_id, + rooms.upsert(roles(category), { "userId": user_id, "category": category, "roomId": room_id, @@ -47,8 +48,8 @@ function onRoomUpdated(user_id, category, room_id, display_name, avatar_url, function onRoomDeleted(user_id, category, room_id) { - var client_id = clientId(user_id, category, room_id) - return models.rooms.popWhere("clientId", client_id, 1) + var roles = {"userId": user_id, "roomId": room_id, "category": category} + models.rooms.popWhere(roles, 1) } diff --git a/src/qml/EventHandlers/rooms_timeline.js b/src/qml/EventHandlers/rooms_timeline.js index e69de29b..f06889c7 100644 --- a/src/qml/EventHandlers/rooms_timeline.js +++ b/src/qml/EventHandlers/rooms_timeline.js @@ -0,0 +1,12 @@ +function onHtmlMessageReceived(type, room_id, event_id, sender_id, date, + is_local_echo, content) { + models.timelines.upsert({"eventId": event_id}, { + "type": type, + "roomId": room_id, + "eventId": event_id, + "senderId": sender_id, + "date": date, + "isLocalEcho": is_local_echo, + "content": content, + }, true, 1000) +} diff --git a/src/qml/EventHandlers/users.js b/src/qml/EventHandlers/users.js index 9322a97d..a0a6d658 100644 --- a/src/qml/EventHandlers/users.js +++ b/src/qml/EventHandlers/users.js @@ -2,18 +2,17 @@ function onAccountUpdated(user_id) { models.accounts.append({"userId": user_id}) } -function AccountDeleted(user_id) { - models.accounts.popWhere("userId", user_id, 1) +function onAccountDeleted(user_id) { + models.accounts.popWhere({"userId": user_id}, 1) } function onUserUpdated(user_id, display_name, avatar_url, status_message) { - models.users.upsert("userId", user_id, { + models.users.upsert({"userId": user_id}, { "userId": user_id, "displayName": display_name, "avatarUrl": avatar_url, "statusMessage": status_message }) - } function onDeviceUpdated(user_id, device_id, ed25519_key, trust, display_name, diff --git a/src/qml/Models.qml b/src/qml/Models.qml index 2aaac983..7fd22e4c 100644 --- a/src/qml/Models.qml +++ b/src/qml/Models.qml @@ -1,4 +1,5 @@ import QtQuick 2.7 +import SortFilterProxyModel 0.2 import "Base" QtObject { @@ -8,7 +9,7 @@ QtObject { function getUser(as_account_id, wanted_user_id) { wanted_user_id = wanted_user_id || as_account_id - var found = users.getWhere("userId", wanted_user_id, 1) + var found = users.getWhere({"userId": wanted_user_id}, 1) if (found.length > 0) { return found[0] } users.append({ @@ -22,13 +23,20 @@ QtObject { as_account_id, "request_user_update_event", [wanted_user_id] ) - return users.getWhere("userId", wanted_user_id, 1)[0] + return users.getWhere({"userId": wanted_user_id}, 1)[0] } } property HListModel devices: HListModel {} + property HListModel roomCategories: HListModel {} + property HListModel rooms: HListModel {} - property HListModel timelines: HListModel {} + property HListModel timelines: HListModel { + sorters: RoleSorter { + roleName: "date" + sortOrder: Qt.DescendingOrder + } + } } diff --git a/src/qml/Pages/RememberAccount.qml b/src/qml/Pages/RememberAccount.qml index a1a5f2ca..7542b0c8 100644 --- a/src/qml/Pages/RememberAccount.qml +++ b/src/qml/Pages/RememberAccount.qml @@ -4,7 +4,7 @@ import "../Base" Item { property string loginWith: "username" - property var client: null + property string userId: "" HInterfaceBox { id: rememberBox @@ -20,10 +20,13 @@ Item { buttonCallbacks: { "yes": function(button) { - Backend.clients.remember(client) + py.callCoro("save_account", [userId]) + pageStack.showPage("Default") + }, + "no": function(button) { + py.callCoro("forget_account", [userId]) pageStack.showPage("Default") }, - "no": function(button) { pageStack.showPage("Default") }, } HLabel { diff --git a/src/qml/Pages/SignIn.qml b/src/qml/Pages/SignIn.qml index f29fbafb..2a9e2347 100644 --- a/src/qml/Pages/SignIn.qml +++ b/src/qml/Pages/SignIn.qml @@ -4,7 +4,7 @@ import "../Base" Item { property string loginWith: "username" - onFocusChanged: identifierField.forceActiveFocus() + onFocusChanged: idField.forceActiveFocus() HInterfaceBox { id: signInBox @@ -23,15 +23,15 @@ Item { "register": function(button) {}, "login": function(button) { - var future = Backend.clients.new( - "matrix.org", identifierField.text, passwordField.text - ) - button.loadingUntilFutureDone(future) - future.onGotResult.connect(function(client) { + button.loading = true + var args = [idField.text, passwordField.text] + + py.callCoro("login_client", args, {}, function(user_id) { pageStack.showPage( "RememberAccount", - {"loginWith": loginWith, "client": client} + {"loginWith": loginWith, "userId": user_id} ) + button.loading = false }) }, @@ -58,7 +58,7 @@ Item { } HTextField { - id: identifierField + id: idField placeholderText: qsTr( loginWith === "email" ? "Email" : loginWith === "phone" ? "Phone" : diff --git a/src/qml/Python.qml b/src/qml/Python.qml index 2273f01e..c6810442 100644 --- a/src/qml/Python.qml +++ b/src/qml/Python.qml @@ -9,6 +9,7 @@ Python { property bool ready: false property var pendingCoroutines: ({}) + signal willLoadAccounts(bool will) property bool loadingAccounts: false function callCoro(name, args, kwargs, callback) { @@ -32,18 +33,20 @@ Python { } } - addImportPath("../..") - importNames("src", ["APP"], function() { - call("APP.start", [Qt.application.arguments], function(debug_on) { - window.debug = debug_on + addImportPath("src") + addImportPath("qrc:/") + importNames("python", ["APP"], function() { + call("APP.is_debug_on", [Qt.application.arguments], function(on) { + window.debug = on callCoro("has_saved_accounts", [], {}, function(has) { - loadingAccounts = has py.ready = true + willLoadAccounts(has) if (has) { + py.loadingAccounts = true py.callCoro("load_saved_accounts", [], {}, function() { - loadingAccounts = false + py.loadingAccounts = false }) } }) diff --git a/src/qml/SidePane/AccountDelegate.qml b/src/qml/SidePane/AccountDelegate.qml index 3a9ef467..8efa6bb2 100644 --- a/src/qml/SidePane/AccountDelegate.qml +++ b/src/qml/SidePane/AccountDelegate.qml @@ -20,7 +20,7 @@ Column { HAvatar { id: avatar - name: user.displayName + name: user.displayName || stripUserId(user.userId) } HColumnLayout { diff --git a/src/qml/SidePane/PaneToolBar.qml b/src/qml/SidePane/PaneToolBar.qml index 4cecb7f5..bdbb4ab2 100644 --- a/src/qml/SidePane/PaneToolBar.qml +++ b/src/qml/SidePane/PaneToolBar.qml @@ -4,6 +4,8 @@ import "../Base" HRowLayout { id: toolBar + property alias roomFilter: filterField.text + Layout.fillWidth: true Layout.preferredHeight: HStyle.bottomElementsHeight @@ -17,8 +19,6 @@ HRowLayout { placeholderText: qsTr("Filter rooms") backgroundColor: HStyle.sidePane.filterRooms.background - onTextChanged: Backend.setRoomFilter(text) - Layout.fillWidth: true Layout.preferredHeight: parent.height } diff --git a/src/qml/SidePane/RoomCategoriesList.qml b/src/qml/SidePane/RoomCategoriesList.qml index 0efd465c..35ad0755 100644 --- a/src/qml/SidePane/RoomCategoriesList.qml +++ b/src/qml/SidePane/RoomCategoriesList.qml @@ -1,11 +1,20 @@ import QtQuick 2.7 import QtQuick.Layouts 1.3 +import SortFilterProxyModel 0.2 import "../Base" HListView { property string userId: "" id: roomCategoriesList - model: Backend.accounts.get(userId).roomCategories + + model: SortFilterProxyModel { + sourceModel: models.roomCategories + filters: ValueFilter { + roleName: "userId" + value: userId + } + } + delegate: RoomCategoryDelegate {} } diff --git a/src/qml/SidePane/RoomDelegate.qml b/src/qml/SidePane/RoomDelegate.qml index 5d6dee7a..3cabce06 100644 --- a/src/qml/SidePane/RoomDelegate.qml +++ b/src/qml/SidePane/RoomDelegate.qml @@ -12,11 +12,11 @@ MouseArea { HRowLayout { width: parent.width - spacing: roomList.spacing + spacing: sidePane.normalSpacing HAvatar { id: roomAvatar - name: displayName + name: stripRoomName(displayName) || qsTr("Empty room") } HColumnLayout { @@ -35,27 +35,27 @@ MouseArea { Layout.maximumWidth: parent.width } - HLabel { - function getText() { - return SidePaneJS.getLastRoomEventText( - roomId, roomList.userId - ) - } + //HLabel { + //function getText() { + //return SidePaneJS.getLastRoomEventText( + //roomId, roomList.userId + //) + //} - property var lastEvTime: lastEventDateTime - onLastEvTimeChanged: subtitleLabel.text = getText() + //property var lastEvTime: lastEventDateTime + //onLastEvTimeChanged: subtitleLabel.text = getText() - id: subtitleLabel - visible: text !== "" - text: getText() - textFormat: Text.StyledText + //id: subtitleLabel + //visible: text !== "" + //text: getText() + //textFormat: Text.StyledText - font.pixelSize: HStyle.fontSize.small - elide: Text.ElideRight - maximumLineCount: 1 + //font.pixelSize: HStyle.fontSize.small + //elide: Text.ElideRight + //maximumLineCount: 1 - Layout.maximumWidth: parent.width - } + //Layout.maximumWidth: parent.width + //} } } } diff --git a/src/qml/SidePane/RoomList.qml b/src/qml/SidePane/RoomList.qml index 2e663933..cdfa6668 100644 --- a/src/qml/SidePane/RoomList.qml +++ b/src/qml/SidePane/RoomList.qml @@ -1,5 +1,6 @@ import QtQuick 2.7 import QtQuick.Layouts 1.3 +import SortFilterProxyModel 0.2 import "../Base" HListView { @@ -7,8 +8,37 @@ HListView { property string category: "" id: roomList - spacing: accountList.spacing - model: - Backend.accounts.get(userId).roomCategories.get(category).sortedRooms + spacing: sidePane.normalSpacing + + model: SortFilterProxyModel { + sourceModel: models.rooms + filters: AllOf { + ValueFilter { + roleName: "category" + value: category + } + + ValueFilter { + roleName: "userId" + value: userId + } + + ExpressionFilter { + expression: { + var filter = paneToolBar.roomFilter.toLowerCase() + var words = filter.split(" ") + var room_name = displayName.toLowerCase() + + for (var i = 0; i < words.length; i++) { + if (words[i] && room_name.indexOf(words[i]) == -1) { + return false + } + } + return true + } + } + } + } + delegate: RoomDelegate {} } diff --git a/src/qml/SidePane/SidePane.qml b/src/qml/SidePane/SidePane.qml index c6f9a20b..7ae95211 100644 --- a/src/qml/SidePane/SidePane.qml +++ b/src/qml/SidePane/SidePane.qml @@ -15,16 +15,18 @@ HRectangle { Layout.fillWidth: true Layout.fillHeight: true - spacing: collapsed ? 0 : normalSpacing - topMargin: spacing - bottomMargin: spacing - Layout.leftMargin: spacing + spacing: collapsed ? 0 : normalSpacing * 3 + topMargin: normalSpacing + bottomMargin: normalSpacing + Layout.leftMargin: normalSpacing Behavior on spacing { NumberAnimation { duration: HStyle.animationDuration } } } - PaneToolBar {} + PaneToolBar { + id: paneToolBar + } } } diff --git a/src/qml/UI.qml b/src/qml/UI.qml index fc07b5f9..f6288ed5 100644 --- a/src/qml/UI.qml +++ b/src/qml/UI.qml @@ -8,10 +8,15 @@ import "SidePane" Item { id: mainUI + Connections { + target: py + onWillLoadAccounts: function(will) { + pageStack.showPage(will ? "Default" : "SignIn") + } + } + property bool accountsPresent: models.accounts.count > 0 || py.loadingAccounts - onAccountsPresentChanged: - pageStack.showPage(accountsPresent ? "Default" : "SignIn") HImage { id: mainUIBackground diff --git a/submodules/SortFilterProxyModel b/submodules/SortFilterProxyModel new file mode 160000 index 00000000..770789ee --- /dev/null +++ b/submodules/SortFilterProxyModel @@ -0,0 +1 @@ +Subproject commit 770789ee484abf69c230cbf1b64f39823e79a181