1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-12-23 01:55:48 -05:00

ADS-B updates.

Add support for speech notifications and running commands when aircraft meet user-defined rules.
Fix fighter aircraft icon.
Add additional airline logos.
This commit is contained in:
Jon Beniston 2021-10-27 22:25:14 +01:00
parent 7b5bfefa84
commit f38b9b8dda
168 changed files with 876 additions and 36 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

View File

@ -40,6 +40,8 @@ if(NOT SERVER_MODE)
adsbdemodfeeddialog.ui
adsbdemoddisplaydialog.cpp
adsbdemoddisplaydialog.ui
adsbdemodnotificationdialog.cpp
adsbdemodnotificationdialog.ui
csv.cpp
airlinelogos.qrc
flags.qrc
@ -51,13 +53,14 @@ if(NOT SERVER_MODE)
adsbdemodgui.h
adsbdemodfeeddialog.h
adsbdemoddisplaydialog.h
adsbdemodnotificationdialog.h
ourairports.h
osndb.h
csv.h
)
set(TARGET_NAME demodadsb)
set(TARGET_LIB Qt5::Widgets Qt5::Quick Qt5::QuickWidgets Qt5::Positioning)
set(TARGET_LIB Qt5::Widgets Qt5::Quick Qt5::QuickWidgets Qt5::Positioning Qt5::TextToSpeech)
set(TARGET_LIB_GUI "sdrgui")
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
else()

View File

@ -28,6 +28,7 @@
#include <QUrl>
#include <QMessageBox>
#include <QDebug>
#include <QProcess>
#include "SWGMapItem.h"
@ -48,35 +49,9 @@
#include "adsbdemodgui.h"
#include "adsbdemodfeeddialog.h"
#include "adsbdemoddisplaydialog.h"
#include "adsbdemodnotificationdialog.h"
#include "adsb.h"
// ADS-B table columns
#define ADSB_COL_ICAO 0
#define ADSB_COL_FLIGHT 1
#define ADSB_COL_MODEL 2
#define ADSB_COL_AIRLINE 3
#define ADSB_COL_ALTITUDE 4
#define ADSB_COL_SPEED 5
#define ADSB_COL_HEADING 6
#define ADSB_COL_VERTICALRATE 7
#define ADSB_COL_RANGE 8
#define ADSB_COL_AZEL 9
#define ADSB_COL_LATITUDE 10
#define ADSB_COL_LONGITUDE 11
#define ADSB_COL_CATEGORY 12
#define ADSB_COL_STATUS 13
#define ADSB_COL_SQUAWK 14
#define ADSB_COL_REGISTRATION 15
#define ADSB_COL_COUNTRY 16
#define ADSB_COL_REGISTERED 17
#define ADSB_COL_MANUFACTURER 18
#define ADSB_COL_OWNER 19
#define ADSB_COL_OPERATOR_ICAO 20
#define ADSB_COL_TIME 21
#define ADSB_COL_FRAMECOUNT 22
#define ADSB_COL_CORRELATION 23
#define ADSB_COL_RSSI 24
const char *Aircraft::m_speedTypeNames[] = {
"GS", "TAS", "IAS"
};
@ -732,6 +707,8 @@ void ADSBDemodGUI::handleADSB(
if (m_settings.m_autoResizeTableColumns)
ui->adsbData->resizeColumnsToContents();
ui->adsbData->setSortingEnabled(true);
// Check to see if we need to emit a notification about this new aircraft
checkStaticNotification(aircraft);
}
aircraft->m_time = dateTime;
QTime time = dateTime.time();
@ -1124,6 +1101,152 @@ void ADSBDemodGUI::handleADSB(
// TIS-B
qDebug() << "TIS B message cf=" << ca << " icao: " << icao;
}
// Check to see if we need to emit a notification about this aircraft
checkDynamicNotification(aircraft);
}
void ADSBDemodGUI::checkStaticNotification(Aircraft *aircraft)
{
for (int i = 0; i < m_settings.m_notificationSettings.size(); i++)
{
QString match;
switch (m_settings.m_notificationSettings[i]->m_matchColumn)
{
case ADSB_COL_ICAO:
match = aircraft->m_icaoItem->data(Qt::DisplayRole).toString();
break;
case ADSB_COL_MODEL:
match = aircraft->m_modelItem->data(Qt::DisplayRole).toString();
break;
case ADSB_COL_REGISTRATION:
match = aircraft->m_registrationItem->data(Qt::DisplayRole).toString();
break;
case ADSB_COL_MANUFACTURER:
match = aircraft->m_manufacturerNameItem->data(Qt::DisplayRole).toString();
break;
case ADSB_COL_OWNER:
match = aircraft->m_ownerItem->data(Qt::DisplayRole).toString();
break;
case ADSB_COL_OPERATOR_ICAO:
match = aircraft->m_operatorICAOItem->data(Qt::DisplayRole).toString();
break;
default:
break;
}
if (!match.isEmpty())
{
//QRegularExpression regExp(m_settings.m_notificationSettings[i]->m_regExp);
if (m_settings.m_notificationSettings[i]->m_regularExpression.isValid())
{
if (m_settings.m_notificationSettings[i]->m_regularExpression.match(match).hasMatch())
{
if (!m_settings.m_notificationSettings[i]->m_speech.isEmpty()) {
speechNotification(aircraft, m_settings.m_notificationSettings[i]->m_speech);
}
if (!m_settings.m_notificationSettings[i]->m_command.isEmpty()) {
commandNotification(aircraft, m_settings.m_notificationSettings[i]->m_command);
}
aircraft->m_notified = true;
}
}
}
}
}
void ADSBDemodGUI::checkDynamicNotification(Aircraft *aircraft)
{
if (!aircraft->m_notified)
{
for (int i = 0; i < m_settings.m_notificationSettings.size(); i++)
{
if ( (m_settings.m_notificationSettings[i]->m_matchColumn == ADSB_COL_FLIGHT)
|| (m_settings.m_notificationSettings[i]->m_matchColumn == ADSB_COL_ALTITUDE)
|| (m_settings.m_notificationSettings[i]->m_matchColumn == ADSB_COL_SPEED)
|| (m_settings.m_notificationSettings[i]->m_matchColumn == ADSB_COL_RANGE)
|| (m_settings.m_notificationSettings[i]->m_matchColumn == ADSB_COL_CATEGORY)
|| (m_settings.m_notificationSettings[i]->m_matchColumn == ADSB_COL_STATUS)
|| (m_settings.m_notificationSettings[i]->m_matchColumn == ADSB_COL_SQUAWK)
)
{
QString match;
switch (m_settings.m_notificationSettings[i]->m_matchColumn)
{
case ADSB_COL_FLIGHT:
match = aircraft->m_flightItem->data(Qt::DisplayRole).toString();
break;
case ADSB_COL_ALTITUDE:
match = aircraft->m_altitudeItem->data(Qt::DisplayRole).toString();
break;
case ADSB_COL_SPEED:
match = aircraft->m_speedItem->data(Qt::DisplayRole).toString();
break;
case ADSB_COL_RANGE:
match = aircraft->m_rangeItem->data(Qt::DisplayRole).toString();
break;
case ADSB_COL_CATEGORY:
match = aircraft->m_emitterCategoryItem->data(Qt::DisplayRole).toString();
break;
case ADSB_COL_STATUS:
match = aircraft->m_statusItem->data(Qt::DisplayRole).toString();
break;
case ADSB_COL_SQUAWK:
match = aircraft->m_squawkItem->data(Qt::DisplayRole).toString();
break;
default:
break;
}
if (!match.isEmpty())
{
if (m_settings.m_notificationSettings[i]->m_regularExpression.isValid())
{
if (m_settings.m_notificationSettings[i]->m_regularExpression.match(match).hasMatch())
{
if (!m_settings.m_notificationSettings[i]->m_speech.isEmpty()) {
speechNotification(aircraft, m_settings.m_notificationSettings[i]->m_speech);
}
if (!m_settings.m_notificationSettings[i]->m_command.isEmpty()) {
commandNotification(aircraft, m_settings.m_notificationSettings[i]->m_command);
}
aircraft->m_notified = true;
}
}
}
}
}
}
}
void ADSBDemodGUI::speechNotification(Aircraft *aircraft, const QString &speech)
{
m_speech->say(subAircraftString(aircraft, speech));
}
void ADSBDemodGUI::commandNotification(Aircraft *aircraft, const QString &command)
{
QProcess::startDetached(subAircraftString(aircraft, command));
}
QString ADSBDemodGUI::subAircraftString(Aircraft *aircraft, const QString &string)
{
QString s = string;
s = s.replace("${icao}", aircraft->m_icaoItem->data(Qt::DisplayRole).toString());
s = s.replace("${flight}", aircraft->m_flightItem->data(Qt::DisplayRole).toString());
s = s.replace("${aircraft}", aircraft->m_modelItem->data(Qt::DisplayRole).toString());
s = s.replace("${latitude}", aircraft->m_latitudeItem->data(Qt::DisplayRole).toString());
s = s.replace("${longitude}", aircraft->m_longitudeItem->data(Qt::DisplayRole).toString());
s = s.replace("${altitude}", aircraft->m_altitudeItem->data(Qt::DisplayRole).toString());
s = s.replace("${speed}", aircraft->m_speedItem->data(Qt::DisplayRole).toString());
s = s.replace("${heading}", aircraft->m_headingItem->data(Qt::DisplayRole).toString());
s = s.replace("${range}", aircraft->m_rangeItem->data(Qt::DisplayRole).toString());
s = s.replace("${category}", aircraft->m_emitterCategoryItem->data(Qt::DisplayRole).toString());
s = s.replace("${status}", aircraft->m_statusItem->data(Qt::DisplayRole).toString());
s = s.replace("${squawk}", aircraft->m_squawkItem->data(Qt::DisplayRole).toString());
s = s.replace("${registration}", aircraft->m_registrationItem->data(Qt::DisplayRole).toString());
s = s.replace("${manufacturer}", aircraft->m_manufacturerNameItem->data(Qt::DisplayRole).toString());
s = s.replace("${owner}", aircraft->m_ownerItem->data(Qt::DisplayRole).toString());
s = s.replace("${operator}", aircraft->m_operatorICAOItem->data(Qt::DisplayRole).toString());
return s;
}
bool ADSBDemodGUI::handleMessage(const Message& message)
@ -1233,6 +1356,14 @@ void ADSBDemodGUI::on_feed_clicked(bool checked)
applySettings();
}
void ADSBDemodGUI::on_notifications_clicked()
{
ADSBDemodNotificationDialog dialog(&m_settings);
if (dialog.exec() == QDialog::Accepted) {
applySettings();
}
}
void ADSBDemodGUI::on_adsbData_cellClicked(int row, int column)
{
(void) column;
@ -1893,6 +2024,9 @@ ADSBDemodGUI::ADSBDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseb
if (m_airportInfo != nullptr)
updateAirports();
// Initialise text to speech engine
m_speech = new QTextToSpeech(this);
updateDeviceSetList();
displaySettings();
applySettings(true);

View File

@ -25,6 +25,7 @@
#include <QDateTime>
#include <QAbstractListModel>
#include <QProgressDialog>
#include <QTextToSpeech>
#include "channel/channelgui.h"
#include "dsp/dsptypes.h"
@ -125,6 +126,8 @@ struct Aircraft {
AircraftInformation *m_aircraftInfo; // Info about the aircraft from the database
ADSBDemodGUI *m_gui;
bool m_notified; // Set when a notification has been made for this aircraft, so we don't repeat it
// GUI table items for above data
QTableWidgetItem *m_icaoItem;
QTableWidgetItem *m_flightItem;
@ -175,7 +178,8 @@ struct Aircraft {
m_isHighlighted(false),
m_showAll(false),
m_aircraftInfo(nullptr),
m_gui(gui)
m_gui(gui),
m_notified(false)
{
for (int i = 0; i < 2; i++)
{
@ -510,6 +514,7 @@ private:
ADSBDemodSettings::AirportType m_currentAirportMinimumSize;
bool m_currentDisplayHeliports;
QTextToSpeech *m_speech;
QMenu *menu; // Column select context menu
WebAPIAdapterInterface *m_webAPIAdapterInterface;
@ -531,6 +536,11 @@ private:
const QDateTime dateTime,
float correlation,
float correlationOnes);
void checkStaticNotification(Aircraft *aircraft);
void checkDynamicNotification(Aircraft *aircraft);
void speechNotification(Aircraft *aircraft, const QString &speech);
void commandNotification(Aircraft *aircraft, const QString &command);
QString subAircraftString(Aircraft *aircraft, const QString &string);
void resizeTable();
QString getDataDir();
QString getAirportDBFilename();
@ -568,6 +578,7 @@ private slots:
void on_correlateFullPreamble_clicked(bool checked);
void on_demodModeS_clicked(bool checked);
void on_feed_clicked(bool checked);
void on_notifications_clicked();
void on_getOSNDB_clicked();
void on_getAirportDB_clicked();
void on_flightPaths_clicked(bool checked);

View File

@ -600,6 +600,23 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="notifications">
<property name="toolTip">
<string>Open notifications dialog</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../sdrgui/resources/res.qrc">
<normaloff>:/mono.png</normaloff>:/mono.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="stats">
<property name="toolTip">
@ -972,9 +989,10 @@
<container>1</container>
</customwidget>
<customwidget>
<class>ButtonSwitch</class>
<extends>QToolButton</extends>
<header>gui/buttonswitch.h</header>
<class>ValueDialZ</class>
<extends>QWidget</extends>
<header>gui/valuedialz.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>LevelMeterSignalDB</class>
@ -983,10 +1001,9 @@
<container>1</container>
</customwidget>
<customwidget>
<class>ValueDialZ</class>
<extends>QWidget</extends>
<header>gui/valuedialz.h</header>
<container>1</container>
<class>ButtonSwitch</class>
<extends>QToolButton</extends>
<header>gui/buttonswitch.h</header>
</customwidget>
</customwidgets>
<tabstops>

View File

@ -0,0 +1,161 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2021 Jon Beniston, M7RCE //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include <QDebug>
#include <QComboBox>
#include <QPushButton>
#include <QCheckBox>
#include <QHBoxLayout>
#include "adsbdemodnotificationdialog.h"
// Map main ADS-B table column numbers to combo box indicies
std::vector<int> ADSBDemodNotificationDialog::m_columnMap = {
ADSB_COL_ICAO, ADSB_COL_FLIGHT, ADSB_COL_MODEL,
ADSB_COL_ALTITUDE, ADSB_COL_SPEED, ADSB_COL_RANGE,
ADSB_COL_CATEGORY, ADSB_COL_STATUS, ADSB_COL_SQUAWK,
ADSB_COL_REGISTRATION, ADSB_COL_MANUFACTURER, ADSB_COL_OWNER, ADSB_COL_OPERATOR_ICAO
};
ADSBDemodNotificationDialog::ADSBDemodNotificationDialog(ADSBDemodSettings *settings,
QWidget* parent) :
QDialog(parent),
m_settings(settings),
ui(new Ui::ADSBDemodNotificationDialog)
{
ui->setupUi(this);
resizeTable();
for (int i = 0; i < m_settings->m_notificationSettings.size(); i++) {
addRow(m_settings->m_notificationSettings[i]);
}
}
ADSBDemodNotificationDialog::~ADSBDemodNotificationDialog()
{
delete ui;
}
void ADSBDemodNotificationDialog::accept()
{
qDeleteAll(m_settings->m_notificationSettings);
m_settings->m_notificationSettings.clear();
for (int i = 0; i < ui->table->rowCount(); i++)
{
ADSBDemodSettings::NotificationSettings *notificationSettings = new ADSBDemodSettings::NotificationSettings();
int idx = ((QComboBox *)ui->table->cellWidget(i, NOTIFICATION_COL_MATCH))->currentIndex();
notificationSettings->m_matchColumn = m_columnMap[idx];
notificationSettings->m_regExp = ui->table->item(i, NOTIFICATION_COL_REG_EXP)->data(Qt::DisplayRole).toString().trimmed();
notificationSettings->m_speech = ui->table->item(i, NOTIFICATION_COL_SPEECH)->data(Qt::DisplayRole).toString().trimmed();
notificationSettings->m_command = ui->table->item(i, NOTIFICATION_COL_COMMAND)->data(Qt::DisplayRole).toString().trimmed();
notificationSettings->updateRegularExpression();
m_settings->m_notificationSettings.append(notificationSettings);
}
QDialog::accept();
}
void ADSBDemodNotificationDialog::resizeTable()
{
ADSBDemodSettings::NotificationSettings dummy;
dummy.m_matchColumn = ADSB_COL_MANUFACTURER;
dummy.m_regExp = "No emergency and some";
dummy.m_speech = "${aircraft} ${reg} has entered your airspace";
dummy.m_command = "/usr/home/sdrangel/myscript ${aircraft} ${reg}";
addRow(&dummy);
ui->table->resizeColumnsToContents();
ui->table->selectRow(0);
on_remove_clicked();
ui->table->selectRow(-1);
}
void ADSBDemodNotificationDialog::on_add_clicked()
{
addRow();
}
// Remove selected row
void ADSBDemodNotificationDialog::on_remove_clicked()
{
// Selection mode is single, so only a single row should be returned
QModelIndexList indexList = ui->table->selectionModel()->selectedRows();
if (!indexList.isEmpty())
{
int row = indexList.at(0).row();
ui->table->removeRow(row);
}
}
void ADSBDemodNotificationDialog::addRow(ADSBDemodSettings::NotificationSettings *settings)
{
QComboBox *match = new QComboBox();
QWidget *matchWidget = new QWidget();
QHBoxLayout *pLayout = new QHBoxLayout(matchWidget);
pLayout->addWidget(match);
pLayout->setAlignment(Qt::AlignCenter);
pLayout->setContentsMargins(0, 0, 0, 0);
matchWidget->setLayout(pLayout);
match->addItem("ICAO ID");
match->addItem("Flight No.");
match->addItem("Aircraft");
match->addItem("Alt (ft)");
match->addItem("Spd (kn)");
match->addItem("D (km)");
match->addItem("Cat");
match->addItem("Status");
match->addItem("Squawk");
match->addItem("Reg");
match->addItem("Manufacturer");
match->addItem("Owner");
match->addItem("Operator");
QTableWidgetItem *regExpItem = new QTableWidgetItem();
QTableWidgetItem *speechItem = new QTableWidgetItem();
QTableWidgetItem *commandItem = new QTableWidgetItem();
if (settings != nullptr)
{
for (int i = 0; i < m_columnMap.size(); i++)
{
if (m_columnMap[i] == settings->m_matchColumn)
{
match->setCurrentIndex(i);
break;
}
}
regExpItem->setData(Qt::DisplayRole, settings->m_regExp);
speechItem->setData(Qt::DisplayRole, settings->m_speech);
commandItem->setData(Qt::DisplayRole, settings->m_command);
}
else
{
match->setCurrentIndex(2);
regExpItem->setData(Qt::DisplayRole, ".*");
speechItem->setData(Qt::DisplayRole, "${aircraft} detected");
}
ui->table->setSortingEnabled(false);
int row = ui->table->rowCount();
ui->table->setRowCount(row + 1);
ui->table->setCellWidget(row, NOTIFICATION_COL_MATCH, match);
ui->table->setItem(row, NOTIFICATION_COL_REG_EXP, regExpItem);
ui->table->setItem(row, NOTIFICATION_COL_SPEECH, speechItem);
ui->table->setItem(row, NOTIFICATION_COL_COMMAND, commandItem);
ui->table->setSortingEnabled(true);
}

View File

@ -0,0 +1,56 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2021 Jon Beniston, M7RCE //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDE_ADSBDEMODNOTIFICATIONDIALOG_H
#define INCLUDE_ADSBDEMODNOTIFICATIONDIALOG_H
#include <QHash>
#include "ui_adsbdemodnotificationdialog.h"
#include "adsbdemodsettings.h"
class ADSBDemodNotificationDialog : public QDialog {
Q_OBJECT
public:
explicit ADSBDemodNotificationDialog(ADSBDemodSettings* settings, QWidget* parent = 0);
~ADSBDemodNotificationDialog();
private:
void resizeTable();
private slots:
void accept();
void on_add_clicked();
void on_remove_clicked();
void addRow(ADSBDemodSettings::NotificationSettings *settings=nullptr);
private:
Ui::ADSBDemodNotificationDialog* ui;
ADSBDemodSettings *m_settings;
enum NotificationCol {
NOTIFICATION_COL_MATCH,
NOTIFICATION_COL_REG_EXP,
NOTIFICATION_COL_SPEECH,
NOTIFICATION_COL_COMMAND
};
static std::vector<int> m_columnMap;
};
#endif // INCLUDE_ADSBDEMODNOTIFICATIONDIALOG_H

View File

@ -0,0 +1,165 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ADSBDemodNotificationDialog</class>
<widget class="QDialog" name="ADSBDemodNotificationDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>955</width>
<height>400</height>
</rect>
</property>
<property name="font">
<font>
<family>Liberation Sans</family>
<pointsize>9</pointsize>
</font>
</property>
<property name="contextMenuPolicy">
<enum>Qt::PreventContextMenu</enum>
</property>
<property name="windowTitle">
<string>Notifications</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupBox">
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="0">
<widget class="QTableWidget" name="table">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<column>
<property name="text">
<string>Match</string>
</property>
<property name="toolTip">
<string>ADS-B data to match</string>
</property>
</column>
<column>
<property name="text">
<string>Reg Exp</string>
</property>
<property name="toolTip">
<string>Regular expression to match with</string>
</property>
</column>
<column>
<property name="text">
<string>Speech</string>
</property>
<property name="toolTip">
<string>Speech for the computer to read when a match is made</string>
</property>
</column>
<column>
<property name="text">
<string>Command</string>
</property>
<property name="toolTip">
<string>Command/script to execute when a match is made</string>
</property>
</column>
</widget>
</item>
<item row="5" column="0">
<layout class="QHBoxLayout" name="buttonsHorizontalLayout">
<item>
<widget class="QPushButton" name="add">
<property name="toolTip">
<string>Add device set control</string>
</property>
<property name="text">
<string>+</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="remove">
<property name="toolTip">
<string>Remove device set control</string>
</property>
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item>
<spacer name="buttonsHorizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>table</tabstop>
<tabstop>add</tabstop>
<tabstop>remove</tabstop>
</tabstops>
<resources>
<include location="../../../sdrgui/resources/res.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>ADSBDemodNotificationDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>ADSBDemodNotificationDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -17,6 +17,8 @@
///////////////////////////////////////////////////////////////////////////////////
#include <QColor>
#include <QDataStream>
#include <QDebug>
#include "dsp/dspengine.h"
#include "util/simpleserializer.h"
@ -112,6 +114,8 @@ QByteArray ADSBDemodSettings::serialize() const
s.writeFloat(32, m_interpolatorTapsPerPhase);
s.writeBool(33, m_allFlightPaths);
s.writeBlob(34, serializeNotificationSettings(m_notificationSettings));
for (int i = 0; i < ADSBDEMOD_COLUMNS; i++)
s.writeS32(100 + i, m_columnIndexes[i]);
for (int i = 0; i < ADSBDEMOD_COLUMNS; i++)
@ -135,6 +139,7 @@ bool ADSBDemodSettings::deserialize(const QByteArray& data)
QByteArray bytetmp;
qint32 tmp;
uint32_t utmp;
QByteArray blob;
if (m_channelMarker)
{
@ -192,6 +197,9 @@ bool ADSBDemodSettings::deserialize(const QByteArray& data)
d.readFloat(32, &m_interpolatorTapsPerPhase, 3.5f);
d.readBool(33, &m_allFlightPaths, false);
d.readBlob(34, &blob);
deserializeNotificationSettings(blob, m_notificationSettings);
for (int i = 0; i < ADSBDEMOD_COLUMNS; i++)
d.readS32(100 + i, &m_columnIndexes[i], i);
for (int i = 0; i < ADSBDEMOD_COLUMNS; i++)
@ -205,3 +213,53 @@ bool ADSBDemodSettings::deserialize(const QByteArray& data)
return false;
}
}
QDataStream& operator<<(QDataStream& out, const ADSBDemodSettings::NotificationSettings* settings)
{
out << settings->m_matchColumn;
out << settings->m_regExp;
out << settings->m_speech;
out << settings->m_command;
return out;
}
QDataStream& operator>>(QDataStream& in, ADSBDemodSettings::NotificationSettings*& settings)
{
settings = new ADSBDemodSettings::NotificationSettings();
in >> settings->m_matchColumn;
in >> settings->m_regExp;
in >> settings->m_speech;
in >> settings->m_command;
settings->updateRegularExpression();
return in;
}
QByteArray ADSBDemodSettings::serializeNotificationSettings(QList<NotificationSettings *> notificationSettings) const
{
QByteArray data;
QDataStream *stream = new QDataStream(&data, QIODevice::WriteOnly);
(*stream) << notificationSettings;
delete stream;
return data;
}
void ADSBDemodSettings::deserializeNotificationSettings(const QByteArray& data, QList<NotificationSettings *>& notificationSettings)
{
QDataStream *stream = new QDataStream(data);
(*stream) >> notificationSettings;
delete stream;
}
ADSBDemodSettings::NotificationSettings::NotificationSettings()
{
m_matchColumn = 0;
}
void ADSBDemodSettings::NotificationSettings::updateRegularExpression()
{
m_regularExpression.setPattern(m_regExp);
m_regularExpression.optimize();
if (m_regularExpression.isValid()) {
qDebug() << "ADSBDemod: Regular expression is not valid: " << m_regExp;
}
}

View File

@ -21,6 +21,8 @@
#include <QtGlobal>
#include <QString>
#include <QRegularExpression>
#include <stdint.h>
#include "dsp/dsptypes.h"
@ -29,8 +31,46 @@ class Serializable;
// Number of columns in the table
#define ADSBDEMOD_COLUMNS 25
// ADS-B table columns
#define ADSB_COL_ICAO 0
#define ADSB_COL_FLIGHT 1
#define ADSB_COL_MODEL 2
#define ADSB_COL_AIRLINE 3
#define ADSB_COL_ALTITUDE 4
#define ADSB_COL_SPEED 5
#define ADSB_COL_HEADING 6
#define ADSB_COL_VERTICALRATE 7
#define ADSB_COL_RANGE 8
#define ADSB_COL_AZEL 9
#define ADSB_COL_LATITUDE 10
#define ADSB_COL_LONGITUDE 11
#define ADSB_COL_CATEGORY 12
#define ADSB_COL_STATUS 13
#define ADSB_COL_SQUAWK 14
#define ADSB_COL_REGISTRATION 15
#define ADSB_COL_COUNTRY 16
#define ADSB_COL_REGISTERED 17
#define ADSB_COL_MANUFACTURER 18
#define ADSB_COL_OWNER 19
#define ADSB_COL_OPERATOR_ICAO 20
#define ADSB_COL_TIME 21
#define ADSB_COL_FRAMECOUNT 22
#define ADSB_COL_CORRELATION 23
#define ADSB_COL_RSSI 24
struct ADSBDemodSettings
{
struct NotificationSettings {
int m_matchColumn;
QString m_regExp;
QString m_speech;
QString m_command;
QRegularExpression m_regularExpression;
NotificationSettings();
void updateRegularExpression();
};
int32_t m_inputFrequencyOffset;
Real m_rfBandwidth;
Real m_correlationThreshold; //!< Correlation power threshold in dB
@ -78,11 +118,15 @@ struct ADSBDemodSettings
int m_interpolatorPhaseSteps;
float m_interpolatorTapsPerPhase;
QList<NotificationSettings *> m_notificationSettings;
ADSBDemodSettings();
void resetToDefaults();
void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
QByteArray serialize() const;
bool deserialize(const QByteArray& data);
QByteArray serializeNotificationSettings(QList<NotificationSettings *> notificationSettings) const;
void deserializeNotificationSettings(const QByteArray& data, QList<NotificationSettings *>& notificationSettings);
};
#endif /* PLUGINS_CHANNELRX_DEMODADSB_ADSBDEMODSETTINGS_H_ */

View File

@ -11,6 +11,7 @@
<file>airlinelogos/AAY.bmp</file>
<file>airlinelogos/AAZ.bmp</file>
<file>airlinelogos/AB.bmp</file>
<file>airlinelogos/ABA.bmp</file>
<file>airlinelogos/ABB.bmp</file>
<file>airlinelogos/ABD.bmp</file>
<file>airlinelogos/ABG.bmp</file>
@ -29,6 +30,7 @@
<file>airlinelogos/ACI.bmp</file>
<file>airlinelogos/ACL.bmp</file>
<file>airlinelogos/ACV.bmp</file>
<file>airlinelogos/ACW.bmp</file>
<file>airlinelogos/ADN.bmp</file>
<file>airlinelogos/ADO.bmp</file>
<file>airlinelogos/ADR.bmp</file>
@ -67,10 +69,12 @@
<file>airlinelogos/AJD.bmp</file>
<file>airlinelogos/AJI.bmp</file>
<file>airlinelogos/AJK.bmp</file>
<file>airlinelogos/AJP.bmp</file>
<file>airlinelogos/AJT.bmp</file>
<file>airlinelogos/AKC.bmp</file>
<file>airlinelogos/AKL.bmp</file>
<file>airlinelogos/AKS.bmp</file>
<file>airlinelogos/AKY.bmp</file>
<file>airlinelogos/ALK.bmp</file>
<file>airlinelogos/ALN.bmp</file>
<file>airlinelogos/ALV.bmp</file>
@ -123,6 +127,7 @@
<file>airlinelogos/ASY.bmp</file>
<file>airlinelogos/ATC.bmp</file>
<file>airlinelogos/ATG.bmp</file>
<file>airlinelogos/ATL.bmp</file>
<file>airlinelogos/ATN.bmp</file>
<file>airlinelogos/ATR.bmp</file>
<file>airlinelogos/ATV.bmp</file>
@ -189,6 +194,7 @@
<file>airlinelogos/BEZ.bmp</file>
<file>airlinelogos/BFD.bmp</file>
<file>airlinelogos/BFL.bmp</file>
<file>airlinelogos/BFW.bmp</file>
<file>airlinelogos/BGA.bmp</file>
<file>airlinelogos/BGH.bmp</file>
<file>airlinelogos/BGL.bmp</file>
@ -211,12 +217,16 @@
<file>airlinelogos/BNA.bmp</file>
<file>airlinelogos/BNL.bmp</file>
<file>airlinelogos/BOE.bmp</file>
<file>airlinelogos/BOG.bmp</file>
<file>airlinelogos/BOH.bmp</file>
<file>airlinelogos/BOL.bmp</file>
<file>airlinelogos/BON.bmp</file>
<file>airlinelogos/BOS.bmp</file>
<file>airlinelogos/BOT.bmp</file>
<file>airlinelogos/BOV.bmp</file>
<file>airlinelogos/BOX.bmp</file>
<file>airlinelogos/BPA.bmp</file>
<file>airlinelogos/BPAold.bmp</file>
<file>airlinelogos/BQB.bmp</file>
<file>airlinelogos/BRAVO.bmp</file>
<file>airlinelogos/BRH.bmp</file>
@ -226,6 +236,7 @@
<file>airlinelogos/BRQ.bmp</file>
<file>airlinelogos/BRU.bmp</file>
<file>airlinelogos/BRXb.bmp</file>
<file>airlinelogos/BSC.bmp</file>
<file>airlinelogos/BSK.bmp</file>
<file>airlinelogos/BTI.bmp</file>
<file>airlinelogos/BTK.bmp</file>
@ -346,6 +357,7 @@
<file>airlinelogos/CNF.bmp</file>
<file>airlinelogos/CNK.bmp</file>
<file>airlinelogos/CNP.bmp</file>
<file>airlinelogos/CNS.bmp</file>
<file>airlinelogos/CNW.bmp</file>
<file>airlinelogos/COB.bmp</file>
<file>airlinelogos/COL.bmp</file>
@ -422,6 +434,7 @@
<file>airlinelogos/CXI.bmp</file>
<file>airlinelogos/CXM.bmp</file>
<file>airlinelogos/CXP.bmp</file>
<file>airlinelogos/CXPold.bmp</file>
<file>airlinelogos/CYF.bmp</file>
<file>airlinelogos/CYL.bmp</file>
<file>airlinelogos/CYO.bmp</file>
@ -482,6 +495,7 @@
<file>airlinelogos/DOJ.bmp</file>
<file>airlinelogos/DOK.bmp</file>
<file>airlinelogos/DOM.bmp</file>
<file>airlinelogos/DONNINGTON.bmp</file>
<file>airlinelogos/DOS.bmp</file>
<file>airlinelogos/DOW.bmp</file>
<file>airlinelogos/DPJ.bmp</file>
@ -490,6 +504,7 @@
<file>airlinelogos/DRK.bmp</file>
<file>airlinelogos/DRM.bmp</file>
<file>airlinelogos/DRU.bmp</file>
<file>airlinelogos/DRW.bmp</file>
<file>airlinelogos/DRZ.bmp</file>
<file>airlinelogos/DSM.bmp</file>
<file>airlinelogos/DSV.bmp</file>
@ -541,6 +556,7 @@
<file>airlinelogos/EGJ.bmp</file>
<file>airlinelogos/EGL.bmp</file>
<file>airlinelogos/EGS.bmp</file>
<file>airlinelogos/EGT.bmp</file>
<file>airlinelogos/EGU.bmp</file>
<file>airlinelogos/EGW.bmp</file>
<file>airlinelogos/EHR.bmp</file>
@ -604,7 +620,9 @@
<file>airlinelogos/ETS.bmp</file>
<file>airlinelogos/EUC.bmp</file>
<file>airlinelogos/EUG.bmp</file>
<file>airlinelogos/EUK.bmp</file>
<file>airlinelogos/EUL.bmp</file>
<file>airlinelogos/EUP.bmp</file>
<file>airlinelogos/EUS.bmp</file>
<file>airlinelogos/EUW.bmp</file>
<file>airlinelogos/EVA.bmp</file>
@ -639,16 +657,19 @@
<file>airlinelogos/EZE.bmp</file>
<file>airlinelogos/EZS.bmp</file>
<file>airlinelogos/EZY.bmp</file>
<file>airlinelogos/EZZ.bmp</file>
<file>airlinelogos/FAB.bmp</file>
<file>airlinelogos/FAD.bmp</file>
<file>airlinelogos/FAG.bmp</file>
<file>airlinelogos/FAH.bmp</file>
<file>airlinelogos/FAS.bmp</file>
<file>airlinelogos/FAT.bmp</file>
<file>airlinelogos/FBA.bmp</file>
<file>airlinelogos/FBB.bmp</file>
<file>airlinelogos/FBD.bmp</file>
<file>airlinelogos/FBR.bmp</file>
<file>airlinelogos/FBU.bmp</file>
<file>airlinelogos/FBZ.bmp</file>
<file>airlinelogos/FC.bmp</file>
<file>airlinelogos/FCM.bmp</file>
<file>airlinelogos/FDA.bmp</file>
@ -665,6 +686,7 @@
<file>airlinelogos/FFT.bmp</file>
<file>airlinelogos/FFV.bmp</file>
<file>airlinelogos/FGW.bmp</file>
<file>airlinelogos/FHM.bmp</file>
<file>airlinelogos/FHY.bmp</file>
<file>airlinelogos/FIA.bmp</file>
<file>airlinelogos/FIN.bmp</file>
@ -675,22 +697,32 @@
<file>airlinelogos/FLE.bmp</file>
<file>airlinelogos/FLEXIFLY.bmp</file>
<file>airlinelogos/FLI.bmp</file>
<file>airlinelogos/FLJ.bmp</file>
<file>airlinelogos/FLO.bmp</file>
<file>airlinelogos/FLYINGSCHOOL.bmp</file>
<file>airlinelogos/FLYPELICAN.bmp</file>
<file>airlinelogos/FLYR.bmp</file>
<file>airlinelogos/FNA.bmp</file>
<file>airlinelogos/FOX.bmp</file>
<file>airlinelogos/FPC.bmp</file>
<file>airlinelogos/FPK.bmp</file>
<file>airlinelogos/FPO.bmp</file>
<file>airlinelogos/FPY.bmp</file>
<file>airlinelogos/FPYa.bmp</file>
<file>airlinelogos/FREEDOM.bmp</file>
<file>airlinelogos/FRF.bmp</file>
<file>airlinelogos/FRG.bmp</file>
<file>airlinelogos/FRH.bmp</file>
<file>airlinelogos/FSK.bmp</file>
<file>airlinelogos/FSQ.bmp</file>
<file>airlinelogos/FSY.bmp</file>
<file>airlinelogos/FTC.bmp</file>
<file>airlinelogos/FTH.bmp</file>
<file>airlinelogos/FTL.bmp</file>
<file>airlinelogos/FTO.bmp</file>
<file>airlinelogos/FTZ.bmp</file>
<file>airlinelogos/FWI.bmp</file>
<file>airlinelogos/FWK.bmp</file>
<file>airlinelogos/FXP.bmp</file>
<file>airlinelogos/FXX.bmp</file>
<file>airlinelogos/FYL.bmp</file>
@ -701,6 +733,7 @@
<file>airlinelogos/GAJ.bmp</file>
<file>airlinelogos/GAL.bmp</file>
<file>airlinelogos/GBB.bmp</file>
<file>airlinelogos/GBG.bmp</file>
<file>airlinelogos/GBK.bmp</file>
<file>airlinelogos/GBQ.bmp</file>
<file>airlinelogos/GCL.bmp</file>
@ -710,7 +743,9 @@
<file>airlinelogos/GDE.bmp</file>
<file>airlinelogos/GEA.bmp</file>
<file>airlinelogos/GEC.bmp</file>
<file>airlinelogos/GEL.bmp</file>
<file>airlinelogos/GEO.bmp</file>
<file>airlinelogos/GER.bmp</file>
<file>airlinelogos/GFA.bmp</file>
<file>airlinelogos/GFG.bmp</file>
<file>airlinelogos/GGN.bmp</file>
@ -724,9 +759,11 @@
<file>airlinelogos/GLJ.bmp</file>
<file>airlinelogos/GLO.bmp</file>
<file>airlinelogos/GLR.bmp</file>
<file>airlinelogos/GLT.bmp</file>
<file>airlinelogos/GMI.bmp</file>
<file>airlinelogos/GMQ.bmp</file>
<file>airlinelogos/GMR.bmp</file>
<file>airlinelogos/GOMAIR.bmp</file>
<file>airlinelogos/GOW.bmp</file>
<file>airlinelogos/GRL.bmp</file>
<file>airlinelogos/GSW.bmp</file>
@ -735,6 +772,7 @@
<file>airlinelogos/GTV.bmp</file>
<file>airlinelogos/GUG.bmp</file>
<file>airlinelogos/GUY.bmp</file>
<file>airlinelogos/GWC.bmp</file>
<file>airlinelogos/GWI.bmp</file>
<file>airlinelogos/GXL.bmp</file>
<file>airlinelogos/HAL.bmp</file>
@ -767,6 +805,7 @@
<file>airlinelogos/HXA.bmp</file>
<file>airlinelogos/HYA.bmp</file>
<file>airlinelogos/HYP.bmp</file>
<file>airlinelogos/HYS.bmp</file>
<file>airlinelogos/HYT.bmp</file>
<file>airlinelogos/HZS.bmp</file>
<file>airlinelogos/IAD.bmp</file>
@ -778,6 +817,7 @@
<file>airlinelogos/IBS.bmp</file>
<file>airlinelogos/IBX.bmp</file>
<file>airlinelogos/ICE.bmp</file>
<file>airlinelogos/ICF.bmp</file>
<file>airlinelogos/ICL.bmp</file>
<file>airlinelogos/ICV.bmp</file>
<file>airlinelogos/IFC.bmp</file>
@ -789,6 +829,7 @@
<file>airlinelogos/IJM.bmp</file>
<file>airlinelogos/IKA.bmp</file>
<file>airlinelogos/IMX.bmp</file>
<file>airlinelogos/INI.bmp</file>
<file>airlinelogos/IOS.bmp</file>
<file>airlinelogos/IRA.bmp</file>
<file>airlinelogos/IRB.bmp</file>
@ -799,6 +840,7 @@
<file>airlinelogos/ISR.bmp</file>
<file>airlinelogos/ISS.bmp</file>
<file>airlinelogos/ISV.bmp</file>
<file>airlinelogos/ITL.bmp</file>
<file>airlinelogos/IWY.bmp</file>
<file>airlinelogos/IXR.bmp</file>
<file>airlinelogos/IYA.bmp</file>
@ -812,6 +854,7 @@
<file>airlinelogos/JAT.bmp</file>
<file>airlinelogos/JATnew.bmp</file>
<file>airlinelogos/JAV.bmp</file>
<file>airlinelogos/JAW.bmp</file>
<file>airlinelogos/JBE.bmp</file>
<file>airlinelogos/JBU.bmp</file>
<file>airlinelogos/JCC.bmp</file>
@ -820,22 +863,29 @@
<file>airlinelogos/JEI.bmp</file>
<file>airlinelogos/JES.bmp</file>
<file>airlinelogos/JET.bmp</file>
<file>airlinelogos/JFA.bmp</file>
<file>airlinelogos/JFL.bmp</file>
<file>airlinelogos/JG.bmp</file>
<file>airlinelogos/JIA.bmp</file>
<file>airlinelogos/JIT.bmp</file>
<file>airlinelogos/JJA.bmp</file>
<file>airlinelogos/JJP.bmp</file>
<file>airlinelogos/JKH.bmp</file>
<file>airlinelogos/JKR.bmp</file>
<file>airlinelogos/JLC.bmp</file>
<file>airlinelogos/JLF.bmp</file>
<file>airlinelogos/JLL.bmp</file>
<file>airlinelogos/JLN.bmp</file>
<file>airlinelogos/JMA.bmp</file>
<file>airlinelogos/JME.bmp</file>
<file>airlinelogos/JML.bmp</file>
<file>airlinelogos/JNA.bmp</file>
<file>airlinelogos/JNK.bmp</file>
<file>airlinelogos/JNL.bmp</file>
<file>airlinelogos/JON.bmp</file>
<file>airlinelogos/JOR.bmp</file>
<file>airlinelogos/JOY.bmp</file>
<file>airlinelogos/JPT.bmp</file>
<file>airlinelogos/JRC.bmp</file>
<file>airlinelogos/JRT.bmp</file>
<file>airlinelogos/JSA.bmp</file>
@ -844,6 +894,7 @@
<file>airlinelogos/JTA.bmp</file>
<file>airlinelogos/JTF.bmp</file>
<file>airlinelogos/JTG.bmp</file>
<file>airlinelogos/JTL.bmp</file>
<file>airlinelogos/JUS.bmp</file>
<file>airlinelogos/JW.bmp</file>
<file>airlinelogos/JYH.bmp</file>
@ -855,12 +906,15 @@
<file>airlinelogos/KAP.bmp</file>
<file>airlinelogos/KAR.bmp</file>
<file>airlinelogos/KAZ.bmp</file>
<file>airlinelogos/KBD.bmp</file>
<file>airlinelogos/KBZ.bmp</file>
<file>airlinelogos/KCE.bmp</file>
<file>airlinelogos/KDS.bmp</file>
<file>airlinelogos/KEM.bmp</file>
<file>airlinelogos/KEN.bmp</file>
<file>airlinelogos/KFA.bmp</file>
<file>airlinelogos/KFE.bmp</file>
<file>airlinelogos/KFR.bmp</file>
<file>airlinelogos/KGL.bmp</file>
<file>airlinelogos/KGO.bmp</file>
<file>airlinelogos/KGS.bmp</file>
@ -880,7 +934,9 @@
<file>airlinelogos/KN.bmp</file>
<file>airlinelogos/KNA.bmp</file>
<file>airlinelogos/KNE.bmp</file>
<file>airlinelogos/KOC.bmp</file>
<file>airlinelogos/KOR.bmp</file>
<file>airlinelogos/KPO.bmp</file>
<file>airlinelogos/KQA.bmp</file>
<file>airlinelogos/KRE.bmp</file>
<file>airlinelogos/KRN.bmp</file>
@ -909,12 +965,14 @@
<file>airlinelogos/LDC.bmp</file>
<file>airlinelogos/LDX.bmp</file>
<file>airlinelogos/LER.bmp</file>
<file>airlinelogos/LET.bmp</file>
<file>airlinelogos/LEX.bmp</file>
<file>airlinelogos/LFO.bmp</file>
<file>airlinelogos/LGF.bmp</file>
<file>airlinelogos/LGL.bmp</file>
<file>airlinelogos/LGT.bmp</file>
<file>airlinelogos/LHA.bmp</file>
<file>airlinelogos/LHB.bmp</file>
<file>airlinelogos/LIA.bmp</file>
<file>airlinelogos/LIP.bmp</file>
<file>airlinelogos/LJC.bmp</file>
@ -938,18 +996,25 @@
<file>airlinelogos/LPV.bmp</file>
<file>airlinelogos/LRC.bmp</file>
<file>airlinelogos/LRS.bmp</file>
<file>airlinelogos/LSJ.bmp</file>
<file>airlinelogos/LSO.bmp</file>
<file>airlinelogos/LTC.bmp</file>
<file>airlinelogos/LTG.bmp</file>
<file>airlinelogos/LTR.bmp</file>
<file>airlinelogos/LUR.bmp</file>
<file>airlinelogos/LVR.bmp</file>
<file>airlinelogos/LVT.bmp</file>
<file>airlinelogos/LWA.bmp</file>
<file>airlinelogos/LWG.bmp</file>
<file>airlinelogos/LXG.bmp</file>
<file>airlinelogos/LXJ.bmp</file>
<file>airlinelogos/LYC.bmp</file>
<file>airlinelogos/LYD.bmp</file>
<file>airlinelogos/LYM.bmp</file>
<file>airlinelogos/LYX.bmp</file>
<file>airlinelogos/LZB.bmp</file>
<file>airlinelogos/MAC.bmp</file>
<file>airlinelogos/MAD.bmp</file>
<file>airlinelogos/MAI.bmp</file>
<file>airlinelogos/MAL.bmp</file>
<file>airlinelogos/MAR.bmp</file>
@ -960,6 +1025,7 @@
<file>airlinelogos/MAY.bmp</file>
<file>airlinelogos/MBA.bmp</file>
<file>airlinelogos/MCM.bmp</file>
<file>airlinelogos/MCS.bmp</file>
<file>airlinelogos/MDA.bmp</file>
<file>airlinelogos/MDG.bmp</file>
<file>airlinelogos/MEA.bmp</file>
@ -1008,17 +1074,23 @@
<file>airlinelogos/MWI.bmp</file>
<file>airlinelogos/MWM.bmp</file>
<file>airlinelogos/MXD.bmp</file>
<file>airlinelogos/MXY.bmp</file>
<file>airlinelogos/MYA.bmp</file>
<file>airlinelogos/MYP.bmp</file>
<file>airlinelogos/MYU.bmp</file>
<file>airlinelogos/MYW.bmp</file>
<file>airlinelogos/MZN.bmp</file>
<file>airlinelogos/NAA.bmp</file>
<file>airlinelogos/NAC.bmp</file>
<file>airlinelogos/NAD.bmp</file>
<file>airlinelogos/NAX.bmp</file>
<file>airlinelogos/NCB.bmp</file>
<file>airlinelogos/NCR.bmp</file>
<file>airlinelogos/NDL.bmp</file>
<file>airlinelogos/NFA.bmp</file>
<file>airlinelogos/NFX.bmp</file>
<file>airlinelogos/NGB.bmp</file>
<file>airlinelogos/NGL.bmp</file>
<file>airlinelogos/NGT.bmp</file>
<file>airlinelogos/NHX.bmp</file>
<file>airlinelogos/NIA.bmp</file>
@ -1027,6 +1099,7 @@
<file>airlinelogos/NIN.bmp</file>
<file>airlinelogos/NIS.bmp</file>
<file>airlinelogos/NJE.bmp</file>
<file>airlinelogos/NJU.bmp</file>
<file>airlinelogos/NKS.bmp</file>
<file>airlinelogos/NKT.bmp</file>
<file>airlinelogos/NLA.bmp</file>
@ -1041,6 +1114,7 @@
<file>airlinelogos/NRL.bmp</file>
<file>airlinelogos/NRS.bmp</file>
<file>airlinelogos/NSE.bmp</file>
<file>airlinelogos/NSH.bmp</file>
<file>airlinelogos/NSJ.bmp</file>
<file>airlinelogos/NSW.bmp</file>
<file>airlinelogos/NTB.bmp</file>
@ -1052,6 +1126,7 @@
<file>airlinelogos/NWG.bmp</file>
<file>airlinelogos/NWL.bmp</file>
<file>airlinelogos/NWS.bmp</file>
<file>airlinelogos/NXU.bmp</file>
<file>airlinelogos/NYS.bmp</file>
<file>airlinelogos/NYT.bmp</file>
<file>airlinelogos/NYX.bmp</file>
@ -1060,13 +1135,17 @@
<file>airlinelogos/OAW.bmp</file>
<file>airlinelogos/OBS.bmp</file>
<file>airlinelogos/OCA.bmp</file>
<file>airlinelogos/OCJ.bmp</file>
<file>airlinelogos/OCL.bmp</file>
<file>airlinelogos/OES.bmp</file>
<file>airlinelogos/OFL.bmp</file>
<file>airlinelogos/OHC.bmp</file>
<file>airlinelogos/OHY.bmp</file>
<file>airlinelogos/OIX.bmp</file>
<file>airlinelogos/OKA.bmp</file>
<file>airlinelogos/OKC.bmp</file>
<file>airlinelogos/OKS.bmp</file>
<file>airlinelogos/OLA.bmp</file>
<file>airlinelogos/OLC.bmp</file>
<file>airlinelogos/OLS.bmp</file>
<file>airlinelogos/OMA.bmp</file>
@ -1091,10 +1170,12 @@
<file>airlinelogos/PAM.bmp</file>
<file>airlinelogos/PAO.bmp</file>
<file>airlinelogos/PAPILLON.bmp</file>
<file>airlinelogos/PAS.bmp</file>
<file>airlinelogos/PAV.bmp</file>
<file>airlinelogos/PBD.bmp</file>
<file>airlinelogos/PCO.bmp</file>
<file>airlinelogos/PCP.bmp</file>
<file>airlinelogos/PDY.bmp</file>
<file>airlinelogos/PER.bmp</file>
<file>airlinelogos/PEV.bmp</file>
<file>airlinelogos/PEX.bmp</file>
@ -1118,11 +1199,13 @@
<file>airlinelogos/PNX.bmp</file>
<file>airlinelogos/POE.bmp</file>
<file>airlinelogos/POT.bmp</file>
<file>airlinelogos/PPJ.bmp</file>
<file>airlinelogos/PRF.bmp</file>
<file>airlinelogos/PRI.bmp</file>
<file>airlinelogos/PRW.bmp</file>
<file>airlinelogos/PSC.bmp</file>
<file>airlinelogos/PST.bmp</file>
<file>airlinelogos/PSU.bmp</file>
<file>airlinelogos/PTB.bmp</file>
<file>airlinelogos/PTH.bmp</file>
<file>airlinelogos/PTR.bmp</file>
@ -1130,20 +1213,27 @@
<file>airlinelogos/PUE.bmp</file>
<file>airlinelogos/PUN.bmp</file>
<file>airlinelogos/PVD.bmp</file>
<file>airlinelogos/PVL.bmp</file>
<file>airlinelogos/PVN.bmp</file>
<file>airlinelogos/PVO.bmp</file>
<file>airlinelogos/PVV.bmp</file>
<file>airlinelogos/PWD.bmp</file>
<file>airlinelogos/PXG.bmp</file>
<file>airlinelogos/QAI.bmp</file>
<file>airlinelogos/QAJ.bmp</file>
<file>airlinelogos/QAZ.bmp</file>
<file>airlinelogos/QBA.bmp</file>
<file>airlinelogos/QDA.bmp</file>
<file>airlinelogos/QFA.bmp</file>
<file>airlinelogos/QHD.bmp</file>
<file>airlinelogos/QLK.bmp</file>
<file>airlinelogos/QNT.bmp</file>
<file>airlinelogos/QQE.bmp</file>
<file>airlinelogos/QSM.bmp</file>
<file>airlinelogos/QTG.bmp</file>
<file>airlinelogos/QTR.bmp</file>
<file>airlinelogos/QXE.bmp</file>
<file>airlinelogos/QZR.bmp</file>
<file>airlinelogos/RAC.bmp</file>
<file>airlinelogos/RAE.bmp</file>
<file>airlinelogos/RAM.bmp</file>
@ -1151,11 +1241,17 @@
<file>airlinelogos/RBA.bmp</file>
<file>airlinelogos/RBB.bmp</file>
<file>airlinelogos/RBG.bmp</file>
<file>airlinelogos/RCH.bmp</file>
<file>airlinelogos/RDA.bmp</file>
<file>airlinelogos/RDS.bmp</file>
<file>airlinelogos/REDAIR.bmp</file>
<file>airlinelogos/REU.bmp</file>
<file>airlinelogos/REV.bmp</file>
<file>airlinelogos/RGE.bmp</file>
<file>airlinelogos/RHH.bmp</file>
<file>airlinelogos/RJA.bmp</file>
<file>airlinelogos/RJD.bmp</file>
<file>airlinelogos/RJE.bmp</file>
<file>airlinelogos/RKM.bmp</file>
<file>airlinelogos/RKS.bmp</file>
<file>airlinelogos/RLA.bmp</file>
@ -1174,12 +1270,15 @@
<file>airlinelogos/RPA.bmp</file>
<file>airlinelogos/RPB.bmp</file>
<file>airlinelogos/RPM.bmp</file>
<file>airlinelogos/RSB.bmp</file>
<file>airlinelogos/RSI.bmp</file>
<file>airlinelogos/RSY.bmp</file>
<file>airlinelogos/RTG.bmp</file>
<file>airlinelogos/RTL.bmp</file>
<file>airlinelogos/RUC.bmp</file>
<file>airlinelogos/RUK.bmp</file>
<file>airlinelogos/RUN.bmp</file>
<file>airlinelogos/RUT.bmp</file>
<file>airlinelogos/RVP.bmp</file>
<file>airlinelogos/RWD.bmp</file>
<file>airlinelogos/RWG.bmp</file>
@ -1201,8 +1300,10 @@
<file>airlinelogos/SBM.bmp</file>
<file>airlinelogos/SBS.bmp</file>
<file>airlinelogos/SBU.bmp</file>
<file>airlinelogos/SCA.bmp</file>
<file>airlinelogos/SCN.bmp</file>
<file>airlinelogos/SCO.bmp</file>
<file>airlinelogos/SCU.bmp</file>
<file>airlinelogos/SCX.bmp</file>
<file>airlinelogos/SDA.bmp</file>
<file>airlinelogos/SDG.bmp</file>
@ -1225,6 +1326,7 @@
<file>airlinelogos/SHH.bmp</file>
<file>airlinelogos/SHI.bmp</file>
<file>airlinelogos/SHU.bmp</file>
<file>airlinelogos/SHZ.bmp</file>
<file>airlinelogos/SIA.bmp</file>
<file>airlinelogos/SID.bmp</file>
<file>airlinelogos/SIF.bmp</file>
@ -1233,6 +1335,7 @@
<file>airlinelogos/SIS.bmp</file>
<file>airlinelogos/SIY.bmp</file>
<file>airlinelogos/SJJ.bmp</file>
<file>airlinelogos/SJK.bmp</file>
<file>airlinelogos/SJO.bmp</file>
<file>airlinelogos/SJX.bmp</file>
<file>airlinelogos/SJY.bmp</file>
@ -1253,11 +1356,13 @@
<file>airlinelogos/SLQ.bmp</file>
<file>airlinelogos/SLX.bmp</file>
<file>airlinelogos/SME.bmp</file>
<file>airlinelogos/SMF.bmp</file>
<file>airlinelogos/SMJ.bmp</file>
<file>airlinelogos/SMR.bmp</file>
<file>airlinelogos/SNA.bmp</file>
<file>airlinelogos/SNG.bmp</file>
<file>airlinelogos/SNJ.bmp</file>
<file>airlinelogos/SNM.bmp</file>
<file>airlinelogos/SOL.bmp</file>
<file>airlinelogos/SONOCO.bmp</file>
<file>airlinelogos/SOO.bmp</file>
@ -1274,6 +1379,8 @@
<file>airlinelogos/SRN.bmp</file>
<file>airlinelogos/SRQ.bmp</file>
<file>airlinelogos/SRR.bmp</file>
<file>airlinelogos/SRS.bmp</file>
<file>airlinelogos/SSE.bmp</file>
<file>airlinelogos/SSF.bmp</file>
<file>airlinelogos/SSQ.bmp</file>
<file>airlinelogos/SSV.bmp</file>
@ -1307,6 +1414,7 @@
<file>airlinelogos/TAPexp.bmp</file>
<file>airlinelogos/TAR.bmp</file>
<file>airlinelogos/TAY.bmp</file>
<file>airlinelogos/TAYB752WHITE.bmp</file>
<file>airlinelogos/TBA.bmp</file>
<file>airlinelogos/TBM.bmp</file>
<file>airlinelogos/TBN.bmp</file>
@ -1327,10 +1435,12 @@
<file>airlinelogos/THA.bmp</file>
<file>airlinelogos/THD.bmp</file>
<file>airlinelogos/THE.bmp</file>
<file>airlinelogos/THO.bmp</file>
<file>airlinelogos/THT.bmp</file>
<file>airlinelogos/THY.bmp</file>
<file>airlinelogos/THYANA.bmp</file>
<file>airlinelogos/TIA.bmp</file>
<file>airlinelogos/TIH.bmp</file>
<file>airlinelogos/TIS.bmp</file>
<file>airlinelogos/TIV.bmp</file>
<file>airlinelogos/TIW.bmp</file>
@ -1351,12 +1461,15 @@
<file>airlinelogos/TNX.bmp</file>
<file>airlinelogos/TOK.bmp</file>
<file>airlinelogos/TOM.bmp</file>
<file>airlinelogos/TON.bmp</file>
<file>airlinelogos/TOR.bmp</file>
<file>airlinelogos/TOS.bmp</file>
<file>airlinelogos/TPA.bmp</file>
<file>airlinelogos/TPC.bmp</file>
<file>airlinelogos/TPU.bmp</file>
<file>airlinelogos/TRA.bmp</file>
<file>airlinelogos/TRJ.bmp</file>
<file>airlinelogos/TRQ.bmp</file>
<file>airlinelogos/TSC.bmp</file>
<file>airlinelogos/TSG.bmp</file>
<file>airlinelogos/TSH.bmp</file>
@ -1381,11 +1494,13 @@
<file>airlinelogos/TWB.bmp</file>
<file>airlinelogos/TWI.bmp</file>
<file>airlinelogos/TWY.bmp</file>
<file>airlinelogos/TXA.bmp</file>
<file>airlinelogos/TYA.bmp</file>
<file>airlinelogos/UAE.bmp</file>
<file>airlinelogos/UAL.bmp</file>
<file>airlinelogos/UBA.bmp</file>
<file>airlinelogos/UBD.bmp</file>
<file>airlinelogos/UBE.bmp</file>
<file>airlinelogos/UBG.bmp</file>
<file>airlinelogos/UCA.bmp</file>
<file>airlinelogos/UDN.bmp</file>
@ -1404,13 +1519,16 @@
<file>airlinelogos/URS.bmp</file>
<file>airlinelogos/USC.bmp</file>
<file>airlinelogos/UTA.bmp</file>
<file>airlinelogos/UTAOLD.bmp</file>
<file>airlinelogos/UTN.bmp</file>
<file>airlinelogos/UTP.bmp</file>
<file>airlinelogos/UTY.bmp</file>
<file>airlinelogos/UVT.bmp</file>
<file>airlinelogos/UWD.bmp</file>
<file>airlinelogos/UWJ.bmp</file>
<file>airlinelogos/UZB.bmp</file>
<file>airlinelogos/VAA.bmp</file>
<file>airlinelogos/VAG.bmp</file>
<file>airlinelogos/VAJ.bmp</file>
<file>airlinelogos/VAL.bmp</file>
<file>airlinelogos/VAR.bmp</file>
@ -1437,18 +1555,21 @@
<file>airlinelogos/VJC.bmp</file>
<file>airlinelogos/VJS.bmp</file>
<file>airlinelogos/VJT.bmp</file>
<file>airlinelogos/VKA.bmp</file>
<file>airlinelogos/VKG.bmp</file>
<file>airlinelogos/VKGOLD.bmp</file>
<file>airlinelogos/VLG.bmp</file>
<file>airlinelogos/VLJ.bmp</file>
<file>airlinelogos/VLK.bmp</file>
<file>airlinelogos/VLM.bmp</file>
<file>airlinelogos/VLZ.bmp</file>
<file>airlinelogos/VMP.bmp</file>
<file>airlinelogos/VNE.bmp</file>
<file>airlinelogos/VNL.bmp</file>
<file>airlinelogos/VOC.bmp</file>
<file>airlinelogos/VOE.bmp</file>
<file>airlinelogos/VOI.bmp</file>
<file>airlinelogos/VOS.bmp</file>
<file>airlinelogos/VOZ.bmp</file>
<file>airlinelogos/VPA.bmp</file>
<file>airlinelogos/VPC.bmp</file>
@ -1456,6 +1577,7 @@
<file>airlinelogos/VRD.bmp</file>
<file>airlinelogos/VRE.bmp</file>
<file>airlinelogos/VRG.bmp</file>
<file>airlinelogos/VRH.bmp</file>
<file>airlinelogos/VSV.bmp</file>
<file>airlinelogos/VTA.bmp</file>
<file>airlinelogos/VTE.bmp</file>
@ -1466,6 +1588,8 @@
<file>airlinelogos/VUN.bmp</file>
<file>airlinelogos/VVC.bmp</file>
<file>airlinelogos/VVV.bmp</file>
<file>airlinelogos/VXP.bmp</file>
<file>airlinelogos/VYR.bmp</file>
<file>airlinelogos/WAA.bmp</file>
<file>airlinelogos/WAJ.bmp</file>
<file>airlinelogos/WAL.bmp</file>
@ -1474,6 +1598,7 @@
<file>airlinelogos/WDE.bmp</file>
<file>airlinelogos/WEN.bmp</file>
<file>airlinelogos/WEW.bmp</file>
<file>airlinelogos/WFL.bmp</file>
<file>airlinelogos/WFR.bmp</file>
<file>airlinelogos/WGN.bmp</file>
<file>airlinelogos/WHS.bmp</file>
@ -1481,9 +1606,11 @@
<file>airlinelogos/WIF.bmp</file>
<file>airlinelogos/WIL.bmp</file>
<file>airlinelogos/WJA.bmp</file>
<file>airlinelogos/WJT.bmp</file>
<file>airlinelogos/WLB.bmp</file>
<file>airlinelogos/WLC.bmp</file>
<file>airlinelogos/WMN.bmp</file>
<file>airlinelogos/WMU.bmp</file>
<file>airlinelogos/WON.bmp</file>
<file>airlinelogos/WORLD2FLY.bmp</file>
<file>airlinelogos/WOW.bmp</file>
@ -1499,6 +1626,7 @@
<file>airlinelogos/XAI.bmp</file>
<file>airlinelogos/XAU.bmp</file>
<file>airlinelogos/XAX.bmp</file>
<file>airlinelogos/XGE.bmp</file>
<file>airlinelogos/XLF.bmp</file>
<file>airlinelogos/XLK.bmp</file>
<file>airlinelogos/XLR.bmp</file>
@ -1506,6 +1634,7 @@
<file>airlinelogos/XOJ.bmp</file>
<file>airlinelogos/XRC.bmp</file>
<file>airlinelogos/XRO.bmp</file>
<file>airlinelogos/XSR.bmp</file>
<file>airlinelogos/YEL.bmp</file>
<file>airlinelogos/YZR.bmp</file>
<file>airlinelogos/ZOM.bmp</file>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Some files were not shown because too many files have changed in this diff Show More