From 048da06230acc4924cc1887889c9156582f9ed39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F?= <Илья@WIN-RANNDDD> Date: Tue, 24 Dec 2024 18:13:22 +0400 Subject: [PATCH] Client part ready --- HardwareAccountingClient.pro | 52 ++ apiclient.cpp | 109 +++ apiclient.h | 62 ++ main.cpp | 11 + mainwindow.cpp | 640 ++++++++++++++++ mainwindow.h | 97 +++ mainwindow.ui | 1088 ++++++++++++++++++++++++++++ models/baseentity.cpp | 14 + models/baseentity.h | 21 + models/department.cpp | 31 + models/department.h | 24 + models/device.cpp | 190 +++++ models/device.h | 78 ++ models/devicemodel.cpp | 190 +++++ models/devicemodel.h | 75 ++ models/devicestructureelement.cpp | 79 ++ models/devicestructureelement.h | 40 + models/devicetype.cpp | 31 + models/devicetype.h | 24 + models/filterparams.cpp | 54 ++ models/filterparams.h | 32 + models/location.cpp | 31 + models/location.h | 24 + models/manufacturer.cpp | 31 + models/manufacturer.h | 24 + models/types.h | 12 + presenter.cpp | 86 +++ presenter.h | 29 + resources/images/device-type-1.png | Bin 0 -> 13711 bytes resources/images/device-type-2.png | Bin 0 -> 9919 bytes resources/images/device-type-3.png | Bin 0 -> 9641 bytes resources/images/device-type-4.png | Bin 0 -> 4918 bytes resources/images/device-type-5.png | Bin 0 -> 12139 bytes resources/images/device-type-6.png | Bin 0 -> 26079 bytes resources/images/device-type-7.png | Bin 0 -> 18535 bytes resources/images/device-type-8.png | Bin 0 -> 14969 bytes resources/images/down-arrow.png | Bin 0 -> 310 bytes resources/images/mw-icon.png | Bin 0 -> 1258 bytes resources/images/question.png | Bin 0 -> 49992 bytes resources/images/search-hover.png | Bin 0 -> 1305 bytes resources/images/search.png | Bin 0 -> 692 bytes resources/resources.qrc | 45 ++ resources/styles.qss | 47 ++ utils/buttonhoverwatcher.cpp | 24 + utils/buttonhoverwatcher.h | 16 + 45 files changed, 3311 insertions(+) create mode 100644 HardwareAccountingClient.pro create mode 100644 apiclient.cpp create mode 100644 apiclient.h create mode 100644 main.cpp create mode 100644 mainwindow.cpp create mode 100644 mainwindow.h create mode 100644 mainwindow.ui create mode 100644 models/baseentity.cpp create mode 100644 models/baseentity.h create mode 100644 models/department.cpp create mode 100644 models/department.h create mode 100644 models/device.cpp create mode 100644 models/device.h create mode 100644 models/devicemodel.cpp create mode 100644 models/devicemodel.h create mode 100644 models/devicestructureelement.cpp create mode 100644 models/devicestructureelement.h create mode 100644 models/devicetype.cpp create mode 100644 models/devicetype.h create mode 100644 models/filterparams.cpp create mode 100644 models/filterparams.h create mode 100644 models/location.cpp create mode 100644 models/location.h create mode 100644 models/manufacturer.cpp create mode 100644 models/manufacturer.h create mode 100644 models/types.h create mode 100644 presenter.cpp create mode 100644 presenter.h create mode 100644 resources/images/device-type-1.png create mode 100644 resources/images/device-type-2.png create mode 100644 resources/images/device-type-3.png create mode 100644 resources/images/device-type-4.png create mode 100644 resources/images/device-type-5.png create mode 100644 resources/images/device-type-6.png create mode 100644 resources/images/device-type-7.png create mode 100644 resources/images/device-type-8.png create mode 100644 resources/images/down-arrow.png create mode 100644 resources/images/mw-icon.png create mode 100644 resources/images/question.png create mode 100644 resources/images/search-hover.png create mode 100644 resources/images/search.png create mode 100644 resources/resources.qrc create mode 100644 resources/styles.qss create mode 100644 utils/buttonhoverwatcher.cpp create mode 100644 utils/buttonhoverwatcher.h diff --git a/HardwareAccountingClient.pro b/HardwareAccountingClient.pro new file mode 100644 index 0000000..32c3dd8 --- /dev/null +++ b/HardwareAccountingClient.pro @@ -0,0 +1,52 @@ +QT += core gui httpserver + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++17 + +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + apiclient.cpp \ + main.cpp \ + mainwindow.cpp \ + models/baseentity.cpp \ + models/department.cpp \ + models/device.cpp \ + models/devicemodel.cpp \ + models/devicestructureelement.cpp \ + models/devicetype.cpp \ + models/filterparams.cpp \ + models/location.cpp \ + models/manufacturer.cpp \ + presenter.cpp \ + utils/buttonhoverwatcher.cpp + +HEADERS += \ + apiclient.h \ + mainwindow.h \ + models/baseentity.h \ + models/department.h \ + models/device.h \ + models/devicemodel.h \ + models/devicestructureelement.h \ + models/devicetype.h \ + models/filterparams.h \ + models/location.h \ + models/manufacturer.h \ + models/types.h \ + presenter.h \ + utils/buttonhoverwatcher.h + +FORMS += \ + mainwindow.ui + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +RESOURCES += \ + resources/resources.qrc diff --git a/apiclient.cpp b/apiclient.cpp new file mode 100644 index 0000000..11e2582 --- /dev/null +++ b/apiclient.cpp @@ -0,0 +1,109 @@ +#include "apiclient.h" + +ApiClient::ApiClient(QObject *parent) + : QObject{parent}, networkManager(new QNetworkAccessManager(this)) +{} + +void ApiClient::getFilteredDevices(bool isWorking, double priceFrom, double priceTo, bool applyFilters, bool disregardState, int entityId, int currentEntity, + const QString &searchText, const QString &sortOrder) +{ + QString url = QString("/api/devices?isWorking=%1&priceFrom=%2&priceTo=%3&applyFilters=%4&disregardState=%5&entityId=%6¤tEntity=%7&searchText=%8&sortOrder=%9") + .arg(isWorking ? "true" : "false") + .arg(priceFrom) + .arg(priceTo) + .arg(applyFilters ? "true" : "false") + .arg(disregardState ? "true" : "false") + .arg(entityId) + .arg(currentEntity) + .arg(searchText) + .arg(sortOrder); + + QNetworkRequest request(baseUrl + url); + QNetworkReply *reply = networkManager->get(request); + + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + parseData(reply); + }); + connect(reply, &QNetworkReply::errorOccurred, this, &ApiClient::handleError); +} + +void ApiClient::getEntities(const QString &url) +{ + QNetworkRequest request(baseUrl + url); + QNetworkReply *reply = networkManager->get(request); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + parseData(reply); + }); + connect(reply, &QNetworkReply::errorOccurred, this, &ApiClient::handleError); +} + +void ApiClient::updateDevice(int id, const Device &device) +{ + QString url = QString("/api/devices/%1").arg(id); + QNetworkRequest request(baseUrl + url); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + + QJsonDocument doc(device.toJson()); + QByteArray data = doc.toJson(); + + QNetworkReply *reply = networkManager->put(request, data); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + handleDeviceUpdated(reply); + }); + connect(reply, &QNetworkReply::errorOccurred, this, &ApiClient::handleError); +} + +void ApiClient::parseData(QNetworkReply *reply) +{ + if (reply->error() == QNetworkReply::NoError) { + QByteArray data = reply->readAll(); + + QString urlPath = reply->url().path(); + + if (urlPath.contains("/api/devices")) { + QJsonDocument doc = QJsonDocument::fromJson(data); + QJsonArray devicesArray = doc.object().value("devices").toArray(); + QList devices; + for (const QJsonValue &value : devicesArray) { + devices.append(deserializeDevice(value.toObject())); + } + emit devicesReceived(devices); + } + if (urlPath.contains("/api/locations")) { + emit locationsReceived(deserializeEntities(data, "locations")); + } + if (urlPath.contains("/api/departments")) { + emit departmentsReceived(deserializeEntities(data, "departments")); + } + if (urlPath.contains("/api/manufacturers")) { + emit manufacturersReceived(deserializeEntities(data, "manufacturers")); + } + if (urlPath.contains("/api/devicetypes")) { + emit deviceTypesReceived(deserializeEntities(data, "deviceTypes")); + } + if (urlPath.contains("/api/devicemodels")) { + emit deviceModelsReceived(deserializeEntities(data, "deviceModels")); + } + } +} + +void ApiClient::handleDeviceUpdated(QNetworkReply *reply) +{ + if (reply->error() == QNetworkReply::NoError) { + emit deviceUpdated(true); + } else { + emit deviceUpdated(false); + } +} + +void ApiClient::handleError(QNetworkReply::NetworkError error) +{ + qWarning() << "Network error:" << error; +} + +Device ApiClient::deserializeDevice(const QJsonObject &json) +{ + Device device; + device.fromJson(json); + return device; +} diff --git a/apiclient.h b/apiclient.h new file mode 100644 index 0000000..a6b630f --- /dev/null +++ b/apiclient.h @@ -0,0 +1,62 @@ +#ifndef APICLIENT_H +#define APICLIENT_H + +#include +#include +#include + +#include "models/types.h" // IWYU pragma: keep + +class ApiClient : public QObject +{ + Q_OBJECT +public: + explicit ApiClient(QObject *parent = nullptr); + + void getEntities(const QString &url); + void getFilteredDevices(bool isWorking, double priceFrom, double priceTo, bool applyFilters, + bool disregardState, int entityId, int currentEntity, const QString &searchText, + const QString &sortOrder); + void updateDevice(int id, const Device &device); + +signals: + void departmentsReceived(const QMap &departments); + void deviceModelsReceived(const QMap &deviceModels); + void deviceTypesReceived(const QMap &deviceType); + void locationsReceived(const QMap &locations); + void manufacturersReceived(const QMap &manufacturers); + void devicesReceived(const QList &devices); + void deviceUpdated(bool success); + +private slots: + void parseData(QNetworkReply *reply); + void handleDeviceUpdated(QNetworkReply *reply); + void handleError(QNetworkReply::NetworkError error); + +private: + QNetworkAccessManager *networkManager; + + const QString baseUrl = "http://localhost:8080"; + + template + QMap deserializeEntities(const QByteArray &data, const QString &itemsKey); + Device deserializeDevice(const QJsonObject &json); +}; + +template +QMap ApiClient::deserializeEntities(const QByteArray &data, const QString &itemsKey) +{ + QMap entities; + QJsonDocument doc = QJsonDocument::fromJson(data); + QJsonArray itemsArray = doc.object().value(itemsKey).toArray(); + + for (const QJsonValue &value : itemsArray) { + T entity; + entity.fromJson(value.toObject()); + entities.insert(entity.id(), entity); + } + + return entities; +} + +#endif // APICLIENT_H diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..5ea4a48 --- /dev/null +++ b/main.cpp @@ -0,0 +1,11 @@ +#include "presenter.h" +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + + new Presenter(); + + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..7da3d5e --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,640 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + + setWindowIcon(QIcon(":/images/mw-icon.png")); + + int width = frameGeometry().width(); + int height = frameGeometry().height(); + QScreen *screen = qApp->primaryScreen(); + int screenWidth = screen->geometry().width(); + int screenHeight = screen->geometry().height(); + setGeometry((screenWidth/2)-(width/2), (screenHeight/2)-(height/2), width, height); + + returnToDeviceList(); + + ui->tableWidget->verticalHeader()->setVisible(false); + ui->tableWidget->setColumnCount(2); + QStringList headers = QString("ID, Название").split(','); + ui->tableWidget->setHorizontalHeaderLabels(headers); + QHeaderView *header = ui->tableWidget->horizontalHeader(); + header->setSectionResizeMode(0, QHeaderView::Stretch); + header->setSectionResizeMode(1, QHeaderView::Stretch); + QFont headerFont = header->font(); + headerFont.setBold(true); + header->setFont(headerFont); + ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); + + ui->listWidgetDevices->setSpacing(10); + + ui->checkBoxIsWorking->setAttribute(Qt::WA_TransparentForMouseEvents); + ui->checkBoxIsWorking->setFocusPolicy(Qt::NoFocus); + + QStringList filterItems = { + "Все устройства", + "Типы устройств", + "Помещения", + "Отделы", + "Производители", + "Модели устройств" + }; + + ui->comboBoxFilters->addItems(filterItems); + + QStringList sortItems = { + "Сначала новые", + "Сначала старые", + "Сначала дешевые", + "Сначала дорогие", + "Сначала с лайком" + }; + + ui->comboBoxSort->addItems(sortItems); + + QLineEdit *searchEdit = ui->lineEditSearch; + QPushButton *searchButton = new QPushButton(this); + + ButtonHoverWatcher *watcher = new ButtonHoverWatcher(this); + searchButton->installEventFilter(watcher); + searchButton->setCursor(Qt::PointingHandCursor); + searchButton->setStyleSheet("background: transparent; border: none;"); + searchButton->setIcon(QIcon(":/images/search.png")); + searchButton->setFixedSize(22, 22); + + QMargins margins = searchEdit->textMargins(); + searchEdit->setTextMargins(margins.left(), margins.top(), searchButton->width(), margins.bottom()); + searchEdit->setPlaceholderText(QStringLiteral("Поиск устройств по модели, типу или серийному номеру...")); + searchEdit->setMaxLength(200); + + QHBoxLayout *searchLayout = new QHBoxLayout(); + searchLayout->addStretch(); + searchLayout->addWidget(searchButton); + searchLayout->setSpacing(0); + searchLayout->setContentsMargins(3, 2, 3, 2); + searchEdit->setLayout(searchLayout); + + QButtonGroup *buttonGroup = new QButtonGroup(this); + buttonGroup->addButton(ui->radioButtonWorking); + buttonGroup->addButton(ui->radioButtonNotWorking); + buttonGroup->addButton(ui->radioButtonDisregard); + ui->radioButtonWorking->setChecked(true); + + connect(ui->comboBoxFilters, SIGNAL(activated(int)), this, SLOT(updateTableWidget(int))); + connect(ui->comboBoxSort, SIGNAL(activated(int)), this, SLOT(changeSortOrder())); + connect(ui->tableWidget->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(updateListWidget())); + connect(ui->listWidgetDevices, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(showItemInfo(QListWidgetItem*))); + connect(ui->pushButtonBack, SIGNAL(clicked()), this, SLOT(pushButtonBackClicked())); + connect(ui->pushButtonClear, SIGNAL(clicked()), this, SLOT(pushButtonClearClicked())); + connect(searchEdit, SIGNAL(returnPressed()), this, SLOT(pushButtonSearchClicked())); + connect(searchButton, SIGNAL(clicked()), this, SLOT(pushButtonSearchClicked())); + connect(ui->pushButtonApplyFilters, SIGNAL(clicked()), this, SLOT(pushButtonApplyFiltersClicked())); + connect(ui->pushButtonCancelFilters, SIGNAL(clicked()), this, SLOT(pushButtonCancelFiltersClicked())); + connect(ui->pushButtonDefault, SIGNAL(clicked()), this, SLOT(pushButtonDefaultClicked())); + connect(ui->pushButtonStructure, SIGNAL(clicked()), this, SLOT(pushButtonStructureClicked())); + connect(ui->pushButtonCharacteristics, SIGNAL(clicked()), this, SLOT(pushButtonCharacteristicsClicked())); + + QFile *styleFile = new QFile(":/styles.qss"); + if (styleFile->open(QFile::ReadOnly)) { + QTextStream ts(styleFile); + QString style = ts.readAll(); + qApp->setStyleSheet(style); + } +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::updateTableWidget(int index) +{ + returnToDeviceList(); + + ui->tableWidget->clearContents(); + ui->tableWidget->setRowCount(0); + + switch (index) { + case 0: // Все устройства + clearDevicesOutputSettings(); + updateListWidgetDevices(0); + break; + case 1: // Типы устройств + fillTable(mapDeviceTypes); + break; + case 2: // Помещения + fillTable(mapLocations); + break; + case 3: // Отделы + fillTable(mapDepartments); + break; + case 4: // Производители + fillTable(mapManufacturers); + break; + case 5: // Модели устройств + fillTable(mapDeviceModels); + break; + default: + break; + } +} + +void MainWindow::updateListWidget() +{ + returnToDeviceList(); + + int selectedEntityId = getSelectedIndex(); + + if (selectedEntityId == -1) + return; + + clearDevicesOutputSettings(); + updateListWidgetDevices(selectedEntityId); +} + +template +void MainWindow::fillTable(const QMap &map) +{ + int row = 0; + for (auto &item : map) { + ui->tableWidget->insertRow(row); + + QTableWidgetItem *idItem = new QTableWidgetItem(QString::number(item.id())); + QTableWidgetItem *nameItem = new QTableWidgetItem(item.name()); + + idItem->setFlags(idItem->flags() & ~Qt::ItemIsEditable); + nameItem->setFlags(nameItem->flags() & ~Qt::ItemIsEditable); + + ui->tableWidget->setItem(row, 0, idItem); + ui->tableWidget->setItem(row, 1, nameItem); + + idItem->setTextAlignment(Qt::AlignCenter); + nameItem->setTextAlignment(Qt::AlignCenter); + + row++; + } +} + +void MainWindow::updateListWidgetDevices(int entityId) +{ + client->getFilteredDevices( + filterParams.isWorking(), + filterParams.priceFrom(), + filterParams.priceTo(), + filterParams.getApllyFilters(), + filterParams.getDisregardState(), + entityId, + ui->comboBoxFilters->currentIndex(), + searchInfo, + ui->comboBoxSort->currentText() + ); +} + +QWidget *MainWindow::createMessageEmptyCard() +{ + QWidget *cardWidget = new QWidget(ui->listWidgetDevices); + QVBoxLayout *cardLayout = new QVBoxLayout(cardWidget); + + QLabel *titleLabel = new QLabel("По заданным параметрам ничего не найдено", cardWidget); + QFont titleFont("Arial", 17, QFont::Bold); + titleLabel->setFont(titleFont); + + cardLayout->addWidget(titleLabel, 0, Qt::AlignCenter); + + cardLayout->setSpacing(12); + + QLabel *imageLabel = new QLabel(cardWidget); + QPixmap pixmap(":/images/question.png"); + imageLabel->setPixmap(pixmap.scaled(256, 256, Qt::KeepAspectRatio)); + + cardLayout->addWidget(imageLabel, 0, Qt::AlignCenter); + + return cardWidget; +} + +QWidget *MainWindow::createDeviceCard(const Device &device) +{ + QWidget *cardWidget = new QWidget(ui->listWidgetDevices); + QVBoxLayout *cardLayout = new QVBoxLayout(cardWidget); + + QFrame *topBorder = new QFrame(cardWidget); + topBorder->setFrameShape(QFrame::HLine); + topBorder->setFrameShadow(QFrame::Sunken); + + cardLayout->addWidget(topBorder); + + QHBoxLayout *iconTextlayout = new QHBoxLayout(); + + QLabel *imageLabel = new QLabel(cardWidget); + QString imagePath = deviceTypeImages[device.deviceModel().idType()]; + QPixmap pixmap(imagePath); + imageLabel->setPixmap(pixmap.scaled(100, 100, Qt::KeepAspectRatio)); + + iconTextlayout->addWidget(imageLabel); + + QVBoxLayout *textLayout = new QVBoxLayout(); + + QLabel *serialNumberLabel = new QLabel(device.serialNumber(), cardWidget); + QFont serialNumberFont("Arial", 14, QFont::Bold); + serialNumberLabel->setFont(serialNumberFont); + textLayout->addWidget(serialNumberLabel); + + QFont generalFont("Arial", 11); + + QString typeName = device.deviceModel().nameType(); + typeName = typeName.left(typeName.length() - 1); + if (typeName == "Персональные компьютер") + typeName = "Персональный компьютер"; + QLabel *typeNameLabel = new QLabel(typeName + ": " + device.deviceModel().name(), cardWidget); + typeNameLabel->setFont(generalFont); + textLayout->addWidget(typeNameLabel); + + QLabel *statusLabel = new QLabel(device.isWorking() ? "Работает" : "Сломано", cardWidget); + statusLabel->setFont(generalFont); + textLayout->addWidget(statusLabel); + + QHBoxLayout *priceLikeLayout = new QHBoxLayout(); + priceLikeLayout->setSpacing(100); + + QLabel *priceLabel = new QLabel(QString::number(device.price()) + " ₽", cardWidget); + priceLabel->setFont(generalFont); + priceLabel->setFixedWidth(100); + priceLikeLayout->addWidget(priceLabel); + + priceLikeLayout->addSpacerItem(new QSpacerItem(40, 0, QSizePolicy::Expanding, QSizePolicy::Minimum)); + + QCheckBox *likeCheckBox = new QCheckBox("Нравится", cardWidget); + likeCheckBox->setChecked(device.isLiked()); + likeCheckBox->setFont(generalFont); + likeCheckBox->setStyleSheet(likeCheckBox->isChecked() ? "color: green;" : "color: black;"); + + connect(likeCheckBox, &QCheckBox::toggled, this, [this, device, likeCheckBox](bool checked) { + Device updDevice = device; + updDevice.setIsLiked(checked); + client->updateDevice(updDevice.id(), updDevice); + + connect(client, &ApiClient::deviceUpdated, this, [this, checked, device, likeCheckBox](bool success) { + disconnect(client, &ApiClient::deviceUpdated, this, nullptr); + + if (success) { + QString message = checked ? "Устройство добавлено в избранное." : "Устройство удалено из избранного."; + QMessageBox::information(this, "Обновление", message); + + Device& deviceRef = mapDevices[device.id()]; + deviceRef.setIsLiked(checked); + + likeCheckBox->setStyleSheet(checked ? "color: green;" : "color: black;"); + } else { + QMessageBox::critical(this, "Ошибка", "Не удалось изменить состояние устройства."); + } + }); + }); + + priceLikeLayout->addWidget(likeCheckBox); + + textLayout->addLayout(priceLikeLayout); + + iconTextlayout->addSpacerItem(new QSpacerItem(40, 0, QSizePolicy::Expanding, QSizePolicy::Minimum)); + iconTextlayout->addLayout(textLayout); + + cardLayout->addLayout(iconTextlayout); + + QFrame *bottomBorder = new QFrame(cardWidget); + bottomBorder->setFrameShape(QFrame::HLine); + bottomBorder->setFrameShadow(QFrame::Sunken); + cardLayout->addWidget(bottomBorder); + + cardLayout->setContentsMargins(2, 0, 2, 0); + + return cardWidget; +} + +void MainWindow::addDeviceToList(const Device &device) +{ + QListWidgetItem *item = new QListWidgetItem(ui->listWidgetDevices); + ui->listWidgetDevices->addItem(item); + + QWidget *cardWidget = createDeviceCard(device); + + item->setSizeHint(cardWidget->minimumSizeHint()); + ui->listWidgetDevices->setItemWidget(item, cardWidget); + + item->setData(Qt::UserRole, device.id()); +} + +void MainWindow::returnToDeviceList() +{ + idCard = 0; + ui->stackedWidget->setCurrentIndex(0); +} + +void MainWindow::showItemInfo(QListWidgetItem *item) +{ + if (!item) + return; + + int deviceId = item->data(Qt::UserRole).toInt(); + Device device = mapDevices[deviceId]; + + idCard = deviceId; + + ui->lineEditId->setText(QString::number(device.id())); + ui->lineEditSerialNum->setText(device.serialNumber()); + ui->lineEditPurchaseDate->setText(device.purchaseDate().toString("dd.MM.yyyy HH:mm:ss")); + ui->lineEditPrice->setText(QString::number(device.price(), 'f', 2)); + ui->lineEditWarranty->setText(device.warrantyExpireDate().toString("dd.MM.yyyy HH:mm:ss")); + ui->lineEditLocation->setText(device.nameLocation()); + ui->lineEditEmployee->setText(device.nameEmployee()); + ui->lineEditDepartment->setText(device.nameDepartment()); + ui->lineEditModel->setText(device.deviceModel().name()); + ui->lineEditType->setText(device.deviceModel().nameType()); + ui->lineEditManuf->setText(device.deviceModel().nameManuf()); + ui->textEditFurtherInformation->setPlainText(device.furtherInformation()); + ui->checkBoxIsWorking->setChecked(device.isWorking()); + + ui->stackedWidget->setCurrentIndex(1); +} + +void MainWindow::showTableWithStructureElements(const QList &elements) +{ + QDialog* dialog = new QDialog(this); + dialog->setWindowTitle("Элементы структуры устройства"); + dialog->resize(1100, 600); + + QTableWidget* tableWidget = new QTableWidget(dialog); + tableWidget->setColumnCount(5); + + QFont font("Arial", 12); + tableWidget->setFont(font); + + QStringList headers = {"Название модели", "Производитель", "Описание элемента", "Тип элемента", "Количество"}; + tableWidget->setHorizontalHeaderLabels(headers); + + QFont headerFont("Arial", 12, QFont::Bold); + for (int i = 0; i < tableWidget->columnCount(); i++) { + tableWidget->horizontalHeaderItem(i)->setFont(headerFont); + } + + tableWidget->setRowCount(elements.size()); + for (int row = 0; row < elements.size(); row++) { + const DeviceStructureElement& element = elements[row]; + + tableWidget->setItem(row, 0, new QTableWidgetItem(element.nameModel())); + tableWidget->setItem(row, 1, new QTableWidgetItem(element.nameManuf())); + tableWidget->setItem(row, 2, new QTableWidgetItem(element.description())); + tableWidget->setItem(row, 3, new QTableWidgetItem(element.nameType())); + tableWidget->setItem(row, 4, new QTableWidgetItem(QString::number(element.count()))); + + for (int col = 0; col < tableWidget->columnCount(); col++) { + tableWidget->item(row, col)->setFlags(tableWidget->item(row, col)->flags() & ~Qt::ItemIsEditable); + } + } + + connect(tableWidget, &QTableWidget::cellClicked, [tableWidget](int row, int col) { + QString text = tableWidget->item(row, col)->text(); + QToolTip::showText(QCursor::pos(), text); + }); + + tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); + tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); + tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Interactive); + tableWidget->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Stretch); + tableWidget->horizontalHeader()->setSectionResizeMode(4, QHeaderView::ResizeToContents); + tableWidget->setColumnWidth(2, tableWidget->columnWidth(0) * 2); + + tableWidget->setFocusPolicy(Qt::NoFocus); + + QVBoxLayout* layout = new QVBoxLayout(dialog); + layout->addWidget(tableWidget); + + dialog->setLayout(layout); + dialog->exec(); +} + +void MainWindow::showTableWithDeviceModelCharacteristics(const DeviceModel &model) +{ + QDialog* dialog = new QDialog(this); + dialog->setWindowTitle("Характеристики устройства"); + dialog->setFixedSize(1200, 75); + + QTableWidget* tableWidget = new QTableWidget(dialog); + tableWidget->setColumnCount(6); + + QFont font("Arial", 11); + tableWidget->setFont(font); + + QStringList headers = {"Эффективность работы", "Надежность", "Энергоэффективность", "Удобство использования", "Долговечность", "Эстетические качества"}; + tableWidget->setHorizontalHeaderLabels(headers); + + QFont headerFont("Arial", 11, QFont::Bold); + for (int i = 0; i < tableWidget->columnCount(); i++) { + tableWidget->horizontalHeaderItem(i)->setFont(headerFont); + } + + tableWidget->setRowCount(1); + tableWidget->setItem(0, 0, new QTableWidgetItem(QString::number(model.workEfficiency()))); + tableWidget->setItem(0, 1, new QTableWidgetItem(QString::number(model.reliability()))); + tableWidget->setItem(0, 2, new QTableWidgetItem(QString::number(model.energyEfficiency()))); + tableWidget->setItem(0, 3, new QTableWidgetItem(QString::number(model.userFriendliness()))); + tableWidget->setItem(0, 4, new QTableWidgetItem(QString::number(model.durability()))); + tableWidget->setItem(0, 5, new QTableWidgetItem(QString::number(model.aestheticQualities()))); + + for (int col = 0; col < tableWidget->columnCount(); col++) { + tableWidget->item(0, col)->setFlags(tableWidget->item(0, col)->flags() & ~Qt::ItemIsEditable); + tableWidget->item(0, col)->setTextAlignment(Qt::AlignCenter); + tableWidget->horizontalHeader()->setSectionResizeMode(col, QHeaderView::Stretch); + } + + tableWidget->verticalHeader()->setVisible(false); + tableWidget->setFocusPolicy(Qt::NoFocus); + + QVBoxLayout* layout = new QVBoxLayout(dialog); + layout->addWidget(tableWidget); + + dialog->setLayout(layout); + dialog->exec(); +} + +void MainWindow::clearFilters() +{ + ui->radioButtonWorking->setChecked(true); + ui->doubleSpinBoxFrom->setValue(0.00); + ui->doubleSpinBoxTo->setValue(0.00); + filterParams.setIsWorking(true); + filterParams.setPriceFrom(-1); + filterParams.setPriceTo(-1); + filterParams.setDisregardState(false); + filterParams.setApllyFilters(false); +} + +void MainWindow::clearDevicesOutputSettings() +{ + ui->comboBoxSort->setCurrentIndex(0); + + ui->lineEditSearch->setText(""); + searchInfo = ""; + + clearFilters(); +} + +int MainWindow::getSelectedIndex() +{ + QModelIndexList selectedIndexes = ui->tableWidget->selectionModel()->selectedRows(); + + if (selectedIndexes.isEmpty()) { + return -1; + } + + int rowIndex = selectedIndexes.first().row(); + + return ui->tableWidget->item(rowIndex, 0)->text().toInt(); +} + +void MainWindow::pushButtonBackClicked() +{ + returnToDeviceList(); +} + +void MainWindow::pushButtonClearClicked() +{ + ui->lineEditSearch->setText(""); +} + +void MainWindow::changeSortOrder() +{ + updateListWidgetDevices(getSelectedIndex()); +} + +void MainWindow::pushButtonSearchClicked() +{ + searchInfo = ui->lineEditSearch->text(); + if (searchInfo.isEmpty()) { + QMessageBox::warning(this, "Ошибка", "Пожалуйста, введите текст для поиска."); + return; + } + ui->comboBoxSort->setCurrentIndex(0); + clearFilters(); + updateListWidgetDevices(getSelectedIndex()); +} + +void MainWindow::pushButtonApplyFiltersClicked() +{ + double priceFrom = ui->doubleSpinBoxFrom->value(); + double priceTo = ui->doubleSpinBoxTo->value(); + if (priceFrom > priceTo) { + QMessageBox::warning(this, "Ошибка", "Начальное значение диапазона не может быть больше конечного значения."); + + ui->doubleSpinBoxFrom->setValue(filterParams.priceFrom()); + ui->doubleSpinBoxTo->setValue(filterParams.priceTo()); + + return; + } + + filterParams.setApllyFilters(true); + filterParams.setDisregardState(ui->radioButtonDisregard->isChecked()); + filterParams.setIsWorking(ui->radioButtonWorking->isChecked()); + + if (priceFrom == 0.00 && priceTo == 0.00) { + filterParams.setPriceFrom(0.00); + filterParams.setPriceTo(std::numeric_limits::max()); + } else { + filterParams.setPriceFrom(priceFrom); + filterParams.setPriceTo(priceTo); + } + + updateListWidgetDevices(getSelectedIndex()); +} + +void MainWindow::pushButtonCancelFiltersClicked() +{ + clearFilters(); + updateListWidgetDevices(getSelectedIndex()); +} + +void MainWindow::pushButtonStructureClicked() +{ + showTableWithStructureElements(mapDevices[idCard].deviceModel().structureElements()); +} + +void MainWindow::pushButtonCharacteristicsClicked() +{ + showTableWithDeviceModelCharacteristics(mapDevices[idCard].deviceModel()); +} + +void MainWindow::pushButtonDefaultClicked() +{ + clearDevicesOutputSettings(); + updateListWidgetDevices(getSelectedIndex()); +} + +QMap MainWindow::getMapDeviceModels() const +{ + return mapDeviceModels; +} + +void MainWindow::setMapDevices(const QMap &newMapDevices) +{ + mapDevices = newMapDevices; + updateTableWidget(0); + connect(client, &ApiClient::devicesReceived, this, [this](const QList &filteredDevices) { + ui->listWidgetDevices->clear(); + if (filteredDevices.isEmpty()) { + QListWidgetItem *item = new QListWidgetItem(ui->listWidgetDevices); + ui->listWidgetDevices->addItem(item); + QWidget *cardWidget = createMessageEmptyCard(); + item->setSizeHint(cardWidget->minimumSizeHint()); + item->setFlags(item->flags() & ~Qt::ItemIsEnabled); + ui->listWidgetDevices->setItemWidget(item, cardWidget); + } else { + for (const auto &device : filteredDevices) { + int deviceModelId = device.deviceModel().id(); + if (mapDeviceModels.contains(deviceModelId)) { + Device updatedDevice = device; + updatedDevice.setDeviceModel(mapDeviceModels[deviceModelId]); + addDeviceToList(updatedDevice); + } else { + addDeviceToList(device); + } + } + } + }); +} + +void MainWindow::setMapDeviceModels(const QMap &newMapDeviceModels) +{ + mapDeviceModels = newMapDeviceModels; +} + +void MainWindow::setMapDeviceTypes(const QMap &newMapDeviceTypes) +{ + mapDeviceTypes = newMapDeviceTypes; + for (int i = 1; i <= mapDeviceTypes.size(); i++) { + QString imagePath = QString(":/images/device-type-%1.png").arg(i); + deviceTypeImages[i] = imagePath; + } +} + +void MainWindow::setMapManufacturers(const QMap &newMapManufacturers) +{ + mapManufacturers = newMapManufacturers; +} + +void MainWindow::setMapDepartments(const QMap &newMapDepartments) +{ + mapDepartments = newMapDepartments; +} + +void MainWindow::setMapLocations(const QMap &newMapLocations) +{ + mapLocations = newMapLocations; +} + +void MainWindow::setClient(ApiClient *newClient) +{ + client = newClient; +} diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..0ca6e52 --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,97 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "apiclient.h" +#include "models/types.h" // IWYU pragma: keep +#include "models/filterparams.h" +#include "utils/buttonhoverwatcher.h" // IWYU pragma: keep + +namespace Ui { +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + + void setClient(ApiClient *newClient); + + void setMapLocations(const QMap &newMapLocations); + + void setMapDepartments(const QMap &newMapDepartments); + + void setMapManufacturers(const QMap &newMapManufacturers); + + void setMapDeviceTypes(const QMap &newMapDeviceTypes); + + QMap getMapDeviceModels() const; + void setMapDeviceModels(const QMap &newMapDeviceModels); + + void setMapDevices(const QMap &newMapDevices); + +private: + template + void fillTable(const QMap &map); + void updateListWidgetDevices(int entityId); + QWidget* createMessageEmptyCard(); + QWidget* createDeviceCard(const Device &device); + void addDeviceToList(const Device &device); + void returnToDeviceList(); + void showTableWithStructureElements(const QList& elements); + void showTableWithDeviceModelCharacteristics(const DeviceModel& model); + void clearFilters(); + void clearDevicesOutputSettings(); + int getSelectedIndex(); + +private slots: + void updateTableWidget(int index); + void updateListWidget(); + void showItemInfo(QListWidgetItem*); + void changeSortOrder(); + void pushButtonBackClicked(); + void pushButtonClearClicked(); + void pushButtonSearchClicked(); + void pushButtonApplyFiltersClicked(); + void pushButtonCancelFiltersClicked(); + void pushButtonStructureClicked(); + void pushButtonCharacteristicsClicked(); + void pushButtonDefaultClicked(); + +private: + Ui::MainWindow *ui; + + ApiClient *client; + + QString searchInfo = ""; + FilterParams filterParams; + + int idCard = 0; + + QMap deviceTypeImages; + + QMap mapLocations; + QMap mapDepartments; + QMap mapManufacturers; + QMap mapDeviceTypes; + QMap mapDeviceModels; + QMap mapDevices; +}; + +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..51836ab --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,1088 @@ + + + MainWindow + + + + 0 + 0 + 1136 + 875 + + + + + 0 + 0 + + + + + Arial + + + + Список устройств + + + + data/images/mw-icon.pngdata/images/mw-icon.png + + + true + + + + + + 10 + 12 + 481 + 25 + + + + + 0 + 0 + + + + + Arial + 11 + + + + + + + 10 + 44 + 481 + 820 + + + + + 0 + 0 + + + + + Arial + 11 + + + + QAbstractItemView::SelectionMode::SingleSelection + + + + + + 530 + 12 + 595 + 851 + + + + + 0 + 0 + + + + + Arial + 10 + + + + 0 + + + + + + 0 + 8 + 591 + 16 + + + + + Arial + 12 + true + + + + Устройства + + + Qt::AlignmentFlag::AlignCenter + + + + + + 11 + 80 + 571 + 461 + + + + + + + 11 + 42 + 321 + 25 + + + + + Arial + 11 + + + + + + + 11 + 557 + 461 + 25 + + + + + Arial + 11 + + + + + + + 491 + 556 + 91 + 28 + + + + + Arial + 11 + + + + PointingHandCursor + + + Очистить + + + + + + 11 + 600 + 571 + 242 + + + + + + + + + 210 + 200 + 181 + 31 + + + + + Arial + 11 + + + + PointingHandCursor + + + Применить фильтрацию + + + + + + 410 + 200 + 151 + 31 + + + + + Arial + 11 + + + + PointingHandCursor + + + Отменить фильтры + + + + + + 10 + 10 + 561 + 16 + + + + + Arial + 12 + true + + + + Фильтры + + + Qt::AlignmentFlag::AlignCenter + + + + + + 10 + 37 + 751 + 16 + + + + + Arial + 11 + true + + + + Состояние + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + 10 + 137 + 751 + 16 + + + + + Arial + 11 + true + + + + Цена + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + 10 + 67 + 89 + 20 + + + + + Arial + 10 + + + + Работает + + + + + + 10 + 102 + 89 + 20 + + + + + Arial + 10 + + + + Сломано + + + + + + 40 + 167 + 151 + 22 + + + + + Arial + 10 + + + + 2 + + + 1000000000000000000000.000000000000000 + + + + + + 240 + 167 + 151 + 22 + + + + + Arial + 10 + + + + 1000000000000000000000.000000000000000 + + + + + + 10 + 170 + 21 + 16 + + + + + Arial + 11 + + + + от + + + + + + 210 + 170 + 21 + 16 + + + + + Arial + 11 + + + + до + + + + + + 120 + 67 + 111 + 20 + + + + + Arial + 10 + + + + Не учитывать + + + + + + + 422 + 39 + 161 + 30 + + + + + Arial + 11 + + + + PointingHandCursor + + + Вывод по умолчанию + + + + + + + + 0 + 4 + 571 + 20 + + + + + Arial + 12 + true + + + + Информация об устройстве + + + Qt::AlignmentFlag::AlignCenter + + + + + + 10 + 47 + 574 + 22 + + + + + Arial + 11 + + + + true + + + + + + 10 + 22 + 111 + 20 + + + + + Arial + 11 + + + + Идентификатор + + + + + + 10 + 107 + 574 + 22 + + + + + Arial + 11 + + + + true + + + + + + 10 + 82 + 121 + 20 + + + + + Arial + 11 + + + + Серийный номер + + + + + + 10 + 142 + 121 + 20 + + + + + Arial + 11 + + + + Дата покупки + + + + + + 10 + 167 + 574 + 22 + + + + + Arial + 11 + + + + true + + + + + + 10 + 202 + 121 + 20 + + + + + Arial + 11 + + + + Цена покупки + + + + + + 10 + 227 + 574 + 22 + + + + + Arial + 11 + + + + true + + + + + + 10 + 262 + 121 + 20 + + + + + Arial + 11 + + + + Конец гарантии + + + + + + 10 + 287 + 574 + 22 + + + + + Arial + 11 + + + + true + + + + + + 10 + 322 + 121 + 20 + + + + + Arial + 11 + + + + Помещение + + + + + + 10 + 347 + 574 + 22 + + + + + Arial + 11 + + + + true + + + + + + 10 + 382 + 121 + 20 + + + + + Arial + 11 + + + + Отв. сотрудник + + + + + + 10 + 407 + 574 + 22 + + + + + Arial + 11 + + + + true + + + + + + 10 + 467 + 574 + 22 + + + + + Arial + 11 + + + + true + + + + + + 10 + 442 + 121 + 20 + + + + + Arial + 11 + + + + Отдел + + + + + + 10 + 502 + 121 + 20 + + + + + Arial + 11 + + + + Модель + + + + + + 10 + 527 + 574 + 22 + + + + + Arial + 11 + + + + true + + + + + + 10 + 562 + 121 + 20 + + + + + Arial + 11 + + + + Тип + + + + + + 10 + 587 + 574 + 22 + + + + + Arial + 11 + + + + true + + + + + + 10 + 622 + 121 + 20 + + + + + Arial + 11 + + + + Производитель + + + + + + 10 + 647 + 574 + 22 + + + + + Arial + 11 + + + + true + + + + + + 10 + 707 + 574 + 63 + + + + + Arial + 11 + + + + true + + + + + + 10 + 682 + 211 + 20 + + + + + Arial + 11 + + + + <html><head/><body><p>Дополнительная информация</p></body></html> + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + true + + + + 10 + 780 + 20 + 20 + + + + + Arial + 11 + + + + + + + true + + + + + + 30 + 780 + 71 + 16 + + + + + Arial + 11 + + + + Работает + + + + + + 10 + 809 + 151 + 30 + + + + + Arial + 11 + + + + PointingHandCursor + + + Структура + + + + + + 190 + 809 + 151 + 30 + + + + + Arial + 11 + + + + PointingHandCursor + + + Характеристики + + + + + + 483 + 809 + 101 + 30 + + + + + Arial + 11 + + + + PointingHandCursor + + + Назад + + + + + + + + + 0 + 0 + 1136 + 20 + + + + + + + diff --git a/models/baseentity.cpp b/models/baseentity.cpp new file mode 100644 index 0000000..db5aa17 --- /dev/null +++ b/models/baseentity.cpp @@ -0,0 +1,14 @@ +#include "baseentity.h" + +BaseEntity::BaseEntity() +{} + +int BaseEntity::id() const +{ + return _id; +} + +void BaseEntity::setId(int newId) +{ + _id = newId; +} diff --git a/models/baseentity.h b/models/baseentity.h new file mode 100644 index 0000000..beebd43 --- /dev/null +++ b/models/baseentity.h @@ -0,0 +1,21 @@ +#ifndef BASEENTITY_H +#define BASEENTITY_H + +#include + +class BaseEntity +{ +public: + BaseEntity(); + + int id() const; + void setId(int newId); + + virtual void fromJson(const QJsonObject &) {} + virtual QJsonObject toJson() const = 0; + +private: + int _id = 0; +}; + +#endif // BASEENTITY_H diff --git a/models/department.cpp b/models/department.cpp new file mode 100644 index 0000000..2456e90 --- /dev/null +++ b/models/department.cpp @@ -0,0 +1,31 @@ +#include "department.h" + +Department::Department() +{} + +Department::~Department() +{} + +QString Department::name() const +{ + return _name; +} + +void Department::setName(const QString &newName) +{ + _name = newName; +} + +void Department::fromJson(const QJsonObject &json) +{ + setId(json["id"].toInt()); + setName(json["name"].toString()); +} + +QJsonObject Department::toJson() const +{ + QJsonObject obj; + obj["id"] = id(); + obj["name"] = name(); + return obj; +} diff --git a/models/department.h b/models/department.h new file mode 100644 index 0000000..5b39401 --- /dev/null +++ b/models/department.h @@ -0,0 +1,24 @@ +#ifndef DEPARTMENT_H +#define DEPARTMENT_H + +#include + +#include "baseentity.h" + +class Department : public BaseEntity +{ +public: + Department(); + virtual ~Department(); + + QString name() const; + void setName(const QString &newName); + + void fromJson(const QJsonObject &json) override; + QJsonObject toJson() const override; + +private: + QString _name = ""; +}; + +#endif // DEPARTMENT_H diff --git a/models/device.cpp b/models/device.cpp new file mode 100644 index 0000000..a834707 --- /dev/null +++ b/models/device.cpp @@ -0,0 +1,190 @@ +#include "device.h" + +Device::Device() +{} + +Device::~Device() +{} + +QString Device::serialNumber() const +{ + return _serialNumber; +} + +void Device::setSerialNumber(const QString &newSerialNumber) +{ + _serialNumber = newSerialNumber; +} + +QDateTime Device::purchaseDate() const +{ + return _purchaseDate; +} + +void Device::setPurchaseDate(const QDateTime &newPurchaseDate) +{ + _purchaseDate = newPurchaseDate; +} + +double Device::price() const +{ + return _price; +} + +void Device::setPrice(double newPrice) +{ + _price = newPrice; +} + +QDateTime Device::warrantyExpireDate() const +{ + return _warrantyExpireDate; +} + +void Device::setWarrantyExpireDate(const QDateTime &newWarrantyExpireDate) +{ + _warrantyExpireDate = newWarrantyExpireDate; +} + +bool Device::isWorking() const +{ + return _isWorking; +} + +void Device::setIsWorking(bool newIsWorking) +{ + _isWorking = newIsWorking; +} + +QString Device::furtherInformation() const +{ + return _furtherInformation; +} + +void Device::setFurtherInformation(const QString &newFurtherInformation) +{ + _furtherInformation = newFurtherInformation; +} + +int Device::idLocation() const +{ + return _idLocation; +} + +void Device::setIdLocation(int newIdLocation) +{ + _idLocation = newIdLocation; +} + +QString Device::nameLocation() const +{ + return _nameLocation; +} + +void Device::setNameLocation(const QString &newNameLocation) +{ + _nameLocation = newNameLocation; +} + +int Device::idEmployee() const +{ + return _idEmployee; +} + +void Device::setIdEmployee(int newIdEmployee) +{ + _idEmployee = newIdEmployee; +} + +QString Device::nameEmployee() const +{ + return _nameEmployee; +} + +void Device::setNameEmployee(const QString &newNameEmployee) +{ + _nameEmployee = newNameEmployee; +} + +int Device::idDepartment() const +{ + return _idDepartment; +} + +void Device::setIdDepartment(int newIdDepartment) +{ + _idDepartment = newIdDepartment; +} + +QString Device::nameDepartment() const +{ + return _nameDepartment; +} + +void Device::setNameDepartment(const QString &newNameDepartment) +{ + _nameDepartment = newNameDepartment; +} + +DeviceModel Device::deviceModel() const +{ + return _deviceModel; +} + +void Device::setDeviceModel(const DeviceModel &newDeviceModel) +{ + _deviceModel = newDeviceModel; +} + +bool Device::isLiked() const +{ + return _isLiked; +} + +void Device::setIsLiked(bool newIsLiked) +{ + _isLiked = newIsLiked; +} + +void Device::fromJson(const QJsonObject &json) +{ + setId(json["id"].toInt()); + setSerialNumber(json["serialNumber"].toString()); + setPurchaseDate(QDateTime::fromString(json["purchaseDate"].toString(), Qt::ISODate)); + setPrice(json["price"].toDouble()); + setWarrantyExpireDate(QDateTime::fromString(json["warrantyExpireDate"].toString(), Qt::ISODate)); + setIsWorking(json["isWorking"].toBool()); + setFurtherInformation(json["furtherInformation"].toString()); + setIdLocation(json["idLocation"].toInt()); + setNameLocation(json["nameLocation"].toString()); + setIdEmployee(json["idEmployee"].toInt()); + setNameEmployee(json["nameEmployee"].toString()); + setIdDepartment(json["idDepartment"].toInt()); + setNameDepartment(json["nameDepartment"].toString()); + setIsLiked(json["isLiked"].toBool()); + + DeviceModel model; + model.setId(json["idDeviceModel"].toInt()); + setDeviceModel(model); +} + +QJsonObject Device::toJson() const +{ + QJsonObject obj; + obj["id"] = id(); + obj["serialNumber"] = serialNumber(); + obj["purchaseDate"] = purchaseDate().toString(Qt::ISODate); + obj["price"] = price(); + obj["warrantyExpireDate"] = warrantyExpireDate().toString(Qt::ISODate); + obj["isWorking"] = isWorking(); + obj["furtherInformation"] = furtherInformation(); + obj["idLocation"] = idLocation(); + obj["nameLocation"] = nameLocation(); + obj["idEmployee"] = idEmployee(); + obj["nameEmployee"] = nameEmployee(); + obj["idDepartment"] = idDepartment(); + obj["nameDepartment"] = nameDepartment(); + obj["idDeviceModel"] = deviceModel().id(); + obj["isLiked"] = isLiked(); + return obj; +} diff --git a/models/device.h b/models/device.h new file mode 100644 index 0000000..590611e --- /dev/null +++ b/models/device.h @@ -0,0 +1,78 @@ +#ifndef DEVICE_H +#define DEVICE_H + +#include +#include + +#include "devicemodel.h" +#include "baseentity.h" + +class Device : public BaseEntity +{ +public: + Device(); + virtual ~Device(); + + QString serialNumber() const; + void setSerialNumber(const QString &newSerialNumber); + + QDateTime purchaseDate() const; + void setPurchaseDate(const QDateTime &newPurchaseDate); + + double price() const; + void setPrice(double newPrice); + + QDateTime warrantyExpireDate() const; + void setWarrantyExpireDate(const QDateTime &newWarrantyExpireDate); + + bool isWorking() const; + void setIsWorking(bool newIsWorking); + + QString furtherInformation() const; + void setFurtherInformation(const QString &newFurtherInformation); + + int idLocation() const; + void setIdLocation(int newIdLocation); + + QString nameLocation() const; + void setNameLocation(const QString &newNameLocation); + + int idEmployee() const; + void setIdEmployee(int newIdEmployee); + + QString nameEmployee() const; + void setNameEmployee(const QString &newNameEmployee); + + int idDepartment() const; + void setIdDepartment(int newIdDepartment); + + QString nameDepartment() const; + void setNameDepartment(const QString &newNameDepartment); + + DeviceModel deviceModel() const; + void setDeviceModel(const DeviceModel &newDeviceModel); + + bool isLiked() const; + void setIsLiked(bool newIsLiked); + + void fromJson(const QJsonObject &json) override; + QJsonObject toJson() const override; + +private: + QString _serialNumber = ""; + QDateTime _purchaseDate = QDateTime(); + double _price = 1; + QDateTime _warrantyExpireDate = QDateTime(); + bool _isWorking = true; + QString _furtherInformation = ""; + int _idLocation = 0; + QString _nameLocation = ""; + int _idEmployee = 0; + QString _nameEmployee = ""; + int _idDepartment = 0; + QString _nameDepartment = ""; + DeviceModel _deviceModel; + bool _isLiked = false; +}; + +#endif // DEVICE_H diff --git a/models/devicemodel.cpp b/models/devicemodel.cpp new file mode 100644 index 0000000..d132f9f --- /dev/null +++ b/models/devicemodel.cpp @@ -0,0 +1,190 @@ +#include "devicemodel.h" + +DeviceModel::DeviceModel() +{} + +DeviceModel::~DeviceModel() +{} + +QString DeviceModel::name() const +{ + return _name; +} + +void DeviceModel::setName(const QString &newName) +{ + _name = newName; +} + +QString DeviceModel::description() const +{ + return _description; +} + +void DeviceModel::setDescription(const QString &newDescription) +{ + _description = newDescription; +} + +int DeviceModel::workEfficiency() const +{ + return _workEfficiency; +} + +void DeviceModel::setWorkEfficiency(int newWorkEfficiency) +{ + _workEfficiency = newWorkEfficiency; +} + +int DeviceModel::reliability() const +{ + return _reliability; +} + +void DeviceModel::setReliability(int newReliability) +{ + _reliability = newReliability; +} + +int DeviceModel::energyEfficiency() const +{ + return _energyEfficiency; +} + +void DeviceModel::setEnergyEfficiency(int newEnergyEfficiency) +{ + _energyEfficiency = newEnergyEfficiency; +} + +int DeviceModel::userFriendliness() const +{ + return _userFriendliness; +} + +void DeviceModel::setUserFriendliness(int newUserFriendliness) +{ + _userFriendliness = newUserFriendliness; +} + +int DeviceModel::durability() const +{ + return _durability; +} + +void DeviceModel::setDurability(int newDurability) +{ + _durability = newDurability; +} + +int DeviceModel::aestheticQualities() const +{ + return _aestheticQualities; +} + +void DeviceModel::setAestheticQualities(int newAestheticQualities) +{ + _aestheticQualities = newAestheticQualities; +} + +int DeviceModel::idType() const +{ + return _idType; +} + +void DeviceModel::setIdType(int newIdType) +{ + _idType = newIdType; +} + +QString DeviceModel::nameType() const +{ + return _nameType; +} + +void DeviceModel::setNameType(const QString &newNameType) +{ + _nameType = newNameType; +} + +int DeviceModel::idManuf() const +{ + return _idManuf; +} + +void DeviceModel::setIdManuf(int newIdManuf) +{ + _idManuf = newIdManuf; +} + +QString DeviceModel::nameManuf() const +{ + return _nameManuf; +} + +void DeviceModel::setNameManuf(const QString &newNameManuf) +{ + _nameManuf = newNameManuf; +} + +QList DeviceModel::structureElements() const +{ + return _structureElements; +} + +void DeviceModel::setStructureElements(const QList &newStructureElements) +{ + _structureElements = newStructureElements; +} + +void DeviceModel::fromJson(const QJsonObject &json) +{ + setId(json["id"].toInt()); + setName(json["name"].toString()); + setDescription(json["description"].toString()); + setWorkEfficiency(json["workEfficiency"].toInt()); + setReliability(json["reliability"].toInt()); + setEnergyEfficiency(json["energyEfficiency"].toInt()); + setUserFriendliness(json["userFriendliness"].toInt()); + setDurability(json["durability"].toInt()); + setAestheticQualities(json["aestheticQualities"].toInt()); + setIdType(json["idType"].toInt()); + setNameType(json["nameType"].toString()); + setIdManuf(json["idManuf"].toInt()); + setNameManuf(json["nameManuf"].toString()); + + QJsonArray structureElementsArray = json["structureElements"].toArray(); + QList elements; + for (const QJsonValue &value : structureElementsArray) { + DeviceStructureElement element; + element.fromJson(value.toObject()); + elements.append(element); + } + setStructureElements(elements); +} + +QJsonObject DeviceModel::toJson() const +{ + QJsonObject obj; + + obj["id"] = id(); + obj["name"] = name(); + obj["description"] = description(); + obj["workEfficiency"] = workEfficiency(); + obj["reliability"] = reliability(); + obj["energyEfficiency"] = energyEfficiency(); + obj["userFriendliness"] = userFriendliness(); + obj["durability"] = durability(); + obj["aestheticQualities"] = aestheticQualities(); + obj["idType"] = idType(); + obj["nameType"] = nameType(); + obj["idManuf"] = idManuf(); + obj["nameManuf"] = nameManuf(); + + QJsonArray structureElementsArray; + for (const DeviceStructureElement &element : structureElements()) { + structureElementsArray.append(element.toJson()); + } + obj["structureElements"] = structureElementsArray; + + return obj; +} diff --git a/models/devicemodel.h b/models/devicemodel.h new file mode 100644 index 0000000..8b860b9 --- /dev/null +++ b/models/devicemodel.h @@ -0,0 +1,75 @@ +#ifndef DEVICEMODEL_H +#define DEVICEMODEL_H + +#include +#include +#include + +#include "baseentity.h" +#include "devicestructureelement.h" + +class DeviceModel : public BaseEntity +{ +public: + DeviceModel(); + virtual ~DeviceModel(); + + QString name() const; + void setName(const QString &newName); + + QString description() const; + void setDescription(const QString &newDescription); + + int workEfficiency() const; + void setWorkEfficiency(int newWorkEfficiency); + + int reliability() const; + void setReliability(int newReliability); + + int energyEfficiency() const; + void setEnergyEfficiency(int newEnergyEfficiency); + + int userFriendliness() const; + void setUserFriendliness(int newUserFriendliness); + + int durability() const; + void setDurability(int newDurability); + + int aestheticQualities() const; + void setAestheticQualities(int newAestheticQualities); + + int idType() const; + void setIdType(int newIdType); + + QString nameType() const; + void setNameType(const QString &newNameType); + + int idManuf() const; + void setIdManuf(int newIdManuf); + + QString nameManuf() const; + void setNameManuf(const QString &newNameManuf); + + QList structureElements() const; + void setStructureElements(const QList &newStructureElements); + + void fromJson(const QJsonObject &json) override; + QJsonObject toJson() const override; + +private: + QString _name = ""; + QString _description = ""; + int _workEfficiency = 0; + int _reliability = 0; + int _energyEfficiency = 0; + int _userFriendliness = 0; + int _durability = 0; + int _aestheticQualities = 0; + int _idType = 0; + QString _nameType = ""; + int _idManuf = 0; + QString _nameManuf = ""; + QList _structureElements; +}; + +#endif // DEVICEMODEL_H diff --git a/models/devicestructureelement.cpp b/models/devicestructureelement.cpp new file mode 100644 index 0000000..52fcfb8 --- /dev/null +++ b/models/devicestructureelement.cpp @@ -0,0 +1,79 @@ +#include "devicestructureelement.h" + +DeviceStructureElement::DeviceStructureElement() +{} + +DeviceStructureElement::~DeviceStructureElement() +{} + +QString DeviceStructureElement::nameModel() const +{ + return _nameModel; +} + +void DeviceStructureElement::setNameModel(const QString &newNameModel) +{ + _nameModel = newNameModel; +} + +QString DeviceStructureElement::nameManuf() const +{ + return _nameManuf; +} + +void DeviceStructureElement::setNameManuf(const QString &newNameManuf) +{ + _nameManuf = newNameManuf; +} + +QString DeviceStructureElement::description() const +{ + return _description; +} + +void DeviceStructureElement::setDescription(const QString &newDescription) +{ + _description = newDescription; +} + +QString DeviceStructureElement::nameType() const +{ + return _nameType; +} + +void DeviceStructureElement::setNameType(const QString &newNameType) +{ + _nameType = newNameType; +} + +int DeviceStructureElement::count() const +{ + return _count; +} + +void DeviceStructureElement::setCount(int newCount) +{ + _count = newCount; +} + +void DeviceStructureElement::fromJson(const QJsonObject &json) +{ + setId(json["id"].toInt()); + setNameModel(json["nameModel"].toString()); + setNameManuf(json["nameManuf"].toString()); + setDescription(json["description"].toString()); + setNameType(json["nameType"].toString()); + setCount(json["count"].toInt()); +} + +QJsonObject DeviceStructureElement::toJson() const +{ + QJsonObject obj; + obj["id"] = id(); + obj["nameModel"] = nameModel(); + obj["nameManuf"] = nameManuf(); + obj["description"] = description(); + obj["nameType"] = nameType(); + obj["count"] = count(); + return obj; +} diff --git a/models/devicestructureelement.h b/models/devicestructureelement.h new file mode 100644 index 0000000..dfb2c2b --- /dev/null +++ b/models/devicestructureelement.h @@ -0,0 +1,40 @@ +#ifndef DEVICESTRUCTUREELEMENT_H +#define DEVICESTRUCTUREELEMENT_H + +#include + +#include "baseentity.h" + +class DeviceStructureElement : public BaseEntity +{ +public: + DeviceStructureElement(); + virtual ~DeviceStructureElement(); + + QString nameModel() const; + void setNameModel(const QString &newNameModel); + + QString nameManuf() const; + void setNameManuf(const QString &newNameManuf); + + QString description() const; + void setDescription(const QString &newDescription); + + QString nameType() const; + void setNameType(const QString &newNameType); + + int count() const; + void setCount(int newCount); + + void fromJson(const QJsonObject &json) override; + QJsonObject toJson() const override; + +private: + QString _nameModel = ""; + QString _nameManuf = ""; + QString _description = ""; + QString _nameType = ""; + int _count = 1; +}; + +#endif // DEVICESTRUCTUREELEMENT_H diff --git a/models/devicetype.cpp b/models/devicetype.cpp new file mode 100644 index 0000000..5985e77 --- /dev/null +++ b/models/devicetype.cpp @@ -0,0 +1,31 @@ +#include "devicetype.h" + +DeviceType::DeviceType() +{} + +DeviceType::~DeviceType() +{} + +QString DeviceType::name() const +{ + return _name; +} + +void DeviceType::setName(const QString &newName) +{ + _name = newName; +} + +void DeviceType::fromJson(const QJsonObject &json) +{ + setId(json["id"].toInt()); + setName(json["name"].toString()); +} + +QJsonObject DeviceType::toJson() const +{ + QJsonObject obj; + obj["id"] = id(); + obj["name"] = name(); + return obj; +} diff --git a/models/devicetype.h b/models/devicetype.h new file mode 100644 index 0000000..f655cc7 --- /dev/null +++ b/models/devicetype.h @@ -0,0 +1,24 @@ +#ifndef DEVICETYPE_H +#define DEVICETYPE_H + +#include + +#include "baseentity.h" + +class DeviceType : public BaseEntity +{ +public: + DeviceType(); + virtual ~DeviceType(); + + QString name() const; + void setName(const QString &newName); + + void fromJson(const QJsonObject &json) override; + QJsonObject toJson() const override; + +private: + QString _name = ""; +}; + +#endif // DEVICETYPE_H diff --git a/models/filterparams.cpp b/models/filterparams.cpp new file mode 100644 index 0000000..6fe84aa --- /dev/null +++ b/models/filterparams.cpp @@ -0,0 +1,54 @@ +#include "filterparams.h" + +FilterParams::FilterParams() +{} + +bool FilterParams::isWorking() const +{ + return _isWorking; +} + +void FilterParams::setIsWorking(bool newIsWorking) +{ + _isWorking = newIsWorking; +} + +double FilterParams::priceFrom() const +{ + return _priceFrom; +} + +void FilterParams::setPriceFrom(double newPriceFrom) +{ + _priceFrom = newPriceFrom; +} + +double FilterParams::priceTo() const +{ + return _priceTo; +} + +void FilterParams::setPriceTo(double newPriceTo) +{ + _priceTo = newPriceTo; +} + +bool FilterParams::getDisregardState() const +{ + return disregardState; +} + +void FilterParams::setDisregardState(bool newDisregardState) +{ + disregardState = newDisregardState; +} + +bool FilterParams::getApllyFilters() const +{ + return apllyFilters; +} + +void FilterParams::setApllyFilters(bool newApllyFilters) +{ + apllyFilters = newApllyFilters; +} diff --git a/models/filterparams.h b/models/filterparams.h new file mode 100644 index 0000000..5267e90 --- /dev/null +++ b/models/filterparams.h @@ -0,0 +1,32 @@ +#ifndef FILTERPARAMS_H +#define FILTERPARAMS_H + +class FilterParams +{ +public: + FilterParams(); + + bool isWorking() const; + void setIsWorking(bool newIsWorking); + + double priceFrom() const; + void setPriceFrom(double newPriceFrom); + + double priceTo() const; + void setPriceTo(double newPriceTo); + + bool getDisregardState() const; + void setDisregardState(bool newDisregardState); + + bool getApllyFilters() const; + void setApllyFilters(bool newApllyFilters); + +private: + bool _isWorking = true; + double _priceFrom = -1; + double _priceTo = -1; + bool disregardState = false; + bool apllyFilters = false; +}; + +#endif // FILTERPARAMS_H diff --git a/models/location.cpp b/models/location.cpp new file mode 100644 index 0000000..0928550 --- /dev/null +++ b/models/location.cpp @@ -0,0 +1,31 @@ +#include "location.h" + +Location::Location() +{} + +Location::~Location() +{} + +QString Location::name() const +{ + return _name; +} + +void Location::setName(const QString &newName) +{ + _name = newName; +} + +void Location::fromJson(const QJsonObject &json) +{ + setId(json["id"].toInt()); + setName(json["name"].toString()); +} + +QJsonObject Location::toJson() const +{ + QJsonObject obj; + obj["id"] = id(); + obj["name"] = name(); + return obj; +} diff --git a/models/location.h b/models/location.h new file mode 100644 index 0000000..98e3772 --- /dev/null +++ b/models/location.h @@ -0,0 +1,24 @@ +#ifndef LOCATION_H +#define LOCATION_H + +#include + +#include "baseentity.h" + +class Location : public BaseEntity +{ +public: + Location(); + virtual ~Location(); + + QString name() const; + void setName(const QString &newName); + + void fromJson(const QJsonObject &json) override; + QJsonObject toJson() const override; + +private: + QString _name = ""; +}; + +#endif // LOCATION_H diff --git a/models/manufacturer.cpp b/models/manufacturer.cpp new file mode 100644 index 0000000..6d9df58 --- /dev/null +++ b/models/manufacturer.cpp @@ -0,0 +1,31 @@ +#include "manufacturer.h" + +Manufacturer::Manufacturer() +{} + +Manufacturer::~Manufacturer() +{} + +QString Manufacturer::name() const +{ + return _name; +} + +void Manufacturer::setName(const QString &newName) +{ + _name = newName; +} + +void Manufacturer::fromJson(const QJsonObject &json) +{ + setId(json["id"].toInt()); + setName(json["name"].toString()); +} + +QJsonObject Manufacturer::toJson() const +{ + QJsonObject obj; + obj["id"] = id(); + obj["name"] = name(); + return obj; +} diff --git a/models/manufacturer.h b/models/manufacturer.h new file mode 100644 index 0000000..6106671 --- /dev/null +++ b/models/manufacturer.h @@ -0,0 +1,24 @@ +#ifndef MANUFACTURER_H +#define MANUFACTURER_H + +#include + +#include "baseentity.h" + +class Manufacturer : public BaseEntity +{ +public: + Manufacturer(); + virtual ~Manufacturer(); + + QString name() const; + void setName(const QString &newName); + + void fromJson(const QJsonObject &json) override; + QJsonObject toJson() const override; + +private: + QString _name = ""; +}; + +#endif // MANUFACTURER_H diff --git a/models/types.h b/models/types.h new file mode 100644 index 0000000..669460b --- /dev/null +++ b/models/types.h @@ -0,0 +1,12 @@ +#ifndef TYPES_H +#define TYPES_H + +#include "location.h" // IWYU pragma: keep +#include "department.h" // IWYU pragma: keep +#include "manufacturer.h" // IWYU pragma: keep +#include "devicetype.h" // IWYU pragma: keep +#include "devicestructureelement.h" // IWYU pragma: keep +#include "devicemodel.h" // IWYU pragma: keep +#include "device.h" // IWYU pragma: keep + +#endif // TYPES_H diff --git a/presenter.cpp b/presenter.cpp new file mode 100644 index 0000000..6e02cd9 --- /dev/null +++ b/presenter.cpp @@ -0,0 +1,86 @@ +#include "presenter.h" + +Presenter::Presenter(QObject *parent) : QObject(parent) +{ + client = new ApiClient(); + window = new MainWindow(); + + connect(client, &ApiClient::devicesReceived, this, &Presenter::onDevicesReceived); + connect(client, &ApiClient::departmentsReceived, this, &Presenter::onDepartmentsReceived); + connect(client, &ApiClient::deviceModelsReceived, this, &Presenter::onDeviceModelsReceived); + connect(client, &ApiClient::deviceTypesReceived, this, &Presenter::onDeviceTypesReceived); + connect(client, &ApiClient::locationsReceived, this, &Presenter::onLocationsReceived); + connect(client, &ApiClient::manufacturersReceived, this, &Presenter::onManufacturersReceived); + + window->setClient(client); + + client->getEntities("/api/locations"); + client->getEntities("/api/departments"); + client->getEntities("/api/manufacturers"); + client->getEntities("/api/devicetypes"); + client->getEntities("/api/devicemodels"); +} + +Presenter::~Presenter() +{ + client->deleteLater(); + window->deleteLater(); +} + +void Presenter::onLocationsReceived(const QMap &locations) +{ + window->setMapLocations(locations); +} + +void Presenter::onDepartmentsReceived(const QMap &departments) +{ + window->setMapDepartments(departments); +} + +void Presenter::onManufacturersReceived(const QMap &manufacturers) +{ + window->setMapManufacturers(manufacturers); +} + +void Presenter::onDeviceTypesReceived(const QMap &deviceTypes) +{ + window->setMapDeviceTypes(deviceTypes); +} + +void Presenter::onDeviceModelsReceived(const QMap &deviceModels) +{ + window->setMapDeviceModels(deviceModels); + client->getFilteredDevices( + false, + 0.00, + std::numeric_limits::max(), + false, + false, + -1, + -1, + "", + "Сначала новые" + ); +} + +void Presenter::onDevicesReceived(const QList &devices) +{ + disconnect(client, &ApiClient::devicesReceived, this, &Presenter::onDevicesReceived); + + QMap devicesMap; + QMap deviceModels = window->getMapDeviceModels(); + + for (const Device &device : devices) { + int deviceModelId = device.deviceModel().id(); + + if (deviceModels.contains(deviceModelId)) { + Device updatedDevice = device; + updatedDevice.setDeviceModel(deviceModels[deviceModelId]); + devicesMap.insert(updatedDevice.id(), updatedDevice); + } else { + devicesMap.insert(device.id(), device); + } + } + window->setMapDevices(devicesMap); + window->show(); +} diff --git a/presenter.h b/presenter.h new file mode 100644 index 0000000..8cd6771 --- /dev/null +++ b/presenter.h @@ -0,0 +1,29 @@ +#ifndef PRESENTER_H +#define PRESENTER_H + +#include + +#include "apiclient.h" +#include "mainwindow.h" + +class Presenter : public QObject +{ + Q_OBJECT +public: + Presenter(QObject *parent = nullptr); + ~Presenter(); + +private slots: + void onDevicesReceived(const QList &devices); + void onDepartmentsReceived(const QMap &departments); + void onDeviceModelsReceived(const QMap &deviceModels); + void onDeviceTypesReceived(const QMap &deviceTypes); + void onManufacturersReceived(const QMap &manufacturers); + void onLocationsReceived(const QMap &locations); + +private: + ApiClient *client; + MainWindow *window; +}; + +#endif // PRESENTER_H diff --git a/resources/images/device-type-1.png b/resources/images/device-type-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f554bca86105b3437d262450a4a8eed2aa043b89 GIT binary patch literal 13711 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 literal 0 HcmV?d00001 diff --git a/resources/images/device-type-3.png b/resources/images/device-type-3.png new file mode 100644 index 0000000000000000000000000000000000000000..bf6115bca06f0f864528154ba7e25d3f2390e137 GIT binary patch literal 9641 zcmeHtXH-*LxAqR92nZa3BSk4n5b1*SUIY?AKtM#0qBQ9oYN$ypcvNbncO;;Ih)9v1 zU;$3(y$B?N6zNEB$+yvWyx$miykp#d_s_iy7<;q!T651e_ndRh=UMBinTY`l6E710 z04xajHFE%<0dHx5Q}p0v3pscIUT6b!5SFLFpNLb=e}n%s`oV7p008UflRrqZIO{pE zkta~kI?%$`H8A9^zY7o&5+dd9;~C&|*Uv@D*WWF3RgD(_1Odb~ZA)a<%4B$zolEH2 z#+uC`cDboC;2~d~@P!20k2l{EZ)$5>R?%_NikF2AdX&}FsJHDP$DNkky_bG;_2twQ z6xN)zNq+w9^+diFE&C}QK}DMHG?-=BVU%6?S`fwhniC8b-W;$}Hy4J_m67F!h30O< zVp@*Ml;<~_1rb=-|HSVz%L_~N{>~TtRNiqa(Oc650$0%rj;_IF2y@FYOq3(AK&t>O z*&lCkzY}d3{`m=b=X(`xg!usF0t{Tf#=(97-n6T9tMopF?3`6xP(qIw4HwM_O{&Gd zt2BaG9z}K~lU_f1@YL&TF&{np*(I_Ed6V!yCOi>#vrV7egGNCNd3LdNqfo6gdso)! z$n9RXiLmR5^B7HivjCMbD>+CAi_3V=Udx1(TGB5vlv$!L>MbP1 zZ%j)g4nkj9FhbUd^@+vo9YSbN%sKS%n{$b3kr(l|I+7NuExGaEyTSBz$~P29U_Z4$rwx{tYXZ3WU76F{b^_XV4b7 zPtQ-={d$<8GvjMZ3VnlWWi|q$h#+6*s%y7G*f=;2N$DXG zUP&7jGWzs~+{}u{kdmJsMtYGNb5a${T%6xY&#nS{7Gh6YhaQJ90lv8RPjx+{ z6}r>pQ)f(7;~yKDENcZF|MYIs!IqRY!Q91?H_b_YQ0#Fsk$elV?WjY(}OQ9*gUnq7jpZQj}uv-7a~e3S1|Ik=uK9Hd!^X0n&B-Tn8{w zPnU&>F+Fz)3EE`^E8f}kCn$JNTx$R24`-B8h(ef&lVJihQNmU2-=4>PYczWMvZ7eD zQ3zq4MkA*vFQX)vWmtDl7s|KEb#=7ic|K*e*FONm^8LsT-N=BxxGq3wxu7@47X_QQ z^H1(M6fTaIljF1q<$PzGZ}vS;m#eQ~b5^d1Hm=aW+t`Oh*M6wG%3OS80DluXe5bqV zyP-4%Yx!{8t?GtE(QZ}!XfNR}-{watHMjE%;|l!kwR~pPfjj5k*XHLZR!TL0bOU=A zJo`f9Eh$+%?B(S#H+oh2rS)mb^lrY~!9RvMP_1)*x8WFR7n7v0H$629u56+n%LYV4-svhKU5=Y(~EhGC9Vmappk+P@&o9LfrC z!R$tdH8Mfhfmd=N%>R^ERP5_bpa^?T9TggTdb5fCb=RiJxVn)ZErcn+O4$c4|Fim2 z1fgsWWMpOzl-o-9w|{ifF_eJJy&CLJ^60F`JbJJ?cD`;4N2Vvv%4X(9W^|pi8W^gJ z{gw|Q&Q8QVG&GmuWTML`s=neB%&<8pojDY9NIy_Y$Yew|7Yb1VIi6HSPE%~TStrJP zt=hg_=wJaX?j!mi2dH3sj#E2aQbYQ~GKA8!!dTbxKimcfea59(Do%DqpiGHF~^ zcLrtT$^ZBm-TIxHXb?@$UY-oQdCMKPe|VdPMH?cRIuH3S55QI%{b8aXBCUGYs;$_fg&w&;(8}yu3;0og=mq1TeoUTZ=cl6f4R*ps98X4m6VNcW zZA-KmNP{6>^ri(tLkATC6u9g*Zq#^1M1yIjvNYhF&?jBvOyziGgY1^0%JR9t6`M%D z6tL!S0pPFAF28f!*pNVOe<3`j<1(}N({8mxU;`bGo{9a3u=vlx^53`4pgF`+JG`QH z+!cJSuiu(i(ATFtn%iNWJ0GON++Cj`)Ls8frzJudQF5IgO?wdDU>$WB8@PhpcZ-Uu z4L|plAD`?UPa@WTZT@&W_xP;$W*qUg5dyo@RsQNpVCkD$E#J5nOHiZVI>8uNe2;(uqRJX!gzC-z!&h9%+HEsiNj0!&ng9zb9( zIs^adHfaR7k{Ecm?vBY({^JJ)5m?L82NVH5KW{;DMp7ZTu(sfs+u97DY6gZG+5TEE zJu;>;kSlx0pPtYwf4o-`4`l%&5nL(y2JEPXlPqK}jwpG%Gq%ZI&L>VshyFZ*lbDqU zwnXfdMoF1_x?EBk8XGnU^Pr&f6-pc9i7k1a$e+wc(LZ^CV6X-n$wrF)D^GEhr-E=O zMwu`0e3a$%w(jxd1p)k3=fAALt_m=_+R^~qX*NktrmV<~Kbx5a5%M^98|IGgMs6B= zn&qX{)9!a8+o#`v%kdkddcVWx(zKE5G3f!w!&!k16EtiH%@d%4oUxU53-b&&%U)fP zj+QWuxK1>;H-#D>rA}6szQ9cRjJtN59DVb?>K4%Vr+`aGtJ`SfUHJx;4>D?_0&@2* zBgXMM`C0>2R^#)5y?=ei61}N}Gb{O+oL&Qux3&#Xr)wfR!u07mOjDo} zFRY|3BthWSo$$r9JOaJ3QBf5JLd+ZTKF6jp@fD#fPWdjYh6Sk--<5$0L&B=jag*H} zyK1#B!7#+o6`32Z_hI`|Zx7$Q9E(MNQUng73|EZn)ELm(?bpKTKVNwy$!dj|x%req5JTWg* zw&K0p^-MKAjhjt!d(D08MKXvB8Zbi_=)hErBr}lKBLPH-c4Q>f7`L~ASCeVUFj#X& z3L+0F^0bXH_RPHReFW)_2`(4t=numd#)kem^E|H5tTX%)7I$DK7TY&@ZY!G7lg2IJ zw(?B%N0@MOaT5v1F)lE(`dNRbH;1=)`D4}Ps@}#=XZ=@I%U>3U+8}RXai57vV-=N| z=AzjRl}?3cazgil!-5-=^y^{?GFt0bA4v>-;zKj$o!k4;s{@Tx_X_o4;d|2gs!-C) z!5v}l-_&$`Iv!WKVT!sXVyeESP9KKNrEf^>q0uxcwYFOP#tK+c&a(mYxEpUk%<|r% z`|eord~a{U$P7D7G&efhU}2FpO26mx9`|poC(@7n=KFz4GiB%!@bOM*DggM&zQb~| zDP_n6u(o9f^E0RB!23d=u;N911EXbdbbVur$feO{7xl~$jk7BA_zyB<%RH$XY}pe7 zprMJTie|p(reC0Q8kd80ThX?uIWJ#+P^)pqt7_a$du-K{z6zP(pzVY$$Dw=-zx{Y^ z#&+qd%i-L1OtQJAD!GGz!r6g{HIMBQB>a<4UO85o5d?6aAlHQ+i1mVJDvBl+Sw(V_JLXJZ7!HoanrqmNy z@d1%wfXS@%!SOE216s3^UHass6V76`p9-PKE?p`q1nYY7^}1Uqt zCR+3di?OV4?!#{uL%9>U(T{8?D&W{r&X6cuL{HxG@&CW zbcU$m$c=sWj1DKvCNGeIS=tE2!$fUK`R{M^!iQsxt@xo@9Ld*tq`E*}2aC4Fh_{ci zR)vN$sPmxehnK4mHpD|TS{}i9r^JXmIey;M1 z8iiNP!lItX(1%+)EXE#Py=1}T;1a5P;^E%+a#Y-Nsk$Vc{9)<> z7B|vAIoU>D_w(2WK``4?h=}6Rl4k$FWU|$mon;X;7k;_FhL$H&Gljl2tJ+mR#I0F}k(1ub8A z>>DCE-^CGA@Y-)14{S6xevoka`NNwa6Q~sv8{1b`kSRNBxfB;4A8tB5 zYpeBcr$zoOFWQ~p{Vlt&+zLv#OThoJw?ZxPj7m3+n)}fI1CF({$jId7;pe~mGHcZi zKy#R=B)4E7Id=FjD*Tn3qc>xVmmq!;X6tjb*a;eAC`;89RMaz7%yisds zWUb2ldR8FuN8|bgeN7XmTtDg5Y3MF);AWV|#-b9-sId!;V4`vW+jKn&e{wY}7e|<1 zU!3UEbN6~9RvjMRuz%#HX%aHhogk}<-nV?9)%E%d!^|xXzYT`Hk6hHx&+#z5m)`nD zLmoX@%9#$wookO$l)3k`m{xElXQ71h#}XP#6CeD>d3;Su!HA9ZOjl?skq*lZB=TfM zc&w}bkPk_)E2BeiqCbD#{F8}Jf0l-feuMjl}<^qFxdQt zCxkq3;dxJZ$5-q3Tcaln;p{a}Bcq!R2ljzm<|e3s_3guvfdyg7YEFQ)z(3~Ry<1W1 z<4HDPKZLGs;*Wuh(gU8gsI@~KqdTnU6LrLkPffW<>*49;gzXxge^g}oO`m(1$$kDj zdDxfK4&9ynwAthBn5TL4T@=wj=;`e}^Y`QDN}F#sYuBeku11E9c04dj%_iJ<9{;V* zZA4hI4?dfaCrvAl#oCN9IP$Ishh9yqD_ktV%Rvo3}O z1=`ynzbl$-xI9sjEpn^uJEg(b?c2+O^pN&^ZTWNO&fVT`*S#Pd2W@7ubo2R(-DCC) zL7p~-(v_qBgjqVwzzoW!?kA8-ohYyHbnD`u0HNUP22T;x!4rH(NirM5kn&O^bGp3h z0(v}yhw)7^uwI<-Wvy=cSWeN@s4>c5KA5ui9N)ILhlHQQ;&>G_G+If=L#YoHw%t8E zrXM_?`g7dydJOHb4seS1*z^8GLdtq(nE2&=Nb*tXm5gjk@ z1N;2ar-=lcQ-HS98Q;3~iz;(X7d8$k%^FdDUqf_k5@56K$05`N3gx@oW@mc%A8t9x z)I`FYlL(NG=Bzy;dOqN-U1?C1QIq4e)Ws$V2nh*Ipmy0FdNj^VYFjLsL4`248PLWC z)JvBx?R9sNj2rE-Nv0oAYiGd*_HvRsJGbL5+|l*@X9)DA1+!!^z6p*I`LFf%b^4wK#z&X&fEGoDWH!QhmwC*m)74%{`c3$c2fr$jh=L z>3CvjUC#jLk6*xsVyq2lUL7crL5-re$j90RC~!q?+#M(7iIVBAA( z3-FiQswxh5hlo#cKtRQqA+-BrlwJ24iQdHMSn}U_(EnV1dtUtZV>g`^6irm z3EfD=@%E1nc77}rp&zO}uCaYEJpUKWuLP>KQ-Bf|U~$KM5y?7J1sb=xP$Y+^Dr!4^ z<{V=d5lA@f!|Toobag5-Fl-AV3>^-aA1XOhZfMKj`}cEUk%JWntj7?R&;V4#(wczN zKVBe#mAg`4%XA(;SeXWleiR02|H~T(qxv+j#DMQnTfYB1bu+un`M?9LMwb?5Oqgv1 z2H<2%T68`4v2CE&Pv9aVgV#VH#IP4PyqZY(BUD+~PmBg#fWqQLzro3v%x3@@G^IOH zi5=-!!UrrmZmnH5pu$8A#@z%yUocQ&uhkr41%j>|aHYV65f;*cUaHZF1P^)u?1V^H zT5d0lqg^$ShyD`Tsl>i_Q1a)mkKwZT+Ql~zwjN};w6yXBvxJq(Q4eP&9j)?d`%+P> zBbu!<;`|8E5pf(Q8p))?>0A+e2eIV6&bGHjuNuU0v20KWX3=$CB9Ha47z&UEs zp;*qa*pdnK&i*OGLiU-N8Etuwl_Y}PFYg9eSYnNH?YD)Jgb|793Xx&!-S4Uu*wd^| zbYaW0mH-p(%!4I3w(6ChfpnquX}t4rKitsIUC zkQYY$l_67*O`_yFFg1BouX?z^uE+t#Pz_#l!Pq{0lcaU+-{q7~c>gVI9^MgQ{`stw zO{YM_zOT~O`hM|<$z9m`3~d~3bPj#mele>2m8IB*!|v1t{f74e&^PM?qHA= zE5BC(Z);Ta`~I>ZbV)DO?+D@6JDN77NL3&DD2mC4IMPADkGt?mV7?%CFVK-03o9(W z6Mai1#A@4UMzI_p=Zji8NMJ8TTfC5B4W%{XIQg)JWoGD_;l)+)7u#@0IPf~X4=nfk zhsVct_F{j6pbmD$9e7>*yU|RdU$#kQ?e$8^EZnglFta!jaPw14O-jjdk3Z}R0(kw; z@1BE$a0`o|OOW6WkCWzFdic@0Myv(sJQ-r%H=CIgK!y2WO2Xi?_M<`YjYWnXRX>W) z(^g5}&SqB{(@Z=GlGlSvaI*7n?_Q{?sWE$9nMnAD_LukH@VI<7-QGorxWVcd)nO~1q<%JYjW66fYVlj7On z)dn;U(!T|0R8@aJOd^c@YXn=U0OQ21`4c6#RDNo(*Ovbteb_fVp7Ax2Fv9dpav%Wi z6iG^U-8_!*h^1||0{pg2u{h}9u+`)yq(q**Hsp5;q8&8K)Nl1JiN*_I!Wn)UBm?(j z;1#%gQ=UjrZwNXWOUp!ezwDW@g1}l1G`Ez-(*!f1KcTr!ArBqE z;BJ(0Jo7GSR|uVVGU+5{O&&%GGoItG*9c#!SeU4y3WiQktmn9C&j`!;gq3{ELP$mD zNrDk;{+5%OU_{8j4HCfEqD~_^M@|PI2_|}}@ZuG05EmBaZpiW{ruj`n0t{hM(sQx_ z5pnR0(EYo?!|lvy!tY*X(lkr&S9P$k>%~EOj^4v|a4<(!*8mbYe|E=@Z*En;mV;vHt%-BvpcU#Au5fR4Md0m`b7w%p#NjO@ z472vh6iNX60^nb^O*M$!w`!u3K-TO-tH>qp^SmWC$IWk7yuw$1^vWti9z^&n3but3_;*A|N1M5w^d}!@IyJxqaG?x{4aR3K#<@cALnNoz%U)Y(*Ij`=(Su z7@|aYvgtSpL0zJPCi3KOdPrIAmLnd^Bzvl_S3&?XJ$b*^6zM)dzk1w_mpQ-l@&ODX z@9TFzEwOLQ4cv%g2>pp!>)$4($PvA1n=9r`m-&EJ^mp6*mAmue(*E<;sm8bFYvhQa zZw9osw*B~Vo!a4p3K21#04r9zuLENHdSWAcxudE85W!-d)B1{KXV-teYouba<*R6{ zRfrQU=zHeij^M3ZzP!?N$DjB1xHE^}e1CfAd)N7Lwd021`dT>EdB*doRd!v}aaJQL z(wxY_@dmYcqeksRG)GT_ICDytmaeYfZ3I@t2NJ5z*gdfJr;~G9KE)?2*r&j) z%_zU&V5KJ>O(Km*uda!y3Ru&fPjWQ?;ao{Q+5*G1vwhBfNtmGS4SDNQuE-#aFz*tB z+}c#(LZPFfm#Z+uDIm3is!9(=yQ&M>i4c2u7|Xy806DbLm=6qc!U(X!K>?_6LHvdm z6d>qoDXz0Na)9A1DGEiwT^dMG*>un`PpzN#bAM0`N{O5SnG1Yc=Sv*vI|<=(>jJ~R zFoM`^LVieCd11%xFOJe!&n1jOLOBmZ`2_dc>GFKJy}ciqu6zYOj$#6nQ? z5q}f;(AWCI($`?*HFSV^i3kE4HTBSPX9v}_5-B27=DT7_GY`S*%nECRxhp5uQejRt zms5&jmi<@rML)WAJZ7fE%mItDR)Zdi`awn4h_+p!l#A|egPu4)AOO7$OR~8fnl=!Tf&TlSi zveCOX9ynR)M}pqVqOL_P)eJVPBbSG7=Zd4t#;Py^m1KvD6CfLB^UWe9^J7f3V-b0leLK}8%+ zS_MM@uL@!V5#q#XP%%UV1Z*ILNeICx2_|6>LdZS5_tyK__s3oLU)Nga)UI8-zP(pf z?OnC&!U10|!=-DM0ssu5y}J$qfJR6((9=Px$)xvlNTp5Q3H_{x6slh2d8Dm>YVQ#; z07kDCKh$*_BU6NFLfIWi@h6_3B!-cWgT%x{yJ$iTIU?-TaXTU@iYaql1HiW&XxEOP zlk%kfF%N@}pW(?vNhIHW`!`(ZSOKp(fNtqAh+;o( zYjxAKMOjaDrQ}Dg7MD(hsE)*JM6CR8mdWq|AYKcRBH;+e+I-PN%_Pa7)hrd( zo!cJvTx&=lYV}skVf@CGLBPSd@46@*8YmFS(tJADAn-Sltt4pPcqZBiS)C;}v{VjG;AgToOlDAvT6PGR(a%8xjMm~bP#A3Ctr&w6o@@?0hC1Z| z+rVqvJCXo5f5C?3B7KTAyPpk`4#JxKq`d|aDBxdX#pgp#Sd+WapcGPMV{F!3)&i7? zR?0vz*`KZDs884GNKS5OFnkR_ijslh-Q}^hQVi*X`xIqgTP=W{Al-?O!IrB_Pc zmot*sodD=W9dagit6%K*8y_{|X2I0zOeLUCOMMkDFa=CLw8fCV8!FG5P^0ifMJLA3 zXN;Fo{Zl6!46J&(fbcj(SeHR96Rtc#(#0n`x0&1Jw!?rfaL8|s`ATbVX)rk9@Wr%4 z(WsHz1Vl;aj71OQX*p*C%yM|_pz9T9%)7i1h`}+xOF3~BT;fut8yXFKv8;=#hSIOb3>fsWejP!AxKqn zW%P}q@d@g&5v>)oB`8l2_U~XTT$Vv{>`5= zl3&A_Qfc~MU$umsd=d{}6Tu#M-j!vRvHci%9>RULuuE*V0Ol`cd_HwJFF^F##$8Cc zpV~3|CN2Cyx;Sz3yKB)&^3dvGdhPs#rm@iiq@^b-$HpGb1i@A+=^*9)8HOvlI=xz- z9>FY+R96w@EO)R!;={1j5t?jC+_LySiY{d($iyCL7zrqEkp# z_UH`j@=f%>q8y~_{BiTIjH{=XgWy~4mFr^ss5?5tjF<`eb~;D;BbUTnb}!*ez=77= zyn;T;`9YS9PC(mQK zB@<*mcRaVdadQoG|IluaceI)W>6_gX^$rE|qIa4qi$nl|Lxj8vaJa@UgZ+?WS^fPtegvK`s5HZ<{ ztbspfvNY_Pxlg|WC*f*I ztf2B9U&3|VVhzJAD8Q$f2#Z4C_S8KWBn#A^h?#6vA zOjp9j&$kh2JQroh&00t0n9x~UJ>6!Z-dkQHtG4!}+Vj1NoeP<|$yn>;IJQj>O`}#` zx2MIgGrbP*J&OyWzVP{0n&Fq*7&h}0op5j=!`kNA$YmEr2~G7gV?8LmXs4ELrkB5im;ce?S=q!uC}mfYc#bZMBI;N_an#kV@MWVc`;7-WHg&5&p@ypO>}^` zl+WkSk1_{;E6~)+JIRR~XA2}opTt?S{ZKwj^n=e~&hchH@>6+%t>z%7xqf9*B~2+SAVz<8$wt^n^sXRL64 zM1|8Qxvn|AgK{I@cI;k!ZQexxtU+O)vjm>A>dt!O6r zj4=Sz92Y(=x1rHpvap#O`V_}s$(T=DK86O;6e7I*?d08%!6uFat9zMS4Nr-pi_0Mr z6%O9Ay@GEuo94pO3+%)%1BF<3U($ZqB?VW-U!F?zChdc}EW))x5ycB;bdEH-N3Q}9 z$sfMc(P*QKq92~e@bx7@>8V|g!2D>F9IEep5eT@%1RrOMS}c-Clo`th3q+QZSR+^K zmg!Xhr1s{Bu5>1kghr^J9Vmb!J!?1Vf!k#m1o-h$JOMv-;piBL8UwR0>in}3xX|K0jZt8uR-!V-3R4vbRZ%T| zH~)gWlRX2tL7Yv71>r~P$MtP(&mC{Rfi)Y3pf$_U*1J{dy?p298Wgls|?vWqhS_;53<9|e34sAIWxb&?F z8km=~mkl>Mf$81erYO@m*{@Z55UH(8>7xiQJDdK_4nckY(f^-@bae!R;SIPiV?ke* zKu=HlE%@SK3TDEc&^v1oRd02;bvfAorAq}m9)p@076O38?&Zp*Lv=w0n(XaM^)!CK zgI7s$x-f;vFL1tD(Q63`U+Qqz;}LW(;E`!a_vG&JIC%xok@thlT?V0Adf+^uXZCovsj=F>Cg_2Os8jcQ5c5t>mguH@nZ&Rm zQaGFryAle2|D~aK(WgRvNf7*5r+N+DEiea3nyumS={9%G^w$|YYzX!Fh97>W#f?R} zlu*9Q$8+2j&wk=78RKgvcjgH9=+uFIJy%7OJM7UJuNow-xr*5x_Pnk_jc*D!4J$qhNe`LLqF1^hb$`ueHb9rpC9mH;p* zOoAKJL$sIOmSeni>-5BSi~G)e5{*AUYw9!j6?umFlPu+AL!mM7uR^W{=^^OJSm}pM zqZIuwrd3*hn&^n07D=A=r-y)Ln`w6>riuS9?@>FseO$u5T1|XsfG4a(OfFj-TVjj+ z$xKi*1k?$^Fm3JR27D8B zo!!D@t_ygZQGqG&CLu%7o++iXtE_ zp(90*5_<1tPTudEzh=$+rmi(>&9GL;$-U>EcK3Pqv!AoW9%w34! zq#V<|2gT>}*=eY3N%UzrDSWmmCJ(H}>d;q|B#%?2(bVHprzaiNtXt z+fnMwrQGmryWr_G;Ga1Y@MN1_cb=*dRcV z!pPi0kfkcZLJ@5$zWO>%1a_#LRv*)i*^VHvOWc6VIZ7D(RuVVP4Tf4^{c4iNzXeFv zZ@|%eJBIthIxcv5C?lGmp~?Q!Hx%8n=?elhT*eu)cHq8AL8k`iJkj{w7V}&CxNW1_ z4lX-K0aeUdA!FfdED-JVCA8NLrV^>6_4N+Kt}}o+r&4$;g%mLbuA2*MoX zapGbB{LB(04drP|ph1_Z-9$hLNm1PM1M-l=$)l@73o~s3TwDWP>d^K6!NEet&iIA- z8q2bdH=8PXOw%^pwZTg0iAoI}ZBEjwX$QrcY5vunuF$Y^-wU5QyG5lann`X8)73k_ zNY-+TK2hxm`*Iwnop2FSN5-H~409!M{k#PVI=t|$HZi!| z{C1qEG45W-869nGjI$^`)EYsBT)Xdj%8g|4ylP#6CC7LwZFsvrCnU@ z?KU$Iw0lhv7dqZt8rRQF&_~|l>=IAt#2bph#` zA@7UiQ$=sMP84whnETA#B+xVGm@kGfi}!j@CBpL_KuxG5EG>icI|#k+)`Zo^a3|7C zGcusdI~h;=Ev+OdAa>tF-UhjK6TEx_nuPsC1()9XLIo<9&%(BGjoV9x+Ergh3vi9w zN|HetrU#tkW$Oc$4kKpJca_87FF|w=DgX8BdL|}G zlod_R8`Iz5WF*>&EKr@Pg2IdYk!*%qwcdX6I!yevhv5*D4<#%X=!sMB_++=(0wy{2ShzExh)#<2 z^k?@of!9MLdXV>uFf=7se8+HD5A5<5X9n>9`aKvZD*XTAf9EWHQmzRb z&KaPFbH(7Y{O>~0Bja#v4Ob&C!3E=ae@U*77m`8ha%#k)USa?6vXVk*?;&o27!hIO zJ8LL^U574Ux?{F)A=~OCgdwQfRFH7SDJ{r1_5GzYBf0_;C~WsqZ3_mW%ls^HI~W6r z)E@+E^e2oB(nJXOJm}sSZ^+R3pYLO49{lMef8o0Rb0NYaBl;fl7MJ*lhl#$*z@I4{IGFq(1ee5?$7@~`1MQbu$ECUDi@ZwTrYjL_Z}`AoaJLw#gQ zdczFY%orGM*}v~E^W@1BJ~1)<_V$L`5M-4$xfVaU7CG9Wq0wzo_6w%d|_!`@A-JZ*G5u_f!O(}lyv90aW{!HXhC_P6^Vj^L#AFQy_lP5Wz zt8YhHe9nq;a+Gp%a!hKRQ)0ApFi~!6@y7&h7(`>T4rYF=N+b6o)?yu8dzIrv*5Ya z7W39^0xj7b%3PR*?DQ!t*FJ2_v^n6g$jyUazB4x<$fmNo+8&>)(O0K6nfZVhODlW) zfQyT(R6TF~&S^6x$zBu5dO6lb;?9endAzZ0YL4s7ch^k{s5JzOvgY~<`ZnWpr+gqFv!8P0oB{K~u4Eum=L7U6Ld7)V-lT3TscU7d3y zoE_=oZ=_NT|Q$E5vKOYnZFg*A^DBl^Ql_c{FjxQ4-F?SjS{(P^_G&95aw;n;&jO`^4>p4R`0?Yx z+3AVCiHYx&%j)nIq%?*TQ6gMMh8p=1#leAqL!lSDy1GoN9TN>o%?btw%No77ZDM0% z3yO=?DK884Cx}?1ro(vnrKQLBrJTT!7qAeg8gneC-BawX$2KUiE+I=wN=)id1rvU2(y4)m1ZI&(FEP>40}~U@oLcEJ0WnEQi&#f$4GhW%n@vH( z`olR0vI3nObR~;x6&aS@M&yi%-o9<$opR?8>_9Q!?Wfjv{AJSNaCqgD&N!94D@p8x zUKQoNr6FNlCWO9XU};%q{L#kPV{=j$i42?TN**dPC0#4=TAR>(MT>mTutE9`*pDU+ z4HPObCMK42$32(D6#u=lu#jKSthRT!BobH+&sX=0oB=0HuQea-$U?(86&2b+2c4FB zy1LeqZ+M6U0u<%`B^gPx(1g^Cb!#*|QbWVT?HMFTbssnq6625eJv=;etx?Qi13i-~YdS1E4r~SwUZOg;^O@pmLPVb(*d{H3 zPLoaMEVmtRAUL=k$LsXLA9x539xAu&j2GVfL+RgOKVIjN%ki&^T24+*#C6qZ3*`go z`n~%6DqLCZJPg`!Iyv02cW`jO+p}@!PF+U63de_!u~7*N3OBvP$Vp7}4fE!!U53U6 z1|sG*k4{FL0_tgG_O0S^N)*J-w9*516SFs%!om($${$MBXkCr}OR49#wC_UJ^rOZ~ z>(|cweA>F~bQ@-~v$J5}a?7I)KJKm7(f%?gcKgpXeuR6s`EYcv;FYDLF{q6~efYiF z-OLXkaI<==*3=M`q4?RVx9`oa+R;wIY)Rm3{57e0mg>nm6DR0)~fjYKt;=Ce9w|)`Q4n)%Pu z9v|zJILxz+Xlq@ureYdJl@BhvkkNmT*4xK3Gv!BBEI@{;~OT?KNwb zOu*s4_kmnqiqBkPM^BG9;%oGW4y@tg6=$KV-0;zpNRLx#l_`@ zUF7+`>_ks|uoF1&JcrUx+}za-?_PcRqG0Yz$Pw||j3>U-^E<2Krn-5W1H%>89Dz>H zijg3w0A(?cMZMX%xul4h^QJIT=K>FDZ;IS$`=$8?LE+hQHh z2-XnoaJaitwAC%8Wt$#Qt*WL5{6L}8SardN4>~(LJGnE62L=Xln_FA@W@g3m!RPD% zn7bae5{-ST?$4jc)J!+;DZZjQ=om^)PNwFPyfL;bo&g3?_s)sOSoov$2sZ@n!-=BW zC8A+kUHcD<%2KfIbXiLz(vkZ-R316GW(b%}#S8@rOnD{%=|=&Hr8z}&d!6&BOf`~*7Bhg&r!R@fueXKe+Wee zHd|IzReg`JG&Nnyhn`V_nf>1;xe!H=qNJpx%D@v}r;!gzz$l2^$ibnAUp+jSILBSp7W)zmmlH24s$+hgQOJmCeU&;tb$ zwej7Mpj$`f4nsoYZk>X@fM-Y?kjhbk7{2c<(=F6eNsawbsd?^<_a*WS(qwU$!JQ$? zvVkJQd2=$d({OQ(QS8lfVU*uN80ELonJ0)kwar0WO0I zG~`ya!1dRyRFD1R(cw@F7xDMW?wG!*se|MjAk%nKo(rzqoAA@OuyB?H6`qXMxD1sA z?g)?v%LBh2Oj179DcoFqc04beYYn2F$KT#C`tA%EYP79W!O_^!QInI6$RJS!DMa_= zmTk9QKtLmK*K)A;qPE?vr*aUQ9B^4NP{xbg{d`E$J33l;+0wrcMFr%7L@6&~T%g`| zqx+Dg-2cE$=7bcj1nTeXj=3a9JWSakw;K8IB$os1KPK5D!Jx}>ybL(72&_H2VEcl_ z&%t7A-@~DDVc_2j^YeQFF=y@C0z`qA0p32p^(p51u8}$9xjg*)DLx$l;yV`ch#F0p zoH+As#{{rwl_&x(bZyqq(69(N-Np1tgGrL%4^P6gH`=ZSH4FrKLoG3&n|BDQ!9LdN zW{#Fck_YDIh>hWt6jsK|m+KSGLA{ItN4xr(nwqUMMTLcC>KFZrg&;sM=_9*3JKaSt zKw2hm~xY3^kx_b@q_2~-DZrBEB8K74Q08z*&lvoV; zuNPa{Ukl%a6FqmRJn)m6sx6vC7!u(X5zz+mUKGt)0%$?*Ewi*Q3afY~4`htRj#O;s`wHN|c&o3yb0YbRkY@-~*GK;#^x~1)2MOr=v zxQC5OG**rCfDd9DnwTi{SQ;#-tkk2XrUrYXB@h@J5k@7K%fGTV7SN`89dERCuI(*> zHI(gTp%LIr6($5Avmo!`?o_EN6hWt|vN8eKbE*#Duwo8_PiMZrlO$lH`|G`2@KMD# zfSW>i4nOq$9dfx6;Jw)G+p7m-rd-lo1R12hrGFI36bOm*eYd*AXZMaYlwoKg2Y_tJ zE=>ixTGIMpMRRA2GBYydhAe{`OB;7h^bHIO3kw%_2>3ip4!dw{+4xl}`V0zS;DVM- zDbcd%gt@(=D*uDc?uq1AY5*4Wjg0c?IqvJJjTX~rp8iGN5`Eig6nl8+ix+`fD(dPa zoklC$QB){2$&|clwWA0E2AO^B5p@Ame4wH6j&L5DVh+spxk%m;Of+w02pR(6XHo>3 zhUm}!n>zM}5L&{0xcs-OiaOX+aw!+ik(d~M7)4RlhLX_Po*sWucw)1AgLucz(XrR{ zD_{b!%dY<+U`N78AUd9oj*jiMpfghtlob{ir?3N&#z4i_0yik#9RH8OIN00cij6;3 zI*!}~F|TmbFJ)Xveb9+2P7#xuZjgtV=B&-zIyBJgi)^iZt zq{{};KAZpgXVTQ;Jyac*g7XrwVI&~TP(j;ra&bAdWPDCS9ez4ojTO%~)GQ^a zltbi@cFohzcgH=Js_gU2ZXw9mIh&i!S;YN|-?7LH-Ujv@h9W^bb(=>u#4&);^>25y4=6^;mh@Mm@Y?7EOj2Cw>(lj0 z-`x(8e@{))_h;B)=T=$KS<7dDJtCQB8H!>@AtB6Shh%tdx_NIVx~$dE-`U&KENhDc z@o7UWTb4LmmZ2hF!yJMU+V;<%S%==KOv%}8cd^-DE&_afBPdQIG$G(C<^I%Cz41(-9U@rMx8XNC0T=+-5|Z*L&V!vWRCdki_)?*X{|zXy{QKK>!-7 zc5=Vjz%7rXoMaj3$+GX?L*uhsD_gOg|DeT8vx#Zaz$o*^SNTvm8yi|K zZZ2R-Lgzyi?o+ma_$3Qy0zA6KYMAXNY{uWeE?RwlLCyf7Myfyb?0i4=G5N60=ybSz zab?u_;c;LR(vHBisB2Vg9Vvwb7H`^?Dxuxp&NuFP961!2pO@~h?jmTMZ!RTJw^Dmv zO-1Fw+4EpA!nQk#pfAqPQ&vMzk$~`#pU;*o&)ja_ znfcicwlAkMa5?>O@+~SZH&gjv`7eiEcJIBtKTUz{6d&v^WyfR$zwVff<{iCgPVREj;)0KczmBy++9_Ie5-eB{)2du_hc$)|} zu2(K?efb20O3+K$%2;(m#0#3rsw$>2QmeKIgzv#@e5&S0xx)`o!?l9DxI`0E)19ec zTINXx*u?ht;zYJFx3<{$KB<>ErS>7 zg}s(qSGvvsw*#uJW|@p5-og+%#+=SQ{vIn}xCo>@AZAYY&gZb~L?@SJvPxE#KCW6l z80jkQ+WUPZu#aLQo$y{!a*p>=H~rA5Tmdo%ei3s4Op}jaohJWGl`;hCmZxObEer|H z(D3x^8=?54O&9LNlg<>)V2RB!OD(UR=%TKJB zTPj{?OuS#o<>9qo`i7>~k|drEc6K70gtNxI2|P#S-RbYK{Rg8n1(@+4f(e0G7H9n3V8?+0pxz$uGMdmYJftkaV~T>J}1+i*wznMW5W~ zRWbh#`-_XO=j7!Hh=~n!eO)mGp;xPQXJ=;>n8sziKOb8u=B0w;;YC6D%WH}j0be8g z!K7D@W+U}24VOk6LVsm^R@_NeJ}dtEiW&$jVwV1O?_Q-!ah#P`JZ}Fh07#;UQ*h3K zI{6R;Ua5(RNq=u|#^$D5p3BzKTlAOtO`5AmBa=rwlX~9Ytn_5r^b8E@0t&KC!F#$_ zRASr{|2`jEx!-h?0Z#VEW#{|p`N@VUzoci2iM|^L&5I@9C@ZTRKQ7uAX|#Q~56+A? zeJ?-lo%)LEV4AnzOq~BVUi2KCLf>}&^;GivP_cQvfx}R#7=k0|R2hc}IGKBX8grt9 zyMoNCkEa-JP6>|ee`&YTSoEh`>nuB``6!KW8*+r!JN)o z(E!QP!$p;ui$GA}d8Pw#g5$~y@X1TO?h==Q^49EzjOS|@?&)J0O1XpkXvVt!Ru1Np+G3nIkH@?~p3KOJ!yKEXl#0%CEGtsl^Q>dx zySl|rIaU;Z4FvCk@F2QM^XM-;$LEj(@W~-@&yZi+Qam-GW26WlIY7@hvdt||)+uO1 zzk{SKXv&qy*#FB@^xSk3Xi5b51bY`3pd9iOn3z;GHAN7lao|n$jt;CX74TfeZw3kK zc?<~QU5opJdNY$m4;;;Xciwd@nOjNHTyGJCS{}iONcU}}ZXw0>a9%cT_K!>Ne0o3@ z&()v@y5A86|Il4fl@U~xtzS9v^;w-%Z);&oVrD^&(Fy@syf?;O_y&T)^{oJe&av=c zElW9;<_E6maAnA0Y!GN1>=A%(QG!TKdbf8x*V;-J5E-$psL6kEP3ZbIa6x)aB|lMA ztSx{f>a?thBS>A}kU&OH&D-tq^t~4V8|I(X)K)}+(2G*6e;_detyx%90%A5$ZAwEU zib@qw6mX_DW=!|mZPPay-0$e>6#w^qdh@L%^9T7@?Bkk`>@@GLhS%8)eEj7hbyN)uxiV+OPLMlspd22GfM41e_{?v&&p-BE@d7%f$|sQmr5O9|m2v zq|cEERVHF87w0-hOVK7J+~c4>S-nk;b;hMx+zGS2R7$nK%VlV{|D&%D8C)wm_wqv0 z?#!7Of)w%N$8shS5Q~@7{-HBZ)34-iwKKGeN77Zmg}@0?k1mSAEtmJlR`* zA_@0ox%=nYiAVR}h;NeA_n6j5)=M+Mc537x#AD!lr>_9Gitc>By5whgf>!$!I(%o| zviL%tdS7_YnZAplkNH@&v-VD@D!!sPDj^2jFhS0I_i+NZhKy;R#zEX)e_hmQdqK_% zO^B=EbTQmWX6eo0io6IJ=U>B_%2Y#PGg|t-_j7-Hhf<74`w?(OF8w)%lTRh#XlDgj zD77HQB5J#1dH(WX`#g(-Bpt+F?K*zt|Fi)407HNlDkm@zjc2RrZ<*b{cq2SpwfPrx zA4}@$k&TV@*E)m~u4oVF7(SHzA|oc+UzBT~N4PSmqOPjrY|*5ni&s~E{)9MZ9h@{q zGdf1XZ;&HNdWjx*U4-=9z485Q0<*{R#w(7xA{&RWOTPjN30Dk^KQ5X}@BFbgsrG)p zxMZ)@5+_|TPexb^e3$K3vJU#E#JVlyD&uk?(^?iJ_c zX%pWSs>R<&fu(H5BX#Szg7N6$i$L?&P!2UkB3F;As6!ME+XaUfK&<8dM5Z?TQ-QYZ z>2F4G;3av~5U$=P&pHD~i|=5zDG*bCn)4`Dn{>x&eCC^cEY?Wy^wV*s@vqM|emQEM zvM~bg6)qK+QDS;KG2#V?2iJ3pxMn?`$T>KKrv+~AX}`gHG*TY&UVAQU(KmG;cK#g6 z;fdm2?fY|mxY5z9#K;L-$#c_JWHTEH#VY4c9Qqub=R=KjbUs8}k?8Yuf2c3jE{CABqP3Rf$j03z zS&JD3=6j}28dV)N@x*Xi2@G&q<=nx^ioLV5o0M8>_wgM0KVZmFsxGs1Hz&tdA}ueo zv^zv}fySds?B4;i*te6zC8^2!?_fw#NlCdZ&YwDCKLPltze$@FNnRCt2@Yi~j$WO} zlu-%*hmMp($5Xc%8L$57Fmo>EklSY5lQueVt()QbnGLi8-`PKleX=rT+i%tJ+K)!D z?ehysSAVUJ`Uk&eE&bXo@}=s44q=<_73JTgDN9X-x&Q-?~Sl9-(%U{SS)g6!i8&+iNzFnBn>ca~Q^#KB-p&Z6^AuO!!@YPj9 zlyQ&JEW9IOrfq3XYRxmiLLxqKM3J^@pCyM$8;A-uOrqZTbJvYB>sL<&g{4Ml!8ur1 zURuE?N(1}RmFCdJylp@g@MTv6bsF8=vOTF#UGKj(XEt{S=zdjZb07*H;_(dynmPuY zq-W+IKu(ynS;S0}6??|s*;e(X=8ZyC@zSA)%@TWiM^Qv)C`e|RotrJnC^yP(i@?9s z?OEP6lpY!yu%AfD+Zn_RRh2k?1hQJ)&VF_0kDvWh*S?ApqstD$yzl0qy0vw11j`@~ z?)T1{^$nYQwB#+x(@h{|7i2*1&om}o0OSEkkN-`1^*_{K|EDTUFuXxo`I#pFllD53 zE+}8))*=m3aP8lsru+mZ-H17_m2%1#*hpnEB2x{hz5DeIA+iWEvNl|5-4@g`@tEI)Go)hTy`JG|j zc)whbcNIP%hJY-Ufw_yTQ$WyVL6G2U*(M0NY$6Zu;jV#vWwas-7j;x{UNRkmm@E7q zE1N_EgM_>lfKv_=fF=fXaoos8s(A>lqK{-|FPL~ngJSPPfo$p`>?LGgG7Skte;9?G z%~i~>1`Sl-L#lBhTqMs!sJ@%Xi(KUD6!L8VFulsZME3q6)=sTd1hlO~o#Jy-#rfW& z+iFRFuVw;|umeB)IsIqNl>t4xUW$$8(oX=Dk1Et~kCAK1G%rZAL0+pDV-xoK3uee- z`zpx(_H9Gap=dz1wqum2Jgx+@_!FF(B6Uiz$qW|7X7&=4b!a7Yg@7UM9R{Sh_B^`; z?T%!vbIUeI>p4kK{w)U!4Y+{Oe2;pA?Ss2~O3YiouK-QGVh$1CF&4JV`LZV9W2)2p em{(%!45k<(WGs$;EenVhgjCYJSE^w3;y(fB&r7BN literal 0 HcmV?d00001 diff --git a/resources/images/device-type-6.png b/resources/images/device-type-6.png new file mode 100644 index 0000000000000000000000000000000000000000..c4fef450fefde0cf0f064639351d489fd8cb747d GIT binary patch literal 26079 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

G$!lotetQWQ4X1+I@Hfv-u-s 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

S6adNt4sXi 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 literal 0 HcmV?d00001 diff --git a/resources/images/device-type-8.png b/resources/images/device-type-8.png new file mode 100644 index 0000000000000000000000000000000000000000..2ebf3e79a8876b8d03a006910da47aff27721fc4 GIT binary patch literal 14969 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 literal 0 HcmV?d00001 diff --git a/resources/images/question.png b/resources/images/question.png new file mode 100644 index 0000000000000000000000000000000000000000..4efea09264c9c552f43c4be348695a669c33d6f1 GIT binary patch literal 49992 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 z zz{u5v$=XDq!|3pi`J~^xT&?u2Nu1JnW-s1r>KVo%k5wD|S%^2Xl}M*EU3iVIjPaqf z>mbGH`8S%e*MWd>zzLPzOLe06YJ5Xp(WdiYJkWvFP6Ul~2>ISK!b!=Ve?Dw5x{+yy zXTC(2`fzl9WO^9nbo8~#08!P!53}H0Ktd-6@p|_fvu$4%~0E? zx8@5UWkK1Q&c#Q5jFnCns=4g@j>*p<-0BU6uIu*PEEA~qU_zgtNzuR9=!yj|nGqF? zFoM62GJpO~D7r4b*d!&EEx_Y{`3l)Fy&PdNmT++VY9lQoVZ-i(&&BnUt>L$$PQK^6 zFf&D%;Rfgq3gIpjV`(`{dS~B{k9&0#g=NPwkn-E=j{*TS@0wb+Xamm?k4SUBK(1mG z+~~_DG(N329JD+OI;Sd)GcQDPXm-Z4BX>Ju`N1-_Mc z7BOFjq$vJea#jSPq9j@qt_VAsMf%*XWLELa9>0B7*N{^ex1kxk96q+%8FgUJ5t3FY zvmoy51;ym_FRK1xVgS*OaD!eEMF^D#R~>zf(@;*o*SDohhYW2xt8j+Ddi!cVTwuRrUP}F>I_GbR_`2a}uE|6h=kn%r@z$ zA8g`@U}&hTHe~PkIgTWC_CizZC2sMS?&Q8(-mi~*8P01<8Tpv#jP9)u48J)lY9HQU zQ)Fd2ukSuMFAKi)??{7P+##@3a{hHxxCwK05~0>w^>p(>%f4vJ{gtLnMkv8evI*um zJRrMdtq~adYb7_)Dt_VvO}A&B7kYxk(`ye;uAU>?tcC#8?sQJ4oeAMVO;~?vlGPrQ z{dON3)U?V0*}?>S&H?0Ui3SXxNrB8NbsM54fRDsMSqdIYK%4OC^f?iS)b4Yv2=VEM zG?2T_e_IZE%E3J2k$Quvx;kXezjj@jaql&?=OUMW`gMk?S7QE1v zEU{0aC**FQiNl>R>Yl0f4~=3M-A>(-tsMTfjHpcmu@2?}va`tsr*57Sjy__+1NJr; z9a%(Q6SNESBXp5BD@-5Xv$h%V514_ZPT9OTLd__fv(>vOtx~VvnE<};*lI0qYg`yH zDw>Ax6R1=j`tp8Q-o0}(5h9(#Z)fb41^agdtI`GEyJ#8e#^f@k&UXCUI>uzHF2lHe zr|n89A#sNvUZc>-J^3*U+D#;Vv?Bb*ko}1l=?2rbstj$41IkmnUNuq!B+ZHuW?s{i}OxFI%k0|wve22Z7 zHJ_;sOr~QEQUDQ`t}H?PSU}0T_&L@ zgdmtd-IeRVO2^d&sdRykskxiLZjW@HM$d4J{@LgOtEp$3mWfs(u~o!`S{XmSB?j!z z86z1D)oJ^9!R_apf4GOk@o|0X*XUjUHC8d4`iI^*R_D$+_5Q6fF#OYmNS98Y0L4uC zOhx^7{dV^%Ct%;O3R&n%>#%YQB2_d~aNf4>+I6V+Ggo!TG%q9mU?s^(6oQ z48+^~^MTA258K2fh2N@P;M0$@e~v=|>$V0hEz~F}=oXBOPVESesMq&Q*)4oflMZJB z31u07c?qKE(I*j!*M(v4F|xBeZ~odo2dQ& z!-M`Y$`4zM5y&Q}h0Wb#dDSe2CMdij!#!t8Qt?I(E3-Agn-i}wKC68mBD`ZxtM z!q9_@Srq|ET<47j7jfLHST+nlThKl;MpSUhdOvWJcw58 z4yA-TqyFn|h4?M-8NNlgqlhND?D$B<~_g zAU*&}g2H(s#H0uGQz1OYS9e0WK3hUGw*wkyS)LL&^DMf4*=9pDeqX9;1x>G1qh3C% zPX{xgGaevy9j)8qbvK+BPRp?Xt{Wq+3yiScI+6)vfwk(OQL6O>Fh}d1PPMfN2+W_I z$TRpFtOexF#Y~}9Jc9)3*4)FnrAw_@N)B(2 z33=BJ;HR9i>f_&pejCbqoP|?R&4I}}q%@z*>HKs?;|&w&*CY*D0pLBga%E3)-`HG* zl`&w`SJ3qyQG{xrfBi6&!h!t(j=}x;L-fzb!t@nUn!M;nz4pFKMo))GKEcb>&!y!n&;PQ1>^mNLh5f3g$xfYsj3u-w|uo z=h}6rL%(M=59lEFkd%Dwnw}k|MJA(&MR#>D51>`D#9|?Q z?YJ6u)Gmoy#C|$q<+2dvC~=SQ>uwh_JzITQxd@S-1V9mej1GC?F+5A`OST9^Hod+z z8Nl}l)7ScB*dw9M{rg~V^~gdntpBj5?R6?NF*0#G~K1@1w)PWL;G91|a#)6LvbR zr!-L4V4-ak!=UU(q(ZFcZa0vV7f9wE7F1e1z;bkZFDVg03*TS<_7{6M2jkiEuf$90 zL!Gg;w7|RF)^Eu21RPJqhRNS5%+7Wo&Fn_)*I+47X)?Ri@JP0JDkagkxVK5Ms~(?w zh4PQtPyv*w$n05(?Td;*m3PbOS$WxtzV7=7s+d>12OOys!E7khFXGZRFAB^I!HDB&YV=nQWlps zwJ~YMX+QA?SQ?p4vphAf&EY=+!)KP)JcH#dme|dIQ(s+6@{QxL3g9K{oT~v0>F^&0 z)tYR*dg$@#93unThsF?Eto>8JALyj4y4^T0vRw6Q7KwDNccb!Ma_OQC8u<%l*)3iO zOSji-R^*oveK47iX}iNj{3RhE5eMIK42UW<7S64kILyHj&vYyPAqsOJj_5_l3}(vV zB80|&z}=!7-3tT=?k{lxhLL!hKYPSZmIg69?P@K2gL$`zT5PHFKm9%Xh6^Sr|21iR zlGp9)_bMcI5JVVu0Q*?8nvdiL|Bgeo#c67BCB4qEA7P}9106h2M9>g^;aK{)A%XqE zQoPu-0mtwOhuD+Xx5* zO6*0UXw4{}1(IkLe{v{eB9xZ05C&)@d;bSScSx^Ms0)1dw=8Z47)h7WWE;6njhs%(m{|uSat5mChuc`X-Nlv8Xq{>A*!1?>ZbSB0XDuekPy) zXkJO`^pC`6v+_X(h9qS!@R(UhvnZ{waRKVr~5zTASDA zMQrl4SjsQPPd)4JpBu|6PG?3lwSB&ikGTr~bE;sRHHCzL6<0$;t5+T#%cM@y`z>QZlK1T<;c5s2*$e|Ru_Qj?G)Cyn z@VqnGDfu@qf({7)w{FfAbt^Eg0 zKL6cv^22kfK;7BWI95rEi#*qkG(!22F_hm4hqHcGZ^zu@~~=1cC;?3~b$b zTUV%$6Y@=jO1F-Qafk;3!(&hZs+7qfN`vU$`qo6ZSKsaZ1<$MNcq%{Uc-IKtm%A#jwsG@lbRmrVJ-7K6+$nO-!csxgUFGMclq;KM*}`2i=SggI~|PkL_+jj6+trpO#2;^FWAOo*LiUPQT%!z&U$tg z=!Jtbcj)xYiWwnGPPH4-D?xbrDvBQ*toTwz00pVaBt$cPtF29zok>FWVa$5J>^1Po zb-bp8eJc(4$6i@BF!0_JNgPw+i(J}wmVXmAFE*~*k3-ZQPkoObQ_UXxi#o%ZoQ-nz z%m)bXPnPZ)OG7%`u1^~ikZCCB$TjpjhU!Liu;~uB_bsvDh=9gARadBLpCb>Y^T+J% z`>m>GGf4As3t=I{xxBwmND=`+pc&6h`eW7Eu`84CB>S+tNTV|>VX)WF$|XKVngGC= zyzb;;sYC+sj{&|NCRT`&9z4)PCN7PK(#&=EU{D^RvZ8vh`Gcoyb$pekCI|x%4$$#h zhe2KvR5MP?z@~MlaPVpeTx;m&=H|-$qYnqnHuj8^fPhIE)9{Mzjg%VG5dwF-GSUy; zdXpaGsI_Vcbv%yk9xPY5q^gj@Gr)}Z98)$=zhLU~RD-2=bRomPik2p-EXPISQ>RKn zV~Nmb&JO8S-{;YCQ{I1fOo80|_{naGx(L8H!$Nva6+7UFAi4*(Qs$X1UmhS9di@gf>fH`L6p4z-8k#}FLP2pZW61{o2s#iBrCdew?S!+u21!q1XyNAlNM`O20XY)e+7sPP~G zZ7x;d=%5uXLVSoMkVPzY)Ij-smcp_KP+&wQkg7gwD(6w{1 zHr?7a3kQDQZo9&X{-MhTf(Wp4g**Uj zA=PWI0WxET;S7!;Fr@0~ATLS306Fb7(!Acggb-YK<*V3mxRuoFglr@8)Fh(yn48H| z&81|3)*8>yauMQFqT_W^!BcFFh9@(``V~wcO*8}*!fRKYo~G{-5FN;o0H^CL6Un=I z1B@O4-vQUU@PzBfMXKcdrrVv1&Xz1&QQArB2H3#M}D>CSuO zV!$MCnF63?N7SUd#HpVI>Ul5-Gt6Unff*cQ?>mk?Rd9|c<`pjIU;Ef5VQlzFq#Xe; zjyL6OGh6{VMYoOw8*#{2I#f8H(CIUZ!MUj4oVLA!-_`;RlhhD^d_E(@;{rNUt~U4; zTFcK@@yPnJK?$rAJVaAS&0|QutLE9Of733Rh2Ryaq*{81FVmm`QqUDUuWmo=z-}BC z?oNXRLgkX>NYJ}tKeqvE@eri^zc$Gb6V*oOtBF0A=47EF-`vzJ{r0JNNwcPj5DRXiFJsk_|us zAkh_KNOHVNg)xUFDt&Sn5%`Xjecow(aV`F;JU)WyD;EKv48xBDki^cS!5e9EA8{i1 zdvg3__>~;*rL;c80Eu+NhQ3us2k1lPWQ%6ajf>#dfhb~2Q&(G?`udE@jNn#76aa8? z$}n^BD{7lv_@cW>g#~@oe{YVRCkD-RKP;k!Ou-Ff zx^Fc1i|C{15|E@!&2Da{9wou6)$zzk1b*CgcFl`ZQ{xtwjB+Tmfx?bu^h3zk`Nlvb zgO*hNA9PnM-tHRpC}E@_p!H?~q~-^GDIj#AiML>%9uZO6Z6{rj2cjiCcqP@EBJiaN z1&SxLt~XaVc|u`fH_~i>Bi}@wW%-}lfu8GQ1~mvMx24aN+p>6%C6GTnVV`|L71n3H zM2D(?t=Qnnd8^eElA}L&9vGQ=me5my#nKdj4<4HeUWWzN9PUgu=bIZUW8#g*7+hH( zu=2=YJeh6i{(=wR_MHE&fJ1MaTc51?OKSo^=?emQ5d+v9u}MmD*GY%|UYiy>YBpOL zU{WfN3;{0-J+GjE$HY3S`ZF=;7JTEohBrX`eH-?t?N9B z1ubistgtJ8hAm&0JztwMUpHp5f>@IinN1#FB@9TFfu1i&nq#Gki5sI!M1ehWFt-O& zPjAOtlZcTR@={WdG(mKDm@AUS5HFhyd@Gld$2Fh&3t%bM$^_t7LGs^rg?>v`VD9;* z-Cd^JQ>NWhraSI&{~1{)dUHa8gSh9rYmYoxQ+ER5%`MaXN3ptp%XMQd{GU86%ongr z7t=1uw(|4K`gkFx2n*9hI8if_R`W4y~vwX46ry1 zus&~+&DN3WXma+uMWhlb937U)>n7m?u=86!zK@FVGHU%ns?+7YwPPYJGH%vi^ zU~n=N(Z9&!GH!HqZx1147%683co@Bm<7Jz|f)YTnSkjQX$ZNXCDs|B51*a?IHZxwa zHQ6Lt|LyvQ894CQh#3t_zEy;1Yk%@JFRm;hjuBN|fny)eCmbH3=56A8R)By4pn9V! z#l!&GC)FB7%kr^KpS03nz60H%i7C3(D*0cAh;b^pvUkG+WSTZpg_DJ0Ge@#Fv+UU? zKgPNl9!$lpQq`zYBl6uS;OS+A z0&`(K1M1b*Mg~?NFHfG)6hoBssQp-btxPKv{zax6$e1-lC= z0p+@qr9XD82!r_lq-JVqnRX>z6zx)H;=oJny2v=I-{JgkFTf=VA~>ex_;XYX0h}8C zFGdVxgeWFLTFOa)VV72gR~0d_;C?hq^ZNg&;B#)1=8Ksm;Eu-)6~;qXOwUyTA%iXs zX{MK8^nk(4JRtxyLIF@BnJ$ylAtBS$wG1`X@V(gjCZLhxjl{ zHj9oGNeC>PxRjoV;C~!+ zy|rDk3;rYfW;CAo%)13IXW)vM;2xxd{f-*Z9iJU3;H05$MWG@yIJ;-q=(P z1$`9>ASm``W zps8)wV?Xk{zDy)dBrqB8%IYIm1&-IQx&qqY3@RZfX!CbVHp5uJrqy{VYUuiQv9#1| zcudtr&a#H1$!6-UtvrtIA)_*1Cj+WS8Y$_0qqQe6Y}7yo5pvso-~sSc?;2-hq>_nn2Ydk%`=-j|xNJuU|6ac!+Ckw8l~Ixb z*^`EHJeCh0Oqmh5BNcf`#Qz>m$rR z)Zt-hy*626!nUjj|0~A^*5A6gbZEoxOr1ViORmBEp5*^S(^rPY(KOL61cC*3cXxN! z;I09J1$Wmac#z-_+}(n^g#f|b-Q8XH&imbapJ)E;kDcl1?y9bH>Qqgekgig?Te!qN zTY>hE`)8pJe;>NFJP@d3Jy4dw7ll-0Q^}p_f0i%cAv_C>0K2t}jgu-?mB(t2K^RK+ z)g&3#y@-ZQAS>29FcSJh7)>U=8pq-p!tYN}!A*u1Y(NmAXlg)Vt)nK)x|D~O#xOi* zV(m}TV59ds9EY~*fGQ#sK;YO7CQ9|G{%URq&B=*k)oAl8`lDtNj>*tAtZu6t`zQ^B z(n+JrJsTTv){27DzCl1e;eGeNxcAWz80siTP87SJyWW)@kztU}Zc^X#T4`|Ii}rz+ zO0aXX!V-OtwY*$*+z9VGy7pb;;g0FeQ_F0h3{Eu$!v&G$T9|wwd0j=};+-oY-`30T z`Q5=zT0?XuOI4Cj6ScCF17ZWnbefT8nB0OLa^w#NnAKVGMG{8hCJYi3946dlwUxCX znJNwdMN+v47(Py^w+C;tgN1>KBv7|`+V>6vw zJsVxGLo;*z1lsg?qE#Z|f{q)i6M_0F(?nFiM9P}S3my#RDJQoct0nFzyixFl=l#$X`L-%4_o%F7#d5@3=nR9N_j&7 z9Vqm1n?&aY0`3o7I~&(7f~6;1P=riuoJ`#NGU~2P3dB?sh*l%9w3E0hv_UhNlTS}zukq;sacsm{hL9N%#lNwzr`cY44OPC zZslYWP(FDtnaT>G<4n!Yl1Z4?wfHx=Iz1pNs(X^ycuzWP^3X*oqIaT5^D|neO&BB)vJVCSHAo*sr~cE`@{8h^pk}2hcn%qwP}i#@EX9vm-AYrJ*`^^IK$5uYbYH8<{rt!-@nt}j)g#S<_j?}%_p6imQ0f>dG6*6?vLE4)Em z?|px7@y3Z$Beq9)sbT^*Z)!YV+&WLqU^6Srua43;*c?JGIzY(o%HY`k3TiEWdHUeQVa2=Wz*a)XPa!PU z6zbSE3m!!O^V!@vCIE958brQ|0osb6T5pn~>|w`u8_h}|{wD=la9FrR^}T;N5DI9{ znTN#_6dICczF87cFpmh;*|qiZr@gJQ=9MD2Q3EQj<(+efxz=OClQ)q z#B^KsuZhd0!U)oM{qeT+IZ2UwzTK$AyrNjzyZFngD@N#mKiX8NY&-FdcdV|bR|=js zN^=WIOd^8N92)PD5N2R{RH=CW{Oz!&55eQUh?T*mNd$-FE}cROXdOR((AMG;-d=3C zT&i>M{!Z{+8u%Z*X0s58CUI${*a`;EIi6-;QK`3d@6pyTyhRrR^MUr!dhH@1o@ndp zy60Y*Q2MErNVsET>5Q1fP_d5@#$NF2_vqmD?#YjxQ*iTEFo;uIGAx;yK}NU@%i4Vk z=FyibqH%7bRWF94GQ{-Gd6}j7y6A-|`!tbA*K`d33OX9_!q?7k>6t=T`Ex_L{3Otj zKc$RD*&m7eXVx>X|TC7|m=O<8f@h(d2|!jF{hEeRRGP- z&8ueS$U2L&BxBPmzuX`p#X4z2>k7DigxpHaA7YBP3(6;>@e+X!k<;P6(xH)T94nx}BF~v*f59)X|&8aG*L#&6E0#OZynQ|Qd_V7Sj6hvIK81`(jit6rnugW4f1B*Dh2X$yTbaE^HVleBJh?bbmuc7hU z_0-(hsG;f?G<>YTydsDeNhZJ%G`lM$gQ6m?#x)Vrod%w26~P8^7Aunp3_oN&Ws<`b z4uq~GWs}F`F7ap@IY;MS-M4FL}}$I z`-9+E`BUJ)rc8}Si<3G>9u34VnUEl3sm>kO_-t|Td*9%1PnB?>nH59O&3N|ksh*|( zN#y*c@WL07SX6EM!t&zr6I%rGmK(SQZ~v?=HYSl%1E|Y2rS8K=cDtta8SF&$nP1=| zQ;LEDHDZ)ug{U@E442OEvH433aYhi@pQ=ofvU0%o`hfO8d|(NTsjV*2{iDO**IUO* z9XIbb`YX%6#2b@~qsuV{dhO1Pl;I^VFJn=yk3nf7zcqK-@nSv(c-@%3U;eQ*GPYe0 zJz%4;EnHYQLi#-Qt(-wQ&UF{$EsHv{)ES(kfhE0F>B{ zb{9?D`rbfTj4xIvV!?L?-EO6X!|>!@o2j1h{2XJ9HyP0~B%Kfv(|mu(n^0nTx1V;>G*MxZ=6#38{DY$kO$V+0$+1RZB}fDQD%3vV3>rL!(}wCrmBi1rR{t`%rjp zzy{*rr<^}H38*`FB>{Wj^JE+#W+o@=Tt~s>+z+KS41nR0*>Bpz-^1hkG=v2mt>9zd z_elnR%0C=-`1fzAdLO*at==cXJz9+wi-0XD3rux8cC}f4wZnIIy;$3NTce-ZuNmD6 zDt)W1gJ|16rjy}-TBtz+RmAH}l6~PJ;dp$WU-E%TPs$p+8Cky?UUk2V5xRXua&v3> z*)e}9^!bPL>mDkq3(#Upn8R4!1)5dl4s?*oJw$nPmzq$Ac>Z*^({a5I=Z{-avi|JY zamJ!PEz?4z9e2<$b5ZQhXf&5(hlbt&Erz({yNk`IQAQvhsf?b$-Yjf5A!FDk4qx0zwaY*=W9Bv8Y)%Y27-Oemz?%DvZ6Xl+CL- zUH1&hS$lwKeUo#Kj*i?vCUiLRIpJ;jS=;34kpQl22gONrZ5&8*zsgU3gkp%$_dND) zY;G^Y z4OlcWr2R<25@YwC^55X6@aL&WmmQzj@aY-NzlAXvyZd6q1d>~s zfi$%=+d0R-)tj76{)7s`mPQ{X$ca$CQrYXM@!<1bxw=mm^zSZ~ajNq^85gmCuVq(z zeK=F_I@#N(|2huqUoGc-yZP>5i|}uyU2kuQ&WNdWp^L<=JuxMuI=f>U0@urQ~vr16ToGC zpO=o46*M`f*uo$J8xT~O)G85S1S=-l31~E8hSF+7 z9?SYRcw1(62QzGKp~VVlIb@5GTQZ&P3ezyTJ1yn+NJol`%8o`y$|bcRLS!Gf{%1?j z@Z{I4_&Nq!NA?o$Xl zuQ5GTK;Vd#@5_rwJG-zTAlN<)FNQ_V=W7T3{Wl~uJQQW9kvj~9-2rBCpIBJJ-~M5T zP5Pf@he=}C1-uPZt_HF18UY>koRHh?jzL*L?}yP#VT9xK%4Uw{&PbvtOf<_suGGmfZM-n z#^2yDu`4$Ia)mh|~SU|=XLPiRWPxpuA3 z@)t0OA69b3fgB=g7FB!>qc8};I*Y8nF{`2xb3(s`?#ZKTcSCttHcm;!N#ynjN@bot zWVA*wp_00*Vo0lri2QU=Y|Co#v_k6R&)jJ=akgQ6dgsm+Mp9*e=GSV^YS47P>!kb+ zf~opNM~w*!{kQD6yY7S(MT->rwVx9Q*gCnmpqt`i;uk;1&zO_8+g{er-)TV5pP&?p z@cF)j$6L0JLo46x7_n*Bjz#AjQ<#i)n@2yy^nTWGMY;fYd`Hy=?=!Qe!0;f^8~@;K z>^O*lAXiaYqu;{(?!~=6dwT@zvgdhaRmx2~Ea2drZx?K8Xc5B% zK}qOKc=cetIfvg&qzzo8z6TAyUt)|g+mocZUWZHx`9M^Dz%MXBtUqPGg~whUYJiJs zhY}s%>ORZuHA_VBiW)pcYU}u;Z5geUf=Uh-yOyJCXB^>H;d4@=)7X|)Xsla$D-nMD zis`+>R#Z~n{B!foiB2%KEo>lQqJR!@!H7Kv4(!gGM@~-CplVj?LMNDNEPVTkn3#mw zcb!6W@KGtJqpSLIaecl0qcse6@7?X$_h|N+0m{Fl>jRBVO>B3SuBxkcX=Pi)38oTw zyh404YZR1!TCWqLhVa;7ce>0{Jfn0KwK3qz^EmR5`SgleX1gONx6UGG55 z%xcrAbe5NEdTB|kotA*uQGv?L>a5egtUgh>Ps;qcrxPb#5D03%+P~fU zd|Qx*Qg3!;aXQ~mKwz0Yqp@BG%tpgJyg}m?1B@19JBYGg-0U!ShW@YMlhONIqi2@= zJ6VhD$}5~`@G(feyyIk?PfLsb-`G_XKY{Y(36>1iN24(?a!ejTODv1so6wd81%Vyk zy`BiWn&tWyJ~2R{nKlQ2TC~dcyv9uc_qi2~{=?+3(a#eZx!Z-SIZ$Wg%hu^ULV?=q znXNC^YhSJpMvdW%2WAlWc{H=An!K$-eY4UuUvTs;JUAmakG-(W(aQ8F5!`EXp*>il zA@88yygerXUM$-3{g?~_^^BQ;3U?RdgN=A(cG>}a84)!bw8h2s8rqk4y-4~lV{iE2 z3jXnUm!dV&{M^fgEXsZe6KJQc^FcXZzs>crC)=TnonT$k_hn)7k`)LmQQ%NWPXHh& z+Fa>(Hxa=0xi9vU0Mu`bkrQIM)#J70`DsP*Y@APrjA67PPb)CUG2|n@q}4k++-tVa z@O*_Ahp()nzY4c3KW2eIs;b5=o~L>Kf}Pfp1N5epiXmyf%u~5}d0Vhuk3OiZkUr~4 zZ@nr%vj;d4K9hlRzKl~!)0qP~59 z{#Y{6G}ve=N)X&cZRFw6L}|9#z=r1POUPLC*Wtq4eBa9W7tgMo3L+_1448{6D0KN* zCg5q4w6wDNEI{LOe?NHyvhbj74MPw-{{fUMw>A=JFjnh|LYiCFTXiZPBa(0bPC(FA zP}UmyLgJlrov5{T{+V89XaL=VPV5Y+UK zjAOn}t()vE;X(k)%`X})Xax7mp<^QS&o*F^t~N>O=+3*Ikoc&I9JW$ojTXlFxRuQ& zkwBpE^-Gv@4}?)+`MJ-u=bSMC=rus91M0Wgg!p;OgNe4|;jni5;VZr(Uh1A@1$0#T zu>f$p8K4cEV7tFq^0T*rHuKDv41zVhS$5Eds*9V7!v5kBd(YE(bWOFu(Bsey+H&h1 zAQ*6(FXh8JgBL46T|D#XTK5hVeZNCq_XZ52OuT~&FvACu=%t!x)haQ`g z!lvr)+jTBKNf^H#tV?n=H)QdYpas3WAIMVC4!pcRV3rb%F>ij~cuyNB#-a7>51@BP zY8*2zpbeX?Sjw!p@RADb&#I-VPs?zCu#@Kn*9RF|n}}41zLrcZaAzouig*g#u!^Ln z&Cuk{Apg)P6<2XpAUxsq?@wKMaCtm*j`du6T{7f#T}wt160l^ew_kuFdFk8ut=|rJ ztI*4nsP?7Rp})dCfK7=q0uMtLw819gdhgL*eIr9w-CPS)Q``Cy9tCqTPZAMCqCvM; zCEj~%+(Ff@5CfWztEB@$-R>vbTLEJHqrSCIn zbD0;sk@=T5q#MKBsS`JgnZ4t*Cn5)BqMh=VC2LD(F3hB&&w<^n`Uy}AkaQb z*PBaW-Evl~1U$}$7voT$jMoZN_w@R_yq+_;1vP9EHum)L@o3SZuxUQ!e+c`FZ@LS|gp%p%bZK>d?L(I;<_-Mm`FOPwk7?(+~C2 ztS;|t0K{DHkgomf#~q!8X8Vvy?2BUReN0`#Vx{5)kPc7%Dgk14ib*>As5}5M<$ZgU zy4ZOUaRa3;)a*T1(JfJNSuzC|wyWW>zUTQf$tMlD1zTCjV_S3I$fYQ?3Q>^=1&&rF z$tAxbBC-ynTsdXOiLaw=-#EuR!nuI6qb*DZvQ#gcu_1I%drI<70#E*n$D62mqvO{Q zWdsY#*;!Nef#0Ih`pb;HPB^UEcX;THN04!iuPT%-4JWG#SEqUAO93S-ZCxH-eh& zj9UGQV#lr-%`R35Opxp|7z=+zef^klB<7VvgPtiC=|{f{6({KKvDUN`J2CO_v;X@@ zuJBI8n6~ko}W#`<8 zLV$xo*s1%)VZxKF zr!ipz-vS;^Iqr%6d2pMD8`gB+kD#V#Jx;S2bFS8j%;iR2kUxsB&4eo~knfqn$`Trx z_s6UYU)*vAo6=@*9(dG8XdVZmIo5FBbVU8~&eo3V;4QZ3XQxr}ttV7u^1qgDa@aVy z4tS2x{HC1oxA3aq7heFD^KyoN&Jvg|oHpAxG=16U-~)`K2VMrmcO??rA(;nNhJ$pS z4PRO$5KSR2KuK$ZIb>(wZ=`7O%_>+2A4^0By(%Z7+{gb0Zn6GN!E|SPh=_9?cLbJM zCRlsZlFg*vz0UPw%VA;g=Qu#RaJC-4rWI0IYdt?l0g=|cZ-v)Qr^*-N96i|8_M@FW z2W}oDnQ7*e0eW?Bj3HAr3eYwFH+i>q&Qyn%qRrY+hoYZwgu#*^xk0QWO3SdMgs~HC zbYemkJ3omFQoQ_MpY%;~djC$XLfbV}e^nue!Oh|g&Zurrs?~2A2rMhF-th!~8OS>o z(vciSyAD$#?QZHz^>|7cEg}qn5<>U|JKjaA=@!G&{MCp>g1S8@FL%}^=-euu!!bqDZjV3P09Es zRcGBDdoMOnMY9Ytm69CXTnyf)JjsC#IQq`}&J*%4QC%Beyeg?q8{S5|3>}R{>n^DQ z?OO<5Xj}nxG)CRR@NXZO8go4!zH4Tr4ZPpUP*P;pRRNrySHy(zqn;iUR$OSfg#OFi z8FOK0(X)+B_b5a^yXIIg5D{NVB&^QQIa|%Y5vZ9+mUvBn9Xxl6Gu9nmR6Ba-u~1dj z+4u*f7e4|N^o31?lHB`7vDOG=l#Jy((PGIfCh5Ab3#^U>Wl*T;i6qVck)ye%E;lKl z1EJVpJ_fVgMHq1*syazRXE78_XU_n~Z`srLLt-yEsJg2F!zo=%$n&0G==B8RVViw_ zk3s_ehQH!L>g0RIj!DD$kWkSu8pzr5nz+O3}>?#fXLU`fu8iI)`kjC*g#8!%x;?5w1u~ zNG_eVT{Q^Lh9`ec&XuQD&Xg6*p;p~j?pFQY_8cY_=GS|LyWg`a$_BDG)d9F-*zn;WZAL;V@xZ;5{DBjrfDY)gc@wIhr*!GEQb3~$L?R>Lgg)=^v{uOgW791-8nwQL zOIqB(#cjSSDNHhi`l*(k5gA`D=9l<2KYf7Lv(mebj1(dj&r5{jj5_L=@Vxhm1?Ua2 z*gJ2|>6vFC6M1zZ)c5Oik-PGZr#YND)bq0&{a|dBrjWTwc=b2d9)Jy-^jBmazH~mEBHYc2Md5vmi7nYBWqn) zI?)v_n6+2@tQ-3E-`7+1P&7B`|% zOs;~j7As=#9#CX~ZaTcOpH!~?QHVYRNRqet8knj7hE;bKHF0=)O0??#p|G%S8wS>! zA8U7Sa&`7_>gY~@xETy~&Z*<$`iSch9=yM=eTo7Xzh&}E@w<*eeqQYl@T)6zPUTBS zi9SWS)O#c5RgVs%F+PWQzEt3=y`{Q=_R4?>)RS$&Dagr0_|C8yI^!T0 zb`r9~^ED03M2H9IANCEs4a#9s&-&F9g>=dv*4w*PYz+hno9tX)INO{3#Y@J9E2H*N z%LSks=aP3xgcSqE(e?E^ZkRHJOt?hbPhO(OiMEoTxS?YKXwbFVmD>3d>(cQ%1VE$9 z%gPttW^9K;ilpO@Q}~(O?m`FSzk+%-fDL3{EfnyIwBT7F%8}^svCI*V((5po}lOb$slU)3xM_WA8;Q76dl09m zKH>52w{-+dHC9yn8)_;HIqr|*U8VP%9vP%fkq?)Ki;TD&61#>nP!#?_FiCwuBr)Et z`y5m=^xN)HUv6CRrcHJ4^mT&;vF*#{=2|=`eAc4P2ES(DlJNNB6EanFXX;PTMK82Q7Y3B!m&XZmt#LT1mM4)f+UEUqa} zMn}_6nXmDQI{*5*eZMb1zY~*kH#b~gBopd(z9V&co)xXu?IPX^T-@fxsbA0i^zXPI zm&L+)z-zaZy-dJ5o@OTPT>stQc}b4E`M7g)^W6`;vV{l*J81|i6}S=x$jvS(IsVaP zR7!q!6zMC!v=8JkqMbLsA)%p{v7VwHFRog&BTtuSdtY3}VyLKSd{ z9~T6pqr5$9e$jONwxy(liDR>0w0F_^_HA`~dUO!t6WkhAO=W8rdl&U81JLufqCOLp zt_b82fbV4B2rB*O1hAc-l_O~xg=0o?vN-`mlo=4up&`cIY-7mJ z4c50-S$*t_rJOO_3qQI0+Mx9?608JcNBzcC|AkzcNpe^d<*acAvjJV6!2|vMk6H@@ zxi}z1iuE*tV3yRn=KsK)R7m*EVE23QxbnlW#EPKcQp-MNIU^&V<^5`)?@3HV^mh8i zTVT_?cC-v8op4ScV`NaT)$w!ldW3R~WDRfb%t^~PkCb^-u|9gh9ptOL@jOeIX&`m` zJmP16d3L2y!CO0+P@rGxdLeV{d_a(O^<8@$5f}2i((5x`7=H=}sT1#Wxha!rhMRHa zB7ls^LlxcT=s3y8>klB+E#~V_pA=7;h)%ngZ@&#<_l6?X|I(X1jlw>btu0fuSIZ;Aw>k*V3<5pdv#4nfqPj%5OR<1db#f25IE zEj0s45I%*Z51{;yG5iz*+L4mRrnXq~ZT|~=Bm_Vmm?THfmJ93Fln4LB@6TS-=Z(}= zGtv#b035WxcR)g37~Z3vQI&|CL;(~ZQ;1ji{LdrYyGyf-00X|^2q%WRxiap zvCuqo1S%54%{uV=9{8Mdx+q7KX4w-OL`Kj46F1u@aH;-T8+!3ueVy}NxL=nE_q}pP zYUK^;USrie4*-XTSeecO)ZlT9y!~S{L;;bs`E)~?-^D%T+wJ4JZ|#3<;`B9`zZ2ls zM+qVNLrM^L(uuCe*mWKV51I<2fbV{B@(AzM(sIceklnyUL=TmE>23MBx}I+bqkm>K_T}3!cvM8vOV%IsMG_F6l4% za9}QPLs08{&I{%sP#SH&wV|LaSgJR(jWyG$fduj6W{&A;w3oM}Bxzl~4K;;?HQup8(5SrZNMHoB13wuV9>dhVqa8go$qfyH#-QUhmq5jgz1j&_%nZs&OiUy z*LeGOl-s5!9Xa~*X7T0X*wl?0`*+Dq>Wd=+_2Z3%1O*=g8W{1VX?`o%!0pL)zbdY@ zXs9VJDjI==5|SraPsnAM$U%E^BUin{9wJZWbMC^|60zc$YV|MJ9rw0gB$iO#CR=Y0 zi}V7-z`6Dv?Soe)0tyoO1)FD>g`M8rv4(Ngmui3Oa6WugJH_Elw0ao{R!fK`|77p~Mq)U-$*|i`A}4>WO{`u^iM=Hy##C@*MG{3! zUTA;5dFjChMaV0q@ZU85D6DQKA2)~K2jm+e@e?Sqi#DX(DJv)U5yxo4tlkZX-B$4l zi)6{k3Tb=i%)q(5@%6ban3DGe&8wECo7d{>w`+&cA+$MnM@T)$Fe_jao4jN^bFUgV zm)J{-;rMopl-2mR_1twMz#)H(vtDW;(=ht20Dtw-!R}rCGCXJy2d3zSG-&Zdu3Y<2 zasWF4G|*A!SG3Ie`xf$OmOsx#$D@EZEVci$pREFChKS)%o_{+Zcw9m~4EZ6UD4Vvu zB|HA}7J!V8Hu98B{p^};1=fH@j`341UKPIN&@tqn%Pq7@ z5oR7>hbQ7(%2!CSuID7Wx;CPUy|VxV;Jf|yg$N4f&l6ZBdYoVgAi91%i0BUzLcSa+ zGfZ1+>S$kHbpu@reP}qx+an5-OpNMgT^COo+J9SW7?LNHo83eQbi;YzKh<)$TOJ zVxguA3+p5NgG5^MJFGvX`Nik1InX2`;#}n zQdFv;siyPz_mu%ne^mn2T%;kOLGu?i*4`J@1G4_Vj(Ds;Ktg*^AUVRcsR9t_+jyGUl;e`=)oQ-K`K;qS zRq4k!=n!4ds9pG#MDOHY7>;2hB20v169avGq!?UoqPa+2?FSwrxHL*?1GnW$9vNE~>W1zKN;%c$2lHc!nIef-i6v$z zx#dA;+JeSJm0!nav6$(cA`;Rwy_O+@r`an}iR!+0fuYCwk%OQm5`$S}8IcAS$*HIe z*kSkbq?soNEZ2>Vy|ErDw8W6jk6LOL0H&k)?nMI(N@GHgm`*PKYO@#}kH{=^*b8ew zfqnq-7l=x}i~^?Qoe1t7nlASX;#JYxo>`RzS>01pQoeckwWbNLG;@4=rJ_;J68{q9Tcy^iWL6QQ^fHnr z$cKd{3qO##DOut-UW{QA}R8rO0zlT>A$>m1|lF^%&63~1@ zRsG8>VS$6Ol^iYkU5vw+;=odm$BzX~RMpM{p2Eu6J<%E@!=QX9LiOz1awG1zD`JijuEj@TkGvz6Q~Xy z3D~4H2f6cp7o{A_r3n+q^q)uUxdsCR7_S2=|e)Eo3$KW4QMk^lU%n7&HqS3 zi#ll(I08f}kwE(3`iG^{r5q)PfZCDT>{}4%FAdc_6DZ`;=C9qpho9$cf_UC;ozYC7-EtPN}*& zAx#qY3~1l5I|@}x8M8(aAWc)b3nQqxi~DE%;3<}M_~w#9TozDr z8-@c~a6zzbgD+byU0g)ekL_$h$L$ot>dnNvoSUokvDx{%8t9^9C)K!ANpT~TJd-W+ zpCq#Tht7qC$fUYTcL87PEBu@fsW4?^I8CJ7R6jbSNCPjj`bu$6DlqUJc#+}pg3dno zXG4|4=S9W>UQ-`iW+v%q+69GrKLXphVM_JLoS;vc2j#myX66Qeq(=4`f9meHdHi_% z@oD7QK+75uCFa%Qn?Z*WWZ2{2becjuoE=nx)3%ZB9)UKivfQe(F@+eC?JdmDp6&Vm zo-}b5kKsXFA)`hnGOQ?(l*Wcj(T@pa9z`HNs1T#p??Aak?5H&g0y(8E5x&_#JdYn$ zWH{+)Cpxb6cBbr)p`ZUSq~mXK7#7h#!i z(bq|3faAL!>fUhnHYS5~Snt`2KK#{BOF>@v?gdK^$HD+}M&=T4lPxx+6z6mV;IWp=d{GTHe`>y%^zM$@D`nwRUS9TJV{2nnp5mE$=R6c?9HMcyL+7}g(} zK!7Xbm$X!ntqka%UZch>0O3_aR^mjrj{WY4z3)dXn5C)p@u|KSJ|8bqn#8pDv;zF> zcm$!#SFJ7u~`&=Y;lT9>K5rh^_~wyJ+wL(JP|#1mS-nY^3l?{zA~>N=cmJmtX+>9<|^)`@0x z=VA^)g)EY*H6sZMB68~lbR*b6kx^>}okQn#_C=1(AEg$H0c8j>$Was*QmM^lMV*Oe z7BNJOwtuZA<8eskzsVO4B5eVg?EVmEJuWVu+WUI@SKl$5LHrSC)2H&ZXCtaPIv1EnQ@t<0saJu_T*iwD%Y6j%*H8x<8b#_YgS136x*7hMrq zSESMk(w0Fk7LoWZe7$J72@3DU%b70Du!~o}bfL^*0s?~d9e>!V?)u1!xK_6vX7%Bc z=R?^s>3?7aH_{lXrS^Uf&z^(i!R+j{PaOyyX+Tg1qK7Ez_^cku?R%izFgaa_EfB#M zFxgUQ?IJnAJs?DW=T_HRXlkr0yG~Qk@3h`f{jU%vE`K>$*TKP>nuTY15XYUJpE9g2 zU3U>FP5*2{_8Od3njbGW~ShhbDS9B(S8k z%9gAqHw2iKU2H7Zj^9ai2xN9 zjI^4n)&W$n`ah_~5+e5tg2eKFmTRkjkI}9zeq2vTj08E_2Keqzp1UD3A@LL&@Jy&W z>8kGeL&~UTLql>b^m*(Ue>1uHi)>qHe&Qwjd}tkwH4A-lNVL7S)1B2VtjmEP6tjr~ zimY^*!*8xF>vx0}tI_zCiQYF(w17JIjKkROT6H>6Ln%z3>D*UFGuq?>}wCVE7nob?Lx3gi!5|RZ6`kdjRp*hQ! z?L2R#Ru8eg-Jch@e<}Ww6!Pn!g4vH#O)U#lXZYaaSnB*dB`H!^^27nE z`Nz@xp+$70PDGZ%NZdp4T$kr~O9}2L#KS0d52G_I3DYnv2jLoa`v_%u1F_I6v{znL zRJsUDt2#j{BmIr=QhdN7Yv#)5@3esSUpyu7Dz?&miuuheV29!&Pspb|FDGvYPl?fok3$+Zu0kLEUBWj!Ibqu6zw#^==8~3% zlMU=-ZkCO}7X@8iz9DN$IVD2z22(m8bZseSm2QXQ=q{maVDe$SiATl-iHhvZ7ou?AL!i3v8kL~+oYLXMCO>^K zx;zZ3>T0qm1&ZIq$|+F$TVYB|Z%5Pi#Uf(45(#kSy{lfbD;=RXPCUF{Xlgq)z1ZR3E?VRU3BAJhGd|Tw&SN6!Z#Xsp>DlBO7kq_6>p3ck~B zZHCl~gz-{Pa-sb_NL>x$1yKO$TW?vI;@{O=NPLK6j{{EvIuwXf`GHiFPf7vG&2Nfv zSEA*!w1X~lK8KUXzeW63@DnA&*Lx*z3tcfgfak>{U~PttQN4>Pl*5qBa(j1T%|N$` z7`SHVZr>lu=^|%O?#kD#T<9Y636N!gFU$yZDig%e%vo`u;h1WF5|GCGBw#X0A1Pi# z$swe9cqcKHB_MQu>NaU|hJjgLKK-24e3_EMW0#fX=B8_HeX@MHvQqWNGIh!vq8jn@ z$Jz2OX5tS8MGA8Er5$Tee{uQG)2oAZ6N z_`E{tL-@50xR}RL0HNb??+tjLhbr571R8RwgZ<rO0Q4#&1&hO zXT<$$`8<9y?**MPrj;zwx~5?pg4h>)Hr)lX^nTc=3{$+D^?57$FY>5oBIK3Vby-IK zp`8B;^O($fh91#Ob^YwfN+%?^bG~-+Ve6kc9Xe2BD<*#pvj!_>D2Yi-tUdZ|0%!FI z6^Pgp%p~~qM1Q-kW=?-3Ft7&-v8Jk)q5P2}IMYTIMGyR%z*lJ_>=*$YkmZ%^FSXk- z`d?Sdj6qELx4~@TQ*6=Lv=6{1F5 zhVxLg9?Uj9E!TCs-^aAa(O?x)n5MKmq+%xNf3izpn-zX#3YwA|08zq&V#Uew4&6dR zrP0u_fmXCk@l$G2GW}@ym^JbY6bVu1 zGPK5y-?ViqrO~Y~QT_6@85esi%MA@V6{Zsu7hza!1GP)Sih>6fhes>{6rJxkefMoS zPOq{PQ0?v4P={x4!-48VfU!Kh`&gXiFJi!3KOk|Z{B^4VLBGrbwHpJEYQRM!8exvze!s*ASXa1Pxd-Hnox(g$g2=`Lvy zknTfCcSxsnOG~#(w{%Izp*z0w-sijj!+oCp``&A>wPuVt=9sQ%Arc#+xbID{(R%E$ z8F@vrYERV>VoWzeWM%Nls3hPK18u%(@K5pr+@J*)&a-Hh~ zHV8B?k7a70{-c^3aWD)FKrVl$bBcWzvSi3(Yx?9F8*!r%DS6YhtIDR^FQakKDp1}pErUgyZarEb{~Rtt%g(Qg`xB% z{({?yj2?q}!W0qj_cr5gMczk%NSQ+wUzLYT;xf~|hkTC@`4C7Njy&S2BeI8ujEPK- zT!@e~8NF)#c%AY4)1V2LyTdtcKD>#>jNjv_S&$(lK3+BMrhVQ?sUiwi{c6*YIuoBu zP7}-dj`G!yrMKnH3-$JvRvFvV12V4TAocgsE4!Udrls)ZtPeNVXpX~sx#(z~MtoZD z2E>|6n7I@C1PwI8B(D^84^yv|J4IX*TcHBp%%gsc-|ssb&2 zWv*5JCHCxa#+`<2rt;g!IaTR{Hlz@_Lgktdq#N<>nUmEGLSVf2zc|0Y>kz*iz^E~K z{Acs@Bft2bAyeG&_p$=zdIX?qqv8Q z+`6ltb@a_~QK9Nb{Sg2QM-^%s1hV(#H%=5z;rBl-uY24^wcIJHHrpfQSAOIewmvMI zZqC&I?eZZ%cHpQdE*{bK9SUNn=3M&=llJW%BpmK6yF1ZpZTHe%yNeH*=6@+o(}4po zi#1o8nikWGDKoPg(>C=sh~2U?v##Tai60Nh$ww_sL$n74s~EDfZ_n|-T4EH6)VY5z4ecd2L@xf@lLJll|{zc_LH zvu`p0Ay0rLUF0b%2Swh00fvMaFCFEN%ariqvvcJ#*445$dGO%jP*`1@F;VM8SNJrY zWy|vM@H=4>ZkhvAa1zUH&v@xtr99+I^)Lc{%`0Wno6Hzz8CR5qbKUr6L~X=1lrx3z zI#nj(Ii|V+jRJFXd)aU@l~ap|@S?|QDW}qYO8;KGnD&)Rm}KbH3K>qL9?G1p?|DPI zs7y8noRhgp-8vG0&2Mkn7Z*7Fb4f}@I!Vydplip@(avH#wi>L@6~ifHeZaYA$18Jt@Q340Wk)6Ll`$JbIb9*Cp#HOTJD(}?t1(xjH}<8AWLIH2h7xV4gH2>&;+u*IGLN{ z13r&PIDf<%h4(00&JkGh;}V$C@%Kt8wxD&4wM{PeZT7u0I=P!!-?>))p>U9%h!-W9 z(y)Zg1OQAb;+Y^Hk0~3s^fQmcM?1%dQ7h`sjr2?806fOe(qHrj_>%-foC!)U?S3j( zq#OnNbUnR<%Z)z4SU;d&`21vd+UrCS*`{}S{NpryuMu%eB9DW_@G1SH%f|S#v!l7 z1uquAm+{;i%G`Jw@oOChm}UAdSX;3amcK#rdJ(+lA!{3ILZfxOE>e0no9WABBKv-> z8OPxXK|h;;GrVAp#j;(vy-x>L=!G3-!Cw`SW8l#G+!ozgRYPg_v6qJCmmk&H9bSCC zKRQCNd{k5o7J?2URxV#f;`YmWl@w%3rckg|7EXaQQMyd08tT=&S$J4~ddHwRBtEp; zors{kQ`$z&=gPO*n5MrIEE&on0WlC*)T-+xzc}oCkov@H&Mc&~lI1W9?D$?T;wo*afF$7QdU@iZqwjZXZ}h9BW#KEhV;%)d)M z-;UVzP4l1~?&|ya=#y_-NS7G$khHS`@N5|C3UuN`eo3+1MgU|h5B0LvFxriflx(?T zyQz93OtEJs!K1%b+0$o%V|PQkQmv5Z9ro1LRcANE(sKuoF!cV1is`|KuIRVYln(;L-dtR} z8B2wDzOa!)bLK195p`a}JL;+FjTkKN4oGXbiF)Q#=!nEp>!%(4p09fqc^BYDk+g^d{p zZw$J;(eh34o>uGDu|Kb{ePxjUWpK%hpV(HM6v5EXSXw2ym3&!L!L%sw{!qbNRDfG| z^@gdv3>@9qA$H}_TJn~r{?k*?1wRfh^!?&DiBHuCNpyG}mT@{EvaPcv1Az`N`XSZj zP?<Hi}cPfzd-aJ3bURkFXl(2OQ*P^@uVSi4I~soh7I_~*#nZ+6GM(MpOk zPS$C^FTmbzn;Co@_1`?^c%5(;p{x`N=1FHyZkSE$s6cTYtllz+O)|msHP^mo@eq>mGXRB2@7Wf2b}foiYIx}AMEFhLVDB7pyUA;GJ3LJT zO@H53`cIQwj_1kZA02N+{n{fTsM#|#_v<*2Q&*_JBC>FwUz~~_{95gf5-33=3dR;P zT3rnfk5tRdh!FMMnd1dyDR8x5pL9R)DrPDsUcN$5Alw-$4HzckV2P&wRz1wSvbCff zxtbGz(cL8^gqxV6;+6#)VA!lCX&xjOf7?{jm0zD1$YYc+NqlD^tc$= z5ow=ywEgwlVroP&$pw*_WB(O44rquIK2sSmAkc*79xhNd9@^Bs;Dlmb9f*c0HkMG9 zE@@^Y~y{BusPX5JUlLIdZpL1g+usw)$#FgG3$d@ss>@`L)L)}_!O z1?|jgA4M#=&O{K2-oN+k`rL1VyB&CUGcc7<<*7i`ULlE;w9ElNCAeK6ra~}8?Ug~B zD-}U8Ss0Ma@w~*vY}cc-}{q;&k915}%9xdJ-WV z>xM7$@0*bp{iVo)Kgb%Z%_|LZD)3acd?=z0w|o4ENX~<`$@=4T@03pA2;j-YGm7X! z7v7e0@zCtj8XL%-_`O}7VZ7_ptS1t@KLZW2dOiAJ$!X|@1yv*d#!5VH@|bMHZ_HlB zwe`{FxNi~&aNH_$wj(0`Q8Ky3w0ZQKGasg5cmV47rLch{5|! z=*d#qvsKVfvL%fVa~}Ezf0zH7+_?938tFyLqf7XPSQOgg;}uBy;!2eXbp4-El=T;)x?Q|KgW@71jy?9*P!t(~t42Q6 zS0^6&rs@p)hZM!t)ySp^YFZs#ucboN&?MxdFb-~Dulv^sNVm+LI$MzEhYzbLHVWYz zO;=E$ru(@8H|;VH3Epws2aY+G>r3Jb{3%_2{pi>=4L@3 zezmK#@6}0om-!GNDASgdwNwzuxJyYKrHt7D*F~s9rJSSc>2^w6X#_^ExqJ`KTJv>I2@jc#pVc$OatOy4(~nnb0*2UV@#kK-4WviHs=gQ3!C^_vx98VMDP+5AnR^#t7!bw zmHZFf>jxAw!u9{3_s4c3J z2kVt5fJP5gBw|6##<$eo)`2=bZkW$=PF6XZy%8rm44f?n*el=~G1gFK%jn1-_t>fb ztOKkWde7_z^;xPIh4_uG-ht8y<}1(Mb(r=+{b`c6v(il-(YqD7aN0*`@=2pbn2s1l zVeEGU?c|`2A{y6S?}~~0_cf1X(1Q|1FZ(Sy!&)L8~*z-CzFsrQX;i#SWXc>`Be=xOJExUTRG(m3Qg4GS0tUE)E z7zgoI|I#W+ET2?rq5rb^yY?pB z`%vgV&b7}+{<}lzHxuibTNZ-bK^&#s8idl%dg9ju&;A~06fF8)}O}G=AfVb zj&0ep5c93%ObG&zvo`Nj^laU1RTArg$Xles$&k#oK^a;H3FNQT8Pm~g;MfZ2e3M9z z>b?aZJ=a-9y$ag%u-z?(tqe2{6CY6~>dR9JAwDB8J;Z_e5;mlL2B$MaF#`VmezPPQ zEUEbI-3bOY4|_=Z!oQ4&Kvb*;Z$k--fvT_+ger;M{GLm-1otZ4{OJ#A@wVAraXAHM zN*tFINu7@=d7aBqlCF;2r!CU+_$R@89*OU#qqax>!8Z{0Vcz0|J;h4+Sedlvsnrh= z07f$4Ik8^E_P+#QSNEUS2JQ6n_@=i?LJxU58!kn`@a=LZhIrg9keBbW89p%uukCwPx3;3~ zDpL&nBUKTi<89_L8}ZB%bSF7JF2~^^*kRKbeCoa)l|82XMux>@bllR)BH&;mYERQka=LHG-ExdpU?2+`JY==SM=agNL@raJ^k1KL-n@)%?(fZel;~va3wp zSDRptOG2>;{bi7=Tq3!c=KL<;Anm|Q>l6eiCjhv~L*Ab!&M(h@*an2d@rNWdXaU!U zsLwPGGv-=8;@M*a`FMDxojxdlszTbpjA0l+U&qWizYk?a}$YCTDO5M+|1bS}I~ z>RvE(a<-{(X|b#Z8?<*H!L*mau)EBhhucjERblC_`$*9N=w7~8wpdie&zVgth0gy5E&Qy<`oZ zzdW;V?D{0xpZPdh1T(<}o}ZS)ZxKfVw1hp{HiIJ&w~Z52g@z0xJV}b^E-4!7)|NF z4Ivrs=33)f$snNuI%}>j+Y`@soQPu!Sx6@u zHkRbaKdR~_=D)k_(?z%TZJr}%X@O{_hpKGAxG9GySEE z&Ncg4@P>fmCu414issM`{F4C46j$L#P~3!v`+8zZNmhZkqG)o;s|?$P$~UxAIJD2# zJ~W3>-&qc05aC}x-N^c@MK1YuqR~Ar0ELZ0+QH4WOd1o`v0MvH7N__}NxKgpUA}X9LD6IuN>jEB8HhzvA zpsv+omf+(u7C#K&U}Px1)YH4&Oi$9HL_)=i^ZfU6m7UGP$=bNrNEUIblX!6wROjxs z4uvG)N*cHKknW) zlV|yxmo!h&Z~^=c8iW+0RX@%1()AnULpdnV$ZsL3&vRez1r@Y9{)C9`rK7$zf5|!a zJlWRXup2lw4IT)2&7+Rxo>hqhuvh`@|Vo&Ir_J@z1=E- zB#wyd7_>T(@y%*#d3D8eZB_XYHh=K(%Vxlv+N5aPUBj=_s>IxL6heSb*^qqR_lukx z7so2_XroL-d~%(uIR955SJ968wdkdE3~$m-)%wF(%3^#qcKC(AE}NCVR*V1G_A|fq zn>&lal>#@?7j?GrOxaH)Js~RHOa~v{cBQiIw$J3=I9mk6gBs{1+Sy@GgZ}aI@i{le z$cj1Kg!O*6VX`aV(>cEt_8FXtIS@d-I%ixl_D4XFBjuku;*0G4wbIeJrhonO;`01! zv25EC99UtAykp;&S9?}|x_p81DS#gCGmX^qSnR(rR**T)Jc7cheN~rRIZE_B;z}^+ z4&45Bp@n$Jt1%IFr3iM)jom7p-A5<=@?K?9F_1nF>V*dv(h)Yus0V#X-PHKoq7hA= z0ako_1b}X8in8<#J2Y};j2Nyf2xtpH3EEce4Sn|75 z%6Mkr)w{TUkba&)LO-O3IT+B_os^M z=pu{?{{sd7BUfUQSIe5z`NZGGvU>-3n2|4yMld@h99`SXCS4J^7)FL{BA<2WxPJ*1 z9_Hi}mlQL8R2(r*mo)fq&)LS+DU~Sf89=*blvbxNtf@T4KcBCc(S3$4yBm!ymP;P8 zhk=j3e|jmOXSN2|y_8Z&G62TE*RFd6Expm8XSlC;t^+zLn^~pWPCCO?K1fR?-@A$< zyzn{BX>9>npF3@eTd#~ zb+USeXP+GapJl!ehDwx6Y7@+7oy(=V7=19xY!mcyP*$E=%xeGMDCqUt&gGeLdvtk0 z3vEQ{RrR>YFu2fGTk3M_mEbP%>n|tg|K`6?G@X7w&6YmKcN4){Pn?wRbxibcGWKIl z%EUv12*5+U=0JHjf4#MZ2vL1;ufI;xwIkp6RnmkAw`Vu3=FhuFit&M^&!9Q$Mo(@R z=Nb$|gmr6wj#z53iNp4ejC$tSQmPyNx}*WPqP8&ICwcM7nj->g0ys zFb0Q!E<~DOs4LD%?R!6ARDlj-->Q(T27xWSo+zx?JitCtL~y+Jpa1WmeEu~+SiQx zYd>>&?x%Zs?|atkLji?@msP?PQy06a2!-wjW*+vR*GCbYXA8Lk8}44|((}#DjTP)zoiM2g+@}PUpFaI^ZdMTu+ zfo^Z-FfgVfF5?g*hsbtyJF*ZrQwC$wL(fZb$B?3(b-a%q3#{pG?uQ3#Z_OGka$nDS zz)T)ean9!B_&1l!%vj*6ufWGzi=8wFQt9XDQ#aftA9w+J0lAk5Z{Xou>hL%c$l;`-;8&q zUdo)%O`RI|cs8ga^eM9?&IqQtueDlbqs8DOMp&?HC=%ZhGB&)<>T zR!}r8rE>hX0Q8j?w-c>+K4PDc&PGP0Awv4gAiwMo3P5wjEi^bGH_>VKVsa!K4WuQc zq|DYiZNzCc*yxLa&I)pNm-O`OL=Pp|bk4K(y*?vAw2!ag2wGX{pvC6A702`HU|-v6 zOfI9`9?2Ue{w? z2lze%R%e1%Km1lx1|V_8WQzPnYK$@cz=2Zs#Y+MUD()t3xj>TUSKBLHKAjv*4E(x| z9Wv@ig>YUUd6kHcRBYG)y0*K*OG|ZjhsLU&$3L>^T|^0r$Dqw|2gEA1T1(eItJZP@ zWg54#-IW0VD%YD#y06pn=yiLq+r0J^KDkwQx=*Ya-2zPJi%l%nUI$ir`PgpcQ|dfM z-hCftK|rm>T(m0=TBb*RH@DUTMoIWPv*wT??1<*NqJkj&=g*%5)C>DZWa!Pz7%MX9 z8n(dk2Kl;odYD|@YE)BHR#7~w-n!8tV1mTWHf%|ca=w{S>@^{0^&{1wN;-1YP`5XJ zh^*8`*{)G<(gjia<2ed+4|m@0K7gj%$|OLG^4M~Cn4BG5u*38tbN5=g z2ri{9SO0D_@#ElH!Oj%oR;T7tc+d@9@$~dGIT#VVo%8SyDdU;Odu4y8bq>v|E=#c( z?~1nSY9y;Wlkezc`ooS74O9X(G-n#Rl>h9l)yZil4}n1#B|O9LvJ0AbqasZ?WD+nf z$&wQW*b59}bU+gVSOhQ!K?^qFyxV;JVo)E_5Mni&4p!Qh#t@HS8aa4GqGJqjz~)YtqF%?8M5 zYMp3lt=CXHNDXe5;8C&?fp1>n6U7cODG#(J4XQJtC$E*1ba4+7Eg>?Z@!6_(DJjKL zBB&DJz6ycnIcs&*2*am?LdStN;-=>GyWN3L?#iVaIUd;Eo1X-ksnEww&^p0ctf{-% zWU8t`!CZkZx%^%kYz9yJK~jhlDtAi)+i-pHifKM%3s#`;d1G``>DTimy<+-Xa&u+`-AzYf_1z;^I^Dc81ocm-{$$ku)}SjUOI zesQd8?clupp2zC@)r9F-uSM~}){7?``R{o-MI%o2b=l%vTo^;&(){gMeD zsVJDBctk^Z`*+Cb{{9b5+0q>`A{XK}7%f6eOOqm~iBO2~3bc7#5Q9^N{X0T*d0DiG zTVKJ?c^WwI@J!E>!|R0*tjq0dIuw8OM^p@pBJQHu(LWR70wh-$PQdFuD@$TM8z3Lb zAFyRzB~M?X-oog%8hmpyq}2vn2YBQO?_=`&RZ+40!XwT*;qUj&J_hjgzI@rL=v;M0 zgwWJQ2H?uU;RL?dw=oM*3>1V#P^2h|zjbHvgX+R$in*oPR+a`r9_Rt9j~pL9zxpdI zQo7-pvmbNGSR?j%yIF(sYpXcw2caw zGpj@iUP+}}J>BELHvc|BejPcCCxvKY(W*;+aPdQ+6Lr0fOUrV!Dv|4aqyjm0&+thjX`lXn zdB&+W60uA2KCS-rH~cLLk7?v$nFi&abn^)<8)``***Omp~^8I64F|JFWo1*r9chQpU z5IMj;4*px8je?SqPhWbaTFZn9Eq>i^`MmQrf#t1mv%q(-Bq!7u0-Y2@UR5;y;e7{L zD@;lrR$Zv-smv=__ABuR`JreDj+5HVG{;{btR8=GDN*=QFVOOY(j~0mPj96N4~VaR zfBB3M{sn;zrSHcE-6jPZrAqQ6cV9;sxNFlW4$NV4JvGY%JPLF(4Y%*R3Pop%P{t{x zVOE9tU@hqt6#qnDYW5AkZko#}A(JnN1}*XDko*q#y3Ix7;;01Bcy>pqe^q7A z)&7M(fuG7vV)fC{Forg*jHKW}j3}|)U45^Qm3ZSDQODili>Ck-A;elWL{&Ad#TR`c zK^Owjn6u0iDS~xr1&?s=;5rW|LcX@6A$RAiyXWZ^+nEO9D3~id{h@0hRJ9lRK6CSm z^mE(V+N+xf4JQQSW7(Ij_7dY~gBs7r4AQl)e_R#q6fk0UV12VuR$Oj7_6)@>4(e~{ z@zmb_GB~FYTf3GYFP4yquYHJMtQiwYe)5+OI2l!q#ozN0jhmm-C@iZ(@P8gu$E_Zt zBm=Hya>02&dLQq_%!KCGJi&)#jE<9yv`%S=N*Q2fa}x#<0^#mH0P1OiBMsJg6B1x$ z{nF<8WM6SZ<%|@(TQ?OUT6dK4R!{CQtq#-jS-F>v4&H2z$$+B-LY8+7>E**@fOaM(pR+lSbUyOJ#cHR~ov$9TGJ| zD6r?uRx)54ZrBHO8Q)20{&%*DJVz}zy`*@Nqw%1lOUL}s+9-+K#zMCn6P*>u*Kd*5 zrOrLYQw>NZ@)Cfm26%q$@kWec;bUO5!3(TSRjR1a>a6O#rJ2yipqq&bp2OL zQNn3tfULzVM%G=fNg;q|#Bg`}I0hd0n*K{WJ9Vz-tUf6}(J-5z>&mN|wf2CJgKBnQ ze=qBbZZe)`4qD^iX&)~)Fz=WhG1zI-xL0oT;ODy}$v|*4Gz7MOSqyvFQT|y8W+fh} zJTq^P|JGp>MfjcoV1O6Y$Vi@J(~Uv6X7vJe8iCIEA)E{#O3Ze0SKC^gWBm^d0LOX- zUSJo>DdtG@q8vW$TZ?xxG1=j8crc#4nxM3%Vqo=1MNQqp;ODnMaZiu?=QUBE)&0hT zak%og>+JEfCJ?Rl7#b?O(fUnWpV@@@Y`K!5c}f1G(Moh75fc#E1I1Z;;B070qj=(T zB@^kxfq6H>9?+5K<-eSm_di+z^i{rxLb%Go&iK*l_VLOo?V|I37@mLAeEjHIS_PxD zm|3X);6&^T1Bj!BLqZ-3RDUVf<=FuosCrdaGknXfU>5cXT_o zfxm}a-tpfU9Tp7H+@vod#2tAIck5l63Z$oO)A$n+B5%uKv3`OaU@#F~RPpH656Aff zfV8Ji^R}Y#8T|P4GI6q>MsS6tt*Ny+vU(EQ{cNK^a&E82E|CS&=vB$-@!-LBA9%C`J#bNxgHU-Q|U4Qdnjya5Xl z9v(bB0ew^*-!{CG>YJSZ1|h8{;XIo(ZKO)j$A~msJypy_J92%{&8*Kx80NNmPfsGK z*e(l-8^_pQD8MMpjsSNnjd)usHE6BfaYI;5C0>t&my%#oz9lQ`lkHs^n#aal#I6rg zuu|FRPw;KjT+IenCq2%^1L~~mCz}V3idX~CCRAom4wZ`nzbPv~zhx4Fe!5p+6Gz&4 zcbp7MJ~%(myyek8t!t;uEYaos(eqk!EJ{;nO`o1oH2eqYt-4jmc=dTe?&pRA?ON&t zpe0{$SW7vKuIke!T(SScDN%|fF+MuKPnMQekPyyzaF3k2hZ7@C2Li{P>u90uDt{@c(~-h=f%0Ay^ya9L5h(O-= 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 ap8f&!!LD1^+=A5r0000 + + + images/mw-icon.png + + + images/search.png + + + images/search-hover.png + + + images/question.png + + + images/down-arrow.png + + + images/device-type-1.png + + + images/device-type-2.png + + + images/device-type-3.png + + + images/device-type-4.png + + + images/device-type-5.png + + + images/device-type-6.png + + + images/device-type-7.png + + + images/device-type-8.png + + + styles.qss + + \ No newline at end of file diff --git a/resources/styles.qss b/resources/styles.qss new file mode 100644 index 0000000..8596cec --- /dev/null +++ b/resources/styles.qss @@ -0,0 +1,47 @@ +QMainWindow { + background-color: rgb(246, 246, 246); +} + +QComboBox, QPushButton, QLineEdit, QTextEdit, QListWidget, QTableWidget, QGroupBox, QStackedWidget { + border: 1px solid black; + border-radius: 2px; +} + +QGroupBox#groupBoxFilters, QStackedWidget#stackedWidget { + background-color: white; +} + +QLineEdit { + border-radius: 5px; +} + +QComboBox { + background-color: white; +} + +QComboBox::drop-down { + border: 0px; +} + +QComboBox::down-arrow { + width: 10px; + height: 10px; + image: url(:/images/down-arrow.png); +} + +QPushButton { + background-color: white; + padding: 5px; +} + +QPushButton:hover { + background-color: green; + color: white; +} + +QPushButton:pressed { + background-color: green; + border-radius: 4px; + border-width: 2px; + color: white; +} \ No newline at end of file diff --git a/utils/buttonhoverwatcher.cpp b/utils/buttonhoverwatcher.cpp new file mode 100644 index 0000000..d08a508 --- /dev/null +++ b/utils/buttonhoverwatcher.cpp @@ -0,0 +1,24 @@ +#include "buttonhoverwatcher.h" + +ButtonHoverWatcher::ButtonHoverWatcher(QObject *parent) : QObject(parent) +{} + +bool ButtonHoverWatcher::eventFilter(QObject *watched, QEvent *event) +{ + QPushButton * button = qobject_cast(watched); + if (!button) { + return false; + } + + if (event->type() == QEvent::Enter) { + button->setIcon(QIcon(":/images/search-hover.png")); + return true; + } + + if (event->type() == QEvent::Leave){ + button->setIcon(QIcon(":/images/search.png")); + return true; + } + + return false; +} diff --git a/utils/buttonhoverwatcher.h b/utils/buttonhoverwatcher.h new file mode 100644 index 0000000..659e8a6 --- /dev/null +++ b/utils/buttonhoverwatcher.h @@ -0,0 +1,16 @@ +#ifndef BUTTONHOVERWATCHER_H +#define BUTTONHOVERWATCHER_H + +#include +#include +#include + +class ButtonHoverWatcher : public QObject +{ + Q_OBJECT +public: + explicit ButtonHoverWatcher(QObject *parent = nullptr); + virtual bool eventFilter(QObject * watched, QEvent * event) Q_DECL_OVERRIDE; +}; + +#endif // BUTTONHOVERWATCHER_H