klog-0.9.8.1/0000755000175000017500000000000013532600401011575 5ustar develdevelklog-0.9.8.1/setuppagesats.h0000644000175000017500000001030113532572307014646 0ustar develdevel#ifndef SETUPPAGESATS_H #define SETUPPAGESATS_H /*************************************************************************** setuppagesats.h - description ------------------- begin : Dec 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include "updatesatsdata.h" #include "dataproxy.h" #include "utilities.h" #include "setuppagesatsnew.h" class SetupPageSats : public QWidget { Q_OBJECT public: SetupPageSats(DataProxy *dp, QWidget *parent=0); ~SetupPageSats(); int getSelectedSat(); void setSelectedSat(const int _i); void createNewSat(); void setDefaultStationCallsign (const QString _p); void setDefaultOperators(const QString _p); private slots: void slotImportButtonClicked(); void slotExportButtonClicked(); void slotNewButtonClicked(); void slotEditButtonClicked(); void slotRemoveButtonClicked(); void slotAnalyzeNewSatData(const QStringList _qs); void slotSatselected(const QModelIndex & index); void slotSatDoubleClicked(const QModelIndex & index); void slotSatsCancelled(const bool _q); signals: //void exitSignal(const int status); // 1 = OK, -1 = NOK, 2 = Cancel clicked void newSatData(const QStringList _qs); // Station QRZ + Operators to be shown in the main tab void queryError(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); // To alert about any failed query execution private: //void createActions(); QStringList readSats(); //bool readSatsFile(); void createSatsPanel(); void createSatsModel(); void createActions(); //bool addNewSat(const QStringList _qs); void updateSelectedSats(); void readSelectedSat(const int _i); void showError(const QString _errorC); /* Wizard to create a new Sat*/ //QWizardPage *createSatTypePage(); //QWizard *newSatWizard; // Wizard to create a new Sat /*^Wizard to create a new satellite^*/ QSqlRelationalTableModel *satsModel; QWidget *satsPanel; QTableView *satsView; QAbstractButton *finishButton; QPushButton *newSatPushButton, *editPushButton, *removePushButton, *importPushButton, *exportPushButton; int lastSat; QString currentSatComment; QString currentStationCallSign; QComboBox *currentSats; QStringList satsAvailable; QString arrild, satname, uplink, downlink, modes; DataProxy *dataProxy; int selectedSat; QString defaultStationCallSign, defaultOperators; Utilities *util; SetupPageSatsNew *newSat; }; #endif // SETUPPAGESATS_H klog-0.9.8.1/mainwindowinputqsl.h0000644000175000017500000000707513532572307015750 0ustar develdevel#ifndef MAINWINDOWINPUTQSL_H #define MAINWINDOWINPUTQSL_H /*************************************************************************** mainwindowinputqsl.h - description ------------------- begin : jun 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the QSL options // #include #include #include #include "dataproxy.h" #include "dataproxy_sqlite.h" #include "utilities.h" class MainWindowInputQSL : public QWidget { Q_OBJECT public: explicit MainWindowInputQSL(DataProxy *dp, QWidget *parent = 0); ~MainWindowInputQSL(); QString getQSLRecStatus(); QString getQSLSenStatus(); QString getSentVia(); QString getRecVia(); QString getQSLVia(); QString getQSLMsg(); void setQSLRecStatus(const QString _qs); void setQSLSenStatus(const QString _qs); void setQSLRecVia(const QString _qs); void setQSLSenVia(const QString _qs); void setQSLVia(const QString _qs, QColor qColor=Qt::black); void setQSLMsg(const QString _qs); QDate getQSLRecDate(); QDate getQSLSenDate(); void setQSLRecDate(const QDate _qs); void setQSLSenDate(const QDate _qs); void clear(); void qslViaClear(); signals: void returnPressed(); private slots: void slotQSLViaTextChanged(); void slotQSLSentComboBoxChanged(); void slotQSLRecvComboBoxChanged(); void slotQSLViaLineEditReturnPressed(); /* void sloteQSLRecvComboBoxChanged(); void sloteQSLSentComboBoxChanged(); void slotLotwRecvComboBoxChanged(); void slotLotwSentComboBoxChanged(); */ private: void createUI(); void setDefaultData(); QComboBox *qslSentComboBox, *qslRecComboBox, *qslSentViaComboBox, *qslRecViaComboBox; QDateEdit *qslSentQDateEdit, *qslRecQDateEdit; QTextEdit *qslmsgTextEdit; QLineEdit *qslViaLineEdit; DataProxy *dataProxy; Utilities *util; QStringList qslSentStatusList, qslRcvdStatusList, qslViaList; QPalette palette; // To color some widgets }; #endif // MAINWINDOWINPUTQSL_H klog-0.9.8.1/updatesatsdata.h0000644000175000017500000000445413532572307015001 0ustar develdevel#ifndef UPDATESATSDATA_H #define UPDATESATSDATA_H /*************************************************************************** updatesatsdata.h - description ------------------- begin : sep 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "utilities.h" #include "dataproxy.h" #include "dataproxy_sqlite.h" class UpdateSatsData : public QObject { Q_OBJECT public: explicit UpdateSatsData(DataProxy *dp, QObject *parent = nullptr); bool readSatDataFile(); bool satDataFileRead(const QString& tfileName); private: Utilities *util; DataProxy *dataProxy; signals: void satsUpdatedSignal(const bool _p); // void clearError(); public slots: }; #endif // UPDATESATSDATA_H klog-0.9.8.1/logwindow.h0000644000175000017500000001057613532572307014005 0ustar develdevel#ifndef LOGWINDOW_H #define LOGWINDOW_H /*************************************************************************** logwindow.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include //#include #include #include #include #include #include #include "dataproxy.h" #include "logmodel.h" #include "awards.h" //#include "dxccstatuswidget.h" #include "elogclublog.h" class LogWindow : public QWidget { Q_OBJECT public: explicit LogWindow(DataProxy *dp, QWidget *parent = 0); ~LogWindow(); void createlogPanel(const int _currentLog); void clear(); void refresh(); void setCurrentLog(const int _currentLog); void qslSentViaBureau(const int _qsoId); //Maybe this could be defined as private and call it with an action, if needed. void qslRecViaBureau(const int _qsoId); //Maybe this could be defined as private and call it with an action, if needed. void qslRecViaDirect(const int _qsoId); bool isQSLReceived(const int _qsoId); bool isQSLSent(const int _qsoId); signals: void actionQSODoubleClicked(const int _qsoid); void updateAwards(); void updateSearchText(); //void qsoFound(const QStringList _qs); // Each: QString with format: Fieldname:value void queryError(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); // To alert about any failed query execution //void clearError(); private slots: void slotDoubleClickLog(const QModelIndex & index); void slotRighButtonFromLog(const QPoint& pos); void slotQSLSentViaBureauFromLog(); void slotQSLSentViaDirectFromLog(); void slotQSLRecViaDirectFromLog(); void slotQSLRecViaBureauFromLog(); void slotQsoDeleteFromLog(); void slotQSOToEditFromLog(); void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); private: void createUI(); void createActionsCommon(); void createActions(); void deleteQSO(const int _qsoID); void righButtonFromLogMenu(const int trow); void showMenuRightButtonFromLogCreateActions(); void setDefaultData(); void setColumnsToDX(); DataProxy *dataProxy; LogModel *logModel; Awards *awards; //DXCCStatusWidget *dxccStatusWidget; eLogClubLog *elogClublog; QTableView *logView; QLabel *logLabel; QAction *delQSOFromLogAct; QAction *qsoToEditFromLogAct; QAction *qslSentViaBureauFromLogAct; QAction *qslSentViaDirectFromLogAct; QAction *qslRecViaBureauFromLogAct; QAction *qslRecViaDirectFromLogAct; int currentLog; }; #endif // LOGWINDOW_H klog-0.9.8.1/setuppagesatseditor.h0000644000175000017500000000603113532572307016062 0ustar develdevel#ifndef SETUPPAGESATEDITOR_H #define SETUPPAGESATEDITOR_H /*************************************************************************** setuppagesateditor.h - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "dataproxy.h" //#include "utilities.h" enum { WORLD_DXCCid = 0, WORLD_Nameid = 1, WORLD_MainPrefix = 2, WORLD_CQZ = 3, WORLD_ITUZ = 4, WORLD_Cont = 5 }; class SetupPageSatEditor : public QWidget { Q_OBJECT public: SetupPageSatEditor(DataProxy *dp, QWidget *parent=0); ~SetupPageSatEditor(); private slots: void slotAddButtonClicked(); void slotDelButtonClicked(); void slotEditButtonClicked(); void slotDoubleClickEntity( const QModelIndex & index); //void slotAnalyzeEntityAddedSignal(const QStringList _qs); void slotImportSatsButtonClicked(); private: //World *world; Utilities *util; DataProxy *dataProxy; void createSatsPanel(); void createSatsModel(); void createActions(); bool isSatsListEmpty(); QSqlRelationalTableModel *satsModel; QWidget *satsPanel; QTableView *satsView; QTreeWidget *searchResultsTreeWidget; QPushButton *addSatPushButton, *delSatPushButton, *editSatPushButton, *exportSatsPushButton, *loadSatsPushButton; //SetupEntityDialog *setupEntityDialog; }; #endif // SetupPageSatEditor_H klog-0.9.8.1/dataproxy_sqlite.cpp0000644000175000017500000063433113532572307015724 0ustar develdevel/*************************************************************************** dataproxy_sqlite.cpp - description ------------------- begin : sept 2014 copyright : (C) 2014 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "dataproxy_sqlite.h" #include "utilities.h" //#include DataProxy_SQLite::DataProxy_SQLite(const QString _softVersion, const QString _parentFunction) { //qDebug() << "DataProxy_SQLite::DataProxy_SQLite" << _softVersion << _parentFunction << endl; //qDebug() << "DataProxy_SQLite::DataProxy_SQLite 1" << endl; util = new Utilities(); util->setVersion(_softVersion); db = new DataBase(Q_FUNC_INFO, _softVersion, util->getKLogDBFile()); //db = new DataBase(Q_FUNC_INFO, util->getKLogDBFile()); dbCreated = db->createConnection(); //dbCreated = db->createBandModeMaps(); //qDebug() << "DataProxy_SQLite::DataProxy_SQLite - END" << endl; searching = false; executionN = 0; //preparedQuery = new QSqlQuery; //db = new DataBase(0); //dataProxy = new DataProxy_SQLite(); //qDebug() << "DataProxy_SQLite::DataProxy_SQLite END" << endl; } DataProxy_SQLite::~DataProxy_SQLite(){ //qDebug() << "DataProxy_SQLite::~DataProxy_SQLite" << endl; } QString DataProxy_SQLite::getSoftVersion() { //SELECT MAX (softversion) FROM softwarecontrol QSqlQuery query; QString stQuery = QString("SELECT MAX (softversion) FROM softwarecontrol"); if (query.exec(stQuery)) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); //qDebug() << "DataProxy_SQLite::getSoftVersion: DATA: " << v << endl; if (v.length()<1) { //The following is not a query error but if the softwareversion value is lower than 0 or empty queryError(Q_FUNC_INFO, tr("Software version in DB is null"), -1, tr("No query failed")); // To alert about any failed query execution } return v; } else { query.finish(); //qDebug() << "DataProxy_SQLite::getSoftVersion: version empty-1" << endl; return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::getSoftVersion: version empty-1 - ERROR" << endl; return QString(); } } QString DataProxy_SQLite::getDBVersion() { //SELECT MAX (dbversion) FROM softwarecontrol QSqlQuery query; QString stQuery = QString("SELECT MAX (dbversion) FROM softwarecontrol"); if (query.exec(stQuery)) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); return v; } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } } bool DataProxy_SQLite::reconnectDB() { return db->reConnect(util->getKLogDBFile()); } void DataProxy_SQLite::createLogModel(){ //qDebug() << "DataProxy_SQLite::createLogModel" << endl; } void DataProxy_SQLite::createLogPanel(){ //qDebug() << "DataProxy_SQLite::createLogPanel" << endl; } int DataProxy_SQLite::getIdFromModeName(const QString& _modeName) { //qDebug() << "DataProxy_SQLite::getIdFromModeName: " << _modeName << "/" << QString::number(db->getModeIDFromName2(_modeName)) << endl; if (_modeName.length()<2) { return -4; } return db->getModeIDFromName2(_modeName); } int DataProxy_SQLite::getSubModeIdFromSubMode(const QString _subModeName) { //qDebug() << "DataProxy_SQLite::getSubModeIdFromSubMode: " << _subModeName << endl; if (_subModeName.length()<2) { return -3; } QSqlQuery query; QString stQuery = QString("SELECT id FROM mode WHERE submode='%1'").arg(_subModeName.toUpper()); if (query.exec(stQuery)) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -2; } } int DataProxy_SQLite::getModeIdFromSubModeId(const int _sm) { return getIdFromModeName(getNameFromSubMode(getSubModeFromId(_sm))); } bool DataProxy_SQLite::isModeDeprecated (const QString _sm) { if (_sm.length()<2) { return -3; } QSqlQuery query; QString stQuery = QString("SELECT deprecated FROM mode WHERE submode='%1'").arg(_sm); if (query.exec(stQuery)) { query.next(); if (query.isValid()) { if ( (query.value(0)).toInt() == 1 ) { query.finish(); return true; } else { query.finish(); return false; } } else { query.finish(); return false; // In case we can't check, we don't state it as deprecated } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; // In case we can't check, we don't state it as deprecated } } int DataProxy_SQLite::getIdFromBandName(const QString& _bandName) { // //qDebug() << "DataProxy_SQLite::getIdFromBandName: " << _bandName << "/" << QString::number(db->getBandIDFromName2(_bandName))<< endl; if (_bandName.length()<1) { //qDebug() << "DataProxy_SQLite::getIdFromBandName:-4: " << _bandName << "/" << QString::number(db->getBandIDFromName2(_bandName))<< endl; return -4; } return db->getBandIDFromName2(_bandName); } QString DataProxy_SQLite::getNameFromBandId (const int _id) { //qDebug() << "DataProxy_SQLite::getNameFromBandId: " << QString::number(_id) << endl; return db->getBandNameFromID2(_id); } QString DataProxy_SQLite::getNameFromModeId (const int _id) { //qDebug() << "DataProxy_SQLite::getNameFromModeId" << endl; //return db->getModeNameFromID2(_id); return db->getModeNameFromNumber(_id); } QString DataProxy_SQLite::getNameFromSubModeId (const int _id) { //qDebug() << "DataProxy_SQLite::getNameFromSubModeId: " << QString::number(_id) << "DB: " << db->getModeNameFromID2(_id) << endl; return db->getSubModeNameFromID2(_id); /* QSqlQuery query; QString queryString = QString("SELECT submode, name, deprecated FROM mode WHERE id='%1'").arg(_id); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ( (query.value(2)).toInt()<0 ) { // DEPRECATED VALUE, return the MODE return (query.value(1)).toString(); } else { return (query.value(0)).toString(); } } else { return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); return QString(); } */ } QString DataProxy_SQLite::getSubModeFromId (const int _id) { //qDebug() << "DataProxy_SQLite::getSubModeFromId: " << QString::number(_id) << endl; QSqlQuery query; QString queryString = QString("SELECT submode FROM mode WHERE id='%1'").arg(_id); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); return v; } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } //return QString(); } QString DataProxy_SQLite::getNameFromSubMode (const QString _sm) { QSqlQuery query; QString queryString = QString("SELECT name FROM mode WHERE submode='%1'").arg(_sm.toUpper()); //QString queryString = QString("SELECT name, deprecated FROM mode WHERE submode='%1'").arg(_sm.toUpper()); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); return v; } else { query.finish(); return QString(); } query.finish(); return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getFreqFromBandId(const int _id) { return db->getFreqFromBandId(_id); } int DataProxy_SQLite::getBandIdFromFreq(const double _n) { //qDebug() << "DataProxy_SQLite::getBandIdFromFreq: " << QString::number(_n) << endl; //Freq should be in MHz bool sqlOk = false; QString queryString = QString("SELECT id FROM band WHERE lower <= '%1' and upper >= '%2'").arg(_n).arg(_n); QSqlQuery query(queryString); sqlOk = query.exec(); //qDebug() << "DataProxy_SQLite::getBandIdFromFreq: Query: " << query.lastQuery() << endl; if (sqlOk) { //qDebug() << "DataProxy_SQLite::getBandIdFromFreq: Query OK" << endl; query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { //qDebug() << "DataProxy_SQLite::getBandIdFromFreq: Query NOK" << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -2; } return -3; } QString DataProxy_SQLite::getBandNameFromFreq(const double _n) { //qDebug() << "DataProxy_SQLite::getBandNameFromFreq: " << QString::number(_n) << endl; return getNameFromBandId(getBandIdFromFreq(_n)); } double DataProxy_SQLite::getLowLimitBandFromBandName(const QString _sm) { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: " << _sm << endl; QSqlQuery query; QString queryString = QString("SELECT lower FROM band WHERE name='%1' OR name='%2'").arg(_sm).arg(_sm.toUpper()); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ( (query.value(0)).toDouble()<0 ) { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: -1.0-1" << endl; query.finish(); return -1.0; } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName(else): " << QString::number((query.value(0)).toDouble()) << endl; double v = (query.value(0)).toDouble(); query.finish(); return v; } } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: -1.0-2" << endl; query.finish(); return -1.0; } //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: -1.0-3" << endl; //query.finish(); //return -1.0; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1.0; } //return -1.0; } double DataProxy_SQLite::getLowLimitBandFromBandId(const QString _sm) { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandId" << endl; QSqlQuery query; QString queryString = QString("SELECT lower FROM band WHERE id='%1'").arg(_sm.toUpper()); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ( (query.value(1)).toDouble()<0 ) { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandId: -1.0-1" << endl; query.finish(); return -1.0; } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandId: " << QString::number((query.value(0)).toDouble()) << endl; double v = (query.value(0)).toDouble(); query.finish(); return v; } } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandId: -1.0-2" << endl; query.finish(); return -1.0; } //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandId: -1.0-3" << endl; query.finish(); return -1.0; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1.0; } //return -1.0; } bool DataProxy_SQLite::isThisFreqInBand(const QString _band, const QString _fr) { return db->isThisFreqInBand(_band, _fr); } QStringList DataProxy_SQLite::getBands() { //qDebug() << "DataProxy_SQLite::getBands - DEPRECATED please use getBandNames - TODO: Remove this function and change the calls" << endl; return getBandNames(); /* QStringList bands = QStringList(); QSqlQuery query("SELECT name FROM band"); while (query.next()) { if (query.isValid()){ bands << query.value(0).toString(); } } //return bands; return sortBandNamesBottonUp(bands); */ } QStringList DataProxy_SQLite::getBandNames() { //qDebug() << "DataProxy_SQLite::getBandNames" << endl; QStringList bands = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; queryString = QString("SELECT DISTINCT name FROM band"); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getBandNames: " << queryString << endl; bands.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); return sortBandNamesBottonUp(bands); //return bands; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } } QStringList DataProxy_SQLite::getModes() { QStringList modes = QStringList(); QSqlQuery query("SELECT submode FROM mode ORDER BY submode"); while (query.next()) { if (query.isValid()){ modes << query.value(0).toString(); } } query.finish(); modes.sort(); return modes; } QStringList DataProxy_SQLite::sortBandNamesBottonUp(const QStringList _qs) { //Receives a list of band names, sorts it from the lower band to the upper band and returns //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp: " << QString::number(_qs.length()) << endl; if (_qs.length()<2) { return _qs; } //Next lines to be commented out //for (int i=0; i<_qs.length();i++) //{ // //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp - band: " << _qs.at(i) << QString::number(i) << "/" << QString::number(_qs.length())<< endl; //} //Previous lines to be commented out QMap map; map.clear(); QStringList qs; qs.clear(); //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp-00" << endl; for (int j=0; j<_qs.count(); j++) { map.insert(getLowLimitBandFromBandName(_qs.at(j)), _qs.at(j)); } //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp-10" << endl; QMap::const_iterator i = map.constBegin(); //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp-20" << endl; while (i != map.constEnd()) { qs << i.value(); ++i; } //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp - END -lengh = " << QString::number(qs.length()) << endl; qs.removeDuplicates(); return qs; } QStringList DataProxy_SQLite::getBandIDs() { //qDebug() << "DataProxy_SQLite::getBandIDs" << endl; QStringList bands = QStringList(); QSqlQuery query("SELECT id FROM band"); while (query.next()) { if (query.isValid()){ bands << query.value(0).toString(); } } query.finish(); return sortBandIdBottonUp(bands); } QStringList DataProxy_SQLite::sortBandIdBottonUp(const QStringList _qs) { //Receives a list of band id, sorts it from the lower band to the upper band and returns QMap map; QStringList qs; qs.clear(); for (int j=0; j<_qs.count(); j++) { map.insert(getLowLimitBandFromBandId(_qs.at(j)), _qs.at(j)); } QMap::const_iterator i = map.constBegin(); while (i != map.constEnd()) { qs << i.value(); ++i; } return qs; } QStringList DataProxy_SQLite::getModesIDs() { QStringList modes = QStringList(); QSqlQuery query("SELECT id FROM mode"); while (query.next()) { if (query.isValid()){ modes << query.value(0).toString(); } } query.finish(); return modes; } QStringList DataProxy_SQLite::getBandsInLog(const int _log) { //qDebug() << "DataProxy_SQLite::getBandsInLog: " << endl; QStringList bands = QStringList(); QString queryString = QString(); if (_log <= 0) { queryString = QString("SELECT DISTINCT band.name FROM log, band WHERE band.id = log.bandid ORDER BY band.id DESC"); } else { queryString = QString("SELECT DISTINCT band.name FROM log, band WHERE band.id = log.bandid AND log.lognumber='%1' ORDER BY band.id DESC").arg(_log); } QSqlQuery query(queryString); while (query.next()) { if (query.isValid()){ bands << query.value(0).toString(); } } query.finish(); return sortBandNamesBottonUp(bands); //return bands; } QStringList DataProxy_SQLite::getModesInLog(const int _log) { //qDebug() << "DataProxy_SQLite::getModesInLog: " << endl; QStringList modes = QStringList(); QString queryString = QString(); if (_log <=0 ) { queryString = QString("SELECT mode.id, mode.submode, COUNT (mode.submode) FROM log, mode WHERE mode.id = log.modeid GROUP BY mode.submode ORDER BY count (mode.submode) DESC"); } else { queryString = QString("SELECT mode.id, mode.submode, COUNT (mode.submode) FROM log, mode WHERE mode.id = log.modeid AND log.lognumber='%1' GROUP BY mode.submode ORDER BY count (mode.submode) DESC").arg(_log); } QSqlQuery query(queryString); while (query.next()) { if (query.isValid()){ modes << query.value(1).toString(); } } query.finish(); //qDebug() << "DataProxy_SQLite::getModesInLog: " << modes.join(" - ") << endl; modes.sort(); return modes; } int DataProxy_SQLite::getMostUsedBand(const int _log) { //qDebug() << "DataProxy_SQLite::getMostUsedBand: " << endl; QString queryString = QString(); if (_log <=0 ) { queryString = QString("SELECT band.id, band.name, COUNT (band.name) FROM log, band WHERE band.id = log.bandid GROUP BY band.id ORDER BY count (band.id) DESC LIMIT 1"); } else { queryString = QString("SELECT band.id, band.name, COUNT (band.name) FROM log, band WHERE band.id = log.bandid AND log.lognumber='%1' GROUP BY band.id ORDER BY count (band.id) DESC LIMIT 1").arg(_log); } QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { int v = query.value(0).toInt(); query.finish(); //qDebug() << "DataProxy_SQLite::getMostUsedBand-OK: " << QString::number(v)<< endl; return v; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::getMostUsedBand-ERROR-1: " << endl; return -1; } //qDebug() << "DataProxy_SQLite::getMostUsedBand-ERROR-2: " << endl; return -2; } int DataProxy_SQLite::getMostUsedMode(const int _log) { //qDebug() << "DataProxy_SQLite::getMostUsedMode: " << endl; QString queryString = QString(); if (_log <=0 ) { queryString = QString("SELECT mode.id, mode.submode, COUNT (mode.submode) FROM log, mode WHERE mode.id = log.modeid GROUP BY mode.submode ORDER BY count (mode.submode) DESC LIMIT 1"); } else { queryString = QString("SELECT mode.id, mode.submode, COUNT (mode.submode) FROM log, mode WHERE mode.id = log.modeid AND log.lognumber='%1' GROUP BY mode.submode ORDER BY count (mode.submode) DESC LIMIT 1").arg(_log); } QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { int v = query.value(0).toInt(); query.finish(); return v; } } query.finish(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1; } return -2; } int DataProxy_SQLite::getLastQSOid() { //qDebug() << "DataProxy_SQLite::getLastQSOid" << endl; QSqlQuery query; bool sqlOK = query.exec("SELECT MAX(id) from log"); if (sqlOK) { query.next(); if (query.isValid()) { int v = query.value(0).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1; } } bool DataProxy_SQLite::clearLog() { //qDebug() << "DataProxy_SQLite::clearLog" << endl; //int errorCode = 0; QSqlQuery query; bool sqlOK = query.exec("DELETE FROM log"); if (sqlOK) { //qDebug() << "DataProxy_SQLite::clearLog: Log deleted!" << endl; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::clearLog: Log deleted FAILED" << endl; //errorCode = query.lastError().number(); //qDebug() << "DataProxy_SQLite::clearLog - query error: " << QString::number(errorCode) << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastQuery: " << query.lastQuery() << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastError-data: " << query.lastError().databaseText() << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastError-driver: " << query.lastError().driverText() << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastError-n: " << QString::number(query.lastError().number() ) << endl; } query.finish(); sqlOK = query.exec("DELETE FROM awarddxcc"); if (sqlOK) { //qDebug() << "DataProxy_SQLite::clearLog: Awarddxcc deleted!" << endl; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::clearLog: Awarddxcc deletedFAILED" << endl; //qDebug() << "DataProxy_SQLite::clearLog - query error: " << QString::number(query.lastError().number()) << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastQuery: " << query.lastQuery() << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastError-data: " << query.lastError().databaseText() << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastError-driver: " << query.lastError().driverText() << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastError-n: " << QString::number(query.lastError().number() ) << endl; } query.finish(); if (query.exec("DELETE FROM awardwaz")) { //qDebug() << "DataProxy_SQLite::clearLog: Awardwaz deleted!" << endl; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::clearLog: Awardwaz deleted FAILED" << endl; //errorCode = query.lastError().number(); //qDebug() << "DataProxy_SQLite::clearLog - query error: " << QString::number(query.lastError().number()) << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastQuery: " << query.lastQuery() << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastError-data: " << query.lastError().databaseText() << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastError-driver: " << query.lastError().driverText() << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastError-n: " << QString::number(query.lastError().number() ) << endl; } query.finish(); //query.clear(); if (query.isActive()) { //qDebug() << "DataProxy_SQLite::clearLog: Query Active!" << endl; query.finish(); return false; } else { query.prepare("VACUUM;"); //qDebug() << "DataProxy_SQLite::clearLog: Query Not Active!" << endl; if (query.exec()) { //qDebug() << "DataProxy_SQLite::clearLog: VACUUM OK!" << endl; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::clearLog: VACUUM FAILED" << endl; //errorCode = query.lastError().number(); //qDebug() << "DataProxy_SQLite::clearLog - query error: " << QString::number(query.lastError().number()) << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastQuery: " << query.lastQuery() << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastError-data: " << query.lastError().databaseText() << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastError-driver: " << query.lastError().driverText() << endl; //qDebug() << "DataProxy_SQLite::clearLog: LastError-n: " << QString::number(query.lastError().number() ) << endl; } } query.finish(); return false; } bool DataProxy_SQLite::qslSentViaDirect(const int _qsoId, const QString _updateDate) { //qDebug() << "DataProxy_SQLite::qslSentViaDirect" << endl; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_sent = 'Y', qsl_sent_via = 'D', qslsdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); //qDebug() << "DataProxy_SQLite::qslSentViaDirect: " << queryString << endl; bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } return false; } bool DataProxy_SQLite::qslSentViaBureau(const int _qsoId, const QString _updateDate) { //qDebug() << "DataProxy_SQLite::qslSentViaBureau" << endl; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_sent = 'Y', qsl_sent_via = 'B', qslsdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } return false; } bool DataProxy_SQLite::qslRecViaBureau(const int _qsoId, const QString _updateDate) { //qDebug() << "DataProxy_SQLite::" << QString::number (_qsoId) << "/" << _updateDate << endl; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qslrdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << "DataProxy_SQLite:: TRUE" << endl; //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite:: FALSE" << endl; return false; } bool DataProxy_SQLite::qslRecViaBureau(const int _qsoId, const QString _updateDate, const bool _queueSentQSL) { //qDebug() << "DataProxy_SQLite::qslRecViaBureau: " << _updateDate << endl; QSqlQuery query; QString queryString; //bool requestQSL = false; bool sqlOK; if (_queueSentQSL) { queryString = QString("SELECT qsl_sent FROM log WHERE id = '%1'").arg(_qsoId); sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); if ((queryString == "Y") || (queryString == "R")) { // NO ACTION REQUIRED, QSL IS ALREADY SENT //qDebug() << "DataProxy_SQLite::qslRecViaBureau: QSL already requested" << endl; //requestQSL = false; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qslrdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); } else { //qDebug() << "DataProxy_SQLite::qslRecViaBureau: Request QSL-1" << endl; //requestQSL = true; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); } } else { //qDebug() << "DataProxy_SQLite::qslRecViaBureau: Request QSL-2" << endl; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); //requestQSL = true; } } else { //qDebug() << "DataProxy_SQLite::qslRecViaBureau: Request QSL-3" << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); //requestQSL = true; } } else { //requestQSL = false; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qslrdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); } query.finish(); sqlOK = query.exec(queryString); //queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qslrdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslRecViaBureau TRUE" << endl; query.finish(); //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite::qslRecViaBureau FALSE" << endl; query.finish(); return false; } bool DataProxy_SQLite::qslRecViaDirect(const int _qsoId, const QString _updateDate) { //qDebug() << "DataProxy_SQLite::qslRecViaDirect" << endl; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qslrdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } query.finish(); return false; } bool DataProxy_SQLite::qslRecViaDirect(const int _qsoId, const QString _updateDate, const bool _queueSentQSL) { //qDebug() << "DataProxy_SQLite::qslRecViaDirect: " << _updateDate << endl; QSqlQuery query; QString queryString; bool sqlOK; if (_queueSentQSL) { queryString = QString("SELECT qsl_sent FROM log WHERE id = '%1'").arg(_qsoId); sqlOK = query.exec(queryString); if(sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); if ((queryString == "Y") || (queryString == "R")) { // NO ACTION REQUIRED, QSL IS ALREADY SENT //qDebug() << "DataProxy_SQLite::qslRecViaDirect: QSL already requested" << endl; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qslrdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); } else { //qDebug() << "DataProxy_SQLite::qslRecViaDirect: Request QSL-1" << endl; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); } } else { //qDebug() << "DataProxy_SQLite::qslRecViaDirect: Request QSL-2" << endl; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::qslRecViaDirect: Request QSL-3" << endl; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); } } else { queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qslrdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); } query.finish(); sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslRecViaDirect TRUE" << endl; query.finish(); //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite::qslRecViaDirect FALSE" << endl; query.finish(); return false; } bool DataProxy_SQLite::qslSentAsRequested(const int _qsoId, const QString _updateDate) { //TODO: Add some protection to the data before modifying //qDebug() << "DataProxy_SQLite::qslSentAsRequested" << endl; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_sent = 'R', qslsdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); //qDebug() << "DataProxy_SQLite::qslSentAsRequested: " << queryString << endl; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslSentAsRequested" << endl; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } query.finish(); return false; } bool DataProxy_SQLite::qslRecAsRequested(const int _qsoId, const QString _updateDate) { //TODO: Add some protection to the data before modifying //qDebug() << "DataProxy_SQLite::qslRecAsRequested" << endl; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_rcvd = 'R', qslsdate = '%1' WHERE id = '%2'").arg(_updateDate).arg(_qsoId); //qDebug() << "DataProxy_SQLite::qslRecAsRequested: " << queryString << endl; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslRecAsRequested" << endl; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } query.finish(); return false; } bool DataProxy_SQLite::setClubLogSent(const int _qsoId, const QString _st, const QString _updateDate) { // Updates the QSO with the ClubLog status & date QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET clublog_qso_upload_status = '%1', clublog_qso_upload_date = '%2' WHERE id = '%3'").arg(_st).arg(_updateDate).arg(_qsoId); //qDebug() << "DataProxy_SQLite::setClubLogSent: " << queryString << endl; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::setClubLogSent - TRUE" << endl; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite::setClubLogSent - FALSE" << endl; query.finish(); return false; } bool DataProxy_SQLite::isQSLReceived(const int _qsoId) { //qDebug() << "DataProxy_SQLite::isQSLReceived" << QString::number(_qsoId) << endl; QSqlQuery query; QString queryString; queryString = QString("SELECT qsl_rcvd FROM log WHERE id = '%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); query.finish(); if (queryString == "Y") { //qDebug() << "DataProxy_SQLitew::isQSLReceived: " << QString::number(_qsoId) << "QSL Received" << endl; return true; } else { //qDebug() << "DataProxy_SQLite::isQSLReceived: " << QString::number(_qsoId) << "QSL NOT Received-1" << endl; return false; } } else { //qDebug() << "DataProxy_SQLite::isQSLReceived: " << QString::number(_qsoId) << "QSL NOT Received-2" << endl; query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); } return false; } bool DataProxy_SQLite::isQSLSent(const int _qsoId) { //qDebug() << "DataProxy_SQLite::isQSLSent: " << QString::number(_qsoId) << endl; QSqlQuery query; QString queryString; queryString = QString("SELECT qsl_sent FROM log WHERE id = '%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); query.finish(); if (queryString == "Y") { //qDebug() << "DataProxy_SQLite::isQSLSent: " << QString::number(_qsoId) << "QSL Sent" << endl; return true; } else { //qDebug() << "DataProxy_SQLite::isQSLSent: " << QString::number(_qsoId) << "QSL NOT Sent-1" << endl; return false; } } else { //qDebug() << "DataProxy_SQLite::isQSLSent: " << QString::number(_qsoId) << "QSL NOT Sent-2" << endl; return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } //return false; } int DataProxy_SQLite::getBandFromId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT bandid FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); } return -1; } int DataProxy_SQLite::getModeFromId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT modeid FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); } return -1; } int DataProxy_SQLite::getDXCCFromId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT dxcc FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); } return -1; } int DataProxy_SQLite::getCQZFromId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT cqz FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); } return -1; } QString DataProxy_SQLite::getCallFromId(const int _qsoId) { //qDebug() << "DataProxy_SQLite::getCallFromId" << endl; QSqlQuery query; QString queryString = QString("SELECT call FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); return v; } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); } return QString(); } QStringList DataProxy_SQLite::getClubLogRealTimeFromId(const int _qsoId) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: " << QString::number(_qsoId) << endl; /* Return a QStringList with 16 fields with these data: QSO_DATE, TIME_ON, QSLRDATE, QSLSDATE, CALL, OPERATOR, MODE, BAND, BAND_RX, FREQ, QSL_RCVD, LOTW_QSL_RCVD, QSL_SENT, DXCC, PROP_MODE, CREDIT_GRANTED */ QSqlQuery query, query2; int nameCol = -1; QStringList dataC = QStringList(); QString aux1 = QString(); QString aux2 = QString(); QString call = QString(); // IMPORTANT: band_rx is not always present, and if it is not present, the query with INNER JOIN will fail. // To fix that we will do two queries, one to check if I have all the data and if not another one with a reduced scope. QString queryString = QString("SELECT qso_date, time_on, qslrdate, qslsdate, call, station_callsign, operator, M.name, B.name, R.name, freq, qsl_rcvd, lotw_qsl_rcvd, qsl_sent, dxcc, prop_mode, credit_granted FROM log INNER JOIN band as B ON bandid = B.id INNER JOIN band as R ON band_rx = R.id INNER JOIN mode as M ON modeid = M.id WHERE log.id='%1'").arg(_qsoId); bool sqlOk = query.exec(queryString); dataC << QString::number(_qsoId); if (sqlOk) { QSqlRecord rec = query.record(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId sqlOK" << endl; if (query.next()) //if (1) { if (query.isValid()) { nameCol = rec.indexOf("qso_date"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("time_on"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId time: " << aux1 << endl; if ( ((aux1.length()) == 5) || ((aux1.length()) == 8) ){ aux1.remove(QChar(':'), Qt::CaseInsensitive); dataC << aux1; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId time1.5: " << aux1 << endl; } //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId time2: " << aux1 << endl; dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("qslrdate"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("qslsdate"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("call"); call = (query.value(nameCol)).toString(); dataC << call; nameCol = rec.indexOf("operator"); dataC << (query.value(nameCol)).toString(); //nameCol = rec.indexOf("M.name"); //TODO: Fix this to get the proper column dataC << (query.value(7)).toString(); //nameCol = rec.indexOf("B.name"); dataC << (query.value(8)).toString(); //TODO: Fix this to get the proper column //nameCol = rec.indexOf("R.name"); //TODO: Fix this to get the proper column (use an index instead of a number) dataC << (query.value(9)).toString(); nameCol = rec.indexOf("freq"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("qsl_rcvd"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("lotw_qsl_rcvd"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("qsl_sent"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("dxcc"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("prop_mode"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("credit_granted"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("station_callsign"); aux2 = (query.value(nameCol)).toString(); if (aux2.length()>2) { dataC << aux2; } else { dataC << call; } //dataC << (query.value(nameCol)).toString(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: RETURNING ... OK" << endl; return dataC; } else { //NO VALID //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId NO VALID NOT OK" << endl; query.finish(); return QStringList(); } } else { QString queryString = QString("SELECT qso_date, time_on, qslrdate, qslsdate, call, station_callsign, operator, M.name, B.name, freq, qsl_rcvd, lotw_qsl_rcvd, qsl_sent, dxcc, prop_mode, credit_granted FROM log INNER JOIN band as B ON bandid = B.id INNER JOIN mode as M ON modeid = M.id WHERE log.id='%1'").arg(_qsoId); //QString queryString = QString("SELECT qso_date, time_on, qslrdate, qslsdate, call, operator, M.name, B.name, freq, qsl_rcvd, lotw_qsl_rcvd, qsl_sent, dxcc, prop_mode, credit_granted FROM log INNER JOIN band as B ON bandid = B.id INNER JOIN mode as M ON modeid = M.id WHERE log.id='%1'").arg(_qsoId); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId NO NEXT NOT OK" << endl; call = QString(); sqlOk = query2.exec(queryString); rec = query2.record(); if (sqlOk) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId OK2" << endl; if (query2.next()) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId NEXT OK2" << endl; if (query2.isValid()) { nameCol = rec.indexOf("qso_date"); dataC << (query2.value(nameCol)).toString(); nameCol = rec.indexOf("time_on"); aux1 = (query2.value(nameCol)).toString(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId time2-1: " << aux1 << endl; if ( ((aux1.length()) == 5) || ((aux1.length()) == 8) ){ aux1.remove(QChar(':'), Qt::CaseInsensitive); dataC << aux1; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId time2-1.5: " << aux1 << endl; } //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId time2-2: " << aux1 << endl; //dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("qslrdate"); dataC << (query2.value(nameCol)).toString(); nameCol = rec.indexOf("qslsdate"); dataC << (query2.value(nameCol)).toString(); nameCol = rec.indexOf("call"); call = (query2.value(nameCol)).toString(); dataC << call; nameCol = rec.indexOf("operator"); dataC << (query2.value(nameCol)).toString(); nameCol = rec.indexOf("M.name"); //TODO: Fix this to get the proper column dataC << (query2.value(7)).toString(); nameCol = rec.indexOf("B.name"); dataC << (query2.value(8)).toString(); //TODO: Fix this to get the proper column //nameCol = rec.indexOf("band_rx"); //TODO: Fix this to get the proper column (use an index instead of a number) dataC << ""; nameCol = rec.indexOf("freq"); dataC << (query2.value(nameCol)).toString(); nameCol = rec.indexOf("qsl_rcvd"); dataC << (query2.value(nameCol)).toString(); nameCol = rec.indexOf("lotw_qsl_rcvd"); dataC << (query2.value(nameCol)).toString(); nameCol = rec.indexOf("qsl_sent"); dataC << (query2.value(nameCol)).toString(); nameCol = rec.indexOf("dxcc"); dataC << (query2.value(nameCol)).toString(); nameCol = rec.indexOf("prop_mode"); dataC << (query2.value(nameCol)).toString(); nameCol = rec.indexOf("credit_granted"); dataC << (query2.value(nameCol)).toString(); aux2 = QString(); nameCol = rec.indexOf("station_callsign"); aux2 = (query2.value(nameCol)).toString(); if (aux2.length()>2) { dataC << aux2; } else { dataC << call; } //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: RETURNING ... OK" << endl; query2.finish(); return dataC; } else { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId NO VALID NOT OK2" << endl; query2.finish(); return QStringList(); } } else { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId NO NEXT NOT OK2" << endl; query.finish(); return QStringList(); } } else { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId NOT OK2" << endl; emit queryError(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().number(), query2.lastQuery()); query2.finish(); return QStringList(); } //query.finish(); //return QStringList(); // NO NEXT } } else { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId NOT sqlOK" << endl; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: 2 LastQuery: " << query.lastQuery() << endl; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: 2 LastError-data: " << query.lastError().databaseText() << endl; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: 2 LastError-driver: " << query.lastError().driverText() << endl; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: 2 LastError-n: " << QString::number(query.lastError().number() ) << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); query2.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId END NOT OK" << endl; return QStringList(); } QString DataProxy_SQLite::getNameFromQRZ(const QString _call) { if (_call.length() <= 0) { //qDebug() << "DataProxy_SQLite::getNameFromQRZ return 0" << endl; return QString(); } QSqlQuery query; QString queryString = QString("SELECT name FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { //qDebug() << "DataProxy_SQLite::getNameFromQRZ: " << (query.value(0)).toString() << endl; QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getQTHFromQRZ(const QString _call) { if (_call.length() <= 0) { return QString(); } QSqlQuery query; QString queryString = QString("SELECT qth FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getLocatorFromQRZ(const QString _call) { if (_call.length() <= 0) { return QString(); } QSqlQuery query; QString queryString = QString("SELECT gridsquare FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getIOTAFromQRZ(const QString _call) { if (_call.length() <= 0) { return QString(); } QSqlQuery query; QString queryString = QString("SELECT iota FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getQSLViaFromQRZ(const QString _call) { if (_call.length() <= 0) { return QString(); } QSqlQuery query; QString queryString = QString("SELECT DISTINCT qsl_via FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString();; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } } bool DataProxy_SQLite::updateAwardDXCC() { //qDebug() << "DataProxy_SQLite::updateAwardDXCC" << endl; fillEmptyDXCCInTheLog(); return db->updateAwardDXCCTable(); //qDebug() << "DataProxy_SQLite::updateAwardDXCC-END" << endl; } bool DataProxy_SQLite::updateAwardWAZ() { //qDebug() << "DataProxy_SQLite::updateAwardWAZ" << endl; return db->updateAwardWAZTable(); } bool DataProxy_SQLite::addQSOFromWSJTX(const QString _dxcall, const double _freq, const QString _mode, const QString _dx_grid, const QString _time_off, const QString _report_sent, const QString _report_rec, const QString _tx_power, const QString _comments, const QString _name, const QString _time_on, const int _dxcc, const QString _opQrz, const QString _stQrz, const QString _myLoc, const int _logN) { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: " << _dxcall << endl; //void MainWindow::slotWSJTXloggedQSO(const int _type, const QString _dxcall, const quint64 _freq, const QString _mode, // const QString _dx_grid, const QString _time_off, const QString _report_sent, const QString _report_rec, // const QString _tx_power, const QString _comments, const QString _name, const QString _time_on) //_qso format: Date/TimeOn/call/bandid/modeid/freq/dxgrid/timeOff/rsttx/rstrx/txpower/comments/name /* Mandatory data: "qso_date VARCHAR(10) NOT NULL, " "time_on VARCHAR(8) NOT NULL, " "call VARCHAR(40) NOT NULL, " "bandid INTEGER NOT NULL, " "modeid INTEGER NOT NULL, " */ QString stringFields = QString(); QString stringData = QString(); QString stringQuery = QString(); //getITUzFromEntity() QSqlQuery query; if (util->isValidCall(_dxcall)) { stringFields = "call, "; stringData = "'" + _dxcall + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: call" << endl; return false; } if (util->isValidDateTime(_time_on)) { stringFields = stringFields + "qso_date, time_on, "; stringData = stringData + "'" + QDateTime::fromString(_time_on, "yyyyMMddhhmmss").toString("yyyy/MM/dd") + "', '" + QDateTime::fromString(_time_on, "yyyyMMddhhmmss").toString("hh:mm:ss") + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: time-on" << endl; return false; } QString _band; _band = QString::number(_freq); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: freq: " << QString::number(_freq) << endl; //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: freq: " << QString::number(_freq/1000) << endl; if (_band.length()>0) { stringFields = stringFields + "bandid, " ; stringData = stringData + "'" + QString::number(getBandIdFromFreq(_freq)) + "', "; stringFields = stringFields + "freq, " ; stringData = stringData + "'" + QString::number(_freq) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: band" << endl; emit queryError(Q_FUNC_INFO, "Incorrect band: " + _band, -1000 , "No query error"); return false; } int _modeid = getSubModeIdFromSubMode(_mode); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: mode: " << _mode << endl; //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: modeid: " << QString::number(_modeid) << endl; if (util->isValidModeId(_modeid)) { stringFields = stringFields + "modeid, "; stringData = stringData + "'" + QString::number(_modeid) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: mode" << endl; emit queryError(Q_FUNC_INFO, "Incorrect mode: " + _mode, -1000, "No query error"); return false; } if (util->isValidDateTime(_time_off)) { stringFields = stringFields + "time_off, "; stringData = stringData + "'" + QDateTime::fromString(_time_off, "yyyyMMddhhmmss").toString("hh:mm:ss") + "', "; } if (util->isValidName(_name)) { stringFields = stringFields + "name, "; stringData = stringData + "'" + _name + "', "; } if (util->isValidRST(_report_sent)) { stringFields = stringFields + "rst_sent, "; stringData = stringData + "'" + _report_sent + "', "; } if (util->isValidRST(_report_rec)) { stringFields = stringFields + "rst_rcvd, "; stringData = stringData + "'" + _report_rec + "', "; } if (util->isValidGrid(_dx_grid)) { stringFields = stringFields + "gridsquare, "; stringData = stringData + "'" + _dx_grid + "', "; } if (util->isValidGrid(_myLoc)) { stringFields = stringFields + "my_gridsquare, "; stringData = stringData + "'" + _myLoc + "', "; } if (util->isValidPower(_tx_power)) { stringFields = stringFields + "tx_pwr, "; stringData = stringData + "'" + _tx_power + "', "; } if (util->isValidCall(_opQrz)) { stringFields = stringFields + "operator, "; stringData = stringData + "'" + _opQrz + "', "; } if (util->isValidCall(_stQrz)) { stringFields = stringFields + "station_callsign, "; stringData = stringData + "'" + _stQrz + "', "; } if (_dxcc>0) { stringFields = stringFields + "dxcc, "; stringData = stringData + "'" + QString::number(_dxcc) + "', "; } if (util->isValidComment(_comments)) { stringFields = stringFields + "comment, "; stringData = stringData + "'" + _comments + "', "; } stringFields = stringFields + "qsl_via, "; stringData = stringData + "'B', "; stringFields = stringFields + "lognumber"; stringData = stringData + "'" + QString::number(_logN) + "'"; /* if ( stringFields.endsWith(", ") ) { stringFields.chop(2); } if ( stringData.endsWith(", ") ) { stringData.chop(2); } */ stringQuery = "INSERT INTO log (" + stringFields + ") values (" + stringData +")" ; //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Query: " << stringQuery << endl; bool sqlOK = query.exec(stringQuery); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: LastQuery: " << query.lastQuery() << endl; if (sqlOK) { query.finish(); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: SQL OK" << endl; return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: SQL " << endl; return false; } } bool DataProxy_SQLite::deleteQSO(const int _qsoId) { //qDebug() << "DataProxy_SQLite::deleteQSO" << endl; QSqlQuery query; QString queryString = QString("DELETE FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } } int DataProxy_SQLite::isWorkedB4(const QString _qrz, const int _currentLog) { //qDebug() << "DataProxy_SQLite::isWorkedB4" << endl; //Returns the QSO id QSqlQuery query; QString queryString; if (_currentLog < 0) { queryString = QString("SELECT id FROM log WHERE call='%1'").arg(_qrz); } else { queryString = QString("SELECT id FROM log WHERE call='%1' AND lognumber='%2'").arg(_qrz).arg(_currentLog); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1; } } bool DataProxy_SQLite::isThisQSODuplicated(const QString _qrz, const QString _date, const QString _time, const int _band, const int _mode) { //qDebug() << "DataProxy_SQLite::isThisQSODuplicated" << endl; QSqlQuery query; QString queryString; queryString = QString("SELECT id FROM log WHERE call='%1' AND qso_date='%2' AND time_on='%3' AND bandid='%4' AND modeid='%5'").arg(_qrz).arg(_date).arg(_time).arg(_band).arg(_mode); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ((query.value(0)).toInt()>0) { query.finish(); return true; } else { query.finish(); return false; } } else { query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } } int DataProxy_SQLite::getDuplicatedQSOId(const QString _qrz, const QString _date, const QString _time, const int _band, const int _mode) { //qDebug() << "DataProxy_SQLite::isThisQSODuplicated" << endl; QSqlQuery query; QString queryString; int qsoId = -1; queryString = QString("SELECT id FROM log WHERE call='%1' AND qso_date='%2' AND time_on='%3' AND bandid='%4' AND modeid='%5'").arg(_qrz).arg(_date).arg(_time).arg(_band).arg(_mode); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { qsoId = (query.value(0)).toInt(); if (qsoId) { query.finish(); return qsoId; } else { query.finish(); return -1; } } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1; } return -1; } bool DataProxy_SQLite::isDXCCConfirmed(const int _dxcc, const int _currentLog) { //qDebug() << "DataProxy_SQLite::isDXCCConfirmed: " << QString::number(_dxcc) << "/" << QString::number(_currentLog) << endl; QString queryString = QString("SELECT confirmed from awarddxcc WHERE dxcc='%1' AND lognumber='%2'").arg(_dxcc).arg(_currentLog); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ( (query.value(0)).toInt() == 1) { //qDebug() << "DataProxy_SQLite::isDXCCConfrmed: TRUE" << endl; query.finish(); return true; } else { //qDebug() << "DataProxy_SQLite::isDXCCConfrmed: FALSE1" << endl; query.finish(); return false; } } else { //qDebug() << "DataProxy_SQLite::isDXCCConfrmed: FALSE2" << endl; query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::isDXCCConfrmed: FALSE3" << endl; query.finish(); return false; } } bool DataProxy_SQLite::isHF(const int _band) {// 160M is considered as HF if ( (_band>=getIdFromBandName("10M")) && (_band<=getIdFromBandName("160M")) ) { //qDebug() << "DataProxy_SQLite::isHF: TRUE" << endl; return true; } else { //qDebug() << "DataProxy_SQLite::isHF: FALSE" << endl; return false; } } bool DataProxy_SQLite::isWARC(const int _band) { if ( (_band==getIdFromBandName("12M")) || (_band==getIdFromBandName("17M")) || ((_band==getIdFromBandName("30M")) ) ) { //qDebug() << "DataProxy_SQLite::isWARC: tRUE" << endl; return true; } else { //qDebug() << "DataProxy_SQLite::isWARC: FALSE" << endl; return false; } } bool DataProxy_SQLite::isVHF(const int _band) { if (_band<=getIdFromBandName("6M")) { //qDebug() << "DataProxy_SQLite::isVHF: TRUE" << endl; return true; } else { //qDebug() << "DataProxy_SQLite::isVHF: FALSE" << endl; return false; } } bool DataProxy_SQLite::isUHF(const int _band) { if (_band<=getIdFromBandName("70CM")) { //qDebug() << "DataProxy_SQLite::isUHF: TRUE" << endl; return true; } else { //qDebug() << "DataProxy_SQLite::isUHF: FALSE" << endl; return false; } } QStringList DataProxy_SQLite::getOperatingYears(const int _currentLog) { //qDebug() << "DataProxy_SQLite::getYearsOperating: " << QString::number(_currentLog) << endl; QStringList years = QStringList(); //QStringList yearsSorted = QStringList(); QSqlQuery query; QString queryString; if (_currentLog<0) { queryString = QString("SELECT DISTINCT (substr (qso_date, 0, 5)) FROM log ORDER BY 'qso_date'"); } else { queryString = QString("SELECT DISTINCT (substr (qso_date, 0, 5)) FROM log WHERE lognumber='%0' ORDER BY 'qso_date'").arg(_currentLog); } QString year = QString(); //qDebug() << "DataProxy_SQLite::getYearsOperating: -1" << endl; bool sqlOk = query.exec(queryString); if (sqlOk) { //qDebug() << "DataProxy_SQLite::getYearsOperating: sqlOk = true" << endl; while (query.next()) { if (query.isValid()) { year = (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getYearsOperating: year=" << year << endl; years << year; year.clear(); } else { //qDebug() << "DataProxy_SQLite::getYearsOperating: NOT VALID" << endl; } } //qDebug() << "DataProxy_SQLite::getYearsOperating: END OK - " << QString::number(years.size())<< endl; query.finish(); //return years; if (years.length()>0) { years.sort(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getYearsOperating: sqlOk = false" << endl; } return years; } void DataProxy_SQLite::compressDB() { db->compress(); } bool DataProxy_SQLite::unMarkAllQSO() { return db->unMarkAllQSO(); } bool DataProxy_SQLite::lotwSentQueue(const QString _updateDate, const int _currentLog) {// Mark LOTW QSL SENT as Q (Queued) // If currentLog <0 ALL the QSO of the log will be queued //qDebug() << "DataProxy_SQLite::lotwSentQueue: Date:" << _updateDate << " /" << QString::number(_currentLog) << endl; QString queryString; if (_currentLog<1) { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Q', lotw_qslsdate = '%1' WHERE lotw_qsl_sent != 'Y' AND lotw_qsl_sent != 'N' AND lotw_qsl_sent != 'R' AND lotw_qsl_sent != 'I' AND lotw_qsl_sent != 'Q'").arg(_updateDate); } else { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Q', lotw_qslsdate = '%1' WHERE lognumber = '%2' AND lotw_qsl_sent != 'Y' AND lotw_qsl_sent != 'N' AND lotw_qsl_sent != 'R' AND lotw_qsl_sent != 'I' AND lotw_qsl_sent != 'Q'").arg(_updateDate).arg(_currentLog); } QSqlQuery query; bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } return false; } bool DataProxy_SQLite::lotwSentYes(const QString _updateDate, const int _currentLog, const QString _station) {// Mark LOTW QSL SENT as Q (Queued) // If currentLog <0 ALL the QSO of the log will be queued //qDebug() << "DataProxy_SQLite::lotwSentQueue: " << QString::number(_currentLog) << endl; QString queryString; if (_currentLog<1) { if (_station == "ALL") { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE lotw_qsl_sent == 'Q'"); } else { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE lotw_qsl_sent == 'Q' AND station_callsign='%2'").arg(_updateDate).arg(_station); } } else { if (_station == "ALL") { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE lognumber = '%2' AND lotw_qsl_sent == 'Q'").arg(_updateDate).arg(_currentLog); } else { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE lognumber = '%2' AND lotw_qsl_sent == 'Q' AND station_callsign='%3'").arg(_updateDate).arg(_currentLog).arg(_station); } } QSqlQuery query; bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } return false; } int DataProxy_SQLite::getQSOonYear(const int _year, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getQSOonYear: " << QString::number(_year) << "/" << QString::number(_logNumber) << endl; QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT id) FROM log WHERE qso_date LIKE '%1%'").arg(_year); } else { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND qso_date LIKE '%2%'").arg(_logNumber).arg(_year); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOonYear: queryString: " << queryString << endl; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOonYear: " << QString::number((query.value(0)).toInt()) << endl; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOonYear: 0" << endl; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getDXCConYear: Query error" << endl; query.finish(); return 0; } } int DataProxy_SQLite::getDXCConYear(const int _year, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getDXCConYear: " << QString::number(_year) << "/" << QString::number(_logNumber) << endl; QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT dxcc) FROM log where qso_date LIKE '%1%'").arg(_year); } else { queryString = QString("SELECT COUNT (DISTINCT dxcc) FROM log where lognumber='%1' AND qso_date LIKE '%2%'").arg(_logNumber).arg(_year); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getDXCConYear: queryString: " << queryString << endl; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getDXCConYear: " << QString::number((query.value(0)).toInt()) << endl; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getDXCConYear: 0" << endl; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getDXCConYear: Query error" << endl; query.finish(); return 0; } } int DataProxy_SQLite::getCQzonYear(const int _year, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getCQzonYear: " << QString::number(_year) << endl; QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT cqz) FROM log where qso_date LIKE '%1%' AND cqz < '41' AND cqz > '0'").arg(_year); } else { queryString = QString("SELECT COUNT (DISTINCT cqz) FROM log where lognumber='%1' AND qso_date LIKE '%2%'").arg(_logNumber).arg(_year); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getCQzonYear: queryString: " << queryString << endl; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getCQzonYear: " << QString::number((query.value(0)).toInt()) << endl; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getCQzonYear: 0" << endl; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getCQzonYear: Query error" << endl; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsWithDXCC(const int _dxcc, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: " << QString::number(_dxcc) << endl; QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where dxcc LIKE '%1'").arg(_dxcc); } else { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND dxcc LIKE '%2'").arg(_logNumber).arg(_dxcc); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: queryString: " << queryString << endl; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: " << QString::number((query.value(0)).toInt()) << endl; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: 0" << endl; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: Query error" << endl; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsAtHour(const int _hour, const int _log) { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: " << QString::number(_hour) << endl; QSqlQuery query; QString queryString; bool sqlOK; QString aux = QString(); if (_hour < 10) { aux = "0" + QString::number(_hour); } else { aux = QString::number(_hour); } if (_log < 0) { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE time_on LIKE '%1:%'").arg(aux); } else { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE lognumber='%1' AND time_on LIKE '%2:%'").arg(_log).arg(aux); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsAtHour: queryString: " << queryString << endl; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: " << QString::number((query.value(0)).toInt()) << endl; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: 0" << endl; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsAtHour: Query error" << endl; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsAtHourOnBand(const int _hour, const int _band, const int _log) { //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBand: " << QString::number(_hour) << endl; QSqlQuery query; QString queryString; bool sqlOK; QString aux = QString(); if (_hour < 10) { aux = "0" + QString::number(_hour); } else { aux = QString::number(_hour); } if (_log < 0) { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE time_on LIKE '%1:%' AND bandid='%2'").arg(aux).arg(_band); } else { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE lognumber='%1' AND time_on LIKE '%2:%' AND bandid='%3'").arg(_log).arg(aux).arg(_band); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBand: queryString: " << queryString << endl; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBand: " << QString::number((query.value(0)).toInt()) << endl; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBand: 0" << endl; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBandç: Query error" << endl; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsOnMonth(const int _month, const int _log) { //qDebug() << "DataProxy_SQLite::getgetQSOsOnMonth: " << QString::number(_month) << endl; QSqlQuery query; QString queryString; bool sqlOK; QString aux = QString(); if (_month < 10) { aux = "0" + QString::number(_month); } else { aux = QString::number(_month); } if (_log < 0) { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE qso_date LIKE '%/%1/%'").arg(aux); } else { queryString = QString("SELECT COUNT(DISTINCT id) FROM log Wwhere lognumber='%1' AND qso_date LIKE '%/%2/%'").arg(_log).arg(aux); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsAtHour: queryString: " << queryString << endl; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: " << QString::number((query.value(0)).toInt()) << endl; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: 0" << endl; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsAtHour: Query error" << endl; query.finish(); return 0; } } bool DataProxy_SQLite::newDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber) { //qDebug() << "DataProxy_SQLite::newDXMarathon" << endl; QSqlQuery query; QString queryString; bool sqlOK; bool existingDXCC = false; bool existingCQz = false; queryString = QString("SELECT dxcc, cqz FROM log WHERE (lognumber='%1' AND qso_date LIKE'%%2%') AND (dxcc ='%3' OR cqz ='%4')").arg(_logNumber).arg(_year).arg(_dxcc).arg(_cq); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { if ( (query.value(0)).toInt() == _dxcc) { //qDebug() << "DataProxy_SQLite::newDXMarathon - Existing DXCC" << endl; existingDXCC = true; } if ( (query.value(1)).toInt() == _cq) { //qDebug() << "DataProxy_SQLite::newDXMarathon - Existing CQz" << endl; existingCQz = true; } } } if (existingDXCC && existingCQz) { //qDebug() << "DataProxy_SQLite::newDXMarathon - FALSE" << endl; query.finish(); return false; } else { //qDebug() << "DataProxy_SQLite::newDXMarathon - TRUE1" << endl; query.finish(); return true; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::newDXMarathon - TRUE2" << endl; query.finish(); return true; // It is an error inthe query but Work First Worry Later, let us work that QSO. } } QStringList DataProxy_SQLite::getContestNames() { //qDebug() << "DataProxy_SQLite::getContestNames() " << endl; QStringList contests = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; queryString = QString("SELECT DISTINCT name from supportedcontests ORDER BY id ASC"); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getContestNames: " << queryString << endl; contests.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); contests.sort(); return contests; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } return QStringList(); } QStringList DataProxy_SQLite::getContestCat(const int _catn) { QStringList contests = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; switch (_catn) { case 1: queryString = QString("SELECT DISTINCT name from contestcatoperator ORDER BY id ASC"); break; case 2: queryString = QString("SELECT DISTINCT name from contestcatassisted ORDER BY id ASC"); break; case 3: queryString = QString("SELECT DISTINCT name from contestcatpower ORDER BY id ASC"); break; case 4: queryString = QString("SELECT DISTINCT name from contestcatband ORDER BY id ASC"); break; case 5: queryString = QString("SELECT DISTINCT name from contestcatoverlay ORDER BY id ASC"); break; case 6: queryString = QString("SELECT DISTINCT name from contestcatmode ORDER BY id ASC"); break; default: return QStringList(); break; } sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); contests.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); return contests; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } } QStringList DataProxy_SQLite::getContestOverlays() { //qDebug() << "DataProxy_SQLite::getContestOverlays: "<< endl; QStringList contests = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; queryString = QString("SELECT DISTINCT name from contestcatoverlay ORDER BY id ASC"); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getContestOverlays: " << queryString << endl; contests.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); return contests; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } } QStringList DataProxy_SQLite::getPropModeList() { //qDebug() << "DataProxy_SQLite::getPropModeLists" << endl; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT id, shortname, name FROM prop_mode_enumeration ORDER BY name"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { QString translatedValue = QString(); QString valueToTranslate = QString(); while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(2)).toString(); if (valueToTranslate == "Aircraft Scatter") { translatedValue = tr("Aircraft Scatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Aurora") { translatedValue = tr("Aurora"); } else if(valueToTranslate == "Aurora-E") { translatedValue = tr("Aurora-E"); } else if(valueToTranslate == "Back scatter") { translatedValue = tr("Back scatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Earth-Moon-Earth") { translatedValue = tr("Earth-Moon-Earth"); } else if(valueToTranslate == "Sporadic E") { translatedValue = tr("Sporadic E"); } else if(valueToTranslate == "Field Aligned Irregularities") { translatedValue = tr("Field Aligned Irregularities", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "F2 Reflection") { translatedValue = tr("F2 Reflection", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Internet-assisted") { translatedValue = tr("Internet-assisted"); } else if(valueToTranslate == "Ionoscatter") { translatedValue = tr("Ionoscatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Meteor scatter") { translatedValue = tr("Meteor scatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Terrestrial or atmospheric repeater or transponder") { translatedValue = tr("Terrestrial or atmospheric repeater or transponder"); } else if(valueToTranslate == "Rain scatter") { translatedValue = tr("Rain scatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Satellite") { translatedValue = tr("Satellite"); } else if(valueToTranslate == "Trans-equatorial") { translatedValue = tr("Trans-equatorial", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Tropospheric ducting") { translatedValue = tr("Tropospheric ducting", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "") { translatedValue = tr(""); } else { translatedValue = valueToTranslate; } aux.clear(); aux = (query.value(0)).toString() + " - " + (query.value(1)).toString() + " - " + translatedValue; qs << aux; } else { } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); qs.sort(); return qs; } bool DataProxy_SQLite::clearSatList() { QSqlQuery query; bool sqlOK = query.exec("DELETE FROM satellites"); if (sqlOK) { query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } } bool DataProxy_SQLite::addSatellite(const QString _arrlId, const QString _name, const QString _downLink, const QString _upLink, const QString _mode, int id) { //qDebug() << "DataProxy_SQLite::addSatellite: " << QString::number(id) << endl; QSqlQuery query; QString queryString; if (id>0) { queryString = QString("UPDATE satellites set satarrlid = '%1', satname = '%2', uplink = '%3', downlink = '%4', satmode = '%5' WHERE id = '%6'").arg(_arrlId).arg(_name).arg(_upLink).arg(_downLink).arg(_mode).arg(id); } else { queryString = QString("INSERT INTO satellites (satarrlid, satname, uplink, downlink, satmode) VALUES ('%1', '%2', '%3', '%4', '%5')").arg(_arrlId).arg(_name).arg(_upLink).arg(_downLink).arg(_mode); } bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::addSatellite - query: " << query.lastQuery() << endl; if (sqlOK) { //qDebug() << "DataProxy_SQLite::addSatellite - TRUE" << endl; //QDebug() << "DataProxy_SQLite::addSatellite - TRUE - ERROR: " << QString::number(query.lastError().number()) << endl; query.finish(); return true; } else { //QDebug() << "DataProxy_SQLite::addSatellite - FALSE" << endl; //if (query.lastError().number() == 19) //{ // Duplicate Satellite // QMessageBox msgBox; // msgBox.setIcon(QMessageBox::Warning); // msgBox.setText(tr("A duplicated satellite has been detected in the file and will not be imported.")); // msgBox.setInformativeText(tr("Please check the satellite information file and ensure it is properly populated.") + "\n" + tr("Now you will see a more detailed error that can be used for debugging...")); // msgBox.exec(); //} emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } } int DataProxy_SQLite::getDBSatId(const QString _arrlId) { //qDebug() << "DataProxy_SQLite::getDBSatId: " << _sat << endl; int aux = -1; QString queryString = QString("SELECT id FROM satellites WHERE satarrlid='%1'").arg(_arrlId); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toInt(); } else { //qDebug() << "DataProxy_SQLite::getDBSatId: query not valid" << endl; query.finish(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteUplink: query failed: " << query.lastQuery() << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); } //qDebug() << "DataProxy_SQLite::getSatelliteUplink: final: " << aux << endl; query.finish(); return aux; } QStringList DataProxy_SQLite::getSatellitesList() { //qDebug() << "DataProxy_SQLite::getSatellitesList" << endl; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT satarrlid, satname FROM satellites"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(0)).toString() + " - " + (query.value(1)).toString(); qs << aux; } else { } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); qs.sort(); return qs; } QString DataProxy_SQLite::getSatelliteUplink(const QString _sat) { //qDebug() << "DataProxy_SQLite::getSatelliteUplink: " << _sat << endl; QString aux = QString(); //QString aux2 = QString(); //double fr1, fr2, fr; QString queryString = QString("SELECT uplink FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); aux = QString::number(getFreqFromRange(aux)); } else { //qDebug() << "DataProxy_SQLite::getSatelliteUplink: query not valid" << endl; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteUplink: query failed: " << query.lastQuery() << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteUplink: final: " << aux << endl; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteDownlink(const QString _sat) { //qDebug() << "DataProxy_SQLite::getSatelliteDownlink: " << _sat << endl; QString aux = QString(); //QString aux2 = QString(); //double fr1, fr2, fr; QString queryString = QString("SELECT downlink FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); aux = QString::number(getFreqFromRange(aux)); } else { //qDebug() << "DataProxy_SQLite::getSatelliteDownlink: query not valid" << endl; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteDownlink: query failed: " << query.lastQuery() << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteDownlink: final: " << aux << endl; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteMode(const QString _sat) { QString aux = QString(); QString queryString = QString("SELECT satmode FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); query.finish(); if (aux.contains(',')) { // Potentially somethink like: SSB,CW // We select the first one aux = aux.section(',', 0, 0); // We select the first package } } else { //qDebug() << "DataProxy_SQLite::getSatelliteMode: query not valid" << endl; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteMode: query failed: " << query.lastQuery() << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteMode: final: " << aux << endl; return aux; } QString DataProxy_SQLite::getSatelliteFullUplink(const QString _sat) { //qDebug() << "DataProxy_SQLite::getSatelliteFullUplink: " << _sat << endl; QString aux = QString(); //QString aux2 = QString(); //double fr1, fr2, fr; QString queryString = QString("SELECT uplink FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); } else { //qDebug() << "DataProxy_SQLite::getSatelliteFullUplink: query not valid" << endl; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteFullUplink: query failed: " << query.lastQuery() << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteFullUplink: final: " << aux << endl; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteFullDownlink(const QString _sat) { //qDebug() << "DataProxy_SQLite::getSatelliteFullDownlink: " << _sat << endl; QString aux = QString(); //QString aux2 = QString(); //double fr1, fr2, fr; QString queryString = QString("SELECT downlink FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); } else { //qDebug() << "DataProxy_SQLite::getSatelliteFullDownlink: query not valid" << endl; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteFullDownlink: query failed: " << query.lastQuery() << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteFullDownlink: final: " << aux << endl; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteFullMode(const QString _sat) { QString aux = QString(); QString queryString = QString("SELECT satmode FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); query.finish(); } else { //qDebug() << "DataProxy_SQLite::getSatelliteMode: query not valid" << endl; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteMode: query failed: " << query.lastQuery() << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteMode: final: " << aux << endl; return aux; } QString DataProxy_SQLite::getSatelliteName(const QString _sat) { //qDebug() << "DataProxy_SQLite::getSatelliteName: " << _sat << endl; QString aux = QString(); QString queryString = QString("SELECT satname FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); } else { //qDebug() << "DataProxy_SQLite::getSatelliteName: query not valid" << endl; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteName: query failed: " << query.lastQuery() << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteName: final: " << aux << endl; query.finish(); return aux; } QString DataProxy_SQLite::getSateliteArrlIdFromId(const int _id) { QString aux = QString(); QString queryString = QString("SELECT satarrlid FROM satellites WHERE id='%1'").arg(_id); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); query.finish(); } else { //qDebug() << "DataProxy_SQLite::getSateliteArrlIdFromId: query not valid" << endl; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSateliteArrlIdFromId: query failed: " << query.lastQuery() << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSateliteArrlIdFromId: final: " << aux << endl; return aux; } double DataProxy_SQLite::getFreqFromRange(QString _fr) { //May even receive: 145.900-146.00 and should return the mid in the range (145.950) //qDebug() << "DataProxy_SQLite::getFreqFromRange: " << _fr << endl; QString fr1, fr2, aux; double f1, f2; fr1.clear(); fr2.clear(); f1 = 0.0; f2 = 0.0; aux.clear(); aux = _fr; if (aux.contains(',')) { // Potentially somethink like: 435.030-435.456,146.180 // We select the first range //qDebug() << "DataProxy_SQLite::getFreqFromRange: has several freqs: " << aux << endl; aux = aux.section(',', 0, 0); // We select the first package } if (aux.contains('-')) // Potentially somethink like: 435.030-435.456 { //qDebug() << "DataProxy_SQLite::getFreqFromRange: has several freqs: " << aux << endl; fr2 = aux.section('-', 1, 1); // We select the second freq fr1 = aux.section('-', 0, 0); // We select the first freq //qDebug() << "DataProxy_SQLite::getFreqFromRange: fr1: " << fr1 << endl; //qDebug() << "DataProxy_SQLite::getFreqFromRange: fr2: " << fr2 << endl; f1 = fr1.toDouble(); f2 = fr2.toDouble(); //qDebug() << "DataProxy_SQLite::getFreqFromRange: f1: " << QString::number(f1) << endl; //qDebug() << "DataProxy_SQLite::getFreqFromRange: f2: " << QString::number(f2) << endl; f1 = (f2 + f1)/2; //qDebug() << "DataProxy_SQLite::getFreqFromRange: f1 after calc: " << QString::number(f1) << endl; } else { // It is only one freq 145.950 so this is what must be returned f1 = aux.toDouble(); } //qDebug() << "DataProxy_SQLite::getFreqFromRange: Return: " << QString::number(f1) << endl; return f1; } QStringList DataProxy_SQLite::getQSLRcvdList() { //qDebug() << "DataProxy_SQLite::getQSLRcvdList" << endl; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT shortname, name FROM qsl_rec_status"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { QString translatedValue = QString(); QString valueToTranslate = QString(); while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(1)).toString(); if (valueToTranslate == "Yes") { translatedValue = tr("Yes"); } else if(valueToTranslate == "No") { translatedValue = tr("No"); } else if(valueToTranslate == "Requested") { translatedValue = tr("Requested"); } else if(valueToTranslate == "Ignore/Invalid") { translatedValue = tr("Ignore/Invalid"); } else if(valueToTranslate == "Validated") { translatedValue = tr("Validated"); } else { translatedValue = valueToTranslate; } aux.clear(); aux = (query.value(0)).toString() + " - " + translatedValue; qs << aux; } else { } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } QStringList DataProxy_SQLite::getQSLSentList() { //qDebug() << "DataProxy_SQLite::getQSLSentList" << endl; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT shortname, name FROM qsl_sent_status"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { QString translatedValue = QString(); QString valueToTranslate = QString(); while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(1)).toString(); if (valueToTranslate == "Yes") { translatedValue = tr("Yes"); } else if(valueToTranslate == "No") { translatedValue = tr("No"); } else if(valueToTranslate == "Requested") { translatedValue = tr("Requested"); } else if(valueToTranslate == "Queued") { translatedValue = tr("Queued"); } else if(valueToTranslate == "Ignore/Invalid") { translatedValue = tr("Ignore/Invalid"); } else { translatedValue = valueToTranslate; } aux.clear(); aux = (query.value(0)).toString() + " - " + translatedValue; qs << aux; } else { } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } QStringList DataProxy_SQLite::getClubLogStatusList() { //qDebug() << "DataProxy_SQLite::getClubLogStatusList" << endl; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT shortname, name FROM clublog_status"); QSqlQuery query; bool sqlOK = query.exec(queryString); QString translatedValue = QString(); QString valueToTranslate = QString(); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(1)).toString(); if (valueToTranslate == "Uploaded") { translatedValue = tr("Uploaded"); } else if(valueToTranslate == "Do not upload") { translatedValue = tr("Do not upload"); } else if(valueToTranslate == "Modified") { translatedValue = tr("Modified"); } else { translatedValue = valueToTranslate; } aux.clear(); aux = (query.value(0)).toString() + " - " + translatedValue; qs << aux; } else { } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } QStringList DataProxy_SQLite::getQSLViaList() { //qDebug() << "DataProxy_SQLite::getQSLViaList" << endl; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT shortname, name FROM qsl_via_enumeration"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { QString translatedValue = QString(); QString valueToTranslate = QString(); while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(1)).toString(); if (valueToTranslate == "Bureau") { translatedValue = tr("Bureau", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Direct") { translatedValue = tr("Direct"); } else if(valueToTranslate == "Electronic") { translatedValue = tr("Electronic"); } else if(valueToTranslate == "Manager") { translatedValue = tr("Manager", "Common term in hamradio, do not translate if not sure"); } else { translatedValue = valueToTranslate; } aux.clear(); aux = (query.value(0)).toString() + " - " + translatedValue; qs << aux; } else { } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } QStringList DataProxy_SQLite::getValidCatOptions(const int _currentCat, const int _lowerCat) { //qDebug() << "DataProxy_SQLite::getContestNames: " << QString::number(_currentCat) <<"/" << QString::number(_lowerCat) << endl; QStringList contests = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; switch (_currentCat) { case 0: queryString = QString("SELECT DISTINCT contestcatoperator.name FROM contestcatoperator JOIN contest ON contest.catoperator=contestcatoperator.id WHERE contest.contest='%1' ORDER BY contestcatoperator.id").arg(_lowerCat); break; case 1: queryString = QString("SELECT DISTINCT contestcatassisted.name FROM contestcatassisted JOIN contest ON contest.catassisted=contestcatassisted.id WHERE contest.catoperator='1' ORDER BY contestcatassisted.id").arg(_lowerCat); break; case 2: queryString = QString("SELECT DISTINCT contestcatpower.name FROM contestcatpower JOIN contest ON contest.catpower=contestcatpower.id WHERE contest.catoperator='1' ORDER BY contestcatpower.id").arg(_lowerCat); break; case 3: queryString = QString("SELECT DISTINCT contestcatband.name FROM contestcatband JOIN contest ON contest.catband=contestcatband.id WHERE contest.catoperator='1' ORDER BY contestcatband.id").arg(_lowerCat); break; case 4: queryString = QString("SELECT DISTINCT contestcatoverlay.name FROM contestcatoverlay JOIN contest ON contest.catoverlay=contestcatoverlay.id WHERE contest.catoperator='1' ORDER BY contestcatoverlay.id").arg(_lowerCat); break; case 5: queryString = QString("SELECT DISTINCT contestcatmode.name FROM contestcatmode JOIN contest ON contest.catmode=contestcatmode.id WHERE contest.catoperator='1' ORDER BY contestcatmode.id").arg(_lowerCat); break; default: return QStringList(); break; } sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); contests.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); return contests; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } } bool DataProxy_SQLite::haveAtLeastOneLog() { //qDebug() << "DataProxy_SQLite::haveAtLeastOneLog()" << endl; QSqlQuery query; bool sqlOK = query.exec("SELECT COUNT(id) from logs"); if (sqlOK) { query.next(); if (query.isValid()) { if((query.value(0)).toInt()>0) { query.finish(); return true; } else { query.finish(); return false; } } else { query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } //return false; } QStringList DataProxy_SQLite::getColumnNamesFromTableLog() { //qDebug() << "DataProxy_SQLite::getColumnNamesFromTableLog" << endl; return getColumnNamesFromTable("log"); } QStringList DataProxy_SQLite::getColumnNamesFromTable(const QString _tableName) { //qDebug() << "DataProxy_SQLite::getColumnNamesFromTable" << endl; return db->getColumnNamesFromTable(_tableName); } bool DataProxy_SQLite::setDXCCAwardStatus(const int _qsoId) { // If the band/mode/log is already confirmed: Return true // If the band/mode/log is already worked and status worked: Return true // If the band/mode/log is already worked and status confirmed: Update and Return true // If not worked: Add and Return true //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: " << QString::number(_qsoId) << endl; if (_qsoId <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: QSOid <=0 " << QString::number(_qsoId) << endl; return false; } int _dxcc = getDXCCFromId(_qsoId); if (_dxcc <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: DXCC <= 0: DXCC: " << QString::number(_dxcc) << " - " << QString::number(_qsoId) << endl; return false; } int _band = getBandFromId(_qsoId); if (_band <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Band <= 0: BAND: " << QString::number(_band) << " - " << QString::number(_qsoId) << endl; return false; } int _mode = getModeFromId(_qsoId); if (_mode <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Mode <= 0: Mode: " << QString::number(_mode) << " - " << QString::number(_qsoId) << endl; return false; } int _log = getLogNumberFromQSOId(_qsoId); if (_log <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Log <= 0: Log: " << QString::number(_log) << " - " << QString::number(_qsoId) << endl; return false; } // If the band/mode/log is already confirmed: Return true QSqlQuery query; // awarddxcc id dxcc band mode confirmed qsoid lognumber // If the band/mode/log is already confirmed: Return true // If the band/mode/log is already worked and status worked: Return true // If the band/mode/log is already worked and status confirmed: Update and Return true // If not worked: Add and Return true QString queryString = QString("SELECT id, confirmed, qsoid FROM awarddxcc WHERE band='%1' AND mode='%2' AND dxcc='%3'").arg(_band).arg(_mode).arg(_dxcc); bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Queryexec-1: " << queryString << endl; queryString.clear(); if (sqlOK) { QSqlRecord rec = query.record(); query.next(); int nameCol = -1; if (query.isValid()) { nameCol = rec.indexOf("id"); int __id = (query.value(nameCol)).toInt(); nameCol = rec.indexOf("confirmed"); QString __confirmed = (query.value(nameCol)).toString(); if (__confirmed == "1") { // #1 - If the band/mode/log is already confirmed: Return true query.finish(); return true; } else if (__confirmed == "0") { if (!isQSLReceived((_qsoId))) {// #2 - If the band/mode/log is already worked and status worked: Return true query.finish(); return true; } else { // #3 - If the band/mode/log is already worked and status confirmed: Update and Return true nameCol = rec.indexOf("qsoid"); //int __qsoid = (query.value(nameCol)).toInt(); queryString = QString("UPDATE awarddxcc SET confirmed = '1', qsoid = '%1' WHERE id = '%2'").arg(_qsoId).arg(__id); } } else { // This case should not happen? query.finish(); return true; } query.finish(); // #1 - If the band/mode/log is already confirmed: Return true // #2 - If the band/mode/log is already worked and status worked: Return true // #3 - If the band/mode/log is already worked and status confirmed: Update and Return true // #4 - If not worked: Add and Return true } else { //#4 - If not worked: Add and Return true query.finish(); // awarddxcc id dxcc band mode confirmed qsoid lognumber queryString = QString("INSERT INTO awarddxcc (dxcc, band, mode, confirmed, qsoid, lognumber) values('%1','%2','%3','0', '%5', '%6')").arg(_dxcc).arg(_band).arg(_mode).arg(_qsoId).arg(_log); } if (queryString.length()>5) { if (query.exec(queryString)) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Queryexec-2: " << queryString << endl; query.finish(); return true; } else { if(query.lastError().number()==19) {} else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } query.finish(); return true; } bool DataProxy_SQLite::setWAZAwardStatus(const int _qsoId) { // If the band/mode/log is already confirmed: Return true // If the band/mode/log is already worked and status worked: Return true // If the band/mode/log is already worked and status confirmed: Update and Return true // If not worked: Add and Return true //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: " << QString::number(_qsoId) << endl; if (_qsoId <= 0) { return false; } int _cqz = getCQZFromId(_qsoId); if (_cqz <= 0) { return false; } int _band = getBandFromId(_qsoId); if (_band <= 0) { return false; } int _mode = getModeFromId(_qsoId); if (_mode <= 0) { return false; } int _log = getLogNumberFromQSOId(_qsoId); if (_log <= 0) { return false; } // If the band/mode/log is already confirmed: Return true QSqlQuery query; // awarddxcc id dxcc band mode confirmed qsoid lognumber // If the band/mode/log is already confirmed: Return true // If the band/mode/log is already worked and status worked: Return true // If the band/mode/log is already worked and status confirmed: Update and Return true // If not worked: Add and Return true QString queryString = QString("SELECT id, confirmed, qsoid FROM awardwaz WHERE band='%1' AND mode='%2' AND cqz='%3'").arg(_band).arg(_mode).arg(_cqz); bool sqlOK = query.exec(queryString); queryString.clear(); if (sqlOK) { QSqlRecord rec = query.record(); query.next(); int nameCol = -1; if (query.isValid()) { nameCol = rec.indexOf("id"); int __id = (query.value(nameCol)).toInt(); nameCol = rec.indexOf("confirmed"); QString __confirmed = (query.value(nameCol)).toString(); if (__confirmed == "1") { // #1 - If the band/mode/log is already confirmed: Return true query.finish(); return true; } else if (__confirmed == "0") { if (!isQSLReceived((_qsoId))) {// #2 - If the band/mode/log is already worked and status worked: Return true query.finish(); return true; } else { // #3 - If the band/mode/log is already worked and status confirmed: Update and Return true nameCol = rec.indexOf("qsoid"); //int __qsoid = (query.value(nameCol)).toInt(); queryString = QString("UPDATE awardwaz SET confirmed = '1', qsoid = '%1' WHERE id = '%2'").arg(_qsoId).arg(__id); } } else { // This case should not happen? query.finish(); return true; } query.finish(); // #1 - If the band/mode/log is already confirmed: Return true // #2 - If the band/mode/log is already worked and status worked: Return true // #3 - If the band/mode/log is already worked and status confirmed: Update and Return true // #4 - If not worked: Add and Return true } else { //#4 - If not worked: Add and Return true query.finish(); // awarddxcc id dxcc band mode confirmed qsoid lognumber queryString = QString("INSERT INTO awardwaz (cqz, band, mode, confirmed, qsoid, lognumber) values('%1','%2','%3','%4', '%5', '%6')").arg(_cqz); } if (queryString.length()>5) { if (query.exec(queryString)) { query.finish(); return true; } else { if(query.lastError().number()==19) {} else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } query.finish(); return true; } int DataProxy_SQLite::getNumberOfManagedLogs() { //qDebug() << "DataProxy_SQLite::getNumberOfManagedLogs" << endl; QSqlQuery query; bool sqlOK = query.exec("SELECT COUNT (*) from logs"); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1; } return -1; } int DataProxy_SQLite::getMaxLogNumber() { QSqlQuery query; QString queryString = QString("SELECT MAX(id) FROM logs"); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1; } return -1; } QStringList DataProxy_SQLite::getListOfManagedLogs() { //This function returns the list of log IDs that are being managed //qDebug() << "DataProxy_SQLite::getListOfManagedLogs" << endl; QSqlQuery query; QStringList qs; qs.clear(); QString queryString = QString("SELECT id FROM logs"); bool sqlOK = query.exec(queryString); if (sqlOK) { while (query.next()) { if (query.isValid()) { qs << (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getListOfManagedLogs: " << (query.value(0)).toString() << endl; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); qs.clear(); } query.finish(); return qs; } QString DataProxy_SQLite::getStationCallSignFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: " << QString::number(_log)<< endl; QSqlQuery query; QString queryString = QString("SELECT stationcall FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: " << (query.value(0)).toString() << endl; QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: Not valid" << endl; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: query failed" << endl; query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: END" << endl; return QString(); } QStringList DataProxy_SQLite::getStationCallSignsFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getStationCallSignsFromLog" << endl; QStringList calls = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; queryString = QString("SELECT DISTINCT station_callsign FROM log"); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); if (queryString.length()>2) { calls.append(queryString); } //qDebug() << "DataProxy_SQLite::getStationCallSignsFromLog: " << queryString << endl; } else { query.finish(); return QStringList(); } } query.finish(); calls.removeDuplicates(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } calls.sort(); return calls; } QString DataProxy_SQLite::getOperatorsFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: " << QString::number(_log)<< endl; QSqlQuery query; QString queryString = QString("SELECT operators FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: " << (query.value(0)).toString() << endl; QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: Not valid" << endl; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: query failed" << endl; query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: END" << endl; return QString(); } QString DataProxy_SQLite::getCommentsFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: " << QString::number(_log)<< endl; QSqlQuery query; QString queryString = QString("SELECT comment FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: " << (query.value(0)).toString() << endl; QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: Not valid" << endl; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getLogDateFromLog: query failed" << endl; query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getCommentsFromLog: END" << endl; return QString(); } QString DataProxy_SQLite::getLogDateFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: " << QString::number(_log)<< endl; QSqlQuery query; QString queryString = QString("SELECT logdate FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: " << (query.value(0)).toString() << endl; QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: Not valid" << endl; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getLogDateFromLog: query failed" << endl; query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getLogDateFromLog: END" << endl; return QString(); } QString DataProxy_SQLite::getLogTypeNFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getLogTypeNFromLog: " << QString::number(_log)<< endl; QSqlQuery query; QString queryString = QString("SELECT logtypen FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getLogTypeNFromLog: " << (query.value(0)).toString() << endl; QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getLogTypeNFromLog: Not valid" << endl; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getLogTypeNFromLog: query failed" << endl; query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getLogTypeNFromLog: END" << endl; return QString(); } int DataProxy_SQLite::getContestTypeN(const int _co, const int _catop, const int _catas, const int _catpo, const int _catba, const int _catov, const int _catmo) {//typeContestSelected, contestCatOperators, contestCatAssisted, contestCatPower, contestCatBands, contestCatOverlay, contestCatMode //qDebug() << "DataProxy_SQLite::getContestTypeN: " << endl; QSqlQuery query; QString queryString = QString("SELECT id FROM contest WHERE contest='%1' AND catoperator='%2' AND catassisted='%3' AND catpower='%4' AND catoverlay='%5' AND catmode='%6' AND catband='%7'").arg(_co).arg(_catop).arg(_catas).arg(_catpo).arg(_catov).arg(_catmo).arg(_catba); //qDebug() << "DataProxy_SQLite::getContestTypeN: " << queryString << endl; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::getContestTypeN: (OK) LastQuery: " << query.lastQuery() << endl; query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getContestTypeN: " << (query.value(0)).toString() << endl; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getContestTypeN: Not valid (-1)" << endl; query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getContestTypeN: (ERROR) LastQuery: " << query.lastQuery() << endl; //qDebug() << "DataProxy_SQLite::getContestTypeN: query failed (-1)" << endl; query.finish(); return -1; } //qDebug() << "DataProxy_SQLite::getContestTypeN: END (-1)" << endl; return -1; } QStringList DataProxy_SQLite::getDataFromContestType(const int _n) { //qDebug() << "DataProxy_SQLite::getDataFromContestType - n: " << QString::number(_n) << endl; QStringList dataC = QStringList(); QSqlQuery query, query1; QString queryString; int nameCol = -1; bool sqlOK; queryString = QString("SELECT supportedcontests.name, contest.contest, contest.catoperator, contest.catassisted, contest.catpower, contest.catoverlay, contest.catmode, contest.catband FROM supportedcontests JOIN contest ON contest.contest=supportedcontests.id WHERE contest.id='%1'").arg(_n); sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getDataFromContestType: LastQuery: " << query.lastQuery() << endl; QSqlRecord rec = query.record(); if (sqlOK) { //qDebug() << "DataProxy_SQLite::getDataFromContestType: Query OK" << endl; if(query.next()) { //qDebug() << "DataProxy_SQLite::getDataFromContestType: Query Next" << endl; if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getDataFromContestType: Query Valid" << endl; //qDebug() << "DataProxy_SQLite::getDataFromContestType:-1 " << endl; nameCol = rec.indexOf("contest"); dataC << (query.value(nameCol)).toString(); //qDebug() << "DataProxy_SQLite::getDataFromContestType: -2" << endl; nameCol = rec.indexOf("catoperator"); dataC << (query.value(nameCol)).toString(); //qDebug() << "DataProxy_SQLite::getDataFromContestType: -3" << endl; nameCol = rec.indexOf("catassisted"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("catpower"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("catoverlay"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("catmode"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("name"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("catband"); dataC << (query.value(nameCol)).toString(); query.finish(); return dataC; } else { //qDebug() << "DataProxy_SQLite::getDataFromContestType: Query value no valid" << endl; query.finish(); return QStringList(); } } else { //qDebug() << "DataProxy_SQLite::getDataFromContestType: No Next" << endl; query.finish(); return QStringList(); } //query.finish(); //return dataC; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getDataFromContestType: Query not OK" << endl; query.finish(); return QStringList(); } } int DataProxy_SQLite::getLogTypeNumber(const QString _logType) { return db->getLogTypeNumber(_logType); } QString DataProxy_SQLite::getLogTypeName(const int _logType) { return db->getLogTypeName(_logType); } QString DataProxy_SQLite::getLogTypeOfUserLog(const int _logN) { /* * Returns the type of log (DX, CQ-WW-SSB, ...) or DX as default if nothing found */ //qDebug() << "DataProxy_SQLite::getLogTypeOfUserLog: " << QString::number(_logN) << endl; QSqlQuery query; QString queryString; queryString = QString("SELECT logtype FROM logs WHERE id='%1'").arg(_logN); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getLogTypeOfUserLog: found: " << (query.value(0)).toString() << endl; queryString = (query.value(0)).toString(); query.finish(); return queryString; } else { //qDebug() << "DataProxy_SQLite::getLogTypeOfUserLog: NOT found: returning DX" << endl; query.finish(); return "DX"; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getLogTypeOfUserLog: Query error: returning DX" << endl; query.finish(); return "DX"; } } int DataProxy_SQLite::getLogNumberFromQSOId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT lognumber FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1; } } bool DataProxy_SQLite::fillEmptyDXCCInTheLog() { //qDebug() << "DataProxy_SQLite::fillEmptyDXCCInTheLog" << endl; int nameCol = -1; QSqlQuery query; QSqlQuery query2; QString queryString = QString("SELECT COUNT (id) FROM log WHERE dxcc IS NULL OR dxcc<1 OR cont IS NULL"); bool sqlOK = query.exec(queryString); int qsos = -1; if (sqlOK) { //QSqlDatabase::database().commit(); query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } if (qsos < 1) { return true; } int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Urt information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); queryString = QString("SELECT id, call FROM log WHERE dxcc IS NULL OR dxcc<1 OR cont IS NULL"); sqlOK = query.exec(queryString); if (sqlOK) { QSqlRecord rec = query.record(); QString _call = QString(); QString _id = QString(); QString _dxcc = QString(); QString _aux = QString(); QString _continent = QString(); int j = 0; while (query.next()) { if (query.isValid()) { nameCol = rec.indexOf("id"); _id = (query.value(nameCol)).toString(); nameCol = rec.indexOf("call"); _call = (query.value(nameCol)).toString(); _dxcc = QString::number(getPrefixId(_call)); _continent = getContinentShortNameFromEntity(_dxcc.toInt()); //qDebug() << "DataBase::fillEmptyDXCCInTheLog: DXCC: " << _dxcc << endl; //qDebug() << "DataBase::fillEmptyDXCCInTheLog: Cont: " << _continent << endl; // UPDATE THE ID WITH THE DXCC queryString = QString("UPDATE log SET dxcc = '%1', cont = '%2' WHERE id = '%3'").arg(_dxcc).arg(_continent).arg(_id); sqlOK = query2.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().number(), query2.lastQuery()); query2.finish(); return false; } query2.finish(); if (( (j % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs _aux = QObject::tr("Updating DXCC and Continent information...") + "\n" + QObject::tr("QSO: ") + QString::number(j) + "/" + QString::number(qsos); //_aux = "Updating ..."; progress.setLabelText(_aux); progress.setValue(j); } if ( progress.wasCanceled() ) { //qDebug() << "DataBase::fillEmptyDXCCInTheLog: progress canceled" << endl; query.finish(); return true; } j++; } } progress.setValue(qsos); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog DXCC")); msgBox.setText(tr("All QSOs have been updated with a DXCC and the Continent.") ); msgBox.exec(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } query.finish(); return true; } int DataProxy_SQLite::getHowManyQSOInLog(const int _log) { QString queryString = QString(); QSqlQuery query; if (_log < 0) { queryString = QString("SELECT count(id) FROM log"); } else { queryString = QString("SELECT count(id) FROM log WHERE lognumber='%1'").arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getHowManyConfirmedQSLInLog(const int _log) { if (!doesThisLogExist(_log) && (_log>0)) { return 0; } QString queryString = QString(); QSqlQuery query; if (_log < 0) { queryString = QString("SELECT count(id) FROM log WHERE qsl_rcvd='Y'"); } else { queryString = QString("SELECT count(id) FROM log WHERE qsl_rcvd='Y' AND lognumber='%1'").arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getHowManyQSLSentInLog(const int _log) { if (!doesThisLogExist(_log) && (_log>0)) { return 0; } QString queryString = QString(); QSqlQuery query; if (_log < 0) { queryString = QString("SELECT count(id) FROM log WHERE qsl_sent='Y'"); } else { queryString = QString("SELECT count(id) FROM log WHERE qsl_sent='Y' AND lognumber='%1'").arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getQSOsWithContinent(const QString _cont, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: " << _cont << endl; QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where cont LIKE '%1'").arg(_cont); } else { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND cont LIKE '%2'").arg(_logNumber).arg(_cont); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: queryString: " << queryString << endl; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: " << QString::number((query.value(0)).toInt()) << endl; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: 0" << endl; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: Query error" << endl; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsInBand(const QString _band, const int _log) { if (!doesThisLogExist(_log) && (_log>0)) { return 0; } int bandId = getIdFromBandName(_band); if ( bandId < 0) { return 0; } QString queryString = QString(); QSqlQuery query; if (_log < 0) { queryString = QString("SELECT count(id) FROM log WHERE bandid='%1'").arg(bandId); } else { queryString = QString("SELECT count(id) FROM log WHERE bandid='%1' AND lognumber='%2'").arg(bandId).arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getQSOsInMode(const QString _mode, const int _log) { if (!doesThisLogExist(_log) && (_log>0)) { return 0; } int modeId = getIdFromModeName(_mode); if ( modeId < 0) { return 0; } QString queryString = QString(); QSqlQuery query; if (_log < 0) { queryString = QString("SELECT count(id) FROM log WHERE modeid='%1'").arg(modeId); } else { queryString = QString("SELECT count(id) FROM log WHERE modeid='%1' AND lognumber='%2'").arg(modeId).arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return 0; } } bool DataProxy_SQLite::addNewLog (const QStringList _qs) { //qDebug() << "DataProxy_SQLite::addNewLog: " << _qs.at(2) << "/" << _qs.at(5) << "/" << _qs.at(6) << endl; //_qs << dateString << stationCallsign << _qs.at(4) << comment << _qs.at(12); //qDebug() << "DataProxy_SQLite::slotAnalyzeNewLogData: " << _qs.at(4) << "/" << _qs.at(12) << endl; // Date/Call/Operators/"DX"/comment/"1" if (_qs.size()!=8) { //qDebug() << "DataProxy_SQLite::addNewLog: != 8" << endl; return false; } //qDebug() << "DataProxy_SQLite::addNewLog: Has the appropriate length" << endl; QString aux = QString(); //int nameCol = -1; QString _dateString = _qs.at(0); QString _stationCallsign = _qs.at(1); QString _operators = _qs.at(2); //_operators.clear(); //_operators << (_qs.at(2)).split(',', QString::SkipEmptyParts); QString _typeContest = _qs.at(3); QString _comment = _qs.at(4); QString _typeContestN = _qs.at(5); QString id = _qs.at(6); QString editing = _qs.at(7); QString queryString; QSqlQuery query; bool sqlOK; if (editing == "1") { // We are editing //qDebug() << "DataProxy_SQLite::addNewLog: We are editing!" << endl; queryString = QString("UPDATE logs SET logdate = '%1', stationcall = '%2', operators = '%3', comment = '%4', logtype = '%5', logtypen = '%6' WHERE id = '%7'").arg(_dateString).arg(_stationCallsign).arg(_operators).arg(_comment).arg(_typeContest).arg(_typeContestN).arg(id); sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::addNewLog: Editing OK!" << endl; query.finish(); return true; } else { //qDebug() << "DataProxy_SQLite::addNewLog: Editing NOK!" << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } return false; } //qDebug() << "DataProxy_SQLite::addNewLog: We are adding a new log" << endl; // First we check if the log is already there queryString = QString("SELECT id FROM logs WHERE logdate='%1' AND stationcall='%2' AND logtype='%3' AND logtypen='%4'").arg(_dateString).arg(_stationCallsign).arg(_typeContest).arg(_typeContestN); //"logs" //"id, logdate, stationcall, comment, logtype" //qDebug() << "DataProxy_SQLite::addNewLog query1: " << queryString << endl; sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { // It seems that the log is already existing! return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } //Now we add the new log queryString = QString("INSERT INTO logs (logdate, stationcall, operators, comment, logtype, logtypen) values('%1','%2','%3','%4', '%5', '%6')").arg(_dateString).arg(_stationCallsign).arg(_operators).arg(_comment).arg(_typeContest).arg(_typeContestN); //qDebug() << "DataProxy_SQLite::addNewLog query1: " << queryString << endl; sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } return false; } bool DataProxy_SQLite::doesThisLogExist(const int _log) { //qDebug() << "DataProxy_SQLite::doesThisLogExist: " << QString::number(_log) << endl; //qDebug() << "DataProxy_SQLite::doesThisLogExist - Name:" << db->getDBName() << endl; QSqlQuery query; QString queryString = QString("SELECT id FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::doesThisLogExist: query: " << query.lastQuery() << endl; if (sqlOK) { if (query.next()) { if (query.isValid()) { query.finish(); //qDebug() << "DataProxy_SQLite::doesThisLogExist: END TRUE" << endl; return true; } else { query.finish(); //qDebug() << "DataProxy_SQLite::doesThisLogExist: END FALSE 1" << endl; return false; } } else { query.finish(); //qDebug() << "DataProxy_SQLite::doesThisLogExist: END FALSE 2" << endl; return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::doesThisLogExist: END FALSE 3" << endl; return false; } //qDebug() << "DataProxy_SQLite::doesThisLogExist: END FALSE 4" << endl; return false; } int DataProxy_SQLite::getContinentIdFromContinentShortName(const QString _n) { if (_n.length()!=2) { return -3; } QSqlQuery query; QString queryString = QString("SELECT id FROM continent WHERE shortname=='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -2; } } QString DataProxy_SQLite::getContinentShortNameFromEntity(const int _n) { QSqlQuery query; QString queryString= QString("SELECT continent FROM entity WHERE dxcc='%1'").arg(_n); //QString queryString= QString("SELECT continent.shortname FROM entity JOIN continent ON entity.continent=continent.shortname WHERE dxcc='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); query.finish(); return queryString; } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } } int DataProxy_SQLite::getContinentIdFromEntity(const int _n) { QSqlQuery query; QString queryString = QString("SELECT continent.id FROM entity JOIN continent ON entity.continent=continent.shortname WHERE dxcc='%1'").arg(_n); bool sqlOK = query.exec(queryString); //aux = QString("SELECT continent.id FROM entity JOIN continent ON entity.continent=continent.shortname WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(_n); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -2; } } QStringList DataProxy_SQLite::getContinentShortNames() { QSqlQuery query; QStringList continents; continents.clear(); QString queryString = QString("SELECT shortname FROM continent"); bool sqlOK = query.exec(queryString); if (sqlOK) { while (query.next()) { if (query.isValid()) { continents << query.value(0).toString(); } } query.finish(); continents.sort(); return continents; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QStringList(); } //return QStringList(); } bool DataProxy_SQLite::isValidContinentShortName(const QString _n) { QString queryString = QString("SELECT id FROM continent WHERE shortname ='%1'").arg(_n); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { query.finish(); return true; } else { query.finish(); return false; } } else { query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } } int DataProxy_SQLite::getITUzFromPrefix(const QString _p) { QSqlQuery query; QString queryString = QString("SELECT ituz FROM prefixesofentity WHERE prefix LIKE '%1'").arg(_p); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -2; } } int DataProxy_SQLite::getCQzFromPrefix(const QString _p) { QSqlQuery query; QString queryString = QString("SELECT cqz FROM prefixesofentity WHERE prefix LIKE '%1'").arg(_p); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -2; } } int DataProxy_SQLite::getCQzFromEntity(const int _n) { QSqlQuery query; QString queryString = QString("SELECT cqz FROM entity WHERE dxcc='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -2; } } int DataProxy_SQLite::getITUzFromEntity(const int _n) { QSqlQuery query; QString queryString = QString("SELECT ituz FROM entity WHERE dxcc='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -2; } } QString DataProxy_SQLite::getEntityNameFromId(const int _n) { //qDebug() << "DataProxy_SQLite::getEntityNameFromId: " << QString::number(_n) << endl; QSqlQuery query; QString queryString = QString("SELECT name FROM entity WHERE dxcc='%1'").arg(_n); QString motherEntName = QString(); bool sqlOK; if (_n > 1000) { QString aux = (QString::number(_n)).right(3); QString queryString2 = QString("SELECT name FROM entity WHERE dxcc='%1'").arg(aux); sqlOK = query.exec(queryString2); if (sqlOK) { if (query.next()) { if (query.isValid()) { motherEntName = (query.value(0)).toString(); } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } } query.finish(); sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { if (_n>1000) { motherEntName = (query.value(0)).toString() + " (" + motherEntName + ")"; } else { motherEntName = (query.value(0)).toString(); } query.finish(); return motherEntName; } else { query.finish(); return QString(); } } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } return QString(); } int DataProxy_SQLite::getEntityIdFromName(const QString _e) { //qDebug() << "DataProxy_SQLite::getEntityIdFromName:" << _e << endl; int id = -1; QString queryString; QSqlQuery query; //queryString = QString("SELECT mainprefix FROM entity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(_entityN); queryString = QString("SELECT dxcc FROM entity WHERE name='%1'").arg(_e); //queryString = "SELECT prefix FROM prefixesofentity WHERE dxcc=='" + QString::number(i) +"'"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return id; } else { query.next(); if (query.isValid()) { id = (query.value(0)).toInt(); query.finish(); return id; } else { query.finish(); return -1; } } return -1; } QString DataProxy_SQLite::getEntityMainPrefix(const int _entityN) { //qDebug() << "DataProxy_SQLite::getEntityMainPrefix:" << QString::number(_entityN) << endl; if (_entityN <= 0 ) { return QString(); } QString queryString; QSqlQuery query; //queryString = QString("SELECT mainprefix FROM entity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(_entityN); queryString = QString("SELECT mainprefix FROM entity WHERE dxcc='%1'").arg(_entityN); //queryString = "SELECT prefix FROM prefixesofentity WHERE dxcc=='" + QString::number(i) +"'"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } else { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); query.finish(); return queryString; } else { query.finish(); return QString(); } } return QString(); } int DataProxy_SQLite::getDXCCFromPrefix(const QString _p) { //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix(: -" << _p << "-" << endl; QSqlQuery query; QString queryString = QString("SELECT dxcc FROM prefixesofentity WHERE prefix='%1'").arg(_p); bool sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { query.finish(); return -2; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -3; } //return -4; } bool DataProxy_SQLite::isNewCQz(int _c) { QSqlQuery query; QString queryString = QString("SELECT id FROM log WHERE cqz='%1'").arg(_c); //queryString = "SELECT id FROM log WHERE cqz=='" + QString::number(_cqz) +"'"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } else { query.next(); if (query.isValid()) { query.finish(); return true; } else { query.finish(); return false; } } //return false; } bool DataProxy_SQLite::isNewEntity(int _e) { if (_e <= 0) { return false; } //QString queryString; QSqlQuery query; QString queryString = QString("SELECT id FROM log WHERE dxcc='%1'").arg(_e); //queryString = "SELECT id FROM log WHERE dxcc=='" + QString::number(_entityN) +"'"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } else { query.next(); if (query.isValid()) { query.finish(); return true; } else { query.finish(); return false; } } return false; } double DataProxy_SQLite::getLongitudeFromEntity(const int _e) { QString queryString = QString("SELECT longitude FROM entity WHERE dxcc='%1'").arg(_e); QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return 0.0; } else { query.next(); if ( !(query.isValid()) ) { query.finish(); return 0.0; } else { double v = (query.value(0)).toDouble(); query.finish(); return v; } } return 0.0; } double DataProxy_SQLite::getLatitudeFromEntity(const int _e) { QString queryString = QString("SELECT latitude FROM entity WHERE dxcc='%1'").arg(_e); QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return 0.0; } else { query.next(); if ( !(query.isValid()) ) { query.finish(); return 0.0; } else { double v = (query.value(0)).toDouble(); query.finish(); return v; } } } QString DataProxy_SQLite::getEntityPrefixes(const int _enti) { if (_enti<=0) { return QString(); } QString result; result = QString(); QString queryString; QSqlQuery query; int i = _enti; queryString = "SELECT prefix FROM prefixesofentity WHERE dxcc=='" + QString::number(i) +"'"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } else { while ( (query.next())) { if (query.isValid()) { result = result + ", " + (query.value(0)).toString(); } else { } } if (result.length() < 1) { return result; } else { result = result.remove(0,2); query.finish(); return result; } } //return QString(); } QStringList DataProxy_SQLite::getEntitiesNames() { //qDebug() << "DataProxy_SQLite::getEntitiesNames" << endl; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT mainprefix, name, dxcc FROM entity"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { if (query.value(2).toInt()<1000) { aux.clear(); aux = (query.value(0)).toString() + "-" + (query.value(1)).toString()+" ("+(query.value(2)).toString()+")"; //result = result + ", " + (query.value(0)).toString(); qs << aux; } } else { } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } query.finish(); qs.sort(); return qs; } QStringList DataProxy_SQLite::getEntitiesIds() { QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT dxcc FROM entity"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { if (query.value(0).toInt()>0) { aux.clear(); aux = (query.value(0)).toString(); qs << aux; } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } query.finish(); qs.sort(); return qs; } /* * The following code was showing in the Entities prefixes and entities like Sicily, African Italy... and they are not officially an entity in the DXCC QStringList DataProxy_SQLite::getEntitiesNames() { //qDebug() << "DataProxy_SQLite::getEntitiesNames" << endl; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT mainprefix, name, dxcc FROM entity"); QSqlQuery query,query2; int dxcc = -1; QString aux2 = QString(); if (query.exec(queryString)) { while ( (query.next())) { if (query.isValid()) { dxcc = query.value(2).toInt(); //qDebug() << "DataProxy_SQLite::getEntitiesNames - DXCC: " << QString::number(dxcc) << endl; if (dxcc > 1000) { //qDebug() << "DataProxy_SQLite::getEntitiesNames - DXCC>1000 going in details: " << endl; aux2 = QString::number(dxcc); aux2 = aux2.right(3); //qDebug() << "DataProxy_SQLite::getEntitiesNames - aux2: " << aux2 << endl; queryString = QString("SELECT mainprefix, name FROM entity WHERE dxcc ='%1'").arg(aux2); if (query2.exec(queryString)) { if (query2.next()) { if (query2.isValid()) { //aux2 = (query2.value(1)).toString(); aux.clear(); aux = (query.value(0)).toString() + "-" + (query.value(1)).toString()+" (" + (query2.value(0)).toString() + "-" + (query2.value(1)).toString() + " - " + aux2 + ")" ; } } } else { //TODO: Manage the error } } else { //qDebug() << "DataProxy_SQLite::getEntitiesNames - DXCC<1000 quick! " << endl; aux.clear(); aux = (query.value(0)).toString() + "-" + (query.value(1)).toString()+" ("+QString::number(dxcc)+")"; } //qDebug() << "DataProxy_SQLite::getEntitiesNames - AUX: " << aux << endl; //result = result + ", " + (query.value(0)).toString(); qs << aux; } else { //TODO: Manage the error } } } else { //TODO: Manage the error } return qs; } */ int DataProxy_SQLite::getHowManyEntities() { QSqlQuery query; QString queryString = QString("SELECT count(id) FROM entity"); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getMaxEntityID(bool limit) { //SELECT MAX (dxcc) FROM entity WHERE dxcc<1000 QSqlQuery query; QString queryString; if (limit) { queryString = QString("SELECT MAX (dxcc) FROM entity WHERE dxcc<1000"); } else { queryString = QString("SELECT MAX (dxcc) FROM entity"); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1; } } bool DataProxy_SQLite::updateISONames() { //qDebug() << "DataProxy_SQLite::updateISONames" << endl; bool result; result = db->updateTheEntityTableISONames(); return result; } QString DataProxy_SQLite::getISOName(const int _n) { //qDebug() << "DataProxy_SQLite::getISONames: " << QString::number(_n) << endl; if (_n <= 0 ) { //qDebug() << "DataProxy_SQLite::getISONames: NOT KNOWN - UN" << endl; return "un"; // When no flag is known, we return the UN flag } QString queryString, aux; QSqlQuery query; aux.clear(); queryString = QString("SELECT isoname FROM entity WHERE dxcc='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getISOName: Query error - UN" << endl; query.finish(); return "nu"; // When no flag is known, we return the UN flag } else { query.next(); if (query.isValid()){ //qDebug() << "DataProxy_SQLite::getISOName: ISO Name: " << (query.value(0)).toString() << endl; aux = (query.value(0)).toString(); query.finish(); if (aux.length()>1) { return aux; } else { return "un"; // When no flag is known, we return the UN flag } } else { //qDebug() << "DataProxy_SQLite::getISOName: NO ISO Name: " << endl; query.finish(); return "un"; // When no flag is known, we return the UN flag } } //qDebug() << "DataProxy_SQLite::getISOName: NO ISO Name: default" << endl; //return "un"; // When no flag is known, we return the UN flag } void DataProxy_SQLite::getFoundInLog(const QString _txt, const int _log) { //qDebug() << "DataProxy_SQLite::getFoundInLog: " << _txt << "/" << QString::number(_log) << endl; /* searching = true; executionN++; QSqlQuery query; QString queryString, aux; aux.clear(); QStringList qsoDataFound; qsoDataFound.clear(); if (_txt.length()<2) { //qDebug() << "DataProxy_SQLite::getFoundInLog: lengh shorter than 2" << endl; searching = false; return; } //qDebug() << "DataProxy_SQLite::getFoundInLog: let's go searching!" << endl; if (_log <= 0) { queryString = QString("SELECT call, qso_date, time_on, bandid, modeid, qsl_rcvd, qsl_sent, station_callsign, id FROM log WHERE call LIKE '%%1%'").arg(_txt); } else { queryString = QString("SELECT call, qso_date, time_on, bandid, modeid, qsl_rcvd, qsl_sent, station_callsign, id FROM log WHERE call LIKE '%%1%' AND lognumber='%2'").arg(_txt).arg(_log); } bool sqlOk = query.exec(queryString); if (sqlOk) { //qDebug() << "DataProxy_SQLite::getFoundInLog: Query OK" << endl; QSqlRecord rec = query.record(); int nameCol = -1; int counter = 0; while ((query.next()) && (searching)) { if (query.isValid()) { counter++; //qDebug() << "DataProxy_SQLite::getFoundInLog: Data found: - " << QString::number(counter) << endl; qsoDataFound.clear(); nameCol = rec.indexOf("call"); qsoDataFound << "call:" + (query.value(nameCol)).toString(); //qDebug() << "DataProxy_SQLite::getFoundInLog: Data found: " << (query.value(nameCol)).toString() << endl; nameCol = rec.indexOf("qso_date"); qsoDataFound << "qso_date:" + (query.value(nameCol)).toString(); nameCol = rec.indexOf("time_on"); qsoDataFound << "time_on:" + (query.value(nameCol)).toString(); nameCol = rec.indexOf("bandid"); qsoDataFound << "bandid:" + (query.value(nameCol)).toString(); nameCol = rec.indexOf("modeid"); qsoDataFound << "modeid:" + (query.value(nameCol)).toString(); nameCol = rec.indexOf("qsl_rcvd"); aux = (query.value(nameCol)).toString(); if (aux.length()<1) { aux = "N"; } qsoDataFound << "qsl_rcvd:" + aux; nameCol = rec.indexOf("qsl_sent"); aux = (query.value(nameCol)).toString(); if (aux.length()<1) { aux = "N"; } qsoDataFound << "qsl_sent:" + aux; nameCol = rec.indexOf("station_callsign"); qsoDataFound << "station_callsign:" + (query.value(nameCol)).toString(); nameCol = rec.indexOf("id"); qsoDataFound << "id:" + (query.value(nameCol)).toString(); if (qsoDataFound.length()>1) { emit qsoFound(qsoDataFound); //qDebug() << "DataProxy_SQLite::getFoundInLog: Emitting qsoDataFound... (exec: "<< QString::number(executionN) << ") Call-id: " << qsoDataFound.at(0) << "-" << qsoDataFound.at(8) << endl; } else { //qDebug() << "DataProxy_SQLite::getFoundInLog: NOT emitting qsoDataFound... (exec: "<< QString::number(executionN) << ")" << endl; //qDebug() << "DataProxy_SQLite::getFoundInLog: NOT Emitting qsoDataFound..." << endl; } } // Closes if next.isValid } // Closes While //qDebug() << "DataProxy_SQLite::getFoundInLog: No more data!" << endl; return; } else { //qDebug() << "DataProxy_SQLite::getFoundInLog: Error 1: Query NOK" << endl; searching = false; return; } //qDebug() << "DataProxy_SQLite::getFoundInLog: Error 2" << endl; searching = false; return; */ } /* bool DataProxy_SQLite::queryPrepare(const QString _query) { //qDebug() << "DataProxy_SQLite::queryPrepare: " << _query << endl; //return preparedQuery.prepare( _query ); //return preparedQuery.prepare("INSERT INTO log (call, qso_date, bandid, modeid, time_on, time_off, srx, stx, srx_string, stx_string, qso_date_off, band_rx, rst_sent, rst_rcvd, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, checkcontest, class, contacted_op, contest_id, country, credit_submitted, credit_granted, distance, eq_call, email, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, force_init, freq, freq_rx, gridsquare, my_gridsquare, iota, iota_island_id, my_iota, my_iota_island_id, k_index, lat, lon, my_lat, my_lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, clublog_qso_upload_date, clublog_qso_upload_status, max_bursts, ms_shower, my_city, my_cnty, my_country, my_cq_zone, my_name, name, operator, station_callsign, owner_callsign, my_rig, my_sig, my_sig_info, my_state, state, my_street, notes, nr_bursts, nr_pings, pfx, precedence, prop_mode, public_key, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, qth, rx_pwr, tx_pwr, sat_mode, sat_name, sfi, sig, swl, ten_ten, web, points, multiplier, lognumber) VALUES (:call, :qso_date, :bandid, :modeid, :time_on, :time_off, :srx, :stx, :srx_string, :stx_string, :qso_date_off, :band_rx, :rst_sent, :rst_rcvd, :cqz, :ituz, :dxcc, :address, :age, :cnty, :comment, :a_index, :ant_az, :ant_el, :ant_path, :arrl_sect, :checkcontest, :class, :contacted_op, :contest_id, :country, :credit_submitted, :credit_granted, :distance, :eq_call, :email, :eqsl_qslrdate, :eqsl_qslsdate, :eqsl_qsl_rcvd, :eqsl_qsl_sent, :force_init, :freq, :freq_rx, :gridsquare, :my_gridsquare, :iota, :iota_island_id, :my_iota, :my_iota_island_id, :k_index, :lat, :lon, :my_lat, :my_lon, :lotw_qslrdate, :lotw_qslsdate, :lotw_qsl_rcvd, :lotw_qsl_sent, :clublog_qso_upload_date, :clublog_qso_upload_status, :max_bursts, :ms_shower, :my_city, :my_cnty, :my_country, :my_cq_zone, :my_name, :name, :operator, :station_callsign, :owner_callsign, :my_rig, :my_sig, :my_sig_info, :my_state, :state, :my_street, :notes, :nr_bursts, :nr_pings, :pfx, :precedence, :prop_mode, :public_key, :qslmsg, :qslrdate, :qslsdate, :qsl_rcvd, :qsl_sent, :qsl_rcvd_via, :qsl_sent_via, :qsl_via, :qso_complete, :qso_random, :qth, :rx_pwr, :tx_pwr, :sat_mode, :sat_name, :sfi, :sig, :swl, :ten_ten, :web, :points, :multiplier, :lognumber)"); //return db->queryPrepare("INSERT INTO log (call, qso_date, bandid, modeid, time_on, time_off, srx, stx, srx_string, stx_string, qso_date_off, band_rx, rst_sent, rst_rcvd, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, checkcontest, class, contacted_op, contest_id, country, credit_submitted, credit_granted, distance, eq_call, email, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, force_init, freq, freq_rx, gridsquare, my_gridsquare, iota, iota_island_id, my_iota, my_iota_island_id, k_index, lat, lon, my_lat, my_lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, clublog_qso_upload_date, clublog_qso_upload_status, max_bursts, ms_shower, my_city, my_cnty, my_country, my_cq_zone, my_name, name, operator, station_callsign, owner_callsign, my_rig, my_sig, my_sig_info, my_state, state, my_street, notes, nr_bursts, nr_pings, pfx, precedence, prop_mode, public_key, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, qth, rx_pwr, tx_pwr, sat_mode, sat_name, sfi, sig, swl, ten_ten, web, points, multiplier, lognumber) VALUES (:call, :qso_date, :bandid, :modeid, :time_on, :time_off, :srx, :stx, :srx_string, :stx_string, :qso_date_off, :band_rx, :rst_sent, :rst_rcvd, :cqz, :ituz, :dxcc, :address, :age, :cnty, :comment, :a_index, :ant_az, :ant_el, :ant_path, :arrl_sect, :checkcontest, :class, :contacted_op, :contest_id, :country, :credit_submitted, :credit_granted, :distance, :eq_call, :email, :eqsl_qslrdate, :eqsl_qslsdate, :eqsl_qsl_rcvd, :eqsl_qsl_sent, :force_init, :freq, :freq_rx, :gridsquare, :my_gridsquare, :iota, :iota_island_id, :my_iota, :my_iota_island_id, :k_index, :lat, :lon, :my_lat, :my_lon, :lotw_qslrdate, :lotw_qslsdate, :lotw_qsl_rcvd, :lotw_qsl_sent, :clublog_qso_upload_date, :clublog_qso_upload_status, :max_bursts, :ms_shower, :my_city, :my_cnty, :my_country, :my_cq_zone, :my_name, :name, :operator, :station_callsign, :owner_callsign, :my_rig, :my_sig, :my_sig_info, :my_state, :state, :my_street, :notes, :nr_bursts, :nr_pings, :pfx, :precedence, :prop_mode, :public_key, :qslmsg, :qslrdate, :qslsdate, :qsl_rcvd, :qsl_sent, :qsl_rcvd_via, :qsl_sent_via, :qsl_via, :qso_complete, :qso_random, :qth, :rx_pwr, :tx_pwr, :sat_mode, :sat_name, :sfi, :sig, :swl, :ten_ten, :web, :points, :multiplier, :lognumber)"); return true; } bool DataProxy_SQLite::queryBind(const QString _field, const QString value) { //qDebug() << "DataProxy_SQLite::queryBind: " << _field << "/" << value << endl; //preparedQuery.bindValue( _field, value ); //db->queryBind(_field, value); return true; } bool DataProxy_SQLite::queryExec() { //qDebug() << "DataProxy_SQLite::queryExec " << endl; bool sqlOK = db->queryExec(); if (!sqlOK) { //emit queryError(Q_FUNC_INFO, preparedQuery.lastError().databaseText(), preparedQuery.lastError().number(), preparedQuery.lastQuery()); //qDebug() << "DataProxy_SQLite::queryExec - FAILED execution " << endl; } else { //qDebug() << "DataProxy_SQLite::queryExec - executed " << endl; } return sqlOK; } */ int DataProxy_SQLite::getPrefixId(const QString _qrz) { //qDebug() << "DataProxy_SQLite::getPrefixId: -" << _qrz <<"-" << endl; //TODO: Instead of going from long to short, identify prefixes from the begining: // character(may be number) + number if (_qrz.length() < 1) { return -1; } int entityID = 0; QString aux = changeSlashAndFindPrefix((_qrz).toUpper()); while ((entityID <= 0) && (aux.length()>=1) ) { entityID = getDXCCFromPrefix(aux); //qDebug() << "DataProxy_SQLite::getPrefixId: in the while" << aux << " = " << QString::number(entityID) << endl; if (entityID<=0) { aux.chop(1); } } //qDebug() << "DataProxy_SQLite::getPrefixId: " << _qrz << QString::number(entityID) << endl; return entityID; } QString DataProxy_SQLite::changeSlashAndFindPrefix(const QString _qrz) { //qDebug() << "DataProxy_SQLite::changeSlashAndFindPrefix: -" << _qrz <<"-" << endl; int iaux1, iaux2; QString aux = _qrz.toUpper(); if ((aux).count('\\')) // Replaces \ by / to ease operation. { aux.replace(QChar('\\'), QChar('/')); } else { return aux; } if (aux.count('/')) // / found! Checking different options { if (aux.endsWith("/") ) { // We look for calls ending in slash "/" or "\" aux.remove(aux.length()-1,1); } iaux1 = aux.indexOf('/'); //qDebug() << "DataProxy_SQLite::changeSlashAndFindPrefix: Slash found at: " << QString::number(iaux1) << endl; iaux2 = (aux.length())- iaux1; // iaux2 is the length of the second part if (iaux2 < 0){ iaux2 = -iaux2; } if ( iaux1 < iaux2 ) { //Like in F/EA4TV, we can simply take the first part as the prefix aux = aux.left(iaux1); } else { aux = aux.right(iaux2 -1); } } return aux; } klog-0.9.8.1/startwizard.h0000644000175000017500000001154413532572307014346 0ustar develdevel#ifndef STARTWIZARD_H #define STARTWIZARD_H /*************************************************************************** startwizard.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include //#include #include #include #include #include #include "downloadcty.h" class FileOrMemoryPage; class CTYPage; class StartWizard : public QWizard { Q_OBJECT public: enum { Page_Intro, Page_Lic, Page_Mem, Page_CTY }; StartWizard(const QString _klogDir, const QString _softVersion, QWidget *parent = 0); void setVersion(QString tversion); //~StartWizard(); protected: private slots: void slotCancelWizard(); void slotRunInMemory(bool checked); void slotButtonFinishedClicked(); private: FileOrMemoryPage *fileOrMemoryPage; CTYPage *ctyPage; QString version; bool inMemory; QString klogDir; }; class IntroPage : public QWizardPage { Q_OBJECT public: IntroPage(QWidget *parent = 0); int nextId() const; private: QLabel *topLabel; QTextEdit *welcomeBrowser; }; class LicPage : public QWizardPage { Q_OBJECT public: LicPage(QWidget *parent = 0); void setNextButtonActive(const bool _active); int nextId() const; private: QLabel *topLabel; QTextEdit *licenseBrowser; QCheckBox *aceptLicCheckBox; }; /* class FileOrMemoryPage : public QWizardPage { Q_OBJECT public: FileOrMemoryPage(QWidget *parent = 0); int nextId() const; //int nextId() const; private slots: void slotRunningModeSelectedFile(bool checked); void slotRunningModeSelectedMemory(bool checked); signals: void exeInMemory(const bool mem); private: bool downloadCTYFile(); QLabel *topLabel; QRadioButton *memoryRadioButton; QRadioButton *fileRadioButton; bool runInMemory; }; */ class CTYPage : public QWizardPage { Q_OBJECT public: CTYPage(const QString _klogDir, const QString _version, QWidget *parent = 0); void updateProgress (qint64 v,qint64 t); private slots: /* void slotCTYCheckButtonTogled(int state); void slotDownloadCTY(bool checked); void slotDownloadFinished(); void slotValueReturnedFromDownload(int value); void slotDownloadButtonClicked(); */ void slotUpdateDownloadProgress(qint64 received, qint64 total); void slotDownloadButtonClicked(); void slotIgnoreDownloadButtonClicked(); void slotDownloadFinished(const int ret); void slotDownloadError(const int ret); signals: void downloadTheFileSignal(const bool mem); private: bool prepareTheDownload(); bool doTheDownload(); //bool isComplete(); bool downloadCTYFile, CTYFileDownloaded; int downloadValueResult; //QString klogDir; int total; //bool completed; DownLoadCTY *dl; QLabel *topLabel; QTextEdit *ctyBrowser; QCheckBox *downloadCTYCheckBox; QProgressBar *progressBar; QPushButton *downloadButton, *ignoreDownloadButton; QCheckBox *hiddenCheckBox; }; #endif // STARTWIZARD_H klog-0.9.8.1/infowidget.h0000644000175000017500000000662513532572307014133 0ustar develdevel#ifndef INFOWIDGET_H #define INFOWIDGET_H /*************************************************************************** infowidget.h - description ------------------- begin : ago 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the Info widget where the band, bearing, CQ & ITU zones.... are shown // #include #include #include "locator.h" #include "awards.h" #include "world.h" #include "dataproxy.h" #include "dataproxy_sqlite.h" class InfoWidget : public QWidget { Q_OBJECT public: InfoWidget(DataProxy *dp, QWidget *parent = 0); void createUI(); void clear(); void setCurrentLog(const int _log); void setColors (const QString _newOne, const QString _needed, const QString _worked, const QString _confirmed, const QString _default); void setImperialSystem (const bool _imp); void showInfo(const int _entity); void showDistanceAndBearing(const QString _locLocal, const QString _loc2); void showEntityInfo(const int _enti, int _cq=-1, int _itu=-1); void setLocalLocator(const QString _loc); //MAYBE NOT NEEDED void setDXLocator(const QString _loc); //MAYBE NOT NEEDED private: void clearBandLabels(); void clearInfoFromLocators(); QString getStyleColorToLabelFromBand(const QString _b, const QString _q); QLabel *bandLabel1, *bandLabel2, *bandLabel3, *bandLabel4; QLabel *bandLabel5, *bandLabel6, *bandLabel7, *bandLabel8; QLabel *bandLabel9, *bandLabel10, *bandLabel11, *bandLabel12; QLabel *continentLabel, *prefixLabel, *cqzLabel, *ituzLabel; QLabel *gradShortLabel, *distShortLabel; QLabel *gradLongLabel, *distLongLabel; QLabel *distShortLabelN; QLabel *distLongLabelN; Awards *awards; DataProxy *dataProxy; Locator *locator; World *world; int currentLog; bool imperialSystem; QString dxLocator, localLocator; }; #endif // INFOWIDGET_H klog-0.9.8.1/NEWS0000644000175000017500000000017313532572307012312 0ustar develdevelLook at http://www.klog.xyz for NEWS of KLog. You can also check the Changelog file for the latest updates in the software.klog-0.9.8.1/klog.rc0000644000175000017500000000007313532572307013074 0ustar develdevelIDI_ICON1 ICON DISCARDABLE "klog.ico" klog-0.9.8.1/awards.cpp0000644000175000017500000015074113532572307013607 0ustar develdevel#include "awards.h" /*************************************************************************** awards.cpp - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include Awards::Awards(DataProxy *dp, const QString _parentFunction) { //qDebug() << "Awards::Awards- from: " << _parentFunction << endl; dataProxy = dp; //QSqlDatabase db = QSqlDatabase::database("QSQLITE"); world = new World(dataProxy, Q_FUNC_INFO); //qDebug() << "Awards::Awards - Before DXMarathon" << endl; dxMarathon = new DXMarathon(dataProxy); //qDebug() << "Awards::Awards - After DXMarathon" << endl; util = new Utilities(); //world->create(); /* newOneColor.setNamedColor("#ff0000"); neededColor.setNamedColor("#ff8c00"); workedColor.setNamedColor("#ffd700"); confirmedColor.setNamedColor("#32cd32"); defaultColor.setNamedColor("#00bfff"); */ //"Awards::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default << endl; //Awards::setColors: "#ff0000" / "#ff8c00" / "#ffd700" / "#32cd32" / "#00bfff" newOneColor = Qt::black; neededColor = Qt::black; workedColor = Qt::black; confirmedColor = Qt::black; defaultColor = Qt::black; dxccWorked.clear(); dxccConfirmed.clear(); wazWorked.clear(); wazConfirmed.clear(); manageModes = false; //qDebug() << "Awards::Awards - END" << endl; } Awards::~Awards() {} void Awards::setAwardDXCC(const int _qsoId) { //qDebug() << "Awards::setAwardDXCC: _qsoId: " << QString::number(_qsoId) << endl; dataProxy->setDXCCAwardStatus(_qsoId); } void Awards::setAwardWAZ(const int _qsoId) { //qDebug() << "Awards::setAwardWAZ: _qsoId: " << QString::number(_qsoId) << endl; dataProxy->setWAZAwardStatus(_qsoId); } QString Awards::getQSOofAward (const int _enti, const int _bandid) {// Returns the QRZ that granted that status in the DXCC //qDebug() << "Awards::getQSOofAward: " << QString::number(_enti) << "/" << QString::number(_bandid) << endl; QSqlQuery query; QString stringQuery = QString();; bool sqlOK = false; QString answer = QString(); stringQuery = QString("SELECT call, qso_date, time_on from log where id=(SELECT qsoid from awarddxcc where dxcc='%1' and band='%2')").arg(_enti).arg(_bandid); sqlOK = query.exec(stringQuery); //qDebug() << "Awards::getQSOofAward: stringQuery: " << stringQuery << endl; if (sqlOK) { query.next(); if (query.isValid()) { answer = query.value(0).toString() + " / " + query.value(1).toString() + " / " + query.value(2).toString(); query.finish(); //qDebug() << "Awards::getQSOofAward: answer: " << answer << endl; return answer; } else { query.finish(); //qDebug() << "Awards::getQSOofAward: 0" << endl; return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //qDebug() << "Awards::getQSOofAward: Query error" << endl; return QString(); } } int Awards::getQSOIdofAward (const int _enti, const int _bandid) {// Returns the QSOid that granted that status in the DXCC //qDebug() << "Awards::getQSOIdofAward: " << QString::number(_enti) << "/" << QString::number(_bandid) << endl; QSqlQuery query; QString stringQuery = QString();; bool sqlOK = false; int answer = -1; stringQuery = QString("SELECT qsoid from awarddxcc where dxcc='%1' and band='%2'").arg(_enti).arg(_bandid); sqlOK = query.exec(stringQuery); //qDebug() << "Awards::getQSOIdofAward: stringQuery: " << stringQuery << endl; if (sqlOK) { query.next(); if (query.isValid()) { answer = query.value(0).toInt(); //qDebug() << "Awards::getQSOIdofAward: answer: " << QString::number(answer) << endl; query.finish(); if (answer>=1) { return answer; } else { return -1; } } else { query.finish(); //qDebug() << "Awards::getQSOIdofAward: 0" << endl; return -2; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //qDebug() << "Awards::getQSOIdofAward: Query error" << endl; return -3; } } int Awards::getDXCCWorked(const int _logNumber) { //qDebug() << "Awards::getDXCCWorked (logNumber): " << QString::number(_logNumber) << endl; QSqlQuery query; QString stringQuery; bool sqlOK; stringQuery = QString("SELECT COUNT (DISTINCT dxcc) FROM log where lognumber='%1'").arg(_logNumber); sqlOK = query.exec(stringQuery); //qDebug() << "Awards::getDXCCWorked: stringQuery: " << stringQuery << endl; if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); //qDebug() << "Awards::getDXCCWorked: " << QString::number((query.value(0)).toInt()) << endl; return v; } else { //qDebug() << "Awards::getDXCCWorked: 0" << endl; return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //qDebug() << "Awards::getDXCCWorked: Query error" << endl; return 0; } } int Awards::getDXCCConfirmed(const int _logNumber) { //qDebug() << "Awards::getDXCCConfirmed (logNumber): " << QString::number(_logNumber) << endl; QSqlQuery query; QString stringQuery; bool sqlOK; stringQuery = QString("SELECT COUNT (DISTINCT dxcc) FROM log where qsl_rcvd='Y' AND lognumber='%1'").arg(_logNumber); sqlOK = query.exec(stringQuery); //qDebug() << "Awards::getDXCCWorked: stringQuery: " << stringQuery << endl; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "Awards::getDXCCConfirmed: " << QString::number((query.value(0)).toInt()) << endl; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "Awards::getDXCCConfirmed: 0" << endl; return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //qDebug() << "Awards::getDXCCConfirmed: query error" << endl; return 0; } } int Awards::getWAZWorked(const int _logNumber) { //qDebug() << "Awards::getWAZWorked (logNumber): " << QString::number(_logNumber) << endl; QSqlQuery query; QString stringQuery; //stringQuery = QString("SELECT count (cqz) FROM (SELECT DISTINCT cqz FROM log WHERE cqz!='' AND qsl_rcvd='Y' AND lognumber='%1')").arg(_logNumber); stringQuery = QString("SELECT count (cqz) FROM (SELECT DISTINCT cqz FROM log WHERE cqz!='' AND lognumber='%1')").arg(_logNumber); //stringQuery = QString("SELECT count (cqz) from (SELECT DISTINCT cqz FROM awardwaz WHERE lognumber='%1' AND cqz <> '')").arg(_logNumber); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return 0; } } int Awards::getWAZConfirmed(const int _logNumber) { //qDebug() << "Awards::getWAZConfirmed (logNumber): " << QString::number(_logNumber) << endl; QSqlQuery query; QString stringQuery; //Usar la siguiente para el confirmed stringQuery = QString("SELECT count (cqz) FROM (SELECT DISTINCT cqz FROM log WHERE cqz!='' AND qsl_rcvd='Y' AND lognumber='%1')").arg(_logNumber); //stringQuery = QString("SELECT COUNT (cqz) FROM (SELECT DISTINCT cqz FROM awardwaz WHERE lognumber='%1' AND confirmed='1' AND cqz <> '')").arg(_logNumber); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { int v =(query.value(0)).toInt(); query.finish(); return v; } else { return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return 0; } } bool Awards::isThisSpotConfirmed(const QStringList _qs) { if (getDXStatus(_qs) == 13) { return true; } else { return false; } } int Awards::getDXStatus (const QStringList _qs) { //qDebug() << "Awards::getDXStatus: Entity: " << _qs.at(0) << "/ Band: " << _qs.at(1) << "/ Mode: " << _qs.at(2) << "/ Log: " << _qs.at(3) << endl; // Receives: QStringList _qs; //_qs << Entity << BandId << << ModeId << lognumber; /* Not mode -1 - Error. - ERROR - ERROR 0 - New one - New One - New One - 0 1 - Worked but not in this band nor this mode - Needed One - Needed One - 1 2 - Worked in this band, not this mode - Needed One - Worked One - 3 3 - Worked in this band and in this mode - Worked One - Worked One - 3 4 - Worked in this mode, not this band - Needed One - Needed One - 1 5 - Confirmed in another band/mode but not worked in this band nor this mode - Needed One - Needed One - 1 6 - Confirmed in another band/mode but just worked in this band and not in this mode - Needed One - Worked One - 3 7 - Confirmed in another band/mode but just worked in this mode and not in this band - Needed One - Needed One - 1 8 - Confirmed in another band/mode but just worked in this band and mode - Worked One - Worked One - 3 9 - Confirmed in this mode, but not worked this band - Needed One - Needed One - 1 10 - Confirmed in this mode, but worked this band - Worked One - Worked One - 3 11 - Confirmed in this band but not worked in this mode - Needed One - Confirmed One - 13 12 - Confirmed in this band but worked in this mode - Worked One - Confirmed One - 13 13 - Confirmed in this band and mode - Confirmed One - Confirmed One - 13 */ /* 0 - New One - Never worked before - RED 1 - Needed - New one in this band - ORANGE 2 - Worked - Worked in this band but not confirmed - YELLOW 3 - Confirmed - Confirmed in this band - GREEN */ if (_qs.length() != 4 ) { //qDebug() << "Awards::getDXStatus: Length != 4, return -1" << endl; return -1; } //int errorCode = 0; int _band = _qs.at(1).toInt(); int _mode = _qs.at(2).toInt(); int _logNumber = _qs.at(3).toInt(); int dxccEntity = (_qs.at(0)).toInt(); //int dxccEntity = world->getQRZARRLId(_qs.at(0) ); //qDebug() << "Awards::getDXStatus: dxccEntity: " << QString::number(dxccEntity) << endl; if (dxccEntity<=0) { //qDebug() << "Awards::getDXStatus: dxccEntity <= 0, return -1" << endl; return -1; } bool checkingMode = true; if ( (_mode==-1) || (manageModes==false)) { checkingMode = false; //qDebug() << "Awards::getDXStatus: checkingMode = FALSE" << endl; } // dxccStatusMode(const int _ent, const int _mode, const int _logNumber) //-1 error / 0 Not worked / 1 worked / 2 confirmed int wb = dxccStatusBand(dxccEntity, _band, _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed int wm = -1; if (checkingMode) { wm = dxccStatusMode(dxccEntity, _mode, _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed } // int wm = dxccStatusMode(dxccEntity, _mode, _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed if (wm==-1) { checkingMode = false; } //qDebug() << "Awards::getDXStatus: wb=" << QString::number(wb) << " - wm=" << QString::number(wm) << endl; //qDebug() << "Awards::getDXStatus: dxccStatus: " << QString::number(dxccStatus(dxccEntity, _logNumber)) << endl; switch(dxccStatus(dxccEntity, _logNumber)) { case 0: //qDebug() << "Awards::getDXStatus: return 0" << endl; return 0; // ATNO break; case 1: // Worked, not confirmed switch (wb) { case 0: // Not worked in this band but in another band if (checkingMode) { if (wm==1) { //qDebug() << "Awards::getDXStatus: return 4" << endl; return 4; } else { //qDebug() << "Awards::getDXStatus: return 1" << endl; return 1; } } else { //qDebug() << "Awards::getDXStatus: return 4 nc" << endl; return 4; } break; case 1: // Worked in this band if (checkingMode) { if (wm==1) { //qDebug() << "Awards::getDXStatus: return 3" << endl; return 3; } else { //qDebug() << "Awards::getDXStatus: return 2" << endl; return 2; } } else { //qDebug() << "Awards::getDXStatus: return 3 nc" << endl; return 3; } break; default: // ERROR //qDebug() << "Awards::getDXStatus: default return -1 - 1" << endl; return -1; break; } break; case 2: // Confirmed if (wb==2) { if (checkingMode) { if (wm==2) { //qDebug() << "Awards::getDXStatus: return 13" << endl; return 13; } else if (wm==1) { //qDebug() << "Awards::getDXStatus: return 12" << endl; return 12; } else { //qDebug() << "Awards::getDXStatus: return 11" << endl; return 11; } } else { //qDebug() << "Awards::getDXStatus: return 13 nc" << endl; return 13; } } else if ((wb ==1) || (wb == 0)) { if (checkingMode) { if (wb==1) { if (wm==1) { //qDebug() << "Awards::getDXStatus: return 8" << endl; return 8; } else { //qDebug() << "Awards::getDXStatus: return 6" << endl; return 6; } } else { if (wm==1) { //qDebug() << "Awards::getDXStatus: return 7" << endl; return 7; } else { //qDebug() << "Awards::getDXStatus: return 5" << endl; return 5; } } } else { if (wb==0) { //qDebug() << "Awards::getDXStatus: return 7 nc" << endl; return 7; } else { //qDebug() << "Awards::getDXStatus: return 8 nc" << endl; return 8; } } } else { //qDebug() << "Awards::getDXStatus: return -1 - 2" << endl; return -1; } break; default: //qDebug() << "Awards::getDXStatus: return -1 default2" << endl; return -1; break; } // END OF SWITCH //qDebug() << "Awards::getDXStatus: END, return -1" << endl; return -1; } int Awards::dxccStatusBandMode(const int _ent, const int _band, const int _mode, const int _logNumber, bool _checkingMode) {//-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusBandMode: " << QString::number(_ent) << "/" << QString::number(_band) << "/" << QString::number(_mode) << endl; QSqlQuery query = QSqlQuery(); QString queryString = QString(); if (_checkingMode) { //qDebug() << "Awards::dxccStatusBandMode: Checking Mode TRUE" << endl; queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND band='%2' AND mode='%3' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_mode)).arg(QString::number(_logNumber)); } else { //qDebug() << "Awards::dxccStatusBandMode: Checking Mode FALSE" << endl; queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND band='%2' AND lognumber='%3' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_logNumber)); } int status = 0; if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if(query.value(0).toString() == "1") { //qDebug() << "Awards::dxccStatusBandMode: return - 2" << endl; query.finish(); return 2; } else if(query.value(0).toString() == "0") { //qDebug() << "Awards::dxccStatusBandMode: return - 1" << endl; if (status < 1) { status = 1; } } } } query.finish(); } else { // The query fails... //qDebug() << "Awards::dxccStatusBandMode: return - -1" << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatusBandMode: return - 0-4" << endl; return status; } int Awards::dxccStatus(const int _ent, const int _logNumber) {//-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatus: " << QString::number(_ent) << endl; QSqlQuery query = QSqlQuery(); QString queryString = QString(); int worked = 0; queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND lognumber='%2' ").arg(QString::number(_ent)).arg(QString::number(_logNumber)); if (query.exec(queryString)) { //qDebug() << "Awards::dxccStatus: query exec OK: " << query.lastQuery() << endl; while (query.next()) { //qDebug() << "Awards::dxccStatus: query VALUE: " << (query.value(0)).toString() << endl; if ( query.isValid() ) { //qDebug() << "Awards::dxccStatus: query valid OK" << endl; if((query.value(0)).toString() == "1") { //qDebug() << "Awards::dxccStatus: value = 1 - return 2" << endl; query.finish(); return 2; } else if((query.value(0)).toString() == "0") { //qDebug() << "Awards::dxccStatus: value = 0 - worked 1" << endl; if (worked <1) { worked = 1; } } } } //qDebug() << "Awards::dxccStatus: return "<< QString::number(worked) << endl; query.finish(); //qDebug() << "Awards::dxccStatus: END: " << QString::number(worked) << endl; return worked; } else { // The query fails... //qDebug() << "Awards::dxccStatus: return -1" << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatus: return 0" << endl; return worked; } QColor Awards::getQRZDXStatusColor(const QStringList _qs) { //qs << Entity << spotBand << "-1" << QString::number(currentLog) ; //qDebug() << "Awards::getQRZDXStatusColor qs.length: " << QString::number(_qs.length()) << endl; //From Search QSO to QSL: q << _call << bandid << _mode << QString::number(currentLog); //qDebug() << "Awards::getQRZDXStatusColor: " << _qs.at(0) << "/" << _qs.at(1) << "/" << _qs.at(2) << _qs.at(3) << endl; // Receives: QStringList _qs; //_qs << Entity << BandID << ModeId << lognumber; /* 0 - New One 1 - Needed 2 - Worked 3 - Confirmed */ QColor returnedColor; int status = getDXStatus(_qs); //qDebug() << "Awards::getQRZDXStatusColor: status: " << QString::number(status) << "/" << getDXStatusString(status) << endl; //qDebug() << "Awards::getQRZDXStatusColor: status: " << QString::number(status) << endl; switch (status) { case 0: returnedColor = newOneColor; break; case 1: returnedColor = neededColor; break; case 2: returnedColor = neededColor; break; case 3: returnedColor = workedColor; break; case 4: returnedColor = neededColor; break; case 5: returnedColor = neededColor; break; case 6: returnedColor = neededColor; break; case 7: returnedColor = neededColor; break; case 8: returnedColor = workedColor; break; case 9: returnedColor = neededColor; break; case 10: returnedColor = workedColor; break; case 11: returnedColor = neededColor; break; case 12: returnedColor = workedColor; break; case 13: returnedColor = confirmedColor; break; break; default: returnedColor = defaultColor; break; } return returnedColor; } QString Awards::getDXStatusString (const int _status) { //qDebug() << "Awards::getDXStatusString: " << QString::number(_status) << endl; QString message = QString(); switch (_status) { case 0: message = QObject::tr("New One, work it!"); //message = QObject::tr("0-new One"); break; case 1: message = QObject::tr("Needed, work it!"); //message = QObject::tr("1-Needed, work it!"); break; case 2: message = QObject::tr("Needed, work it!"); break; case 3: message = QObject::tr("Worked but not confirmed"); break; case 4: message = QObject::tr("Needed, work it!"); break; case 5: message = QObject::tr("Needed, work it!"); break; case 6: message = QObject::tr("Needed, work it!"); break; case 7: message = QObject::tr("Needed, work it!"); break; case 8: message = QObject::tr("Worked but not confirmed"); break; case 9: message = QObject::tr("Needed, work it!"); break; case 10: message = QObject::tr("Worked but not confirmed"); break; case 11: message = QObject::tr("Needed, work it!"); break; case 12: message = QObject::tr("Worked but not confirmed"); break; case 13: message = QObject::tr("Confirmed"); break; break; default: message = QObject::tr("Not identified"); break; } return message; } QString Awards::getDXCCStatusBand(const int _dxcc, const int _band, const int _logNumber) { // Returns -, W or C (Not worked, worked, Confirmed) //qDebug() << "Awards::getDXCCStatusBand: log received: " << QString::number(_logNumber) << endl; QString stringQuery; if (_logNumber<0) { stringQuery = QString("SELECT confirmed from awarddxcc WHERE dxcc='%1' AND band='%2'").arg(_dxcc).arg(_band); } else { stringQuery = QString("SELECT confirmed from awarddxcc WHERE dxcc='%1' AND band='%2' AND lognumber='%3'").arg(_dxcc).arg(_band).arg(_logNumber); } QString status = "-"; QSqlQuery query; bool sqlOk = query.exec(stringQuery); if (sqlOk) { while (query.next()) { if (query.isValid()) { if ((query.value(0)).toString() == "1") { query.finish(); return "C"; } else if ((query.value(0)).toString() == "0") { if (status == "-") { status = "W"; } } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return "-"; } query.finish(); return status; } QString Awards::checkIfValidIOTA(const QString _tiota) { /********************************** IOTA should be always with this format: CC-NNN being: - CC the shortname of the continent - NNN Number of the reference. NNN has ALWAYS to include THREE(3) characters. ADIF Specs says: CC is the continent designator {NA, SA, EU , AF, OC, AS, AN} XXX is the island designator, where 0 <= XXX ,<= 999 [use leading zeroes] Returns a valid format IOTA if possible and "" in other cases. ************************************/ //qDebug() << "Awards::checkIfValidIOTA: " << _tiota << endl; //bool _valid = false; QString _continent; QString _number; if (_tiota.count("-") == 1) { QStringList _values = _tiota.split("-", QString::SkipEmptyParts); _continent = _values.at(0); _number = _values.at(1); } else { return ""; } //qDebug() << "Awards::checkIfValidIOTA (cont) " << _continent << endl; //qDebug() << "Awards::checkIfValidIOTA (numb): " << _number << endl; // Check if continent is valid if (dataProxy->isValidContinentShortName(_continent)) { if ( (_number.toInt() >0 ) && ((_number.toInt()) < 1000 )) { if ((_number.length()) == 3) { return _continent + "-" + _number ; } else if ((_number.length()) == 2) { return _continent + "-0" + QString::number((_number).toInt()); } else if ((_number.length()) == 1) { return _continent + "-00" + QString::number((_number).toInt()); } else { return ""; } } else { return ""; } } else { return QString(); } return QString(); /* QString stringQuery = QString("SELECT id FROM continent WHERE shortname ='%1'").arg(_continent); QSqlQuery query; query.exec(stringQuery); while (query.next()) { if (query.isValid()) { _valid = true; if ( (_number.toInt() >0 ) && ((_number.toInt()) < 1000 )) { if ((_number.length()) == 3) { return _continent + "-" + _number ; } else if ((_number.length()) == 2) { return _continent + "-0" + QString::number((_number).toInt()); } else if ((_number.length()) == 1) { return _continent + "-00" + QString::number((_number).toInt()); } else { return ""; } } else { return ""; } } } return ""; */ } void Awards::setColors (const QString _newOne, const QString _needed, const QString _worked, const QString _confirmed, const QString _default) //void Awards::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default) { //qDebug() << "Awards::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default << endl; defaultColor = QColor(_default.toUpper()); neededColor = QColor(_needed.toUpper()); workedColor = QColor(_worked.toUpper()); confirmedColor = QColor(_confirmed.toUpper()); newOneColor = QColor(_newOne.toUpper()); if (defaultColor.isValid()) { defaultColor.setNamedColor(_default.toUpper()); } else { } if (neededColor.isValid()) { neededColor.setNamedColor(_needed.toUpper()); } else { } if (confirmedColor.isValid()) { confirmedColor.setNamedColor(_confirmed.toUpper()); } else { } if (newOneColor.isValid()) { newOneColor.setNamedColor(_newOne.toUpper()); } else { } if (workedColor.isValid()) { workedColor.setNamedColor(_worked.toUpper()); } else { //qDebug() << "Awards::setColors: Worked NOT VALID" << endl; } } QColor Awards::getDefaultColor() { return defaultColor; } void Awards::recalculateAwards() { /* TODO: I need to optimize this function. The select & insert of setAwardDXCC are too slow) Should go in a transaction */ //qDebug() << "Awards::recalculateAwards" << endl; dataProxy->updateAwardDXCC(); emit awardDXCCUpdated(); dataProxy->updateAwardWAZ(); //qDebug() << "Awards::recalculateAwards - END" << endl; } int Awards::getQSOsInLog(const int _logNumber) { //qDebug() << "Awards::getQSOsInLog: " << QString::number(_logNumber) << endl; QSqlQuery query; QString queryString; int v; queryString = QString("SELECT COUNT (id) FROM log WHERE lognumber='%1'").arg(_logNumber) ; if( !query.exec(queryString) ) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1; } else { query.next(); if (query.isValid()) { v = query.value(0).toInt(); query.finish(); return v; } else { query.finish(); return -2; } } } /* void Awards::setAwards(const int _dxcc, const int _waz, const int _band, const int _mode, const int _workedOrConfirmed, const int _logNumber, const int _qsoId) { //qDebug() << "Awards::setAwards: " << QString::number(_dxcc) << endl; //_workedOrConfirmed = -1 Remove this pair //_workedOrConfirmed = 0 Set as Worked //_workedOrConfirmed = 1 Set as Confirmed int d = _dxcc; int b = _band; int m = _mode; int w = _workedOrConfirmed; int l = _logNumber; int i = _qsoId; int z = _waz; setAwardDXCC(d, b, m, w, l, i); setAwardWAZ(z, b, m, w, l, i); //setAwardWAZ(_waz, _band, _mode, _workedOrConfirmed, _logNumber); } */ void Awards::setAwards(const int _qsoId) { //qDebug() << "Awards::setAwards: _qsoId: " << QString::number(_qsoId) << endl; dataProxy->setDXCCAwardStatus(_qsoId); dataProxy->setWAZAwardStatus(_qsoId); } /* int Awards::setAwardDXCCst(const int _dxcc, const int _band, const int _mode, const bool _confirmed, const int _logNumber, const int _qsoId) { //qDebug() << "Awards::setAwardDXCCst-0: " << QString::number(_dxcc) << "/" << QString::number(_band) << "/" << QString::number(_mode) << "/" << QString::number(_logNumber) << "/" << QString::number(_qsoId) << endl; int nameCol=-1; QString _refid = QString(); // _confirmedQSO == false QSO is just worked // _confirmedQSO == true QSO is confirmed //TODO: Fix the way we check for data validity for this function if (!( (_dxcc>=0) && (_band >=0) && (_mode>=0) && (_logNumber>=0) && (_qsoId >=0) )) { //qDebug() << "Awards::setAwardDXCCst: Not valid data received!" << endl; return -1; } int _iconfirmed; if (_confirmed) { _iconfirmed = 1; } else { _iconfirmed = 0; } //qDebug() << "Awards::setAwardDXCCst: _qsoId: " << QString::number(_qsoId) << "/" << QString::number(_iconfirmed) << endl; QString stringQuery = QString(); QSqlQuery query; bool sqlOK = false; int errorCode = -1; stringQuery = QString("SELECT id, confirmed FROM awarddxcc where dxcc='%1' AND band='%2' AND mode='%3' AND lognumber='%4'").arg(_dxcc).arg(_band).arg(_mode).arg(_logNumber); sqlOK = query.exec(stringQuery); if (sqlOK) { //qDebug() << "Awards::setAwardDXCCst-1:" << endl; query.next(); QSqlRecord rec = query.record(); if (query.isValid()) {// We have some data, we need to UPDATE - We are only confirming! //qDebug() << "Awards::setAwardDXCCst: We have some data, we neer to update" << endl; nameCol = rec.indexOf("id"); _refid = query.value(nameCol).toString(); stringQuery = QString("UPDATE awarddxcc SET confirmed='1', qsoid='%1' WHERE id='%2'").arg(_qsoId).arg(_refid); //qDebug() << "Awards::setAwardDXCCst: (UPDATE): " << stringQuery << endl; if (sqlOK) { // Set of data updated //qDebug() << "Awards::setAwardDXCCst: Data updated!" << endl; query.finish(); return 1; } else { // Something failed. Trace it! errorCode = query.lastError().number(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1; } } else { // We don't have this set, we need to INSERT stringQuery = QString("INSERT INTO awarddxcc (dxcc, band, mode, confirmed, lognumber, qsoid) values('%1','%2','%3','%4','%5','%6')").arg(_dxcc).arg(_band).arg(_mode).arg(_iconfirmed).arg(_logNumber).arg(_qsoId); sqlOK = query.exec(stringQuery); //qDebug() << "Awards::setAwardDXCCst: We don't have data... so we INSERT" << endl; //qDebug() << "Awards::setAwardDXCCst: (INSERT): " << stringQuery << endl; if (sqlOK) { // Set of data included query.finish(); //qDebug() << "Awards::setAwardDXCCst: Data inserted!" << endl; } else { // Something failed. Trace it! emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); errorCode = query.lastError().number(); query.finish(); return -1; } } } else { // Trace the error... what may be happening??? emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); errorCode = query.lastError().number(); query.finish(); return -1; } return -1; } */ /* int Awards::setAwardWAZst(const int _cqz, const int _band, const int _mode, const bool _confirmed, const int _logNumber, const int _qsoId) { //qDebug() << "Awards::setAwardWAZst(CQZ/BAND/MODE/WORKED/log/qsoid): " << QString::number(_cqz) << "/" << QString::number(_band) << "/" << QString::number(_mode) << "/" << QString::number(_logNumber) << "/" << QString::number(_qsoId) << endl; // _confirmed == false QSO is just worked // _confirmed == true QSO is confirmed //TODO: Fix the way we check for data validity for this function if (!( (_cqz>=0) && (_band >=0) && (_mode>=0) && (_logNumber>=0) && (_qsoId >=0) )) { //qDebug() << "Awards::setAwardWAZst: some data was NOK" << endl; return -1; } int _iconfirmed; if (_confirmed) { _iconfirmed = 1; } else { _iconfirmed = 0; } QString stringQuery; QSqlQuery query; bool sqlOK; //int errorCode = -1; stringQuery = QString("INSERT INTO awardwaz (cqz, band, mode, confirmed, lognumber, qsoid) values('%1','%2','%3','%4','%5','%6')").arg(_cqz).arg(_band).arg(_mode).arg(_iconfirmed).arg(_logNumber).arg(_qsoId); sqlOK = query.exec(stringQuery); if ((sqlOK) && (!_confirmed)) // First time a DXCC/Band/mode is worked { //qDebug() << "Awards::setAwardWAZst: _qsoId: " << QString::number(_qsoId) << "- 1" << endl; query.finish(); return 1; } else if ((sqlOK) && (_confirmed)) // First time a CQZ/Band/Mode is confirmed { //qDebug() << "Awards::setAwardWAZst: _qsoId: " << QString::number(_qsoId) << "- 2" << endl; query.finish(); return 2; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "Awards::setAwardWAZst: _qsoId: " << QString::number(_qsoId) << "- sqlOK ERROR: " << endl; //errorCode = query.lastError().number(); query.finish(); //qDebug() << "Awards::setAwardWAZst: LastQuery: " << query.lastQuery() << endl; //qDebug() << "Awards::setAwardWAZst: LastError-data: " << query.lastError().databaseText() << endl; //qDebug() << "Awards::setAwardWAZst: LastError-driver: " << query.lastError().driverText() << endl; //qDebug() << "Awards::setAwardWAZst: LastError-n: " << QString::number(query.lastError().number() ) << endl; } return -1; } */ /* int Awards::setAwardDXCCConfirmed(const int _band, const int _mode, const int _dxcc, const int _newQSOid) // Changes the status of a DXCC from worked to confirmed { //qDebug() << "Awards::setAwardDXCCConfirmed: " << QString::number(_band) << "/" << QString::number(_mode) << "/" << QString::number(_dxcc)<< "/" << QString::number(_newQSOid)<< endl; QString stringQuery; QSqlQuery query = QSqlQuery(); bool sqlOK = false; int errorCode = -1; int nameCol = -1; QString aux = QString(); stringQuery = QString("SELECT qsoid FROM awarddxcc WHERE band='%1' AND mode='%2' AND dxcc='%3'").arg(_band).arg(_mode).arg(_dxcc); sqlOK = query.exec(stringQuery); if (sqlOK) { QSqlRecord rec = query.record(); if (query.next()) { if (query.isValid()) { nameCol = rec.indexOf("qsoid"); aux = (query.value(nameCol)).toString(); query.finish(); stringQuery = QString("UPDATE awarddxcc SET confirmed='1', qsoid='%1' WHERE qsoid='%2'").arg(_newQSOid).arg(aux); sqlOK = query.exec(stringQuery); if (sqlOK) { query.finish(); return _newQSOid; } else { // UPDATE failed emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); errorCode = query.lastError().number(); query.finish(); //qDebug() << "Awards::setAwardDXCCConfirmed-Update: LastQuery: " << query.lastQuery() << endl; //qDebug() << "Awards::setAwardDXCCConfirmed-Update: LastError-data: " << query.lastError().databaseText() << endl; //qDebug() << "Awards::setAwardDXCCConfirmed-Update: LastError-driver: " << query.lastError().driverText() << endl; //qDebug() << "Awards::setAwardDXCCConfirmed-Update: LastError-n: " << QString::number(query.lastError().number() ) << endl; return errorCode; } } else { // Not valid record //qDebug() << "Awards::setAwardDXCCConfirmed: Not valid record" << endl; return -3; } } else { // Not next record //qDebug() << "Awards::setAwardDXCCConfirmed: Not next record" << endl; return -2; } } else { // emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); errorCode = query.lastError().number(); query.finish(); //qDebug() << "Awards::setAwardDXCCConfirmed: LastQuery: " << query.lastQuery() << endl; //qDebug() << "Awards::setAwardDXCCConfirmed: LastError-data: " << query.lastError().databaseText() << endl; //qDebug() << "Awards::setAwardDXCCConfirmed: LastError-driver: " << query.lastError().driverText() << endl; //qDebug() << "Awards::setAwardDXCCConfirmed: LastError-n: " << QString::number(query.lastError().number() ) << endl; return errorCode; } return 1; } */ int Awards::setDXCCToQSO(const int _dxcc, const int _qsoid) // Defines the DXCC in a QSO { //qDebug() << "Awards::setDXCCToQSO: " << QString::number(_dxcc) << "/" << QString::number(_qsoid) << endl; int errorCode = -1; QString queryString = QString("UPDATE log SET dxcc='%1' WHERE id='%2'").arg(_dxcc).arg(_qsoid); QSqlQuery query = QSqlQuery(); bool sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); return 1; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "Awards::setDXCCToQSO: DXCC Updated in Log but failed...." << endl; errorCode = query.lastError().number(); query.finish(); //qDebug() << "Awards::setDXCCToQSO: LastQuery: " << query.lastQuery() << endl; //qDebug() << "Awards::setDXCCToQSO: LastError-data: " << query.lastError().databaseText() << endl; //qDebug() << "Awards::setDXCCToQSO: LastError-driver: " << query.lastError().driverText() << endl; //qDebug() << "Awards::setDXCCToQSO: LastError-n: " << QString::number(query.lastError().number() ) << endl; return errorCode; } } int Awards::setCQToQSO(const int _cqz, const int _qsoid) // Defines the CQ in a QSO { //qDebug() << "Awards::setCQToQSO: " << QString::number(_cqz) << "/" << QString::number(_qsoid) << endl; int errorCode = -1; QString queryString = QString("UPDATE log SET cqz='%1' WHERE id='%2'").arg(_cqz).arg(_qsoid); QSqlQuery query = QSqlQuery(); bool sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); return 1; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "Awards::setCQToQSO: DXCC Updated in Log but failed...." << endl; errorCode = query.lastError().number(); query.finish(); //qDebug() << "Awards::setCQToQSO: LastQuery: " << query.lastQuery() << endl; //qDebug() << "Awards::setCQToQSO: LastError-data: " << query.lastError().databaseText() << endl; //qDebug() << "Awards::setCQToQSO: LastError-driver: " << query.lastError().driverText() << endl; //qDebug() << "Awards::setCQToQSO: LastError-n: " << QString::number(query.lastError().number() ) << endl; return errorCode; } } bool Awards::getIsDXCCConfirmed(const int _dxcc, const int _logNumber) { // isDXCCConfirmed(const int _dxcc, const int _currentLog); return dataProxy->isDXCCConfirmed(_dxcc, _logNumber); } int Awards::getDXMarathonQSO(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonQSO: " << QString::number(_year) << endl; return dxMarathon->getDXMarathonQSO(_year, _logNumber); } int Awards::getDXMarathonDXCC(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonDXCC: " << QString::number(_year) << endl; return dxMarathon->getDXMarathonDXCC(_year, _logNumber); } int Awards::getDXMarathonCQ(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonCQ: " << QString::number(_year) << endl; return dxMarathon->getDXMarathonCQ(_year, _logNumber); } int Awards::getDXMarathonScore(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonScore: " << QString::number(_year) << endl; return dxMarathon->getDXMarathonScore(_year, _logNumber); } bool Awards::isDXMarathonNeed(const int _dxcc, const int _cq, const int _year, const int _logNumber) { return dxMarathon->neededForDXMarathon(_dxcc, _cq, _year, _logNumber); } int Awards::dxccStatusBand(const int _ent, const int _band, const int _logNumber) //-1 error / 0 Not worked / 1 worked / 2 confirmed { //-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusBand: " << QString::number(_ent) << "/" << QString::number(_band) << endl; QSqlQuery query = QSqlQuery(); QString queryString = QString(); queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND band='%2' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_logNumber)); int status = 0; if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if(query.value(0).toString() == "1") // Confirmed { query.finish(); return 2; } else if(query.value(0).toString() == "0") // Worked { if (status < 1) { status = 1; } } } // Not present => Not worked } query.finish(); } else { //TODO: Manage the query error emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatusBand: return - 0.3" << endl; return status; // if arrives to here decision => not worked } int Awards::dxccStatusMode(const int _ent, const int _mode, const int _logNumber) //-1 error / 0 Not worked / 1 worked / 2 confirmed { //-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusMode: " << QString::number(_ent) << "/" << QString::number(_mode) << endl; QSqlQuery query = QSqlQuery(); QString queryString = QString(); if (_mode == -1) { return -1; } int status = 0; queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND mode='%2' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_mode)).arg(QString::number(_logNumber)); if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if(query.value(0).toString() == "1") // Confirmed { query.finish(); return 2; } else if(query.value(0).toString() == "0") // Worked { if (status < 1) { status = 1; } } } // Not present => Not worked } query.finish(); } else { // The query fails... emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //TODO: Manage the query error return -1; } return status; // if arrives to here decision => not worked } void Awards::setManageModes(const bool _manageModes) { manageModes = _manageModes; } klog-0.9.8.1/setuppagecolors.h0000644000175000017500000000641013532572307015203 0ustar develdevel#ifndef SETUPPAGECOLORS_H #define SETUPPAGECOLORS_H /*************************************************************************** setuppagecolors.h - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include //#include #include class SetupPageColors : public QWidget { Q_OBJECT public: SetupPageColors(QWidget *parent=0); ~SetupPageColors(); QString getNewOneColor(); QString getNeededColor(); QString getWorkedColor(); QString getConfirmedColor(); QString getDefaultColor(); void setNewOneColor(const QString c); void setNeededColor(const QString c); void setWorkedColor(const QString c); void setConfirmedColor(const QString c); void setDefaultColor(const QString c); private slots: void slotNewOneColorButtonClicked(); void slotConfirmedColorButtonClicked(); void slotWorkedColorButtonClicked(); void slotNeededColorButtonClicked(); void slotDefaultColorButtonClicked(); private: QColor giveColor (QColor c); QPalette palette; QPushButton *newOneColorButton; // In ANY band QPushButton *neededColorButton; // In this band QPushButton *workedColorButton; // In this band QPushButton *confirmedColorButton; // In this band QPushButton *defaultColorButton; // In this band QColor color; /* 0 - New one. 1 - Worked but not confirmed: New one in this band. 2 - Worked but not confirmed: Worked in this band. 3 - Confirmed: New one in this band. 4 - Confirmed: Worked in this band. 5 - Confirmed: Confirmed in this band. */ }; #endif // SETUPPAGECOLORS_H klog-0.9.8.1/hamlibclass.h0000644000175000017500000000525713532572307014256 0ustar develdevel#ifndef HAMLIBCLASS_H #define HAMLIBCLASS_H #include #include #include #include #include #include #include #include #include class HamLibClass : public QObject { Q_OBJECT public: explicit HamLibClass(QObject *parent = nullptr); ~HamLibClass(); QStringList getRigList (); int getModelIdFromName (const QString _name); QString getNameFromModelId(const int _id); void setModelId(const int _id); void setPort(const QString _port); void setPool(const int _milsecs); void setData(const QString _data); void setStop(const QString _stop); void setFlow(const QString _flow); void setParity(const QString _parity); void setSpeed(const QString _speed); void setRTS(const QString _state); void setDTR(const QString _state); void setFreq(const double _fr); void setMode(const QString _m); // bool isModeExisting(const QString _m); void init(bool _active); void stop(); bool isRunning(); void clean(); void checkErrorCountAndStop(); //bool openSerialPort(); //bool closeSerialPort(); signals: void freqChanged(double newFreq); void modeChanged(QString newFreq); public slots: void slotTimer(); private: static int addRigToList(const struct rig_caps* caps, void* data); QString hamlibMode2Mode(rmode_t _rmode); rmode_t mode2HamlibMode(const QString _m); QStringList strings; QTimer *timer; QMap rigName2RigId; QMap rigId2RigName; RIG *my_rig; // handle to rig (instance) freq_t freq, freq_old; // Radio freq rmode_t rmode, mode_old; // Radio mode serial_parity_e sparity; serial_handshake_e shandshake; serial_control_state_e srts, sdtr; int retcode; // generic return code from functions rig_model_t myrig_model; // Integer radio model //hamlib_port_t myport; // Hamlib port pbwidth_t width; vfo_t vfo; /* vfo selection */ int strength; /* S-Meter level */ int bauds; // default 9600 int dataBits; // default 8 int stopBits; // default 1 QString flowControl; // default QSerialPort::NoFLowControl QString parity; // default QSerialPort::NoParity QString serialPort; int pollInterval; // Pool interval in mSecs int errorCount; // Number of times that the rig has returned an error since last time OK. bool rigLaunched; //QSerialPort *m_serial; }; #endif // HAMLIBCLASS_H klog-0.9.8.1/setuppageworldeditor.h0000644000175000017500000000615513532572307016246 0ustar develdevel#ifndef SETUPPAGEWORLDEDITOR_H #define SETUPPAGEWORLDEDITOR_H /*************************************************************************** setuppageworldeditor.h - description ------------------- begin : jun 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include "world.h" #include "dataproxy.h" #include "setupentitydialog.h" #include "utilities.h" enum { WORLD_DXCCid = 0, WORLD_Nameid = 1, WORLD_MainPrefix = 2, WORLD_CQZ = 3, WORLD_ITUZ = 4, WORLD_Cont = 5 }; class SetupPageWorldEditor : public QWidget { Q_OBJECT public: SetupPageWorldEditor(DataProxy *dp, QWidget *parent=0); ~SetupPageWorldEditor(); private slots: void slotAddButtonClicked(); void slotDelButtonClicked(); void slotEditButtonClicked(); void slotDoubleClickEntity( const QModelIndex & index); void slotAnalyzeEntityAddedSignal(const QStringList _qs); void slotImportWorldButtonClicked(); private: World *world; Utilities *util; DataProxy *dataProxy; void createWorldPanel(); void createWorldModel(); void createActions(); bool isWorldEmpty(); QSqlRelationalTableModel *worldModel; QWidget *worldPanel; QTableView *worldView; QTreeWidget *searchResultsTreeWidget; QPushButton *addEntityPushButton, *delEntityPushButton, *editEntityPushButton, *exportWorldPushButton, *loadWorldPushButton; SetupEntityDialog *setupEntityDialog; }; #endif // SETUPPAGEWORLDEDITOR_H klog-0.9.8.1/updatesatsdata.cpp0000644000175000017500000002143613532572307015333 0ustar develdevel#include "updatesatsdata.h" UpdateSatsData::UpdateSatsData(DataProxy *dp, QObject *parent) : QObject(parent) { util = new Utilities; dataProxy = dp; } bool UpdateSatsData::satDataFileRead(const QString& tfileName) { //qDebug() << "UpdateSatsData::satDataFileRead: " << tfileName << endl; QString fileName = tfileName; bool errorFound = true; QFile file( fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { //qDebug() << "UpdateSatsData::satDataFileRead File not found" << fileName << endl; return false; } if (dataProxy->clearSatList()) { //qDebug() << "UpdateSatsData::satDataFileRead Sats YES deleted" << endl; } else { //qDebug() << "UpdateSatsData::satDataFileRead Sats NOT deleted" << endl; return false; } int numberOfSats = 0; bool hasEOH = false; bool inHeader = true; QString line = QString(); bool noMoreRegisters = false; qint64 pos; //Position in the file bool haveId = false; bool haveName = false; bool haveUpLink = false; bool haveDownLink = false; bool haveMode = false; pos = file.pos(); while ( !file.atEnd() && !hasEOH) { line = (file.readLine()).toUpper(); numberOfSats = numberOfSats + line.count("EOR>"); if ((line.count("")>0) && (!hasEOH)) { errorFound = false; hasEOH = true; pos = file.pos(); } } file.seek(pos); QProgressDialog progress(tr("Reading Satellites data file..."), tr("Abort reading"), 0, numberOfSats, 0); progress.setWindowModality(Qt::ApplicationModal); progress.setVisible(true); progress.setValue(0); progress.setMaximum(numberOfSats); //qDebug() << "UpdateSatsData::satDataFileRead: END OF HEADER" << endl; //file.seek(pos); //START reading SAT data... //qDebug() << "UpdateSatsData::satDataFileRead: Start reading data" << endl; QStringList fields, fieldToAnalyze;//, qsToPass; fields.clear(); fieldToAnalyze.clear(); QString aux = QString(); QString field, data; int tagLength = 0; int dataLength = 0; QString satID = QString(); QString satName = QString(); QString satUpLink = QString(); QString satDownLink = QString(); QString satMode = QString(); while (!noMoreRegisters) { //qDebug() << "UpdateSatsData::satDataFileRead: While Start" << endl; if (!file.atEnd()) { line.clear(); line.append(file.readLine().trimmed().toUpper()); fields.clear(); //qDebug() << "UpdateSatsData::satDataFileRead-line:" << line << endl; fields << line.split("<", QString::SkipEmptyParts); foreach (aux, fields) { aux = aux.simplified(); //QDebug() << "UpdateSatsData::satDataFileRead-aux:" << aux << endl; fieldToAnalyze = util->getValidADIFFieldAndData("<" + aux); if (fieldToAnalyze.size() == 2) { field = fieldToAnalyze.at(0); data = fieldToAnalyze.at(1); //QDebug() << "UpdateSatsData::satDataFileRead-Field:" << field << endl; //QDebug() << "UpdateSatsData::satDataFileRead-Data:" << data << endl; if (field == "EOR") { //QDebug() << "UpdateSatsData::satDataFileRead - EOR DETECTED!" << endl; if (haveId && haveName) { //QDebug() << "UpdateSatsData::satDataFileRead - EOR DETECTED and have it all!" << endl; haveId = false; haveName = false; haveUpLink = false; haveDownLink = false; haveMode = false; if (!dataProxy->addSatellite(satID, satName, satDownLink,satUpLink, satMode)) { errorFound = true; return false; } //QDebug() << "UpdateSatsData::satDataFileRead - Satellite added: " << satID << endl; satID = QString(); satName = QString(); satUpLink = QString(); satDownLink = QString(); satMode = QString(); } else { haveId = false; haveName = false; haveUpLink = false; haveDownLink = false; haveMode = false; satID = QString(); satName = QString(); satUpLink = QString(); satDownLink = QString(); satMode = QString(); } } else { if (field == "APP_KLOG_SATS_ARRLID") { satID = data; haveId = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_ARRLID" << endl; } else if (field == "APP_KLOG_SATS_NAME") { satName = data; haveName = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_NAME" << endl; } else if (field == "APP_KLOG_SATS_UPLINK") { satUpLink = data; haveUpLink = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_UPLINK" << endl; } else if (field == "APP_KLOG_SATS_DOWNLINK") { satDownLink = data; haveDownLink = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_DOWNLINK" << endl; } else if (field == "APP_KLOG_SATS_MODE") { satMode = data; haveMode = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_MODE" << endl; } else if (field == "APP_KLOG_DATA") { //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_DATA" << endl; if (data != "SATS") { return false; } } } } //qDebug() << "UpdateSatsData::satDataFileRead: foreach end" << endl; } //qDebug() << "UpdateSatsData::satDataFileRead: out of foreach" << endl; } else { noMoreRegisters = true; } //qDebug() << "UpdateSatsData::satDataFileRead: While END" << endl; } if (errorFound) { //qDebug() << "UpdateSatsData::satDataFileRead: errorFound = true" << endl; return false; } else { //qDebug() << "UpdateSatsData::satDataFileRead: END" << endl; emit satsUpdatedSignal(true); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("The Satellites information has been updated.")); msgBox.exec(); } //qDebug() << "UpdateSatsData::satDataFileRead: END " << endl; return true; } bool UpdateSatsData::readSatDataFile() { //qDebug() << "UpdateSatsData::readSatDataFile: " << endl; //QString fileName = QFileDialog::getOpenFileName(0, tr("Open File"), "/home", "Sat data (*.dat)"); QString fileName = QFileDialog::getOpenFileName(0, tr("Open File"), util->getHomeDir(), tr("Sat Data") + "(*.dat)"); if (fileName.isNull()) { return false; } else { //qDebug() << "MainWindow::slotADIFImport -1" << endl; return satDataFileRead(fileName); //filemanager->adifReadLog(fileName, currentLog); } //qDebug() << "UpdateSatsData::readSatDataFile: END" << endl; } klog-0.9.8.1/setupentitydialog.cpp0000644000175000017500000004200113532572307016070 0ustar develdevel/*************************************************************************** setupentitydialog.cpp - description ------------------- begin : sept 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setupentitydialog.h" //#include /* This class calls all the othet "Setup..." to manage the configuration */ SetupEntityDialog::SetupEntityDialog(){ //qDebug() << "SetupEntityDialog::SetupEntityDialog: " << endl; //QPalette::ColorRole QWidget::foregroundRole () const; //QPalette::ColorRole //paletteOrig = new QPalette; //paletteWrong = new QPalette; //paletteWrong.setColor(QPalette::Normal, QPalette::WindowText, Qt::red); //paletteWrong = new QPalette(); //*paletteWrong->setColor(QPalette::WindowText, Qt::red); //paletteWrong.setColor(QPalette::WindowText, color.setNamedColor("red")); palw.setColor(QPalette::Text, Qt::red); //pal.setColor(QPalette::Text, Qt::black); entityData.clear(); entityBool = false; mainPrefixBool = false; cqBool = false; ituBool = false; contBool = false; latBool = false; lonBool = false; utcBool = false; arrlidBool = false; delBool = false; delDateBool = false; prefBool = false; //qDebug() << "SetupEntityDialog::SetupEntityDialog - 0" << endl; QLabel *entityLabel = new QLabel(tr("Entity")); entityLineEdit = new QLineEdit; entityLineEdit->setToolTip(tr("Name of the Entity.")); QLabel *cqLabel = new QLabel(tr("CQ")); cqLineEdit = new QLineEdit; cqLineEdit->setToolTip(tr("CQ zone.")); QLabel *ituLabel = new QLabel(tr("ITU")); ituLineEdit = new QLineEdit; ituLineEdit->setToolTip(tr("ITU zone.")); //QLabel *contLabel = new QLabel(tr("Continent")); //contLineEdit = new QLineEdit; //contLineEdit->setToolTip(tr("Continent of the Entity")); QLabel *latLabel = new QLabel(tr("Latitude")); latLineEdit = new QLineEdit; latLineEdit->setToolTip(tr("Longitude of the Entity.")); QLabel *lonLabel = new QLabel(tr("Longitude")); lonLineEdit = new QLineEdit; lonLineEdit->setToolTip(tr("Longitude of the Entity.")); QLabel *utcLabel = new QLabel(tr("UTC")); utcLineEdit = new QLineEdit; utcLineEdit->setToolTip(tr("Local time difference to UTC.")); QLabel *mprefLabel = new QLabel(tr("Main prefix")); mprefLineEdit = new QLineEdit; mprefLineEdit->setToolTip(tr("Main prefix of the entity.")); //qDebug() << "SetupEntityDialog::SetupEntityDialog - 1" << endl; QLabel *arrlidLabel = new QLabel(tr("ARRL ID")); arrlidLineEdit = new QLineEdit; arrlidLineEdit->setToolTip(tr("ARRL ID.")); //QLabel *deletedLabel = new QLabel(tr("Deleted")); //deletedLineEdit = new QLineEdit; //deletedLineEdit->setToolTip(tr("Mark if the entity is deleted")); QLabel *prefLabel = new QLabel(tr("Prefixes")); prefLineEdit = new QLineEdit; prefLineEdit->setToolTip(tr("Comma separated possible prefixes, e.g. EA1, EA2, ...")); delQDateEdit = new QDateEdit; delQDateEdit->setToolTip(tr("Date of the deletion.")); delRbutton = new QRadioButton(tr("Deleted"), this); QPushButton *closeButton = new QPushButton(tr("Cancel")); QPushButton *okButton = new QPushButton(tr("OK")); //qDebug() << "SetupEntityDialog::SetupEntityDialog - 2" << endl; /* connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); connect(okButton, SIGNAL(clicked()), this, SLOT(slotOkButtonClicked())); connect(entityLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckEntity() ) ); connect(mprefLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckMainprefix() ) ); connect(cqLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckCQz() ) ); connect(ituLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckITUz() ) ); connect(contLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckContinent() ) ); connect(latLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckLatitude() ) ); connect(lonLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckLongitude() ) ); connect(utcLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckUTC() ) ); connect(arrlidLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckARRLid() ) ); connect(delRbutton, SIGNAL(checked), this, SLOT(slotCheckDeleted() ) ); connect(delQDateEdit, SIGNAL(dateChanged), this, SLOT(slotCheckDeletedDate() ) ); connect(prefLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckPrefixes() ) ); */ //qDebug() << "SetupEntityDialog::SetupEntityDialog - 3" << endl; QVBoxLayout *cqLayout = new QVBoxLayout; cqLayout->addWidget(cqLabel); cqLayout->addWidget(cqLineEdit); QVBoxLayout *ituLayout = new QVBoxLayout; ituLayout->addWidget(ituLabel); ituLayout->addWidget(ituLineEdit); QVBoxLayout *latLayout = new QVBoxLayout; latLayout->addWidget(latLabel); latLayout->addWidget(latLineEdit); QVBoxLayout *lonLayout = new QVBoxLayout; lonLayout->addWidget(lonLabel); lonLayout->addWidget(lonLineEdit); QHBoxLayout *posLayout = new QHBoxLayout; posLayout->addLayout(cqLayout); posLayout->addLayout(ituLayout); posLayout->addLayout(latLayout); posLayout->addLayout(lonLayout); QVBoxLayout *utcLayout = new QVBoxLayout; utcLayout->addWidget(utcLabel); utcLayout->addWidget(utcLineEdit); QVBoxLayout *arrlidLayout = new QVBoxLayout; arrlidLayout->addWidget(arrlidLabel); arrlidLayout->addWidget(arrlidLineEdit); QVBoxLayout *delLayout = new QVBoxLayout; delLayout->addWidget(delRbutton); delLayout->addWidget(delQDateEdit); QHBoxLayout *thirdLayout = new QHBoxLayout; thirdLayout->addLayout(utcLayout); thirdLayout->addLayout(arrlidLayout); thirdLayout->addLayout(delLayout); QVBoxLayout *prefLayout = new QVBoxLayout; prefLayout->addWidget(prefLabel); prefLayout->addWidget(prefLineEdit); QGridLayout *dataLayout = new QGridLayout; dataLayout->addWidget(entityLabel, 0, 0); dataLayout->addWidget(entityLineEdit, 1, 0); dataLayout->addWidget(mprefLabel, 0, 1); dataLayout->addWidget(mprefLineEdit, 1, 1); dataLayout->addLayout(posLayout, 2, 0, 2, -1); dataLayout->addLayout(thirdLayout, 4, 0, 4, -1); dataLayout->addLayout(prefLayout, 8, 0, 8, -1); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addStretch(1); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(closeButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(dataLayout); mainLayout->addStretch(1); mainLayout->addSpacing(12); mainLayout->addLayout(buttonsLayout); //qDebug() << "SetupEntityDialog::SetupEntityDialog - 3" << endl; setLayout(mainLayout); setWindowTitle(tr("Entity Dialog")); pal = lonLineEdit->palette(); //qDebug() << "SetupEntityDialog::SetupEntityDialog: END" << endl; } SetupEntityDialog::~SetupEntityDialog() { //qDebug() << "SetupEntityDialog::~SetupEntityDialog " << endl; } void SetupEntityDialog::slotOkButtonClicked() { //qDebug() << "SetupEntityDialog::slotOkButtonClicked " << endl; QStringList ql; ql.clear(); if (entityBool && mainPrefixBool && cqBool && ituBool && contBool && latBool && lonBool && utcBool && arrlidBool && delBool && delDateBool && prefBool) { ql << checkEntity(); ql << checkMainprefix(); ql << checkContinent(); ql << checkCQz(); ql << checkITUz(); ql << checkLatitude(); ql << checkLongitude(); ql << checkUTC(); ql << checkARRLid(); ql << checkDeleted(); //ql << checkDeletedDate(); ql << checkPrefixes(); emit entityAdded(ql); accept(); } else { reject(); } reject(); } QString SetupEntityDialog::checkContinent() { //qDebug() << "SetupEntityDialog::checkContinent" << endl; if(contBool) { return contLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkEntity() { //qDebug() << "SetupEntityDialog::checkEntity" << endl; if(entityBool) { return entityLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkMainprefix() { //qDebug() << "SetupEntityDialog::checkMainprefix" << endl; if(mainPrefixBool) { return mprefLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkCQz() { //qDebug() << "SetupEntityDialog::checkCQz" << endl; if(cqBool) { return cqLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkITUz() { //qDebug() << "SetupEntityDialog::checkITUz" << endl; if(ituBool) { return ituLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkLatitude() { //qDebug() << "SetupEntityDialog::checkLatitude" << endl; if(latBool) { return latLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkLongitude() { //qDebug() << "SetupEntityDialog::checkLongitude" << endl; if(lonBool) { return lonLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkUTC() { //qDebug() << "SetupEntityDialog::checkUTC" << endl; if(utcBool) { return utcLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkARRLid() { //qDebug() << "SetupEntityDialog::checkARRLid" << endl; if(arrlidBool) { return arrlidLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkDeleted() { //qDebug() << "SetupEntityDialog::checkDeleted" << endl; if(delBool) { return "Y"; } else { return "N"; } return ""; } QString SetupEntityDialog::checkDeletedDate() { //qDebug() << "SetupEntityDialog::checkDeletedDate" << endl; if(delDateBool) { return "00/00/0000"; } else { return ""; } return ""; } QString SetupEntityDialog::checkPrefixes() { //qDebug() << "SetupEntityDialog::checkPrefixes" << endl; if(prefBool) { return prefLineEdit->text(); } else { return ""; } return ""; } void SetupEntityDialog::slotCancelButtonClicked() { //qDebug() << "SetupEntityDialog::slotCancelButtonClicked " << endl; reject(); } void SetupEntityDialog::slotCheckEntity() { //qDebug() << "SetupEntityDialog::slotCheckEntity " << endl; QString aux; aux = entityLineEdit->text(); if (aux.length()>2) { entityBool = true; entityLineEdit->setPalette(pal); } else { entityBool = false; entityLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckMainprefix() { //qDebug() << "SetupEntityDialog::slotCheckMainprefix" << endl; QString aux; aux = mprefLineEdit->text(); if (aux.length()>0) { mprefLineEdit->setPalette(pal); mainPrefixBool = true; } else { mainPrefixBool = false; mprefLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckCQz() { //qDebug() << "SetupEntityDialog::slotCheckCQz" << endl; QString aux; aux = cqLineEdit->text(); if (aux.length()>0) { cqBool = true; cqLineEdit->setPalette(pal); } else { cqBool = false; cqLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckITUz() { //qDebug() << "SetupEntityDialog::slotCheckITUz" << endl; QString aux; aux = ituLineEdit->text(); if (aux.length()>0) { ituBool = true; ituLineEdit->setPalette(pal); } else { ituBool = false; ituLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckContinent() { //qDebug() << "SetupEntityDialog::slotCheckContinent" << endl; QString aux; aux = contLineEdit->text(); if (aux.length()>2) { contBool = true; contLineEdit->setPalette(pal); } else { contBool = false; contLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckLatitude() { //qDebug() << "SetupEntityDialog::slotCheckLatitude" << endl; QString aux; aux = latLineEdit->text(); if (aux.length()>0) { latBool = true; latLineEdit->setPalette(pal); } else { latBool = false; latLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckLongitude() { //qDebug() << "SetupEntityDialog::slotCheckLongitude" << endl; QString aux; aux = lonLineEdit->text(); if (aux.length()>3) { //lonLineEdit->setPalette(*paletteOrig); lonBool = true; lonLineEdit->setPalette(pal); } else { //lonLineEdit->setForegroundRole(QPalette::WindowText); lonLineEdit->setPalette(palw); //lonLineEdit->setPalette(*paletteWrong); lonBool = false; } } void SetupEntityDialog::slotCheckUTC() { //qDebug() << "SetupEntityDialog::slotCheckUTC" << endl; QString aux; aux = utcLineEdit->text(); if (aux.length()>0) { utcBool = true; utcLineEdit->setPalette(pal); } else { utcBool = false; utcLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckARRLid() { //qDebug() << "SetupEntityDialog::slotCheckARRLid" << endl; QString aux; aux = arrlidLineEdit->text(); // int n = aux.toInt(); if (aux.length()>0) { arrlidBool = false; arrlidLineEdit->setPalette(pal); } else { arrlidBool = false; arrlidLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckDeleted() { //qDebug() << "SetupEntityDialog::slotCheckDeleted" << endl; if (delRbutton->isChecked()) { delBool = true; } else { delBool = false; } } void SetupEntityDialog::slotCheckDeletedDate() { //qDebug() << "SetupEntityDialog::slotCheckDeletedDate" << endl; delDateBool = false; //arrlidLineEdit->setPalette(palw); } void SetupEntityDialog::slotCheckPrefixes() { //qDebug() << "SetupEntityDialog::slotCheckPrefixes" << endl; QString aux; aux = prefLineEdit->text(); aux = aux.simplified(); QStringList list = aux.split(",", QString::SkipEmptyParts); if (aux.length()>0) { prefBool = true; prefLineEdit->setPalette(pal); //"EA1, EA2, EA3" } else { prefBool = false; prefLineEdit->setPalette(palw); } } klog-0.9.8.1/setupdialog.cpp0000644000175000017500000012753713532572307014655 0ustar develdevel/*************************************************************************** setupdialog.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setupdialog.h" //#include /* This class calls all the othet "Setup..." to manage the configuration */ SetupDialog::SetupDialog(DataProxy *dp, const bool _firstTime) { //qDebug() << "SetupDialog::SetupDialog 1" << endl; util = new Utilities; constrid = 1; nolog = true; configFileName = "klogrc"; version = "."; pageRequested = 0; //qDebug() << "SetupDialog::SetupDialog 2" << endl; dataProxy = dp; //qDebug() << "SetupDialog::SetupDialog 3" << endl; firstTime = _firstTime; if (firstTime) { //qDebug() << "SetupDialog::SetupDialog FIRST TIME = TRUE" << endl; } else { //qDebug() << "SetupDialog::SetupDialog FIRST TIME = FALSE" << endl; } //qDebug() << "SetupDialog::SetupDialog 3.1" << endl; logsPageTabN=-1; //qDebug() << "SetupDialog::SetupDialog 3.2" << endl; locator = new Locator(); //qDebug() << "SetupDialog::SetupDialog 3.3" << endl; tabWidget = new QTabWidget; //qDebug() << "SetupDialog::SetupDialog 3.4" << endl; hamlibPage = new SetupPageHamLib(dataProxy, this); //qDebug() << "SetupDialog::SetupDialog 3.4.1" << endl; userDataPage = new SetupPageUserDataPage(dataProxy); //qDebug() << "SetupDialog::SetupDialog 3.5" << endl; bandModePage = new SetupPageBandMode(dataProxy, this); //qDebug() << "SetupDialog::SetupDialog 3.6" << endl; dxClusterPage = new SetupPageDxCluster(this); //qDebug() << "SetupDialog::SetupDialog 3.7" << endl; colorsPage = new SetupPageColors(this); //qDebug() << "SetupDialog::SetupDialog 3.8" << endl; miscPage = new SetupPageMisc(this); //qDebug() << "SetupDialog::SetupDialog 3.9" << endl; worldEditorPage = new SetupPageWorldEditor (dataProxy, this); //qDebug() << "SetupDialog::SetupDialog 3.10" << endl; logsPage = new SetupPageLogs(dataProxy, this); //qDebug() << "SetupDialog::SetupDialog 3.11" << endl; clubLogPage = new SetupPageClubLog(this); //qDebug() << "SetupDialog::SetupDialog 3.12" << endl; UDPPage = new SetupPageUDP(this); //qDebug() << "SetupDialog::SetupDialog 3.13" << endl; satsPage = new SetupPageSats(dataProxy, this); //hamlibPage = new SetupPageHamLib(dataProxy, this); //qDebug() << "SetupDialog::SetupDialog 4" << endl; tabWidget->addTab(userDataPage, tr("My Data")); tabWidget->addTab(bandModePage, tr("Bands/Modes")); tabWidget->addTab(dxClusterPage, tr("DX-Cluster")); tabWidget->addTab(colorsPage, tr("Colors")); tabWidget->addTab(miscPage, tr("Misc")); tabWidget->addTab(worldEditorPage, tr("World Editor")); logsPageTabN = tabWidget->addTab(logsPage, tr("Logs")); tabWidget->addTab(clubLogPage, "ClubLog"); tabWidget->addTab(UDPPage, "WSJT-X"); tabWidget->addTab(satsPage , tr("Satellites")); tabWidget->addTab(hamlibPage, tr ("HamLib")); QPushButton *closeButton = new QPushButton(tr("Cancel")); QPushButton *okButton = new QPushButton(tr("OK")); connect(closeButton, SIGNAL(clicked()), this, SLOT(slotCancelButtonClicked())); connect(okButton, SIGNAL(clicked()), this, SLOT(slotOkButtonClicked())); connect(logsPage, SIGNAL(queryError(QString, QString, int, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, int, QString)) ); connectActions(); QHBoxLayout *horizontalLayout = new QHBoxLayout; horizontalLayout->addWidget(tabWidget); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addStretch(1); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(closeButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(horizontalLayout); mainLayout->addLayout(buttonsLayout); userDataPage->setFocus(); setLayout(mainLayout); setWindowTitle(tr("Config Dialog")); slotReadConfigData(); if ((pageRequested==6) && (logsPageTabN>0))// The user is opening a new log { tabWidget->setCurrentIndex(logsPageTabN); } nolog = !(haveAtleastOneLog()); //qDebug() << "SetupDialog::SetupDialog 1 END" << endl; } SetupDialog::SetupDialog(DataProxy *dp, const QString _configFile, const QString _softwareVersion, const int _page, const bool _firstTime) { //qDebug() << "SetupDialog::SetupDialog 2" << endl; constrid = 2; util = new Utilities; firstTime = _firstTime; dataProxy = dp; configFileName = _configFile; version = _softwareVersion; pageRequested = _page; int logsPageTabN=-1; //qDebug() << "SetupDialog::SetupDialog 01" << endl; locator = new Locator(); tabWidget = new QTabWidget; userDataPage = new SetupPageUserDataPage(dataProxy); bandModePage = new SetupPageBandMode(dataProxy, this); dxClusterPage = new SetupPageDxCluster(this); colorsPage = new SetupPageColors(this); miscPage = new SetupPageMisc(this); worldEditorPage = new SetupPageWorldEditor (dataProxy, this); logsPage = new SetupPageLogs(dataProxy, this); clubLogPage = new SetupPageClubLog(this); UDPPage = new SetupPageUDP(this); satsPage = new SetupPageSats(dataProxy, this); hamlibPage = new SetupPageHamLib(dataProxy, this); //qDebug() << "SetupDialog::SetupDialog 02" << endl; tabWidget->addTab(userDataPage, tr("User data")); tabWidget->addTab(bandModePage, tr("Bands/Modes")); tabWidget->addTab(dxClusterPage, tr("D&X-Cluster")); tabWidget->addTab(colorsPage, tr("Colors")); tabWidget->addTab(miscPage, tr("Misc")); tabWidget->addTab(worldEditorPage, tr("World Editor")); logsPageTabN = tabWidget->addTab(logsPage, tr("Logs")); tabWidget->addTab(clubLogPage, tr("ClubLog")); tabWidget->addTab(UDPPage, tr("WSJT-X")); tabWidget->addTab(satsPage , tr("Satellites")); tabWidget->addTab(hamlibPage, tr ("HamLib")); //qDebug() << "SetupDialog::SetupDialog 03" << endl; QPushButton *closeButton = new QPushButton(tr("Cancel")); QPushButton *okButton = new QPushButton(tr("OK")); QHBoxLayout *horizontalLayout = new QHBoxLayout; horizontalLayout->addWidget(tabWidget); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addStretch(1); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(closeButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(horizontalLayout); mainLayout->addLayout(buttonsLayout); //qDebug() << "SetupDialog::SetupDialog 04" << endl; setLayout(mainLayout); setWindowTitle(tr("Config Dialog")); //qDebug() << "SetupDialog::SetupDialog 05" << endl; slotReadConfigData(); //qDebug() << "SetupDialog::SetupDialog 05.1" << endl; if ((pageRequested==6) && (logsPageTabN>0))// The user is opening a new log { //qDebug() << "SetupDialog::SetupDialog 05.2" << endl; tabWidget->setCurrentIndex(logsPageTabN); } //qDebug() << "SetupDialog::SetupDialog 05.3" << endl; nolog = !(haveAtleastOneLog()); connect(closeButton, SIGNAL(clicked()), this, SLOT(slotCancelButtonClicked())); connect(okButton, SIGNAL(clicked()), this, SLOT(slotOkButtonClicked())); connectActions(); //qDebug() << "SetupDialog::SetupDialog 2 - END" << endl; } SetupDialog::~SetupDialog() { //qDebug() << "SetupDialog::~SetupDialog " << endl; } void SetupDialog::connectActions() { connect (logsPage, SIGNAL(newLogData(QStringList)), this, SLOT(slotAnalyzeNewLogData(QStringList))); connect (userDataPage, SIGNAL(stationCallSignal(QString)), this, SLOT(slotSetStationCallSign(QString))); connect (userDataPage, SIGNAL(operatorsSignal(QString)), this, SLOT(slotSetOperators(QString))); connect (userDataPage, SIGNAL(enterKey()), this, SLOT(slotOkButtonClicked())); } void SetupDialog::setData(const QString _configFile, const QString _softwareVersion, const int _page, const bool _firstTime) { //qDebug() << "SetupDialog::setData: " << QString::number(_page) << endl; nolog = !(haveAtleastOneLog()); firstTime = _firstTime; if (firstTime) { //qDebug() << "SetupDialog::setData FIRST TIME! " << endl; } else { //qDebug() << "SetupDialog::setData NOT FIRST TIME! " << endl; miscPage->setUseDefaultDBPath(miscPage->getDefaultDBPath()); } setConfigFile(_configFile); setSoftVersion(_softwareVersion); setPage(_page); //removeBandModeDuplicates(); } void SetupDialog::setConfigFile(const QString _configFile) { //qDebug() << "SetupDialog::setConfigFile" << endl; configFileName = _configFile; } void SetupDialog::setSoftVersion(const QString _softwareVersion) { //qDebug() << "SetupDialog::setSoftVersion" << endl; version = _softwareVersion; } void SetupDialog::setPage(const int _page) { //qDebug() << "SetupDialog::setPage("<0))// The user is opening a new log { tabWidget->setCurrentIndex(pageRequested); } } void SetupDialog::slotCancelButtonClicked() { //qDebug() << "SetupDialog::slotCancelButtonClicked" << endl; if (firstTime || nolog) { if (nolog) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You need to enter at least one log in the Logs tab.")); msgBox.exec(); return; } emit exitSignal(2); } // close(); } void SetupDialog::createIcons() { //qDebug() << "SetupDialog::createIcons" << endl; QListWidgetItem *configButton = new QListWidgetItem(contentsWidget); configButton->setIcon(QIcon(":/images/config.png")); configButton->setText(tr("User data")); configButton->setTextAlignment(Qt::AlignHCenter); configButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *logsButton = new QListWidgetItem(contentsWidget); logsButton->setIcon(QIcon(":/images/config.png")); logsButton->setText(tr("Logs")); logsButton->setTextAlignment(Qt::AlignHCenter); logsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *bandsButton = new QListWidgetItem(contentsWidget); bandsButton->setIcon(QIcon(":/images/query.png")); bandsButton->setText(tr("Bands/Modes")); bandsButton->setTextAlignment(Qt::AlignHCenter); bandsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *dxClusterButton = new QListWidgetItem(contentsWidget); dxClusterButton->setIcon(QIcon(":/images/query.png")); dxClusterButton->setText(tr("DX-Cluster")); dxClusterButton->setTextAlignment(Qt::AlignHCenter); dxClusterButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *colorsButton = new QListWidgetItem(contentsWidget); colorsButton->setIcon(QIcon(":/images/query.png")); colorsButton->setText(tr("Colors")); colorsButton->setTextAlignment(Qt::AlignHCenter); colorsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *miscButton = new QListWidgetItem(contentsWidget); miscButton->setIcon(QIcon(":/images/query.png")); miscButton->setText(tr("Misc")); miscButton->setTextAlignment(Qt::AlignHCenter); miscButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *worldButton = new QListWidgetItem(contentsWidget); worldButton->setIcon(QIcon(":/images/query.png")); worldButton->setText(tr("World")); worldButton->setTextAlignment(Qt::AlignHCenter); worldButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); connect(contentsWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(changePage(QListWidgetItem*,QListWidgetItem*))); } void SetupDialog::changePage(QListWidgetItem *current, QListWidgetItem *previous) { //qDebug() << "SetupDialog::changePage" << endl; if (!current) current = previous; pagesWidget->setCurrentIndex(contentsWidget->row(current)); } void SetupDialog::slotOkButtonClicked() { //qDebug() << "SetupDialog::slotOkButtonClicked" << endl; if (!miscPage->areDBPathChangesApplied()) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("DB has not been moved to new path")); msgBox.setInformativeText(tr("Go to the Misc tab and click on Move DB\n or the DB will not be moved to the new location.")); msgBox.exec(); return; } if ((userDataPage->getStationQrz()).length() < 3){ // There are no valid calls with less than 3 Chars QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You need to enter at least a valid QRZ.")); msgBox.setInformativeText(tr("Go to the User tab and enter valid QRZ.")); msgBox.exec(); return; } if (!haveAtleastOneLog()) { //qDebug() << "SetupDialog::slotOkButtonClicked - NO LOG!" << endl; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You have not selected the kind of log you want.")); msgBox.setInformativeText(tr("You will be redirected to the Log tab.\nPlease add and select the kind of log you want to use.")); msgBox.exec(); tabWidget->setCurrentIndex(tabWidget->indexOf(logsPage)); logsPage->createNewLog(); //emit newLogRequested(true); // Signal to be catched by logsPage true show new log return; } QFile file (configFileName); QString tmp; tmp = "true"; if (file.open (QIODevice::WriteOnly)){ QTextStream stream (&file); /*QString stationCall; int contest; int contestCategory; int modes;*/ //QRZ/CQ/ITU/CONTEST stream << "version=" << version << ";" << endl; stream << "callsign=" << userDataPage->getStationQrz() << ";" << endl; if ((userDataPage->getOperators()).length() >= 3){ // There are no valid calls with less than 3 Chars stream << "operators=" << userDataPage->getOperators() << ";" << endl; } //stream << "contest=" << userDataPage->getContest() << ";" << endl; //stream << "contestcategory=" << userDataPage->getContestCategory() << ";" << endl; stream << "cqz=" << QString::number(userDataPage->getCQz()) << ";" << endl; stream << "ituz=" << QString::number(userDataPage->getITUz()) << ";" << endl; if ( locator->isValidLocator(userDataPage->getStationLocator()) ) { stream << "StationLocator=" << userDataPage->getStationLocator() << ";" << endl; } if ((!(userDataPage->getName()).isNull()) && ( (userDataPage->getName()).length() > 0 )) { stream << "Name=" << userDataPage->getName() <<";" << endl; } if ((!(userDataPage->getAddress1()).isNull()) && ( (userDataPage->getAddress1()).length() > 0 )) { stream << "Address1=" << userDataPage->getAddress1() <<";" << endl; } if ((!(userDataPage->getAddress2()).isNull()) && ( (userDataPage->getAddress2()).length() > 0 )) { stream << "Address2=" << userDataPage->getAddress2() <<";" << endl; } if ((!(userDataPage->getAddress3()).isNull()) && ( (userDataPage->getAddress3()).length() > 0 )) { stream << "Address3=" << userDataPage->getAddress3() <<";" << endl; } if ((!(userDataPage->getAddress4()).isNull()) && ( (userDataPage->getAddress4()).length() > 0 )) { stream << "Address4=" << userDataPage->getAddress4() <<";" << endl; } if ((!(userDataPage->getCity()).isNull()) && ( (userDataPage->getCity()).length() > 0 )) { stream << "City=" << userDataPage->getCity() <<";" << endl; } if ((!(userDataPage->getZipCode()).isNull()) && ( (userDataPage->getZipCode()).length() > 0 )) { stream << "ZipCode=" << userDataPage->getZipCode() <<";" << endl; } if ((!(userDataPage->getProvince()).isNull()) && ( (userDataPage->getProvince()).length() > 0 )) { stream << "ProvinceState=" << userDataPage->getProvince() <<";" << endl; } if ((!(userDataPage->getCountry()).isNull()) && ( (userDataPage->getCountry()).length() > 0 )) { stream << "Country=" << userDataPage->getCountry() <<";" << endl; } if ((!(userDataPage->getRig1()).isNull()) && ( (userDataPage->getRig1()).length() > 0 )) { stream << "Rig1=" << userDataPage->getRig1() <<";" << endl; } if ((!(userDataPage->getRig2()).isNull()) && ( (userDataPage->getRig2()).length() > 0 )) { stream << "Rig2=" << userDataPage->getRig2() <<";" << endl; } if ((!(userDataPage->getRig3()).isNull()) && ( (userDataPage->getRig3()).length() > 0 )) { stream << "Rig3=" << userDataPage->getRig3() <<";" << endl; } if ((!(userDataPage->getAntenna1()).isNull()) && ( (userDataPage->getAntenna1()).length() > 0 )) { stream << "Antenna1=" << userDataPage->getAntenna1() <<";" << endl; } if ((!(userDataPage->getAntenna2()).isNull()) && ( (userDataPage->getAntenna2()).length() > 0 )) { stream << "Antenna2=" << userDataPage->getAntenna2() <<";" << endl; } if ((!(userDataPage->getAntenna3()).isNull()) && ( (userDataPage->getAntenna2()).length() > 0 )) { stream << "Antenna3=" << userDataPage->getAntenna3() <<";" << endl; } if ((userDataPage->getPower()).toFloat()>=0) { stream << "Power=" << userDataPage->getPower() << ";" << endl; } //stream << "locator=" << (MyLocatorkLineEdit->text ()).toUpper () << ";" << endl; //stream << "CallUsed=" << (UserDataPage.qrzLineEdit).text() << ";" << endl; //stream << "Operators=" << ";" << endl; stream << "Bands=" << bandModePage->getBands() << ";" << endl; stream << "Modes=" << bandModePage->getModes() << ";" << endl; //stream << "InMemory=" << miscPage->getInMemory() << ";" << endl; stream << "RealTime=" << miscPage->getRealTime() << ";" << endl; stream << "UTCTime=" << miscPage->getUTCTime() << ";" << endl; stream << "AlwaysADIF=" << miscPage->getAlwaysADIF() << ";" << endl; stream << "UseDefaultName=" << miscPage->getUseDefaultName() << ";" << endl; stream << "DefaultADIFFile=" << miscPage->getDefaultFileName() << ";" << endl; stream << "DBPath=" << miscPage->getDefaultDBPath() << ";" << endl; stream << "ImperialSystem=" << miscPage->getImperial() << ";" << endl; stream << "SendQSLWhenRec=" << miscPage->getSendQSLWhenRec() << ";" << endl; stream << "ShowCallsignInSearch=" << miscPage->getShowStationCallSignInSearch() << ";" << endl; stream << "KeepMyData=" << miscPage->getKeepMyData() << ";" << endl; stream << "CompleteWithPrevious=" << miscPage->getCompleteWithPrevious() << ";" << endl; stream << "CheckNewVersions=" << miscPage->getCheckNewVersions() << ";" << endl; stream << "ManageDXMarathon=" << miscPage->getDXMarathon() << ";" << endl; if ((miscPage->getReportInfo()).toUpper() == "TRUE") { stream << "ProvideInfo=True;" << endl; } if ((!(dxClusterPage->getSelectedDxClusterServer()).isNull()) && ( (dxClusterPage->getSelectedDxClusterServer()).length() > 0 )) { stream << "DXClusterServerToUse=" << dxClusterPage->getSelectedDxClusterServer() <<";" << endl; } QStringList stringList; stringList.clear(); stringList << dxClusterPage->getDxclusterServersComboBox(); if (stringList.size()>0) { for (int i = 0; i < stringList.size(); i++) { stream << "DXClusterServerPort="<< stringList.at(i) << ";" << endl; } } stream << "DXClusterShowHF=" << dxClusterPage->getShowHFRadiobutton() << ";" << endl; stream << "DXClusterShowVHF=" << dxClusterPage->getShowVHFRadiobutton() << ";" << endl; stream << "DXClusterShowWARC=" << dxClusterPage->getShowWARCRadiobutton() << ";" << endl; stream << "DXClusterShowWorked=" << dxClusterPage->getShowWorkedRadiobutton() << ";" << endl; stream << "DXClusterShowConfirmed=" << dxClusterPage->getShowConfirmedRadiobutton() << ";" << endl; stream << "DXClusterShowAnn=" << dxClusterPage->getShowANNRadiobutton() << ";" << endl; stream << "DXClusterShowWWV=" << dxClusterPage->getShowWWVRadiobutton() << ";" << endl; stream << "DXClusterShowWCY=" << dxClusterPage->getShowWCYRadiobutton() << ";" << endl; stream << "NewOneColor=" << colorsPage->getNewOneColor() << ";" << endl; stream << "NeededColor=" << colorsPage->getNeededColor() << ";" << endl; stream << "WorkedColor=" << colorsPage->getWorkedColor() << ";" << endl; stream << "ConfirmedColor=" << colorsPage->getConfirmedColor() << ";" << endl; stream << "DefaultColor=" << colorsPage->getDefaultColor() << ";" << endl; stream << "SelectedLog=" << QString::number(logsPage->getSelectedLog()) << ";" << endl; // CLUBLOG if ((clubLogPage->getClubLog()).toUpper() == "TRUE" ) { stream << "ClubLogActive=" << clubLogPage->getClubLog() << ";" << endl; stream << "ClubLogRealTime=" << clubLogPage->getClubLogRealTime() << ";" << endl; stream << "ClubLogCall=" << clubLogPage->getCallsign() << ";" << endl; stream << "ClubLogPass=" << clubLogPage->getPassword() << ";" << endl; stream << "ClubLogEmail=" << clubLogPage->getEmail() << ";" << endl; stream << "ClubLogUseStationCallsign=" << clubLogPage->getUseQSOStationCallsign() << ";" << endl; } // CLUBLOG //WSJTX stream << "UDPServer=" << UDPPage->getUDPServer() << ";" << endl; stream << "UDPServerPort=" << UDPPage->getUDPServerPort() << ";" << endl; stream << "LogFromWSJTX=" << UDPPage->getLogFromWSJTx() << ";" << endl; stream << "LogAutoFromWSJTX=" << UDPPage->getAutoLogFromWSJTx() << ";" << endl; stream << "RealTimeFromWSJTX=" << UDPPage->getReaDataFromWSJTx() << ";" << endl; stream << "InfoTimeOut=" << UDPPage->getTimeout() << ";" << endl; //qDebug() << "SetupDialog::slotOkButtonClicked: hamlib" << endl; QString _aa = hamlibPage->getData(); stream << _aa << endl; //qDebug() << "SetupDialog::slotOkButtonClicked: hamlib-2: " << _aa << endl; //WSJTX file.close (); } //qDebug() << "SetupDialog::slotOkButtonClicked - just before leaving" << endl; QDialog::accept(); //qDebug() << "SetupDialog::slotOkButtonClicked - END" << endl; //close(); } void SetupDialog::slotReadConfigData() { //qDebug() << "SetupDialog::slotReadConfigData" << endl; if (firstTime) { setDefaults(); bands.removeDuplicates(); modes.removeDuplicates(); bandModePage->setActiveModes(modes); bandModePage->setActiveBands(bands); } //qDebug() << "SetupDialog::slotReadConfigData - 1" << endl; QFile file(configFileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){ //qDebug() << "SetupDialog::slotReadConfigData() File not found" << configFileName << endl; //firstTime = true; return; } //qDebug() << "SetupDialog::slotReadConfigData - 2" << endl; //dxClusterServers.clear(); while (!file.atEnd()) { QByteArray line = file.readLine(); processConfigLine(line); //qDebug() << "SetupDialog::slotReadConfigData - in the while" << endl; } //qDebug() << "SetupDialog::slotReadConfigData - 3" << endl; dxClusterPage->setDxclusterServersComboBox(dxClusterServers); dxClusterPage->setSelectedDxClusterServer(dxClusterServerToUse); if (modes.isEmpty()) { modes << "SSB" << "CW" << "RTTY"; } if (bands.isEmpty()) { bands << "10M" << "12M" << "15M" << "17M" << "20M" << "40M" << "80M" << "160M"; } modes.removeDuplicates(); //qDebug() << "SetupDialog::slotReadConfigData - duplicate modes: " << QString::number(a) << endl; bandModePage->setActiveModes(modes); bands.removeDuplicates(); //qDebug() << "SetupDialog::slotReadConfigData - duplicate bands: " << QString::number(a) << endl; bandModePage->setActiveBands(bands); //qDebug() << "SetupDialog::slotReadConfigData - END" << endl; } bool SetupDialog::processConfigLine(const QString _line) { //qDebug() << "SetupDialog::processConfigLine: " << _line << endl; QString line = _line.simplified(); //line.simplified(); int i = 0; //aux variable QStringList values = line.split("=", QString::SkipEmptyParts); QString tab = QString(); if (line.startsWith('#')){ //qDebug() << "SetupDialog::processConfigLine: Comment Line!" << endl; return true; } if (!( (line.contains('=')) && (line.contains(';')))){ //qDebug() << "SetupDialog::processConfigLine: Wrong Line!" << endl; return false; } QString value = values.at(1); tab = (values.at(0)).toUpper(); int endValue = value.indexOf(';'); if (endValue>-1){ value = value.left(value.length() - (value.length() - endValue)); } value = checkAndFixASCIIinADIF(value); // Check whether the value is valid. //qDebug() << "SetupDialog::processConfigLine: TAB: " << tab << endl; //qDebug() << "SetupDialog::processConfigLine: VALUE: " << value << endl; if (tab == "CALLSIGN"){ //qDebug() << "SetupDialog::processConfigLine: CALLSIGN: " << value << endl; userDataPage->setStationQrz(value); }else if (tab == "OPERATORS"){ userDataPage->setOperators(value); }else if (tab=="CQZ"){ userDataPage->setCQz((value).toInt()); }else if (tab=="ITUZ"){ userDataPage->setITUz((value).toInt()); }else if (tab=="CONTEST"){ //userDataPage->setContest(value); }else if (tab=="MODES"){ readActiveModes(value); modes.removeDuplicates(); bandModePage->setActiveModes(modes); }else if (tab=="BANDS"){ readActiveBands(value); bands.removeDuplicates(); bandModePage->setActiveBands(bands); //}else if (tab=="INMEMORY"){ // miscPage->setInMemory(value); }else if (tab=="REALTIME"){ miscPage->setRealTime(value); }else if (tab=="UTCTIME"){ miscPage->setUTCTime(value); }else if (tab=="ALWAYSADIF"){ miscPage->setAlwaysADIF(value); }else if (tab=="USEDEFAULTNAME"){ miscPage->setDefaultFileName(value); }else if (tab=="DBPATH"){ miscPage->setUseDefaultDBPath(value); }else if (tab=="DEFAULTADIFFILE"){ miscPage->setDefaultFileName(value.toLower()); //qDebug() << "SetupDialog::processConfigLine: FILE: " << value << endl; }else if (tab=="IMPERIALSYSTEM"){ miscPage->setImperial(value.toLower()); }else if (tab=="KEEPMYDATA"){ miscPage->setKeepMyData(value.toLower()); }else if (tab=="COMPLETEWITHPREVIOUS"){ miscPage->setCompleteWithPrevious(value.toLower()); }else if (tab=="SENDQSLWHENREC"){ miscPage->setSendQSLWhenRec(value.toLower()); }else if (tab=="MANAGEDXMARATHON"){ miscPage->setDXMarathon(value.toLower()); } else if (tab=="SHOWCALLSIGNINSEARCH"){ miscPage->setShowStationCallSignInSearch(value.toLower()); } else if (tab=="CHECKNEWVERSIONS"){ miscPage->setCheckNewVersions(value); } else if (tab=="PROVIDEINFO"){ miscPage->setReportInfo(value); } else if (tab=="UDPSERVER"){ UDPPage->setUDPServer(value); } else if (tab=="UDPSERVERPORT"){ UDPPage->setUDPServerPort(value); } else if (tab=="LOGFROMWSJTX") { UDPPage->setLogFromWSJTx(value); } else if (tab=="LOGAUTOFROMWSJTX") { UDPPage->setAutoLogFromWSJTx(value); } else if (tab=="REALTIMEFROMWSJTX") { UDPPage->setReaDataFromWSJTx(value); } else if (tab=="INFOTIMEOUT") { UDPPage->setTimeout(value); } else if (tab =="NAME") { userDataPage->setName(value); } else if (tab =="ADDRESS1") { userDataPage->setAddress1(value); } else if (tab =="ADDRESS2") { userDataPage->setAddress2(value); } else if (tab =="ADDRESS3") { userDataPage->setAddress3(value); } else if (tab =="ADDRESS4") { userDataPage->setAddress4(value); } else if (tab =="CITY") { userDataPage->setCity(value); } else if (tab =="ZIPCODE") { userDataPage->setZipCode(value); } else if (tab =="PROVINCESTATE") { userDataPage->setProvince(value); } else if (tab =="COUNTRY") { userDataPage->setCountry(value); } else if (tab =="POWER") { userDataPage->setPower(value); } else if (tab =="RIG1") { userDataPage->setRig1(value); } else if (tab =="RIG2") { userDataPage->setRig2(value); } else if (tab =="RIG3") { userDataPage->setRig3(value); } else if (tab =="ANTENNA1") { userDataPage->setAntenna1(value); } else if (tab =="ANTENNA2") { userDataPage->setAntenna2(value); } else if (tab =="ANTENNA3") { userDataPage->setAntenna3(value); } else if (tab =="STATIONLOCATOR"){ if ( locator->isValidLocator(value) ) { userDataPage->setStationLocator(value); } }else if (tab =="DXCLUSTERSHOWHF"){ dxClusterPage->setShowHFRadiobutton(value); }else if (tab =="DXCLUSTERSHOWVHF"){ dxClusterPage->setShowVHFRadiobutton(value); }else if (tab =="DXCLUSTERSHOWWARC"){ dxClusterPage->setShowWARCRadiobutton(value); }else if (tab =="DXCLUSTERSHOWWORKED"){ dxClusterPage->setShowWorkedRadiobutton(value); }else if (tab =="DXCLUSTERSHOWCONFIRMED"){ dxClusterPage->setShowConfirmedRadiobutton(value); }else if (tab =="DXCLUSTERSHOWANN"){ dxClusterPage->setShowANNRadiobutton(value); }else if (tab =="DXCLUSTERSHOWWWV"){ dxClusterPage->setShowWWVRadiobutton(value); }else if (tab =="DXCLUSTERSHOWWCY"){ dxClusterPage->setShowWCYRadiobutton(value); }else if(tab =="DXCLUSTERSERVERPORT"){ dxClusterServers << value; //qDebug() << "SetupDialog::processConfigLine: dxClusterServers: " << dxClusterServers.last() << endl; }else if (tab =="DXCLUSTERSERVERTOUSE"){ dxClusterServerToUse=value; } else if(tab =="NEWONECOLOR"){ colorsPage->setNewOneColor(value); }else if(tab =="NEEDEDCOLOR"){ colorsPage->setNeededColor(value); }else if(tab =="WORKEDCOLOR"){ colorsPage->setWorkedColor(value); }else if(tab =="CONFIRMEDCOLOR"){ colorsPage->setConfirmedColor(value); }else if(tab =="DEFAULTCOLOR"){ colorsPage->setDefaultColor(value); //qDebug() << "SetupDialog::processConfigLine: DEFAULTCOLOR: " << value << endl; }else if(tab =="HAMLIBRIGTYPE"){ //qDebug() << "SetupDialog::processConfigLine: Before HAMLIBRIGTYPE: " << value << endl; hamlibPage->setRigType(value); //qDebug() << "SetupDialog::processConfigLine: After HAMLIBRIGTYPE: " << value << endl; }else if(tab =="HAMLIBSERIALPORT"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALPORT: " << value << endl; hamlibPage->setSerialPort(value); }else if(tab =="HAMLIBSERIALBAUDS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALBAUDS: " << value << endl; hamlibPage->setSerialSpeed(value); }else if(tab =="HAMLIB"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIB: " << value << endl; hamlibPage->setActive(value); }else if(tab =="HAMLIBSERIALDATABITS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALDATABITS: " << value << endl; hamlibPage->setDataBits(value); }else if(tab =="HAMLIBSERIALSTOPBITS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALSTOPBITS: " << value << endl; hamlibPage->setStopBits(value); }else if(tab =="HAMLIBSERIALFLOWCONTROL"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALFLOWCONTROL: " << value << endl; hamlibPage->setFlowControl(value); }else if(tab =="HAMLIBSERIALPARITY"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALPARITY: " << value << endl; hamlibPage->setParity(value); }else if(tab =="HAMLIBSERIALRTS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALRTS: " << value << endl; //hamlibPage->setRTS(value); }else if(tab =="HAMLIBSERIALDTR"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALDTR: " << value << endl; //hamlibPage->setDTR(value); }else if(tab =="SELECTEDLOG"){ //qDebug() << "SetupDialog::processConfigLine: SELECTEDLOG: " << value << endl; i = value.toInt(); if (dataProxy->doesThisLogExist(i)) { //qDebug() << "SetupDialog::processConfigLine: dataProxy->doesThisLogExist TRUE" << endl; } else { //qDebug() << "SetupDialog::processConfigLine: dataProxy->doesThisLogExist FALSE" << endl; i = 0; while(!dataProxy->doesThisLogExist(i)) { i++; } } logsPage->setSelectedLog(i); //qDebug() << "SetupDialog::processConfigLine: dataProxy->doesThisLogExist END" << endl; }else if(tab =="CLUBLOGACTIVE"){ clubLogPage->setClubLog(value); } else if(tab =="CLUBLOGREALTIME"){ clubLogPage->setClubLogRealTime(value); } else if(tab =="CLUBLOGCALL"){ clubLogPage->setCallsign(value); } else if(tab =="CLUBLOGPASS"){ clubLogPage->setPassword(value); } else if(tab =="CLUBLOGEMAIL"){ clubLogPage->setEmail(value); } else if(tab =="CLUBLOGUSESTATIONCALLSIGN"){ clubLogPage->setUseStationCall(value); }else{ //qDebug() << "SetupDialog::processConfigLine: NONE: " << endl; } // Lines are: Option = value; //qDebug() << "SetupDialog::processConfigLine: END " << endl; return true; } void SetupDialog::readActiveBands (const QString actives) { // Checks a "10m, 12m" QString, checks if they are valid bands and import to the // bands used in the program //qDebug() << "SetupDialog::readActiveBands: " << actives << endl; bool atLeastOne = false; QStringList values = actives.split(", ", QString::SkipEmptyParts); QStringList _abands; for (int i = 0; i < values.size() ; i++) { if (isValidBand(values.at(i))) { if (!atLeastOne) { //qDebug() << "SetupDialog::readActiveBands (at least One!): " << values.at(i) << endl; atLeastOne = true; _abands.clear(); } _abands << values.at(i); //qDebug() << "SetupDialog::readActiveBands: " << values.at(i) << endl; } } bands.clear(); _abands.removeDuplicates(); bands << dataProxy->getBandsInLog(-1); bands << _abands; bands.removeDuplicates(); } void SetupDialog::readActiveModes (const QString actives) { //qDebug() << "SetupDialog::readActiveModes: " << actives << endl; bool atLeastOne = false; QStringList _amodes;//, _backModes; // _backModes.clear(); // _backModes << modes; QStringList values = actives.split(", ", QString::SkipEmptyParts); values.removeDuplicates(); for (int i = 0; i < values.size() ; i++) { if (isValidMode(values.at(i))) { if (!atLeastOne) { atLeastOne = true; _amodes.clear(); } _amodes << values.at(i); } } modes.clear(); modes << dataProxy->getModesInLog(-1); modes << _amodes; modes.removeDuplicates(); //qDebug() << "SetupDialog::readActiveModes: " << modes.join(" / ") << endl; } bool SetupDialog::isValidBand (const QString b) { //qDebug() << "SetupDialog::isValidBand: "<< b << endl; QString stringQuery = QString("SELECT id FROM band WHERE name='%1'").arg(b); QSqlQuery query(stringQuery); query.next(); return query.isValid(); } bool SetupDialog::isValidMode (const QString b) { //qDebug() << "SetupDialog::isValidMode: " << b << endl; QString stringQuery = QString("SELECT id FROM mode WHERE name='%1'").arg(b); QSqlQuery query(stringQuery); query.next(); return query.isValid(); } void SetupDialog::setDefaults() { //qDebug() << "SetupDialog::setDefaults" << endl; //miscPage->setInMemory("TRUE"); miscPage->setRealTime("TRUE"); miscPage->setUTCTime("TRUE"); miscPage->setImperial("FALSE"); //Metric system is the default miscPage->setAlwaysADIF("FALSE"); miscPage->setSendQSLWhenRec("TRUE"); miscPage->setShowStationCallSignInSearch("TRUE"); miscPage->setKeepMyData("TRUE"); miscPage->setCheckNewVersions("TRUE"); miscPage->setReportInfo("FALSE"); miscPage->setDXMarathon("FALSE"); UDPPage->setUDPServer("FALSE"); UDPPage->setUDPServerPort("2237"); UDPPage->setTimeout("2000"); UDPPage->setLogFromWSJTx("FALSE"); UDPPage->setReaDataFromWSJTx("FALSE"); UDPPage->setAutoLogFromWSJTx("FALSE"); dxClusterPage->setShowHFRadiobutton("TRUE"); dxClusterPage->setShowVHFRadiobutton("TRUE"); dxClusterPage->setShowWARCRadiobutton("TRUE"); dxClusterPage->setShowWorkedRadiobutton("TRUE"); dxClusterPage->setShowConfirmedRadiobutton("TRUE"); dxClusterPage->setShowANNRadiobutton("TRUE"); dxClusterPage->setShowWWVRadiobutton("TRUE"); dxClusterPage->setShowWCYRadiobutton("TRUE"); dxClusterServers.clear(); dxClusterServers.append("dxfun.com:8000"); dxClusterServerToUse = "dxfun.com:8000"; if (modes.isEmpty()) { modes << "SSB" << "CW" << "RTTY"; modes.removeDuplicates(); } if (bands.isEmpty()) { bands << "10M" << "12M" << "15M" << "17M" << "20M" << "40M" << "80M" << "160M"; bands.removeDuplicates(); } } QString SetupDialog::checkAndFixASCIIinADIF(const QString _data) { //qDebug() << "SetupDialog::checkAndFixASCIIinADIF " << _data << endl; //TODO: this function is also in the FileManager class. Maybe I should call that one and keep just one copy ushort unicodeVal; QString st = _data; QString newString; newString.clear(); for(int i=0; i < st.length(); i++) { // Get unicode VALUE into unicodeVal unicodeVal = (st.at(i)).unicode(); if ((20 <= unicodeVal ) && (unicodeVal <= 126)) { newString.append(st.at(i)); } //qDebug() << "SetupDialog::checkAndFixunicodeinADIF: " << st.at(i) <<" = " << QString::number(unicodeVal) << endl; } // Show into another lineEdit return newString; } bool SetupDialog::haveAtleastOneLog() { return dataProxy->haveAtLeastOneLog(); } void SetupDialog::setClubLogActive(const bool _b) { if (_b == true) { clubLogPage->setClubLog("True"); } else { clubLogPage->setClubLog("False"); } } void SetupDialog::checkIfNewBandOrMode() { //qDebug() << "SetupDialog::checkIfNewBandOrMode " << endl; QStringList _items; _items.clear(); //qDebug() << "SetupDialog::checkIfNewBandOrMode -1" << endl; _items << dataProxy->getBandsInLog(-1); //qDebug() << "SetupDialog::checkIfNewBandOrMode -2" << endl; _items << (bandModePage->getBands()).split(", ", QString::SkipEmptyParts); //qDebug() << "SetupDialog::checkIfNewBandOrMode -3" << endl; _items.removeDuplicates(); //qDebug() << "SetupDialog::checkIfNewBandOrMode -4" << endl; bandModePage->setActiveBands(_items); //qDebug() << "SetupDialog::checkIfNewBandOrMode -5" << endl; _items.clear(); _items << dataProxy->getModesInLog(-1); _items << (bandModePage->getModes()).split(", ", QString::SkipEmptyParts); _items.removeDuplicates(); bandModePage->setActiveModes(_items); //qDebug() << "SetupDialog::checkIfNewBandOrMode END" << endl; } void SetupDialog::slotAnalyzeNewLogData(const QStringList _qs) { //qDebug() << "SetupDialog::slotAnalyzeNewLogData (length=" << QString::number(_qs.length()) << ")" << endl; //qDebug() << "SetupDialog::slotAnalyzeNewLogData" << endl; // We receive the station callsign and operators from the logs tab if (_qs.length()!=2) { return; } userDataPage->setStationQrz(_qs.at(0)); userDataPage->setOperators(_qs.at(1)); } void SetupDialog::slotSetStationCallSign(const QString _p) { //qDebug() << "SetupDialog::slotSetStationCallSign: " << _p << endl; logsPage->setDefaultStationCallsign(_p); } void SetupDialog::slotSetOperators(const QString _p) { //qDebug() << "SetupDialog::slotSetOperators: " << _p << endl; logsPage->setDefaultOperators(_p); } void SetupDialog::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery) { emit queryError(functionFailed, errorCodeS, errorCodeN, failedQuery); } klog-0.9.8.1/COPYING0000644000175000017500000010451313532572307012651 0ustar develdevel GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . klog-0.9.8.1/downloadcty.cpp0000644000175000017500000001345413532572307014654 0ustar develdevel#include "downloadcty.h" #include #include #include #include //#include DownLoadCTY::DownLoadCTY(const QString _klogDir, const QString _klogVersion) : QObject(0) { //qDebug() << "DownLoadCTY::DownLoadCTY(): " << _klogDir << endl; util = new Utilities; url = new QUrl; klogDir = _klogDir; result = -1; // Error unknown manager = new QNetworkAccessManager; request = new QNetworkRequest; //request->setUrl(QUrl("http://www.country-files.com/cty/cty.csv")); request->setUrl(QUrl("http://www.country-files.com/bigcty/cty.csv")); QString ver = "KLog"+_klogVersion; QByteArray str; str.clear(); str.append(util->getAgent(_klogVersion)); //str.append(_klogVersion); //request.setUrl(QUrl("http://qt.nokia.com")); request->setRawHeader("User-Agent", str); //request->setHeader(QNetworkRequest::UserAgentHeader, str); //qDebug() << "DownLoadCTY::DownLoadCTY() - UserAgent: " << request->rawHeader("QNetworkRequest::UserAgentHeader") << endl; QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(slotDownloadFinished(QNetworkReply*))); //qDebug() << "DownLoadCTY::DownLoadCTY(): - END" << endl; } DownLoadCTY::~DownLoadCTY() { //qDebug() << "DownLoadCTY::~DownLoadCTY" << endl; } void DownLoadCTY::slotDownloadFinished(QNetworkReply *reply) { //qDebug() << "DownLoadCTY::slotDownloadFinished" << endl; QUrl url = reply->url(); //qDebug() << "DownLoadCTY::slotDownloadFinished - URL: " << url.toString() << endl; QMessageBox msgBox; QString aux; aux.clear(); if (reply->error()) { //fprintf(stderr, "Download of %s failed: %s\n", // url.toEncoded().constData(), // qPrintable(reply->errorString())); //errorCode = query.lastError().number(); msgBox.setIcon(QMessageBox::Warning); aux = tr("Download of cty.csv failed with the following error code: "); msgBox.setText(aux + reply->errorString()); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); } else { QString filename = saveFileName(url); if (saveToDisk(filename, reply)) { msgBox.setIcon(QMessageBox::Information); aux = tr("Download of cty.csv done."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); emit actionReturnDownload(QNetworkReply::NoError); } //printf("Download of %s succeeded (saved to %s)\n", // url.toEncoded().constData(), qPrintable(filename)); } reply->deleteLater(); emit done(); } int DownLoadCTY::download() { //qDebug() << "DownLoadCTY::download..." << endl; manager->get(*request); return 1; } void DownLoadCTY::slotDownloadProgress(qint64 received, qint64 total) { //qDebug() << "DownLoadCTY::slotDownloadProgress: " << endl; //qDebug() << "DownLoadCTY::downloadProgress: " << QString::number(received) << "/" << QString::number(total) << endl; //qDebug() << received << total; emit actionShowProgres(received, total); } void DownLoadCTY::slotErrorManagement(QNetworkReply::NetworkError networkError) { //qDebug() << "DownLoadCTY::slotErrorManagement: " << QString::number(networkError) << endl; result = networkError; if (result == QNetworkReply::NoError) { //qDebug() << "DownLoadCTY::downloadFinished: No error" << endl; } else if (result == QNetworkReply::HostNotFoundError) { //qDebug() << "DownLoadCTY::downloadFinished: Host not found" << endl; } else { //qDebug() << "DownLoadCTY::downloadFinished: ERROR: " << QString::number(result) << endl; } actionError(result); } QString DownLoadCTY::saveFileName(const QUrl &url) { //qDebug() << "DownLoadCTY::saveFileName" << endl; QString path = url.path(); QString basename = QFileInfo(path).fileName(); QMessageBox msgBox; QString aux; aux.clear(); if (basename.isEmpty()) basename = "download"; if (QFile::exists(basename)) { msgBox.setIcon(QMessageBox::Warning); aux = tr("There is already a cty.csv file in the folder but it will be replaced with the new one."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); // already exists, don't overwrite //int i = 0; //basename += '.'; //while (QFile::exists(basename + QString::number(i))) // ++i; //basename += QString::number(i); } return basename; } bool DownLoadCTY::saveToDisk(const QString &filename, QIODevice *data) { //qDebug() << "DownLoadCTY::saveToDisk: " << filename << endl; QFile file(filename); QMessageBox msgBox; QString aux; aux.clear(); if (!file.open(QIODevice::WriteOnly)) { msgBox.setIcon(QMessageBox::Warning); aux = tr("Could not open %1 for writing").arg(filename); //aux = tr("Could not open ") + filename + tr(" for writing."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); //fprintf(stderr, "Could not open %s for writing: %s\n", // qPrintable(filename), // qPrintable(file.errorString())); return false; } file.write(data->readAll()); file.close(); return true; } klog-0.9.8.1/main.cpp0000644000175000017500000003572613532572307013257 0ustar develdevel /* This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include //#include #include #include #include //#include #include "startwizard.h" #include "mainwindow.h" #include "utilities.h" int main(int argc, char *argv[]) { QString version = "0.9.8.1" ; QDir d1 = QDir(); Utilities util = Utilities(); QStringList arguments; QTextStream cout(stdout); QApplication app(argc, argv); QString iconSt; iconSt = ":/img/klog.ico"; QIcon KLogIcon(iconSt); QApplication::setWindowIcon(KLogIcon); //QApplication app(argc, argv); app.setApplicationName(QString("KLog")); app.setApplicationVersion(QString(version)); // Now we check if the user is executing from the command line arguments.clear(); arguments << app.arguments(); if (arguments.length()>1) { if (arguments.contains("-h")) { //cout << "Usage: klog [OPTION]... [FILE]..." << endl; cout << "Usage: klog [OPTION]..." << endl; cout << "Options:" << endl; cout << " -? Display this help" << endl; cout << " -h Display this help" << endl; cout << " -v Display program version" << endl; //cout << " -e Export Adif file " << endl; } else if (arguments.contains("-?")) { cout << "Usage: klog [OPTION]..." << endl; cout << "Options:" << endl; cout << " -? Display this help" << endl; cout << " -h Display this help" << endl; cout << " -v Display program version" << endl; } else if (arguments.contains("-v")) { cout << "Version: KLog-" << app.applicationVersion() << endl; } else { cout << "Usage: klog [OPTION]..." << endl; cout << "Options:" << endl; cout << " -? Display this help" << endl; cout << " -h Display this help" << endl; cout << " -v Display program version" << endl; } app.quit(); return 0; } //qDebug() << "KLog Main: Start of translation activities: "<< (QTime::currentTime()).toString("HH:mm:ss") << endl; //qDebug() << "KLog Main: Detected language: " << (QLocale::system().name()).left(2) << ".qm" << endl; // Translations begin QTranslator qtTranslator; qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); app.installTranslator(&qtTranslator); QTranslator myappTranslator; bool missingTranslation = false; //QString msgOSFilePath = QString(); // The OS depending part of the message to be printed if no translation is found. #if defined(Q_OS_WIN) //qDebug() << "KLog WIN " << endl; if (QFile::exists(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm") ) { myappTranslator.load(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm"); } else if (QFile::exists(QDir::homePath()+"/klog/klog_" + (QLocale::system().name()).left(2)+ ".qm") ) { myappTranslator.load(QDir::homePath()+"/klog/klog_" + (QLocale::system().name())); } else if (((QLocale::system().name()).left(2)) == "en") { // If language is English, it will execute without showing message } else { missingTranslation = true; //msgOSFilePath = QCoreApplication::applicationDirPath() + "/translations/" ; } #elif defined(Q_OS_OSX) //qDebug() << "KLog OSX " << endl; if (QFile::exists(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm") ) { myappTranslator.load(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm"); } else if (((QLocale::system().name()).left(2)) == "en") { // If language is English, it will execute without showing message } else { missingTranslation = true; //msgOSFilePath = QCoreApplication::applicationDirPath() + "/translations/" ; } #else //qDebug() << "KLog OTHER OS: " << (QLocale::system()).name() << endl; if (QFile::exists("klog_" + (QLocale::system().name()).left(2) + ".qm") ) { myappTranslator.load("klog_" + (QLocale::system().name()).left(2)); } else if (QFile::exists("/usr/share/klog/translations/klog_" + (QLocale::system().name()).left(2) + ".qm") ) { //qDebug() << "KLog OTHER -2: " << "/usr/share/klog/klog_" + (QLocale::system().name()).left(2) << endl; myappTranslator.load("/usr/share/klog/translations/klog_" + (QLocale::system().name())); } else if (QFile::exists(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm")) { //qDebug() << "KLog OTHER -3: " << QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) << endl; myappTranslator.load(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name())); } else if (((QLocale::system().name()).left(2)) == "en") { // If language is English, it will execute without showing message } else { missingTranslation = true; //sgOSFilePath = QCoreApplication::applicationDirPath() + "/translations/" ; } #endif if (missingTranslation) { //qDebug() << "KLog Main: Translation missing! " << endl; QMessageBox msgBox; QString urlTranslate = QString(); urlTranslate = "

TRANSLATE

"; QString msg = QString(); msgBox.setWindowTitle("KLog"); msgBox.setIcon(QMessageBox::Warning); msgBox.setTextFormat(Qt::RichText); QString language = (QLocale::system().name()).left(2); msg = QString("No translation files for your language have been found so KLog will be shown in English.") + "

" + QString("If you have the klog_%1.qm file for your language, you can copy it into the %2/translations/ folder and restart KLog.

If you want to help to translate KLog into your language, please contact the author.").arg(language).arg(QCoreApplication::applicationDirPath()) + "

" + urlTranslate; msgBox.setText(msg); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } //qDebug() << "KLog Main-1" << (QTime::currentTime()).toString("HH:mm:ss") << endl; app.installTranslator(&myappTranslator); //qDebug() << "KLog Main: End of translation activities: "<< (QTime::currentTime()).toString("HH:mm:ss") << endl; // Traslations end QString configFileName, klogDir; klogDir = util.getHomeDir(); configFileName = util.getCfgFile(); //qDebug() << "KLog Main-10" << endl; //qDebug() << "KLog Main: Setting klog dir: " << (QTime::currentTime()).toString("HH:mm:ss")<< endl;; if (!QDir::setCurrent (klogDir) ) { //qDebug() << "MAIN: KLogDir does not exist.... creating " << endl; if (d1.mkdir(klogDir)) { if (QDir::setCurrent (klogDir) ) { //qDebug() << "MAIN: KLogDir has just been created and pointed " << endl; } else { //qDebug() << "MAIN: KLogDir has just been created and pointed FAILED! " << endl; } } else { //qDebug() << "MAIN: KLogDir can not be created?? " << endl; } } else { //qDebug() << "MAIN: KLogDir already existed!! " << endl; } //qDebug() << "KLog Main: Setting klog dir - finished: " << (QTime::currentTime()).toString("HH:mm:ss") << endl; //qDebug() << "KLog Main: Setting config file: " << (QTime::currentTime()).toString("HH:mm:ss") << endl; if(!QFile::exists(configFileName)) { //qDebug() << "MAIN: Starting wizard... " << endl; StartWizard *wizard = new StartWizard(klogDir, version); wizard->setModal(true); int inMemory = wizard->exec(); //qDebug() << "MAIN: Wizard inMemory: " << QString::number(inMemory) << endl; if (inMemory == 1) { //qDebug() << "MAIN: Wizard accepted " << QString::number(inMemory) << " ... Will run in Memory " << endl; MainWindow mw(klogDir, version); mw.show(); return app.exec(); } else if (inMemory == 2) { //qDebug() << "MAIN: Wizard accepted " << QString::number(inMemory) << " ... Will run in file " << endl; MainWindow mw(klogDir, version); mw.show(); return app.exec(); } else { //qDebug() << "MAIN: Wizard cancelled " << QString::number(inMemory) << " ... should close " << endl; QMessageBox msgBox; msgBox.setText(QObject::tr("Install wizard was canceled before completing...")); msgBox.setInformativeText(QObject::tr("Do you want to remove the KLog dir from your disk?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: if (QDir::setCurrent (QDir::homePath()) ) { if (d1.remove(klogDir)) { QMessageBox msgBox; msgBox.setText(QObject::tr("Your KLog dir has been removed") +"\n\n" + QObject::tr("Thank you for running KLog!")); msgBox.exec(); } else { QMessageBox msgBox; msgBox.setText(QObject::tr("I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk.") +"\n\n" + QObject::tr("Thank you for running KLog!")); msgBox.exec(); } } else { QMessageBox msgBox; msgBox.setText(QObject::tr("Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk.") +"\n\n" + QObject::tr("Thank you for running KLog!")); msgBox.exec(); } break; case QMessageBox::No: QMessageBox msgBox; msgBox.setText(QObject::tr("Remember that your KLog dir is on your system...") + "\n\n" + QObject::tr("Thank you for running KLog!")); msgBox.exec(); break; } return 0; } } else { //qDebug() << "Main: Start of DB Activities" << endl; DataBase *db = new DataBase(Q_FUNC_INFO, version, util.getKLogDBFile()); //qDebug() << "Main: After Start of DB Activities" << endl; if (!db->createConnection()) { //qDebug() << "Main: Conection not created" << endl; return -1; // Exits with an error; no DB has been created } else { db->updateIfNeeded(); // Check if we need to update the DB //qDebug() << "Main: DB Updated" << endl; } db->~DataBase(); //qDebug() << "Main: End of DB Activities" << endl; //qDebug() << "KLog Main-50" << (QTime::currentTime()).toString("HH:mm:ss") << endl; QPixmap pixmap(":img/klog_512x512.png"); //qDebug() << "KLog Main-51" << (QTime::currentTime()).toString("HH:mm:ss") << endl; QSplashScreen splash(pixmap); //qDebug() << "KLog Main-52" << (QTime::currentTime()).toString("HH:mm:ss") << endl; splash.show(); //qDebug() << "KLog Main-100" << (QTime::currentTime()).toString("HH:mm:ss") << endl; MainWindow mw(klogDir, version); splash.finish(&mw); //qDebug() << "KLog Main-101" << (QTime::currentTime()).toString("HH:mm:ss") << endl; mw.show(); //qDebug() << "KLog Main-101.5" << (QTime::currentTime()).toString("HH:mm:ss") << endl; //qDebug() << "KLog Main-102" << (QTime::currentTime()).toString("HH:mm:ss") << endl; return app.exec(); //qDebug() << "KLog Main-103" << (QTime::currentTime()).toString("HH:mm:ss") << endl; } //qDebug() << "KLog Main-END: " << (QTime::currentTime()).toString("HH:mm:ss") << endl; //return app.exec(); } klog-0.9.8.1/contest.cpp0000644000175000017500000000507013532572307013777 0ustar develdevel/*************************************************************************** contest.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "contest.h" #include Contest::Contest() { constrid = 1; //qDebug() << "Contest::Contest - START:END" << endl; } Contest::Contest(const QStringList _qs) { constrid = 2; //qDebug() << "Contest::Contest (_qs) - START:END" << endl; } Contest::~Contest() { } bool Contest::isMultiplier(const QStringList _qs) { //qDebug() << "Contest::isMultiplier" << endl; return false; } int Contest::getQSOPoints(const QStringList _qs) { //qDebug() << "Contest::getQSOPoints" << endl; return 0; } int Contest::getTotalScore() { return 0; } int Contest::getMultipliers() { return 0; } int Contest::getPoints() { return 0; } bool Contest::saveFileToSend(const QString& _fileName) { //qDebug() << "Contest::saveFileToSend" << endl; return false; } klog-0.9.8.1/filemanager.h0000644000175000017500000001226113532572307014237 0ustar develdevel#ifndef FILEMANAGER_H #define FILEMANAGER_H /*************************************************************************** filemanager.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include //#include #include #include #include #include #include #include #include #include #include #include "world.h" #include "awards.h" #include "database.h" #include "dataproxy.h" #include "dataproxy_sqlite.h" #include "utilities.h" enum { CQZones = 40, ITUZones = 90, DXCCEntities = 521 // http://www.adif.org/adif302.htm#Country%20Codes }; class FileManager : public QWidget { Q_OBJECT public: FileManager(DataProxy *dp); //FileManager(DataProxy *dp, const QString _klogDir); FileManager(DataProxy *dp, const QString _klogDir, const QString _softVersion); //FileManager(DataProxy *dp, const QString _softVersion); ~FileManager(); //bool readAdif(const QString& tfileName, const int logN); bool adifReadLog(const QString& tfileName, const int logN); bool adifLoTWReadLog(const QString& tfileName); int adifLoTWLogExport(const QString& _fileName, const int _logN); bool adifLogExport(const QString& _fileName, const int _logN); bool adifLogExportMarked(const QString& _fileName); bool adifReqQSLExport(const QString& _fileName); bool cabrilloLogExport(const QString& _fileName, const QString _contestType, const int logNconst); bool modifySetupFile(const QString& _filename, QString _field, const QString _value); void setVersion(const QString _version); private: bool adifLogExportToFile(const QString& _fileName, const int _logN=0, bool justMarked = false, bool _qslRequested = false, bool _lotw=false); bool cabrilloLogExportToFile(const QString& _fileName, const int logNconst); bool cabrilloLogExportCQWWToFile(const QString& _fileName, const int logNconst); //bool adifCheckMoreThanOneLog(QFile &_f); int howManyLogsInFile(QFile & _f); bool fillHashLog(QFile & _f); QStringList getListOfLogsInFile(QFile & _f); //QString checkAndFixASCIIinADIF(const QString _data); bool processQsoReadingADIF(const QStringList _line, const int logNumber, const bool _keepLogsInFile); void queryPreparation(const int _logN); bool checkADIFValidFormat(const QStringList _qs); QStringList readAdifField (const QString _field); QString prepareStringLog(); bool dbCreated; DataBase *db; //float softwareVersion; //DataProxy_SQLite *dataProxy; DataProxy *dataProxy;//, *dataProxyPrepared; Utilities *util; bool rstTXDefault, rstRXDefault; // If true and a log is not including RST, 59 is automatically added //bool printQs(const QString _q, const QStringList _line); bool printQs(const QStringList _line); //int confirmed; QString klogDir; QString klogVersion; //QProgressBar *progressBar; bool ignoreUnknownAlways; // When importing ADIF, ignore all unknown fields. bool noMoreQso; World *world; Awards *awards; //QSqlDatabase db; QHash hashLogs; // to create different logs when importing a ADIF file QSqlQuery preparedQuery; int constrid; // Just an id for the constructor to check who is being executed at one specific time signals: void queryError(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); // To alert about any failed query execution }; #endif // FILEMANAGER_H klog-0.9.8.1/Makefile0000644000175000017500000043362513532577077013300 0ustar develdevel############################################################################# # Makefile for building: build/target/klog # Generated by qmake (3.1) (Qt 5.11.3) # Project: KLog.pro # Template: app # Command: /usr/lib/qt5/bin/qmake -o Makefile KLog.pro ############################################################################# MAKEFILE = Makefile ####### Compiler, tools and options CC = gcc CXX = g++ DEFINES = -DAPP_VERSION=0.9.8.1 -DAPP_NAME=KLog -DAPP_UNIX_NAME=klog -DQT_USE_QSTRINGBUILDER -DQT_STRICT_ITERATORS -DAPP_LINUX -DQT_NO_DEBUG -DQT_PRINTSUPPORT_LIB -DQT_CHARTS_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_SQL_LIB -DQT_NETWORK_LIB -DQT_SERIALPORT_LIB -DQT_CORE_LIB CFLAGS = -pipe -O2 -Wall -W -D_REENTRANT -fPIC $(DEFINES) CXXFLAGS = -pipe -O2 -std=gnu++11 -Wall -W -D_REENTRANT -fPIC $(DEFINES) INCPATH = -I. -isystem /usr/include/i386-linux-gnu/qt5 -isystem /usr/include/i386-linux-gnu/qt5/QtPrintSupport -isystem /usr/include/i386-linux-gnu/qt5/QtCharts -isystem /usr/include/i386-linux-gnu/qt5/QtWidgets -isystem /usr/include/i386-linux-gnu/qt5/QtGui -isystem /usr/include/i386-linux-gnu/qt5/QtSql -isystem /usr/include/i386-linux-gnu/qt5/QtNetwork -isystem /usr/include/i386-linux-gnu/qt5/QtSerialPort -isystem /usr/include/i386-linux-gnu/qt5/QtCore -Ibuild/moc -isystem /usr/include/libdrm -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ QMAKE = /usr/lib/qt5/bin/qmake DEL_FILE = rm -f CHK_DIR_EXISTS= test -d MKDIR = mkdir -p COPY = cp -f COPY_FILE = cp -f COPY_DIR = cp -f -R INSTALL_FILE = install -m 644 -p INSTALL_PROGRAM = install -m 755 -p INSTALL_DIR = cp -f -R QINSTALL = /usr/lib/qt5/bin/qmake -install qinstall QINSTALL_PROGRAM = /usr/lib/qt5/bin/qmake -install qinstall -exe DEL_FILE = rm -f SYMLINK = ln -f -s DEL_DIR = rmdir MOVE = mv -f TAR = tar -cf COMPRESS = gzip -9f DISTNAME = klog0.9.8.1 DISTDIR = /home/devel/Desktop/klog-0.9.8.1/build/obj/klog0.9.8.1 LINK = g++ LFLAGS = -Wl,-O1 LIBS = $(SUBLIBS) -lhamlib -lQt5PrintSupport -lQt5Charts -lQt5Widgets -lQt5Gui -lQt5Sql -lQt5Network -lQt5SerialPort -lQt5Core -lGL -lpthread AR = ar cqs RANLIB = SED = sed STRIP = strip ####### Output directory OBJECTS_DIR = build/obj/ ####### Files SOURCES = main.cpp \ aboutdialog.cpp \ mainwindow.cpp \ setupdialog.cpp \ world.cpp \ logwindow.cpp \ filemanager.cpp \ contest.cpp \ contest_cqwwdxssb.cpp \ database.cpp \ dataproxy.cpp \ dataproxy_sqlite.cpp \ downloadcty.cpp \ dxcluster.cpp \ setuppagemisc.cpp \ locator.cpp \ awards.cpp \ setuppageuserdata.cpp \ setuppagedxcluster.cpp \ setuppagecolors.cpp \ setuppagelogs.cpp \ setuppageworldeditor.cpp \ setupentitydialog.cpp \ startwizard.cpp \ mainwindowsattab.cpp \ awarddxmarathon.cpp \ setuppagelogsnew.cpp \ setuppageclublog.cpp \ elogclublog.cpp \ softwareupdate.cpp \ softwareupdatedialog.cpp \ utilities.cpp \ dxccstatuswidget.cpp \ mainwindowmydatatab.cpp \ mainwindowinputcomment.cpp \ mainwindowinputothers.cpp \ mainwindowinputeqsl.cpp \ mainwindowinputqsl.cpp \ setuppagebandmode.cpp \ logmodel.cpp \ searchwidget.cpp \ infowidget.cpp \ showerrordialog.cpp \ udpserver.cpp \ setuppageudp.cpp \ statisticswidget.cpp \ charts/barchartstats.cpp \ updatesatsdata.cpp \ charts/statsgeneralchartwidget.cpp \ charts/statsqsosperyearbarchartwidget.cpp \ charts/statsentitiesperyearbarchartwidget.cpp \ charts/statscqzperyearbarchartwidget.cpp \ charts/statsqsospermodebarchartwidget.cpp \ charts/statsqsosperdxccbarchartwidget.cpp \ charts/statsqsospercontinentbarchartwidget.cpp \ charts/statsqsosperhourbarchartwidget.cpp \ charts/statsqsospermonthbarchartwidget.cpp \ charts/statsworkedconfirmedpiechartwidget.cpp \ charts/statsworkedsentpiechartwidget.cpp \ charts/statssentconfirmedpiechartwidget.cpp \ charts/statsqsosperbandbarchartwidget.cpp \ setuppagesats.cpp \ setuppagesatsnew.cpp \ setuppagehamlib.cpp \ hamlibclass.cpp build/rcc/qrc_klog.cpp \ build/moc/moc_setupdialog.cpp \ build/moc/moc_aboutdialog.cpp \ build/moc/moc_mainwindow.cpp \ build/moc/moc_world.cpp \ build/moc/moc_logwindow.cpp \ build/moc/moc_filemanager.cpp \ build/moc/moc_contest.cpp \ build/moc/moc_setuppagemisc.cpp \ build/moc/moc_dxcluster.cpp \ build/moc/moc_awards.cpp \ build/moc/moc_setuppageuserdata.cpp \ build/moc/moc_setuppagedxcluster.cpp \ build/moc/moc_setuppagecolors.cpp \ build/moc/moc_setuppagelogs.cpp \ build/moc/moc_setuppageworldeditor.cpp \ build/moc/moc_setupentitydialog.cpp \ build/moc/moc_startwizard.cpp \ build/moc/moc_downloadcty.cpp \ build/moc/moc_dataproxy.cpp \ build/moc/moc_dataproxy_sqlite.cpp \ build/moc/moc_mainwindowsattab.cpp \ build/moc/moc_setuppagelogsnew.cpp \ build/moc/moc_setuppageclublog.cpp \ build/moc/moc_elogclublog.cpp \ build/moc/moc_softwareupdate.cpp \ build/moc/moc_softwareupdatedialog.cpp \ build/moc/moc_dxccstatuswidget.cpp \ build/moc/moc_mainwindowmydatatab.cpp \ build/moc/moc_mainwindowinputcomment.cpp \ build/moc/moc_mainwindowinputothers.cpp \ build/moc/moc_mainwindowinputeqsl.cpp \ build/moc/moc_mainwindowinputqsl.cpp \ build/moc/moc_setuppagebandmode.cpp \ build/moc/moc_logmodel.cpp \ build/moc/moc_searchwidget.cpp \ build/moc/moc_infowidget.cpp \ build/moc/moc_showerrordialog.cpp \ build/moc/moc_udpserver.cpp \ build/moc/moc_setuppageudp.cpp \ build/moc/moc_statisticswidget.cpp \ build/moc/moc_barchartstats.cpp \ build/moc/moc_updatesatsdata.cpp \ build/moc/moc_statsgeneralchartwidget.cpp \ build/moc/moc_statsqsosperyearbarchartwidget.cpp \ build/moc/moc_statsentitiesperyearbarchartwidget.cpp \ build/moc/moc_statscqzperyearbarchartwidget.cpp \ build/moc/moc_statsqsosperbandbarchartwidget.cpp \ build/moc/moc_statsqsospermodebarchartwidget.cpp \ build/moc/moc_statsqsosperdxccbarchartwidget.cpp \ build/moc/moc_statsqsospercontinentbarchartwidget.cpp \ build/moc/moc_statsqsosperhourbarchartwidget.cpp \ build/moc/moc_statsqsospermonthbarchartwidget.cpp \ build/moc/moc_statsworkedconfirmedpiechartwidget.cpp \ build/moc/moc_statsworkedsentpiechartwidget.cpp \ build/moc/moc_statssentconfirmedpiechartwidget.cpp \ build/moc/moc_setuppagesats.cpp \ build/moc/moc_setuppagesatsnew.cpp \ build/moc/moc_setuppagehamlib.cpp \ build/moc/moc_hamlibclass.cpp OBJECTS = build/obj/main.o \ build/obj/aboutdialog.o \ build/obj/mainwindow.o \ build/obj/setupdialog.o \ build/obj/world.o \ build/obj/logwindow.o \ build/obj/filemanager.o \ build/obj/contest.o \ build/obj/contest_cqwwdxssb.o \ build/obj/database.o \ build/obj/dataproxy.o \ build/obj/dataproxy_sqlite.o \ build/obj/downloadcty.o \ build/obj/dxcluster.o \ build/obj/setuppagemisc.o \ build/obj/locator.o \ build/obj/awards.o \ build/obj/setuppageuserdata.o \ build/obj/setuppagedxcluster.o \ build/obj/setuppagecolors.o \ build/obj/setuppagelogs.o \ build/obj/setuppageworldeditor.o \ build/obj/setupentitydialog.o \ build/obj/startwizard.o \ build/obj/mainwindowsattab.o \ build/obj/awarddxmarathon.o \ build/obj/setuppagelogsnew.o \ build/obj/setuppageclublog.o \ build/obj/elogclublog.o \ build/obj/softwareupdate.o \ build/obj/softwareupdatedialog.o \ build/obj/utilities.o \ build/obj/dxccstatuswidget.o \ build/obj/mainwindowmydatatab.o \ build/obj/mainwindowinputcomment.o \ build/obj/mainwindowinputothers.o \ build/obj/mainwindowinputeqsl.o \ build/obj/mainwindowinputqsl.o \ build/obj/setuppagebandmode.o \ build/obj/logmodel.o \ build/obj/searchwidget.o \ build/obj/infowidget.o \ build/obj/showerrordialog.o \ build/obj/udpserver.o \ build/obj/setuppageudp.o \ build/obj/statisticswidget.o \ build/obj/barchartstats.o \ build/obj/updatesatsdata.o \ build/obj/statsgeneralchartwidget.o \ build/obj/statsqsosperyearbarchartwidget.o \ build/obj/statsentitiesperyearbarchartwidget.o \ build/obj/statscqzperyearbarchartwidget.o \ build/obj/statsqsospermodebarchartwidget.o \ build/obj/statsqsosperdxccbarchartwidget.o \ build/obj/statsqsospercontinentbarchartwidget.o \ build/obj/statsqsosperhourbarchartwidget.o \ build/obj/statsqsospermonthbarchartwidget.o \ build/obj/statsworkedconfirmedpiechartwidget.o \ build/obj/statsworkedsentpiechartwidget.o \ build/obj/statssentconfirmedpiechartwidget.o \ build/obj/statsqsosperbandbarchartwidget.o \ build/obj/setuppagesats.o \ build/obj/setuppagesatsnew.o \ build/obj/setuppagehamlib.o \ build/obj/hamlibclass.o \ build/obj/qrc_klog.o \ build/obj/moc_setupdialog.o \ build/obj/moc_aboutdialog.o \ build/obj/moc_mainwindow.o \ build/obj/moc_world.o \ build/obj/moc_logwindow.o \ build/obj/moc_filemanager.o \ build/obj/moc_contest.o \ build/obj/moc_setuppagemisc.o \ build/obj/moc_dxcluster.o \ build/obj/moc_awards.o \ build/obj/moc_setuppageuserdata.o \ build/obj/moc_setuppagedxcluster.o \ build/obj/moc_setuppagecolors.o \ build/obj/moc_setuppagelogs.o \ build/obj/moc_setuppageworldeditor.o \ build/obj/moc_setupentitydialog.o \ build/obj/moc_startwizard.o \ build/obj/moc_downloadcty.o \ build/obj/moc_dataproxy.o \ build/obj/moc_dataproxy_sqlite.o \ build/obj/moc_mainwindowsattab.o \ build/obj/moc_setuppagelogsnew.o \ build/obj/moc_setuppageclublog.o \ build/obj/moc_elogclublog.o \ build/obj/moc_softwareupdate.o \ build/obj/moc_softwareupdatedialog.o \ build/obj/moc_dxccstatuswidget.o \ build/obj/moc_mainwindowmydatatab.o \ build/obj/moc_mainwindowinputcomment.o \ build/obj/moc_mainwindowinputothers.o \ build/obj/moc_mainwindowinputeqsl.o \ build/obj/moc_mainwindowinputqsl.o \ build/obj/moc_setuppagebandmode.o \ build/obj/moc_logmodel.o \ build/obj/moc_searchwidget.o \ build/obj/moc_infowidget.o \ build/obj/moc_showerrordialog.o \ build/obj/moc_udpserver.o \ build/obj/moc_setuppageudp.o \ build/obj/moc_statisticswidget.o \ build/obj/moc_barchartstats.o \ build/obj/moc_updatesatsdata.o \ build/obj/moc_statsgeneralchartwidget.o \ build/obj/moc_statsqsosperyearbarchartwidget.o \ build/obj/moc_statsentitiesperyearbarchartwidget.o \ build/obj/moc_statscqzperyearbarchartwidget.o \ build/obj/moc_statsqsosperbandbarchartwidget.o \ build/obj/moc_statsqsospermodebarchartwidget.o \ build/obj/moc_statsqsosperdxccbarchartwidget.o \ build/obj/moc_statsqsospercontinentbarchartwidget.o \ build/obj/moc_statsqsosperhourbarchartwidget.o \ build/obj/moc_statsqsospermonthbarchartwidget.o \ build/obj/moc_statsworkedconfirmedpiechartwidget.o \ build/obj/moc_statsworkedsentpiechartwidget.o \ build/obj/moc_statssentconfirmedpiechartwidget.o \ build/obj/moc_setuppagesats.o \ build/obj/moc_setuppagesatsnew.o \ build/obj/moc_setuppagehamlib.o \ build/obj/moc_hamlibclass.o DIST = Changelog \ COPYING \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/spec_pre.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/unix.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/linux.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/sanitize.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/gcc-base.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/gcc-base-unix.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/g++-base.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/g++-unix.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/qconfig.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_Baloo.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_accessibility_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_charts.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_core.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_core_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_edid_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_egl_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_fb_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_glx_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_gui.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_gui_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_input_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_kms_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_network.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_network_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_serialbus.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_serialbus_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_serialport.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_service_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_sql.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_sql_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_theme_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_xml.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_xml_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/qt_functions.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/qt_config.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++/qmake.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/spec_post.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/exclusive_builds.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/toolchain.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/default_pre.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/resolve_config.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/default_post.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/warn_on.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/qt.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/resources.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/moc.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/unix/opengl.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/uic.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/unix/thread.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/qmake_use.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/file_copies.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/testcase_targets.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/exceptions.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/yacc.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/lex.prf \ KLog.pro setupdialog.h \ aboutdialog.h \ mainwindow.h \ setupdialog.h \ world.h \ logwindow.h \ filemanager.h \ contest.h \ database.h \ setuppagemisc.h \ locator.h \ dxcluster.h \ awards.h \ setuppageuserdata.h \ setuppagedxcluster.h \ setuppagecolors.h \ contest_cqwwdxssb.h \ setuppagelogs.h \ setuppageworldeditor.h \ setupentitydialog.h \ startwizard.h \ downloadcty.h \ dataproxy.h \ dataproxy_sqlite.h \ mainwindowsattab.h \ awarddxmarathon.h \ setuppagelogsnew.h \ setuppageclublog.h \ elogclublog.h \ softwareupdate.h \ softwareupdatedialog.h \ utilities.h \ dxccstatuswidget.h \ mainwindowmydatatab.h \ mainwindowinputcomment.h \ mainwindowinputothers.h \ mainwindowinputeqsl.h \ mainwindowinputqsl.h \ setuppagebandmode.h \ logmodel.h \ searchwidget.h \ infowidget.h \ showerrordialog.h \ udpserver.h \ setuppageudp.h \ statisticswidget.h \ charts/barchartstats.h \ updatesatsdata.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperyearbarchartwidget.h \ charts/statsentitiesperyearbarchartwidget.h \ charts/statscqzperyearbarchartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ charts/statsqsospermodebarchartwidget.h \ charts/statsqsosperdxccbarchartwidget.h \ charts/statsqsospercontinentbarchartwidget.h \ charts/statsqsosperhourbarchartwidget.h \ charts/statsqsospermonthbarchartwidget.h \ charts/statsworkedconfirmedpiechartwidget.h \ charts/statsworkedsentpiechartwidget.h \ charts/statssentconfirmedpiechartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ setuppagesats.h \ setuppagesatsnew.h \ setuppagehamlib.h \ hamlibclass.h main.cpp \ aboutdialog.cpp \ mainwindow.cpp \ setupdialog.cpp \ world.cpp \ logwindow.cpp \ filemanager.cpp \ contest.cpp \ contest_cqwwdxssb.cpp \ database.cpp \ dataproxy.cpp \ dataproxy_sqlite.cpp \ downloadcty.cpp \ dxcluster.cpp \ setuppagemisc.cpp \ locator.cpp \ awards.cpp \ setuppageuserdata.cpp \ setuppagedxcluster.cpp \ setuppagecolors.cpp \ setuppagelogs.cpp \ setuppageworldeditor.cpp \ setupentitydialog.cpp \ startwizard.cpp \ mainwindowsattab.cpp \ awarddxmarathon.cpp \ setuppagelogsnew.cpp \ setuppageclublog.cpp \ elogclublog.cpp \ softwareupdate.cpp \ softwareupdatedialog.cpp \ utilities.cpp \ dxccstatuswidget.cpp \ mainwindowmydatatab.cpp \ mainwindowinputcomment.cpp \ mainwindowinputothers.cpp \ mainwindowinputeqsl.cpp \ mainwindowinputqsl.cpp \ setuppagebandmode.cpp \ logmodel.cpp \ searchwidget.cpp \ infowidget.cpp \ showerrordialog.cpp \ udpserver.cpp \ setuppageudp.cpp \ statisticswidget.cpp \ charts/barchartstats.cpp \ updatesatsdata.cpp \ charts/statsgeneralchartwidget.cpp \ charts/statsqsosperyearbarchartwidget.cpp \ charts/statsentitiesperyearbarchartwidget.cpp \ charts/statscqzperyearbarchartwidget.cpp \ charts/statsqsospermodebarchartwidget.cpp \ charts/statsqsosperdxccbarchartwidget.cpp \ charts/statsqsospercontinentbarchartwidget.cpp \ charts/statsqsosperhourbarchartwidget.cpp \ charts/statsqsospermonthbarchartwidget.cpp \ charts/statsworkedconfirmedpiechartwidget.cpp \ charts/statsworkedsentpiechartwidget.cpp \ charts/statssentconfirmedpiechartwidget.cpp \ charts/statsqsosperbandbarchartwidget.cpp \ setuppagesats.cpp \ setuppagesatsnew.cpp \ setuppagehamlib.cpp \ hamlibclass.cpp QMAKE_TARGET = klog DESTDIR = build/target/ TARGET = build/target/klog first: all ####### Build rules $(TARGET): build/target/translations/klog_es.qm build/target/translations/klog_ca.qm build/target/translations/klog_da.qm build/target/translations/klog_de.qm build/target/translations/klog_fi.qm build/target/translations/klog_fr.qm build/target/translations/klog_hr.qm build/target/translations/klog_it.qm build/target/translations/klog_pl.qm build/target/translations/klog_ja.qm $(OBJECTS) @test -d build/target/ || mkdir -p build/target/ $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) Makefile: KLog.pro /usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++/qmake.conf /usr/lib/i386-linux-gnu/qt5/mkspecs/features/spec_pre.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/unix.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/linux.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/sanitize.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/gcc-base.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/gcc-base-unix.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/g++-base.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/common/g++-unix.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/qconfig.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_Baloo.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_accessibility_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_charts.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_core.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_core_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_edid_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_egl_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_fb_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_glx_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_gui.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_gui_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_input_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_kms_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_network.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_network_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_serialbus.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_serialbus_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_serialport.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_service_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_sql.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_sql_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_theme_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_xml.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_xml_private.pri \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/qt_functions.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/qt_config.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++/qmake.conf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/spec_post.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/exclusive_builds.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/toolchain.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/default_pre.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/resolve_config.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/default_post.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/warn_on.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/qt.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/resources.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/moc.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/unix/opengl.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/uic.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/unix/thread.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/qmake_use.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/file_copies.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/testcase_targets.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/exceptions.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/yacc.prf \ /usr/lib/i386-linux-gnu/qt5/mkspecs/features/lex.prf \ KLog.pro \ klog.qrc \ /usr/lib/i386-linux-gnu/libQt5PrintSupport.prl \ /usr/lib/i386-linux-gnu/libQt5Charts.prl \ /usr/lib/i386-linux-gnu/libQt5Widgets.prl \ /usr/lib/i386-linux-gnu/libQt5Gui.prl \ /usr/lib/i386-linux-gnu/libQt5Sql.prl \ /usr/lib/i386-linux-gnu/libQt5Network.prl \ /usr/lib/i386-linux-gnu/libQt5SerialPort.prl \ /usr/lib/i386-linux-gnu/libQt5Core.prl $(QMAKE) -o Makefile KLog.pro /usr/lib/i386-linux-gnu/qt5/mkspecs/features/spec_pre.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/common/unix.conf: /usr/lib/i386-linux-gnu/qt5/mkspecs/common/linux.conf: /usr/lib/i386-linux-gnu/qt5/mkspecs/common/sanitize.conf: /usr/lib/i386-linux-gnu/qt5/mkspecs/common/gcc-base.conf: /usr/lib/i386-linux-gnu/qt5/mkspecs/common/gcc-base-unix.conf: /usr/lib/i386-linux-gnu/qt5/mkspecs/common/g++-base.conf: /usr/lib/i386-linux-gnu/qt5/mkspecs/common/g++-unix.conf: /usr/lib/i386-linux-gnu/qt5/mkspecs/qconfig.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_Baloo.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_accessibility_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_charts.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_core.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_core_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_devicediscovery_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_edid_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_egl_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_fb_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_fontdatabase_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_glx_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_gui.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_gui_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_input_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_kms_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_network.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_network_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_platformcompositor_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_serialbus.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_serialbus_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_serialport.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_service_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_sql.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_sql_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_theme_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_xml.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/modules/qt_lib_xml_private.pri: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/qt_functions.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/qt_config.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++/qmake.conf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/spec_post.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/exclusive_builds.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/toolchain.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/default_pre.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/resolve_config.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/default_post.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/warn_on.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/qt.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/resources.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/moc.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/unix/opengl.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/uic.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/unix/thread.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/qmake_use.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/file_copies.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/testcase_targets.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/exceptions.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/yacc.prf: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/lex.prf: KLog.pro: klog.qrc: /usr/lib/i386-linux-gnu/libQt5PrintSupport.prl: /usr/lib/i386-linux-gnu/libQt5Charts.prl: /usr/lib/i386-linux-gnu/libQt5Widgets.prl: /usr/lib/i386-linux-gnu/libQt5Gui.prl: /usr/lib/i386-linux-gnu/libQt5Sql.prl: /usr/lib/i386-linux-gnu/libQt5Network.prl: /usr/lib/i386-linux-gnu/libQt5SerialPort.prl: /usr/lib/i386-linux-gnu/libQt5Core.prl: qmake: FORCE @$(QMAKE) -o Makefile KLog.pro qmake_all: FORCE all: Makefile $(TARGET) dist: distdir FORCE (cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR) distdir: FORCE @test -d $(DISTDIR) || mkdir -p $(DISTDIR) $(COPY_FILE) --parents $(DIST) $(DISTDIR)/ $(COPY_FILE) --parents translations/klog_es.ts translations/klog_ca.ts translations/klog_da.ts translations/klog_de.ts translations/klog_fi.ts translations/klog_fr.ts translations/klog_hr.ts translations/klog_it.ts translations/klog_pl.ts translations/klog_ja.ts $(DISTDIR)/ $(COPY_FILE) --parents klog.qrc $(DISTDIR)/ $(COPY_FILE) --parents /usr/lib/i386-linux-gnu/qt5/mkspecs/features/data/dummy.cpp $(DISTDIR)/ $(COPY_FILE) --parents setupdialog.h aboutdialog.h mainwindow.h setupdialog.h world.h logwindow.h filemanager.h contest.h database.h setuppagemisc.h locator.h dxcluster.h awards.h setuppageuserdata.h setuppagedxcluster.h setuppagecolors.h contest_cqwwdxssb.h setuppagelogs.h setuppageworldeditor.h setupentitydialog.h startwizard.h downloadcty.h dataproxy.h dataproxy_sqlite.h mainwindowsattab.h awarddxmarathon.h setuppagelogsnew.h setuppageclublog.h elogclublog.h softwareupdate.h softwareupdatedialog.h utilities.h dxccstatuswidget.h mainwindowmydatatab.h mainwindowinputcomment.h mainwindowinputothers.h mainwindowinputeqsl.h mainwindowinputqsl.h setuppagebandmode.h logmodel.h searchwidget.h infowidget.h showerrordialog.h udpserver.h setuppageudp.h statisticswidget.h charts/barchartstats.h updatesatsdata.h charts/statsgeneralchartwidget.h charts/statsqsosperyearbarchartwidget.h charts/statsentitiesperyearbarchartwidget.h charts/statscqzperyearbarchartwidget.h charts/statsqsosperbandbarchartwidget.h charts/statsqsospermodebarchartwidget.h charts/statsqsosperdxccbarchartwidget.h charts/statsqsospercontinentbarchartwidget.h charts/statsqsosperhourbarchartwidget.h charts/statsqsospermonthbarchartwidget.h charts/statsworkedconfirmedpiechartwidget.h charts/statsworkedsentpiechartwidget.h charts/statssentconfirmedpiechartwidget.h charts/statsqsosperbandbarchartwidget.h setuppagesats.h setuppagesatsnew.h setuppagehamlib.h hamlibclass.h $(DISTDIR)/ $(COPY_FILE) --parents main.cpp aboutdialog.cpp mainwindow.cpp setupdialog.cpp world.cpp logwindow.cpp filemanager.cpp contest.cpp contest_cqwwdxssb.cpp database.cpp dataproxy.cpp dataproxy_sqlite.cpp downloadcty.cpp dxcluster.cpp setuppagemisc.cpp locator.cpp awards.cpp setuppageuserdata.cpp setuppagedxcluster.cpp setuppagecolors.cpp setuppagelogs.cpp setuppageworldeditor.cpp setupentitydialog.cpp startwizard.cpp mainwindowsattab.cpp awarddxmarathon.cpp setuppagelogsnew.cpp setuppageclublog.cpp elogclublog.cpp softwareupdate.cpp softwareupdatedialog.cpp utilities.cpp dxccstatuswidget.cpp mainwindowmydatatab.cpp mainwindowinputcomment.cpp mainwindowinputothers.cpp mainwindowinputeqsl.cpp mainwindowinputqsl.cpp setuppagebandmode.cpp logmodel.cpp searchwidget.cpp infowidget.cpp showerrordialog.cpp udpserver.cpp setuppageudp.cpp statisticswidget.cpp charts/barchartstats.cpp updatesatsdata.cpp charts/statsgeneralchartwidget.cpp charts/statsqsosperyearbarchartwidget.cpp charts/statsentitiesperyearbarchartwidget.cpp charts/statscqzperyearbarchartwidget.cpp charts/statsqsospermodebarchartwidget.cpp charts/statsqsosperdxccbarchartwidget.cpp charts/statsqsospercontinentbarchartwidget.cpp charts/statsqsosperhourbarchartwidget.cpp charts/statsqsospermonthbarchartwidget.cpp charts/statsworkedconfirmedpiechartwidget.cpp charts/statsworkedsentpiechartwidget.cpp charts/statssentconfirmedpiechartwidget.cpp charts/statsqsosperbandbarchartwidget.cpp setuppagesats.cpp setuppagesatsnew.cpp setuppagehamlib.cpp hamlibclass.cpp $(DISTDIR)/ $(COPY_FILE) --parents translations/klog_es.ts translations/klog_ca.ts translations/klog_da.ts translations/klog_de.ts translations/klog_fi.ts translations/klog_fr.ts translations/klog_hr.ts translations/klog_it.ts translations/klog_pl.ts translations/klog_ja.ts $(DISTDIR)/ clean: compiler_clean -$(DEL_FILE) $(OBJECTS) -$(DEL_FILE) *~ core *.core distclean: clean -$(DEL_FILE) $(TARGET) -$(DEL_FILE) .qmake.stash -$(DEL_FILE) Makefile ####### Sub-libraries mocclean: compiler_moc_header_clean compiler_moc_objc_header_clean compiler_moc_source_clean mocables: compiler_moc_header_make_all compiler_moc_objc_header_make_all compiler_moc_source_make_all check: first benchmark: first compiler_updateqm_make_all: build/target/translations/klog_es.qm build/target/translations/klog_ca.qm build/target/translations/klog_da.qm build/target/translations/klog_de.qm build/target/translations/klog_fi.qm build/target/translations/klog_fr.qm build/target/translations/klog_hr.qm build/target/translations/klog_it.qm build/target/translations/klog_pl.qm build/target/translations/klog_ja.qm compiler_updateqm_clean: -$(DEL_FILE) build/target/translations/klog_es.qm build/target/translations/klog_ca.qm build/target/translations/klog_da.qm build/target/translations/klog_de.qm build/target/translations/klog_fi.qm build/target/translations/klog_fr.qm build/target/translations/klog_hr.qm build/target/translations/klog_it.qm build/target/translations/klog_pl.qm build/target/translations/klog_ja.qm build/target/translations/klog_es.qm: translations/klog_es.ts /usr/lib/qt5/bin/lrelease translations/klog_es.ts -qm build/target//translations/klog_es.qm build/target/translations/klog_ca.qm: translations/klog_ca.ts /usr/lib/qt5/bin/lrelease translations/klog_ca.ts -qm build/target//translations/klog_ca.qm build/target/translations/klog_da.qm: translations/klog_da.ts /usr/lib/qt5/bin/lrelease translations/klog_da.ts -qm build/target//translations/klog_da.qm build/target/translations/klog_de.qm: translations/klog_de.ts /usr/lib/qt5/bin/lrelease translations/klog_de.ts -qm build/target//translations/klog_de.qm build/target/translations/klog_fi.qm: translations/klog_fi.ts /usr/lib/qt5/bin/lrelease translations/klog_fi.ts -qm build/target//translations/klog_fi.qm build/target/translations/klog_fr.qm: translations/klog_fr.ts /usr/lib/qt5/bin/lrelease translations/klog_fr.ts -qm build/target//translations/klog_fr.qm build/target/translations/klog_hr.qm: translations/klog_hr.ts /usr/lib/qt5/bin/lrelease translations/klog_hr.ts -qm build/target//translations/klog_hr.qm build/target/translations/klog_it.qm: translations/klog_it.ts /usr/lib/qt5/bin/lrelease translations/klog_it.ts -qm build/target//translations/klog_it.qm build/target/translations/klog_pl.qm: translations/klog_pl.ts /usr/lib/qt5/bin/lrelease translations/klog_pl.ts -qm build/target//translations/klog_pl.qm build/target/translations/klog_ja.qm: translations/klog_ja.ts /usr/lib/qt5/bin/lrelease translations/klog_ja.ts -qm build/target//translations/klog_ja.qm compiler_rcc_make_all: build/rcc/qrc_klog.cpp compiler_rcc_clean: -$(DEL_FILE) build/rcc/qrc_klog.cpp build/rcc/qrc_klog.cpp: klog.qrc \ /usr/lib/qt5/bin/rcc \ flags/ru.png \ flags/un.png \ flags/lc.png \ flags/gm.png \ flags/bw.png \ flags/cs.png \ flags/tm.png \ flags/wf.png \ flags/mz.png \ flags/ie.png \ flags/do.png \ flags/ps.png \ flags/gh.png \ flags/br.png \ flags/sl.png \ flags/ve.png \ flags/ly.png \ flags/cn.png \ flags/th.png \ flags/mu.png \ flags/dj.png \ flags/pn.png \ flags/bm.png \ flags/sg.png \ flags/lt.png \ flags/tc.png \ flags/ci.png \ flags/om.png \ flags/al.png \ flags/mp.png \ flags/yt.png \ flags/de.png \ flags/sb.png \ flags/bh.png \ flags/nl.png \ flags/uz.png \ flags/gy.png \ flags/cd.png \ flags/ag.png \ flags/mk.png \ flags/hu.png \ flags/sardinia.png \ flags/kn.png \ flags/ng.png \ flags/iq.png \ flags/gt.png \ flags/jm.png \ flags/cz.png \ flags/tt.png \ flags/ki.png \ flags/rw.png \ flags/il.png \ flags/ss.png \ flags/by.png \ flags/er.png \ flags/ma.png \ flags/hk.png \ flags/ye.png \ flags/cu.png \ flags/to.png \ flags/ax.png \ flags/za.png \ flags/bt.png \ flags/sn.png \ flags/vg.png \ flags/tj.png \ flags/fi.png \ flags/as.png \ flags/mw.png \ flags/kz.png \ flags/ge.png \ flags/bo.png \ flags/si.png \ flags/zw.png \ flags/eh.png \ flags/lv.png \ flags/ck.png \ flags/an.png \ flags/mr.png \ flags/ua.png \ flags/pk.png \ flags/bj.png \ flags/sd.png \ flags/ec.png \ flags/cf.png \ flags/ai.png \ flags/mm.png \ flags/pf.png \ flags/kp.png \ flags/smh.png \ flags/be.png \ flags/ni.png \ flags/is.png \ flags/zm.png \ flags/northernireland.png \ flags/ca.png \ flags/sz.png \ flags/marquesas.png \ flags/jo.png \ flags/ad.png \ flags/mh.png \ flags/canary.png \ flags/hr.png \ flags/tv.png \ flags/pa.png \ flags/wales.png \ flags/in.png \ flags/gq.png \ flags/xk.png \ flags/vn.png \ flags/et.png \ flags/mc.png \ flags/hm.png \ flags/cw.png \ flags/az.png \ flags/um.png \ flags/pw.png \ flags/lb.png \ flags/gl.png \ flags/bv.png \ flags/nz.png \ flags/vi.png \ flags/tl.png \ flags/cr.png \ flags/fk.png \ flags/au.png \ flags/ro.png \ flags/my.png \ flags/id.png \ flags/pr.png \ flags/sk.png \ flags/bq.png \ flags/nu.png \ flags/cm.png \ flags/tg.png \ flags/mt.png \ flags/pm.png \ flags/kw.png \ flags/gb.png \ flags/np.png \ flags/ee.png \ flags/ls.png \ flags/ch.png \ flags/re.png \ flags/mo.png \ flags/ph.png \ flags/ceuta.png \ flags/kr.png \ flags/bg.png \ flags/sa.png \ flags/uy.png \ flags/cc.png \ flags/vu.png \ flags/af.png \ flags/ht.png \ flags/km.png \ flags/bb.png \ flags/nf.png \ flags/england.png \ flags/dz.png \ flags/li.png \ flags/gs.png \ flags/me.png \ flags/cy.png \ flags/kh.png \ flags/fr.png \ flags/na.png \ flags/southbritish.png \ flags/py.png \ flags/gn.png \ flags/sr.png \ flags/tn.png \ flags/fm.png \ flags/aw.png \ flags/pt.png \ flags/gi.png \ flags/sm.png \ flags/bs.png \ flags/co.png \ flags/ar.png \ flags/mv.png \ flags/dk.png \ flags/ky.png \ flags/gd.png \ flags/bn.png \ flags/sh.png \ flags/nr.png \ flags/scotland.png \ flags/va.png \ flags/eg.png \ flags/lu.png \ flags/td.png \ flags/am.png \ flags/mq.png \ flags/bi.png \ flags/sc.png \ flags/ml.png \ flags/tz.png \ flags/pe.png \ flags/ws.png \ flags/bd.png \ flags/ir.png \ flags/qa.png \ flags/lk.png \ flags/gu.png \ flags/sy.png \ flags/mg.png \ flags/europeanunion.png \ flags/nc.png \ flags/gp.png \ flags/bz.png \ flags/st.png \ flags/es.png \ flags/cv.png \ flags/ke.png \ flags/fo.png \ flags/rs.png \ flags/la.png \ flags/so.png \ flags/tk.png \ flags/fj.png \ flags/at.png \ flags/mx.png \ flags/dm.png \ flags/ug.png \ flags/gf.png \ flags/sj.png \ flags/vc.png \ flags/fam.png \ flags/cl.png \ flags/tf.png \ flags/ao.png \ flags/ms.png \ flags/pl.png \ flags/ga.png \ flags/se.png \ flags/no.png \ flags/lr.png \ flags/cg.png \ flags/balear.png \ flags/mn.png \ flags/pg.png \ flags/bf.png \ flags/it.png \ flags/gw.png \ flags/jp.png \ flags/ae.png \ flags/tw.png \ flags/ba.png \ flags/ne.png \ flags/io.png \ flags/us.png \ flags/gr.png \ flags/sv.png \ flags/md.png \ flags/hn.png \ flags/tr.png \ flags/cx.png \ flags/kg.png \ img/klog_logo.png \ img/klog.ico \ img/klog_256x256.png \ img/klog_512x512.png /usr/lib/qt5/bin/rcc -name klog klog.qrc -o build/rcc/qrc_klog.cpp compiler_moc_predefs_make_all: build/moc/moc_predefs.h compiler_moc_predefs_clean: -$(DEL_FILE) build/moc/moc_predefs.h build/moc/moc_predefs.h: /usr/lib/i386-linux-gnu/qt5/mkspecs/features/data/dummy.cpp g++ -pipe -O2 -std=gnu++11 -Wall -W -dM -E -o build/moc/moc_predefs.h /usr/lib/i386-linux-gnu/qt5/mkspecs/features/data/dummy.cpp compiler_moc_header_make_all: build/moc/moc_setupdialog.cpp build/moc/moc_aboutdialog.cpp build/moc/moc_mainwindow.cpp build/moc/moc_setupdialog.cpp build/moc/moc_world.cpp build/moc/moc_logwindow.cpp build/moc/moc_filemanager.cpp build/moc/moc_contest.cpp build/moc/moc_setuppagemisc.cpp build/moc/moc_dxcluster.cpp build/moc/moc_awards.cpp build/moc/moc_setuppageuserdata.cpp build/moc/moc_setuppagedxcluster.cpp build/moc/moc_setuppagecolors.cpp build/moc/moc_setuppagelogs.cpp build/moc/moc_setuppageworldeditor.cpp build/moc/moc_setupentitydialog.cpp build/moc/moc_startwizard.cpp build/moc/moc_downloadcty.cpp build/moc/moc_dataproxy.cpp build/moc/moc_dataproxy_sqlite.cpp build/moc/moc_mainwindowsattab.cpp build/moc/moc_setuppagelogsnew.cpp build/moc/moc_setuppageclublog.cpp build/moc/moc_elogclublog.cpp build/moc/moc_softwareupdate.cpp build/moc/moc_softwareupdatedialog.cpp build/moc/moc_dxccstatuswidget.cpp build/moc/moc_mainwindowmydatatab.cpp build/moc/moc_mainwindowinputcomment.cpp build/moc/moc_mainwindowinputothers.cpp build/moc/moc_mainwindowinputeqsl.cpp build/moc/moc_mainwindowinputqsl.cpp build/moc/moc_setuppagebandmode.cpp build/moc/moc_logmodel.cpp build/moc/moc_searchwidget.cpp build/moc/moc_infowidget.cpp build/moc/moc_showerrordialog.cpp build/moc/moc_udpserver.cpp build/moc/moc_setuppageudp.cpp build/moc/moc_statisticswidget.cpp build/moc/moc_barchartstats.cpp build/moc/moc_updatesatsdata.cpp build/moc/moc_statsgeneralchartwidget.cpp build/moc/moc_statsqsosperyearbarchartwidget.cpp build/moc/moc_statsentitiesperyearbarchartwidget.cpp build/moc/moc_statscqzperyearbarchartwidget.cpp build/moc/moc_statsqsosperbandbarchartwidget.cpp build/moc/moc_statsqsospermodebarchartwidget.cpp build/moc/moc_statsqsosperdxccbarchartwidget.cpp build/moc/moc_statsqsospercontinentbarchartwidget.cpp build/moc/moc_statsqsosperhourbarchartwidget.cpp build/moc/moc_statsqsospermonthbarchartwidget.cpp build/moc/moc_statsworkedconfirmedpiechartwidget.cpp build/moc/moc_statsworkedsentpiechartwidget.cpp build/moc/moc_statssentconfirmedpiechartwidget.cpp build/moc/moc_statsqsosperbandbarchartwidget.cpp build/moc/moc_setuppagesats.cpp build/moc/moc_setuppagesatsnew.cpp build/moc/moc_setuppagehamlib.cpp build/moc/moc_hamlibclass.cpp compiler_moc_header_clean: -$(DEL_FILE) build/moc/moc_setupdialog.cpp build/moc/moc_aboutdialog.cpp build/moc/moc_mainwindow.cpp build/moc/moc_setupdialog.cpp build/moc/moc_world.cpp build/moc/moc_logwindow.cpp build/moc/moc_filemanager.cpp build/moc/moc_contest.cpp build/moc/moc_setuppagemisc.cpp build/moc/moc_dxcluster.cpp build/moc/moc_awards.cpp build/moc/moc_setuppageuserdata.cpp build/moc/moc_setuppagedxcluster.cpp build/moc/moc_setuppagecolors.cpp build/moc/moc_setuppagelogs.cpp build/moc/moc_setuppageworldeditor.cpp build/moc/moc_setupentitydialog.cpp build/moc/moc_startwizard.cpp build/moc/moc_downloadcty.cpp build/moc/moc_dataproxy.cpp build/moc/moc_dataproxy_sqlite.cpp build/moc/moc_mainwindowsattab.cpp build/moc/moc_setuppagelogsnew.cpp build/moc/moc_setuppageclublog.cpp build/moc/moc_elogclublog.cpp build/moc/moc_softwareupdate.cpp build/moc/moc_softwareupdatedialog.cpp build/moc/moc_dxccstatuswidget.cpp build/moc/moc_mainwindowmydatatab.cpp build/moc/moc_mainwindowinputcomment.cpp build/moc/moc_mainwindowinputothers.cpp build/moc/moc_mainwindowinputeqsl.cpp build/moc/moc_mainwindowinputqsl.cpp build/moc/moc_setuppagebandmode.cpp build/moc/moc_logmodel.cpp build/moc/moc_searchwidget.cpp build/moc/moc_infowidget.cpp build/moc/moc_showerrordialog.cpp build/moc/moc_udpserver.cpp build/moc/moc_setuppageudp.cpp build/moc/moc_statisticswidget.cpp build/moc/moc_barchartstats.cpp build/moc/moc_updatesatsdata.cpp build/moc/moc_statsgeneralchartwidget.cpp build/moc/moc_statsqsosperyearbarchartwidget.cpp build/moc/moc_statsentitiesperyearbarchartwidget.cpp build/moc/moc_statscqzperyearbarchartwidget.cpp build/moc/moc_statsqsosperbandbarchartwidget.cpp build/moc/moc_statsqsospermodebarchartwidget.cpp build/moc/moc_statsqsosperdxccbarchartwidget.cpp build/moc/moc_statsqsospercontinentbarchartwidget.cpp build/moc/moc_statsqsosperhourbarchartwidget.cpp build/moc/moc_statsqsospermonthbarchartwidget.cpp build/moc/moc_statsworkedconfirmedpiechartwidget.cpp build/moc/moc_statsworkedsentpiechartwidget.cpp -$(DEL_FILE) build/moc/moc_statssentconfirmedpiechartwidget.cpp build/moc/moc_statsqsosperbandbarchartwidget.cpp build/moc/moc_setuppagesats.cpp build/moc/moc_setuppagesatsnew.cpp build/moc/moc_setuppagehamlib.cpp build/moc/moc_hamlibclass.cpp build/moc/moc_setupdialog.cpp: setuppageuserdata.h \ world.h \ locator.h \ dataproxy.h \ setuppagebandmode.h \ setuppagemisc.h \ utilities.h \ setuppagedxcluster.h \ setuppagecolors.h \ setuppagelogs.h \ setuppagelogsnew.h \ setuppageworldeditor.h \ setupentitydialog.h \ setuppageclublog.h \ setuppageudp.h \ setuppagesats.h \ updatesatsdata.h \ dataproxy_sqlite.h \ database.h \ setuppagesatsnew.h \ setuppagehamlib.h \ hamlibclass.h \ setupdialog.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setupdialog.h -o build/moc/moc_setupdialog.cpp build/moc/moc_aboutdialog.cpp: aboutdialog.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include aboutdialog.h -o build/moc/moc_aboutdialog.cpp build/moc/moc_mainwindow.cpp: database.h \ utilities.h \ locator.h \ setupdialog.h \ setuppageuserdata.h \ world.h \ dataproxy.h \ setuppagebandmode.h \ setuppagemisc.h \ setuppagedxcluster.h \ setuppagecolors.h \ setuppagelogs.h \ setuppagelogsnew.h \ setuppageworldeditor.h \ setupentitydialog.h \ setuppageclublog.h \ setuppageudp.h \ setuppagesats.h \ updatesatsdata.h \ dataproxy_sqlite.h \ setuppagesatsnew.h \ setuppagehamlib.h \ hamlibclass.h \ aboutdialog.h \ filemanager.h \ awards.h \ awarddxmarathon.h \ contest.h \ contest_cqwwdxssb.h \ dxcluster.h \ mainwindowsattab.h \ mainwindowmydatatab.h \ mainwindowinputcomment.h \ mainwindowinputothers.h \ mainwindowinputeqsl.h \ mainwindowinputqsl.h \ elogclublog.h \ downloadcty.h \ dxccstatuswidget.h \ softwareupdate.h \ softwareupdatedialog.h \ logmodel.h \ logwindow.h \ searchwidget.h \ infowidget.h \ showerrordialog.h \ udpserver.h \ statisticswidget.h \ charts/barchartstats.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperyearbarchartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ charts/statsqsospermodebarchartwidget.h \ charts/statsentitiesperyearbarchartwidget.h \ charts/statscqzperyearbarchartwidget.h \ charts/statsqsosperdxccbarchartwidget.h \ charts/statsqsospercontinentbarchartwidget.h \ charts/statsqsosperhourbarchartwidget.h \ charts/statsqsospermonthbarchartwidget.h \ charts/statsworkedconfirmedpiechartwidget.h \ charts/statsworkedsentpiechartwidget.h \ charts/statssentconfirmedpiechartwidget.h \ mainwindow.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include mainwindow.h -o build/moc/moc_mainwindow.cpp build/moc/moc_setupdialog.cpp: setuppageuserdata.h \ world.h \ locator.h \ dataproxy.h \ setuppagebandmode.h \ setuppagemisc.h \ utilities.h \ setuppagedxcluster.h \ setuppagecolors.h \ setuppagelogs.h \ setuppagelogsnew.h \ setuppageworldeditor.h \ setupentitydialog.h \ setuppageclublog.h \ setuppageudp.h \ setuppagesats.h \ updatesatsdata.h \ dataproxy_sqlite.h \ database.h \ setuppagesatsnew.h \ setuppagehamlib.h \ hamlibclass.h \ setupdialog.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setupdialog.h -o build/moc/moc_setupdialog.cpp build/moc/moc_world.cpp: locator.h \ dataproxy.h \ world.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include world.h -o build/moc/moc_world.cpp build/moc/moc_logwindow.cpp: dataproxy.h \ logmodel.h \ awards.h \ world.h \ locator.h \ awarddxmarathon.h \ utilities.h \ elogclublog.h \ logwindow.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include logwindow.h -o build/moc/moc_logwindow.cpp build/moc/moc_filemanager.cpp: world.h \ locator.h \ dataproxy.h \ awards.h \ awarddxmarathon.h \ utilities.h \ database.h \ dataproxy_sqlite.h \ filemanager.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include filemanager.h -o build/moc/moc_filemanager.cpp build/moc/moc_contest.cpp: contest.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include contest.h -o build/moc/moc_contest.cpp build/moc/moc_setuppagemisc.cpp: utilities.h \ locator.h \ setuppagemisc.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setuppagemisc.h -o build/moc/moc_setuppagemisc.cpp build/moc/moc_dxcluster.cpp: awards.h \ world.h \ locator.h \ dataproxy.h \ awarddxmarathon.h \ utilities.h \ dxcluster.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include dxcluster.h -o build/moc/moc_dxcluster.cpp build/moc/moc_awards.cpp: world.h \ locator.h \ dataproxy.h \ awarddxmarathon.h \ utilities.h \ awards.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include awards.h -o build/moc/moc_awards.cpp build/moc/moc_setuppageuserdata.cpp: world.h \ locator.h \ dataproxy.h \ setuppageuserdata.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setuppageuserdata.h -o build/moc/moc_setuppageuserdata.cpp build/moc/moc_setuppagedxcluster.cpp: setuppagedxcluster.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setuppagedxcluster.h -o build/moc/moc_setuppagedxcluster.cpp build/moc/moc_setuppagecolors.cpp: setuppagecolors.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setuppagecolors.h -o build/moc/moc_setuppagecolors.cpp build/moc/moc_setuppagelogs.cpp: dataproxy.h \ setuppagelogsnew.h \ setuppagelogs.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setuppagelogs.h -o build/moc/moc_setuppagelogs.cpp build/moc/moc_setuppageworldeditor.cpp: world.h \ locator.h \ dataproxy.h \ setupentitydialog.h \ utilities.h \ setuppageworldeditor.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setuppageworldeditor.h -o build/moc/moc_setuppageworldeditor.cpp build/moc/moc_setupentitydialog.cpp: setupentitydialog.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setupentitydialog.h -o build/moc/moc_setupentitydialog.cpp build/moc/moc_startwizard.cpp: downloadcty.h \ utilities.h \ locator.h \ startwizard.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include startwizard.h -o build/moc/moc_startwizard.cpp build/moc/moc_downloadcty.cpp: utilities.h \ locator.h \ downloadcty.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include downloadcty.h -o build/moc/moc_downloadcty.cpp build/moc/moc_dataproxy.cpp: dataproxy.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include dataproxy.h -o build/moc/moc_dataproxy.cpp build/moc/moc_dataproxy_sqlite.cpp: dataproxy.h \ database.h \ utilities.h \ locator.h \ dataproxy_sqlite.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include dataproxy_sqlite.h -o build/moc/moc_dataproxy_sqlite.cpp build/moc/moc_mainwindowsattab.cpp: dataproxy.h \ locator.h \ mainwindowsattab.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include mainwindowsattab.h -o build/moc/moc_mainwindowsattab.cpp build/moc/moc_setuppagelogsnew.cpp: dataproxy.h \ setuppagelogsnew.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setuppagelogsnew.h -o build/moc/moc_setuppagelogsnew.cpp build/moc/moc_setuppageclublog.cpp: setuppageclublog.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setuppageclublog.h -o build/moc/moc_setuppageclublog.cpp build/moc/moc_elogclublog.cpp: elogclublog.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include elogclublog.h -o build/moc/moc_elogclublog.cpp build/moc/moc_softwareupdate.cpp: utilities.h \ locator.h \ softwareupdatedialog.h \ softwareupdate.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include softwareupdate.h -o build/moc/moc_softwareupdate.cpp build/moc/moc_softwareupdatedialog.cpp: softwareupdatedialog.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include softwareupdatedialog.h -o build/moc/moc_softwareupdatedialog.cpp build/moc/moc_dxccstatuswidget.cpp: awards.h \ world.h \ locator.h \ dataproxy.h \ awarddxmarathon.h \ utilities.h \ dxccstatuswidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include dxccstatuswidget.h -o build/moc/moc_dxccstatuswidget.cpp build/moc/moc_mainwindowmydatatab.cpp: mainwindowmydatatab.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include mainwindowmydatatab.h -o build/moc/moc_mainwindowmydatatab.cpp build/moc/moc_mainwindowinputcomment.cpp: mainwindowinputcomment.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include mainwindowinputcomment.h -o build/moc/moc_mainwindowinputcomment.cpp build/moc/moc_mainwindowinputothers.cpp: dataproxy.h \ mainwindowinputothers.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include mainwindowinputothers.h -o build/moc/moc_mainwindowinputothers.cpp build/moc/moc_mainwindowinputeqsl.cpp: dataproxy.h \ utilities.h \ locator.h \ mainwindowinputeqsl.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include mainwindowinputeqsl.h -o build/moc/moc_mainwindowinputeqsl.cpp build/moc/moc_mainwindowinputqsl.cpp: dataproxy.h \ dataproxy_sqlite.h \ database.h \ utilities.h \ locator.h \ mainwindowinputqsl.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include mainwindowinputqsl.h -o build/moc/moc_mainwindowinputqsl.cpp build/moc/moc_setuppagebandmode.cpp: dataproxy.h \ setuppagebandmode.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setuppagebandmode.h -o build/moc/moc_setuppagebandmode.cpp build/moc/moc_logmodel.cpp: dataproxy.h \ logmodel.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include logmodel.h -o build/moc/moc_logmodel.cpp build/moc/moc_searchwidget.cpp: dataproxy.h \ awards.h \ world.h \ locator.h \ awarddxmarathon.h \ utilities.h \ filemanager.h \ database.h \ dataproxy_sqlite.h \ searchwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include searchwidget.h -o build/moc/moc_searchwidget.cpp build/moc/moc_infowidget.cpp: locator.h \ awards.h \ world.h \ dataproxy.h \ awarddxmarathon.h \ utilities.h \ dataproxy_sqlite.h \ database.h \ infowidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include infowidget.h -o build/moc/moc_infowidget.cpp build/moc/moc_showerrordialog.cpp: showerrordialog.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include showerrordialog.h -o build/moc/moc_showerrordialog.cpp build/moc/moc_udpserver.cpp: udpserver.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include udpserver.h -o build/moc/moc_udpserver.cpp build/moc/moc_setuppageudp.cpp: setuppageudp.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setuppageudp.h -o build/moc/moc_setuppageudp.cpp build/moc/moc_statisticswidget.cpp: dataproxy.h \ charts/barchartstats.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperyearbarchartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ charts/statsqsospermodebarchartwidget.h \ charts/statsentitiesperyearbarchartwidget.h \ charts/statscqzperyearbarchartwidget.h \ charts/statsqsosperdxccbarchartwidget.h \ charts/statsqsospercontinentbarchartwidget.h \ charts/statsqsosperhourbarchartwidget.h \ charts/statsqsospermonthbarchartwidget.h \ charts/statsworkedconfirmedpiechartwidget.h \ charts/statsworkedsentpiechartwidget.h \ charts/statssentconfirmedpiechartwidget.h \ statisticswidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include statisticswidget.h -o build/moc/moc_statisticswidget.cpp build/moc/moc_barchartstats.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperyearbarchartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ charts/statsqsospermodebarchartwidget.h \ charts/statsentitiesperyearbarchartwidget.h \ charts/statscqzperyearbarchartwidget.h \ charts/statsqsosperdxccbarchartwidget.h \ charts/statsqsospercontinentbarchartwidget.h \ charts/statsqsosperhourbarchartwidget.h \ charts/statsqsospermonthbarchartwidget.h \ charts/statsworkedconfirmedpiechartwidget.h \ charts/statsworkedsentpiechartwidget.h \ charts/statssentconfirmedpiechartwidget.h \ charts/barchartstats.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/barchartstats.h -o build/moc/moc_barchartstats.cpp build/moc/moc_updatesatsdata.cpp: utilities.h \ locator.h \ dataproxy.h \ dataproxy_sqlite.h \ database.h \ updatesatsdata.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include updatesatsdata.h -o build/moc/moc_updatesatsdata.cpp build/moc/moc_statsgeneralchartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statsgeneralchartwidget.h -o build/moc/moc_statsgeneralchartwidget.cpp build/moc/moc_statsqsosperyearbarchartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperyearbarchartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statsqsosperyearbarchartwidget.h -o build/moc/moc_statsqsosperyearbarchartwidget.cpp build/moc/moc_statsentitiesperyearbarchartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statsentitiesperyearbarchartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statsentitiesperyearbarchartwidget.h -o build/moc/moc_statsentitiesperyearbarchartwidget.cpp build/moc/moc_statscqzperyearbarchartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statscqzperyearbarchartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statscqzperyearbarchartwidget.h -o build/moc/moc_statscqzperyearbarchartwidget.cpp build/moc/moc_statsqsosperbandbarchartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statsqsosperbandbarchartwidget.h -o build/moc/moc_statsqsosperbandbarchartwidget.cpp build/moc/moc_statsqsospermodebarchartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statsqsospermodebarchartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statsqsospermodebarchartwidget.h -o build/moc/moc_statsqsospermodebarchartwidget.cpp build/moc/moc_statsqsosperdxccbarchartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperdxccbarchartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statsqsosperdxccbarchartwidget.h -o build/moc/moc_statsqsosperdxccbarchartwidget.cpp build/moc/moc_statsqsospercontinentbarchartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statsqsospercontinentbarchartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statsqsospercontinentbarchartwidget.h -o build/moc/moc_statsqsospercontinentbarchartwidget.cpp build/moc/moc_statsqsosperhourbarchartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperhourbarchartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statsqsosperhourbarchartwidget.h -o build/moc/moc_statsqsosperhourbarchartwidget.cpp build/moc/moc_statsqsospermonthbarchartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statsqsospermonthbarchartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statsqsospermonthbarchartwidget.h -o build/moc/moc_statsqsospermonthbarchartwidget.cpp build/moc/moc_statsworkedconfirmedpiechartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statsworkedconfirmedpiechartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statsworkedconfirmedpiechartwidget.h -o build/moc/moc_statsworkedconfirmedpiechartwidget.cpp build/moc/moc_statsworkedsentpiechartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statsworkedsentpiechartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statsworkedsentpiechartwidget.h -o build/moc/moc_statsworkedsentpiechartwidget.cpp build/moc/moc_statssentconfirmedpiechartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statssentconfirmedpiechartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statssentconfirmedpiechartwidget.h -o build/moc/moc_statssentconfirmedpiechartwidget.cpp build/moc/moc_statsqsosperbandbarchartwidget.cpp: dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include charts/statsqsosperbandbarchartwidget.h -o build/moc/moc_statsqsosperbandbarchartwidget.cpp build/moc/moc_setuppagesats.cpp: updatesatsdata.h \ utilities.h \ locator.h \ dataproxy.h \ dataproxy_sqlite.h \ database.h \ setuppagesatsnew.h \ setuppagesats.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setuppagesats.h -o build/moc/moc_setuppagesats.cpp build/moc/moc_setuppagesatsnew.cpp: dataproxy.h \ setuppagesatsnew.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setuppagesatsnew.h -o build/moc/moc_setuppagesatsnew.cpp build/moc/moc_setuppagehamlib.cpp: hamlibclass.h \ dataproxy.h \ setuppagehamlib.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include setuppagehamlib.h -o build/moc/moc_setuppagehamlib.cpp build/moc/moc_hamlibclass.cpp: hamlibclass.h \ build/moc/moc_predefs.h \ /usr/lib/qt5/bin/moc /usr/lib/qt5/bin/moc $(DEFINES) --include /home/devel/Desktop/klog-0.9.8.1/build/moc/moc_predefs.h -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -I/home/devel/Desktop/klog-0.9.8.1 -I/usr/include/i386-linux-gnu/qt5 -I/usr/include/i386-linux-gnu/qt5/QtPrintSupport -I/usr/include/i386-linux-gnu/qt5/QtCharts -I/usr/include/i386-linux-gnu/qt5/QtWidgets -I/usr/include/i386-linux-gnu/qt5/QtGui -I/usr/include/i386-linux-gnu/qt5/QtSql -I/usr/include/i386-linux-gnu/qt5/QtNetwork -I/usr/include/i386-linux-gnu/qt5/QtSerialPort -I/usr/include/i386-linux-gnu/qt5/QtCore -I/usr/include/c++/8 -I/usr/include/i386-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/i686-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/i686-linux-gnu/8/include-fixed -I/usr/include/i386-linux-gnu -I/usr/include hamlibclass.h -o build/moc/moc_hamlibclass.cpp compiler_moc_objc_header_make_all: compiler_moc_objc_header_clean: compiler_moc_source_make_all: compiler_moc_source_clean: compiler_uic_make_all: compiler_uic_clean: compiler_yacc_decl_make_all: compiler_yacc_decl_clean: compiler_yacc_impl_make_all: compiler_yacc_impl_clean: compiler_lex_make_all: compiler_lex_clean: compiler_clean: compiler_updateqm_clean compiler_rcc_clean compiler_moc_predefs_clean compiler_moc_header_clean ####### Compile build/obj/main.o: main.cpp startwizard.h \ downloadcty.h \ utilities.h \ locator.h \ mainwindow.h \ database.h \ setupdialog.h \ setuppageuserdata.h \ world.h \ dataproxy.h \ setuppagebandmode.h \ setuppagemisc.h \ setuppagedxcluster.h \ setuppagecolors.h \ setuppagelogs.h \ setuppagelogsnew.h \ setuppageworldeditor.h \ setupentitydialog.h \ setuppageclublog.h \ setuppageudp.h \ setuppagesats.h \ updatesatsdata.h \ dataproxy_sqlite.h \ setuppagesatsnew.h \ setuppagehamlib.h \ hamlibclass.h \ aboutdialog.h \ filemanager.h \ awards.h \ awarddxmarathon.h \ contest.h \ contest_cqwwdxssb.h \ dxcluster.h \ mainwindowsattab.h \ mainwindowmydatatab.h \ mainwindowinputcomment.h \ mainwindowinputothers.h \ mainwindowinputeqsl.h \ mainwindowinputqsl.h \ elogclublog.h \ dxccstatuswidget.h \ softwareupdate.h \ softwareupdatedialog.h \ logmodel.h \ logwindow.h \ searchwidget.h \ infowidget.h \ showerrordialog.h \ udpserver.h \ statisticswidget.h \ charts/barchartstats.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperyearbarchartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ charts/statsqsospermodebarchartwidget.h \ charts/statsentitiesperyearbarchartwidget.h \ charts/statscqzperyearbarchartwidget.h \ charts/statsqsosperdxccbarchartwidget.h \ charts/statsqsospercontinentbarchartwidget.h \ charts/statsqsosperhourbarchartwidget.h \ charts/statsqsospermonthbarchartwidget.h \ charts/statsworkedconfirmedpiechartwidget.h \ charts/statsworkedsentpiechartwidget.h \ charts/statssentconfirmedpiechartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/main.o main.cpp build/obj/aboutdialog.o: aboutdialog.cpp aboutdialog.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/aboutdialog.o aboutdialog.cpp build/obj/mainwindow.o: mainwindow.cpp database.h \ utilities.h \ locator.h \ mainwindow.h \ setupdialog.h \ setuppageuserdata.h \ world.h \ dataproxy.h \ setuppagebandmode.h \ setuppagemisc.h \ setuppagedxcluster.h \ setuppagecolors.h \ setuppagelogs.h \ setuppagelogsnew.h \ setuppageworldeditor.h \ setupentitydialog.h \ setuppageclublog.h \ setuppageudp.h \ setuppagesats.h \ updatesatsdata.h \ dataproxy_sqlite.h \ setuppagesatsnew.h \ setuppagehamlib.h \ hamlibclass.h \ aboutdialog.h \ filemanager.h \ awards.h \ awarddxmarathon.h \ contest.h \ contest_cqwwdxssb.h \ dxcluster.h \ mainwindowsattab.h \ mainwindowmydatatab.h \ mainwindowinputcomment.h \ mainwindowinputothers.h \ mainwindowinputeqsl.h \ mainwindowinputqsl.h \ elogclublog.h \ downloadcty.h \ dxccstatuswidget.h \ softwareupdate.h \ softwareupdatedialog.h \ logmodel.h \ logwindow.h \ searchwidget.h \ infowidget.h \ showerrordialog.h \ udpserver.h \ statisticswidget.h \ charts/barchartstats.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperyearbarchartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ charts/statsqsospermodebarchartwidget.h \ charts/statsentitiesperyearbarchartwidget.h \ charts/statscqzperyearbarchartwidget.h \ charts/statsqsosperdxccbarchartwidget.h \ charts/statsqsospercontinentbarchartwidget.h \ charts/statsqsosperhourbarchartwidget.h \ charts/statsqsospermonthbarchartwidget.h \ charts/statsworkedconfirmedpiechartwidget.h \ charts/statsworkedsentpiechartwidget.h \ charts/statssentconfirmedpiechartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/mainwindow.o mainwindow.cpp build/obj/setupdialog.o: setupdialog.cpp setupdialog.h \ setuppageuserdata.h \ world.h \ locator.h \ dataproxy.h \ setuppagebandmode.h \ setuppagemisc.h \ utilities.h \ setuppagedxcluster.h \ setuppagecolors.h \ setuppagelogs.h \ setuppagelogsnew.h \ setuppageworldeditor.h \ setupentitydialog.h \ setuppageclublog.h \ setuppageudp.h \ setuppagesats.h \ updatesatsdata.h \ dataproxy_sqlite.h \ database.h \ setuppagesatsnew.h \ setuppagehamlib.h \ hamlibclass.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setupdialog.o setupdialog.cpp build/obj/world.o: world.cpp world.h \ locator.h \ dataproxy.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/world.o world.cpp build/obj/logwindow.o: logwindow.cpp logwindow.h \ dataproxy.h \ logmodel.h \ awards.h \ world.h \ locator.h \ awarddxmarathon.h \ utilities.h \ elogclublog.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/logwindow.o logwindow.cpp build/obj/filemanager.o: filemanager.cpp filemanager.h \ world.h \ locator.h \ dataproxy.h \ awards.h \ awarddxmarathon.h \ utilities.h \ database.h \ dataproxy_sqlite.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/filemanager.o filemanager.cpp build/obj/contest.o: contest.cpp contest.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/contest.o contest.cpp build/obj/contest_cqwwdxssb.o: contest_cqwwdxssb.cpp contest_cqwwdxssb.h \ contest.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/contest_cqwwdxssb.o contest_cqwwdxssb.cpp build/obj/database.o: database.cpp database.h \ utilities.h \ locator.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/database.o database.cpp build/obj/dataproxy.o: dataproxy.cpp dataproxy.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/dataproxy.o dataproxy.cpp build/obj/dataproxy_sqlite.o: dataproxy_sqlite.cpp dataproxy_sqlite.h \ dataproxy.h \ database.h \ utilities.h \ locator.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/dataproxy_sqlite.o dataproxy_sqlite.cpp build/obj/downloadcty.o: downloadcty.cpp downloadcty.h \ utilities.h \ locator.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/downloadcty.o downloadcty.cpp build/obj/dxcluster.o: dxcluster.cpp dxcluster.h \ awards.h \ world.h \ locator.h \ dataproxy.h \ awarddxmarathon.h \ utilities.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/dxcluster.o dxcluster.cpp build/obj/setuppagemisc.o: setuppagemisc.cpp setuppagemisc.h \ utilities.h \ locator.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setuppagemisc.o setuppagemisc.cpp build/obj/locator.o: locator.cpp locator.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/locator.o locator.cpp build/obj/awards.o: awards.cpp awards.h \ world.h \ locator.h \ dataproxy.h \ awarddxmarathon.h \ utilities.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/awards.o awards.cpp build/obj/setuppageuserdata.o: setuppageuserdata.cpp setuppageuserdata.h \ world.h \ locator.h \ dataproxy.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setuppageuserdata.o setuppageuserdata.cpp build/obj/setuppagedxcluster.o: setuppagedxcluster.cpp setuppagedxcluster.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setuppagedxcluster.o setuppagedxcluster.cpp build/obj/setuppagecolors.o: setuppagecolors.cpp setuppagecolors.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setuppagecolors.o setuppagecolors.cpp build/obj/setuppagelogs.o: setuppagelogs.cpp setuppagelogs.h \ dataproxy.h \ setuppagelogsnew.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setuppagelogs.o setuppagelogs.cpp build/obj/setuppageworldeditor.o: setuppageworldeditor.cpp setuppageworldeditor.h \ world.h \ locator.h \ dataproxy.h \ setupentitydialog.h \ utilities.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setuppageworldeditor.o setuppageworldeditor.cpp build/obj/setupentitydialog.o: setupentitydialog.cpp setupentitydialog.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setupentitydialog.o setupentitydialog.cpp build/obj/startwizard.o: startwizard.cpp startwizard.h \ downloadcty.h \ utilities.h \ locator.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/startwizard.o startwizard.cpp build/obj/mainwindowsattab.o: mainwindowsattab.cpp mainwindowsattab.h \ dataproxy.h \ locator.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/mainwindowsattab.o mainwindowsattab.cpp build/obj/awarddxmarathon.o: awarddxmarathon.cpp awarddxmarathon.h \ dataproxy.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/awarddxmarathon.o awarddxmarathon.cpp build/obj/setuppagelogsnew.o: setuppagelogsnew.cpp setuppagelogsnew.h \ dataproxy.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setuppagelogsnew.o setuppagelogsnew.cpp build/obj/setuppageclublog.o: setuppageclublog.cpp setuppageclublog.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setuppageclublog.o setuppageclublog.cpp build/obj/elogclublog.o: elogclublog.cpp elogclublog.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/elogclublog.o elogclublog.cpp build/obj/softwareupdate.o: softwareupdate.cpp softwareupdate.h \ utilities.h \ locator.h \ softwareupdatedialog.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/softwareupdate.o softwareupdate.cpp build/obj/softwareupdatedialog.o: softwareupdatedialog.cpp softwareupdatedialog.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/softwareupdatedialog.o softwareupdatedialog.cpp build/obj/utilities.o: utilities.cpp utilities.h \ locator.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/utilities.o utilities.cpp build/obj/dxccstatuswidget.o: dxccstatuswidget.cpp dxccstatuswidget.h \ awards.h \ world.h \ locator.h \ dataproxy.h \ awarddxmarathon.h \ utilities.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/dxccstatuswidget.o dxccstatuswidget.cpp build/obj/mainwindowmydatatab.o: mainwindowmydatatab.cpp mainwindowmydatatab.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/mainwindowmydatatab.o mainwindowmydatatab.cpp build/obj/mainwindowinputcomment.o: mainwindowinputcomment.cpp mainwindowinputcomment.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/mainwindowinputcomment.o mainwindowinputcomment.cpp build/obj/mainwindowinputothers.o: mainwindowinputothers.cpp mainwindowinputothers.h \ dataproxy.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/mainwindowinputothers.o mainwindowinputothers.cpp build/obj/mainwindowinputeqsl.o: mainwindowinputeqsl.cpp mainwindowinputeqsl.h \ dataproxy.h \ utilities.h \ locator.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/mainwindowinputeqsl.o mainwindowinputeqsl.cpp build/obj/mainwindowinputqsl.o: mainwindowinputqsl.cpp mainwindowinputqsl.h \ dataproxy.h \ dataproxy_sqlite.h \ database.h \ utilities.h \ locator.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/mainwindowinputqsl.o mainwindowinputqsl.cpp build/obj/setuppagebandmode.o: setuppagebandmode.cpp setuppagebandmode.h \ dataproxy.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setuppagebandmode.o setuppagebandmode.cpp build/obj/logmodel.o: logmodel.cpp logmodel.h \ dataproxy.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/logmodel.o logmodel.cpp build/obj/searchwidget.o: searchwidget.cpp searchwidget.h \ dataproxy.h \ awards.h \ world.h \ locator.h \ awarddxmarathon.h \ utilities.h \ filemanager.h \ database.h \ dataproxy_sqlite.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/searchwidget.o searchwidget.cpp build/obj/infowidget.o: infowidget.cpp infowidget.h \ locator.h \ awards.h \ world.h \ dataproxy.h \ awarddxmarathon.h \ utilities.h \ dataproxy_sqlite.h \ database.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/infowidget.o infowidget.cpp build/obj/showerrordialog.o: showerrordialog.cpp showerrordialog.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/showerrordialog.o showerrordialog.cpp build/obj/udpserver.o: udpserver.cpp udpserver.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/udpserver.o udpserver.cpp build/obj/setuppageudp.o: setuppageudp.cpp setuppageudp.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setuppageudp.o setuppageudp.cpp build/obj/statisticswidget.o: statisticswidget.cpp statisticswidget.h \ dataproxy.h \ charts/barchartstats.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperyearbarchartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ charts/statsqsospermodebarchartwidget.h \ charts/statsentitiesperyearbarchartwidget.h \ charts/statscqzperyearbarchartwidget.h \ charts/statsqsosperdxccbarchartwidget.h \ charts/statsqsospercontinentbarchartwidget.h \ charts/statsqsosperhourbarchartwidget.h \ charts/statsqsospermonthbarchartwidget.h \ charts/statsworkedconfirmedpiechartwidget.h \ charts/statsworkedsentpiechartwidget.h \ charts/statssentconfirmedpiechartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statisticswidget.o statisticswidget.cpp build/obj/barchartstats.o: charts/barchartstats.cpp charts/barchartstats.h \ dataproxy.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperyearbarchartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ charts/statsqsospermodebarchartwidget.h \ charts/statsentitiesperyearbarchartwidget.h \ charts/statscqzperyearbarchartwidget.h \ charts/statsqsosperdxccbarchartwidget.h \ charts/statsqsospercontinentbarchartwidget.h \ charts/statsqsosperhourbarchartwidget.h \ charts/statsqsospermonthbarchartwidget.h \ charts/statsworkedconfirmedpiechartwidget.h \ charts/statsworkedsentpiechartwidget.h \ charts/statssentconfirmedpiechartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/barchartstats.o charts/barchartstats.cpp build/obj/updatesatsdata.o: updatesatsdata.cpp updatesatsdata.h \ utilities.h \ locator.h \ dataproxy.h \ dataproxy_sqlite.h \ database.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/updatesatsdata.o updatesatsdata.cpp build/obj/statsgeneralchartwidget.o: charts/statsgeneralchartwidget.cpp charts/statsgeneralchartwidget.h \ dataproxy.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statsgeneralchartwidget.o charts/statsgeneralchartwidget.cpp build/obj/statsqsosperyearbarchartwidget.o: charts/statsqsosperyearbarchartwidget.cpp charts/statsqsosperyearbarchartwidget.h \ dataproxy.h \ charts/statsgeneralchartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statsqsosperyearbarchartwidget.o charts/statsqsosperyearbarchartwidget.cpp build/obj/statsentitiesperyearbarchartwidget.o: charts/statsentitiesperyearbarchartwidget.cpp charts/statsentitiesperyearbarchartwidget.h \ dataproxy.h \ charts/statsgeneralchartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statsentitiesperyearbarchartwidget.o charts/statsentitiesperyearbarchartwidget.cpp build/obj/statscqzperyearbarchartwidget.o: charts/statscqzperyearbarchartwidget.cpp charts/statscqzperyearbarchartwidget.h \ dataproxy.h \ charts/statsgeneralchartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statscqzperyearbarchartwidget.o charts/statscqzperyearbarchartwidget.cpp build/obj/statsqsospermodebarchartwidget.o: charts/statsqsospermodebarchartwidget.cpp charts/statsqsospermodebarchartwidget.h \ dataproxy.h \ charts/statsgeneralchartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statsqsospermodebarchartwidget.o charts/statsqsospermodebarchartwidget.cpp build/obj/statsqsosperdxccbarchartwidget.o: charts/statsqsosperdxccbarchartwidget.cpp charts/statsqsosperdxccbarchartwidget.h \ dataproxy.h \ charts/statsgeneralchartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statsqsosperdxccbarchartwidget.o charts/statsqsosperdxccbarchartwidget.cpp build/obj/statsqsospercontinentbarchartwidget.o: charts/statsqsospercontinentbarchartwidget.cpp charts/statsqsospercontinentbarchartwidget.h \ dataproxy.h \ charts/statsgeneralchartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statsqsospercontinentbarchartwidget.o charts/statsqsospercontinentbarchartwidget.cpp build/obj/statsqsosperhourbarchartwidget.o: charts/statsqsosperhourbarchartwidget.cpp charts/statsqsosperhourbarchartwidget.h \ dataproxy.h \ charts/statsgeneralchartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statsqsosperhourbarchartwidget.o charts/statsqsosperhourbarchartwidget.cpp build/obj/statsqsospermonthbarchartwidget.o: charts/statsqsospermonthbarchartwidget.cpp charts/statsqsospermonthbarchartwidget.h \ dataproxy.h \ charts/statsgeneralchartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statsqsospermonthbarchartwidget.o charts/statsqsospermonthbarchartwidget.cpp build/obj/statsworkedconfirmedpiechartwidget.o: charts/statsworkedconfirmedpiechartwidget.cpp charts/statsworkedconfirmedpiechartwidget.h \ dataproxy.h \ charts/statsgeneralchartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statsworkedconfirmedpiechartwidget.o charts/statsworkedconfirmedpiechartwidget.cpp build/obj/statsworkedsentpiechartwidget.o: charts/statsworkedsentpiechartwidget.cpp charts/statsworkedsentpiechartwidget.h \ dataproxy.h \ charts/statsgeneralchartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statsworkedsentpiechartwidget.o charts/statsworkedsentpiechartwidget.cpp build/obj/statssentconfirmedpiechartwidget.o: charts/statssentconfirmedpiechartwidget.cpp charts/statssentconfirmedpiechartwidget.h \ dataproxy.h \ charts/statsgeneralchartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statssentconfirmedpiechartwidget.o charts/statssentconfirmedpiechartwidget.cpp build/obj/statsqsosperbandbarchartwidget.o: charts/statsqsosperbandbarchartwidget.cpp charts/statsqsosperbandbarchartwidget.h \ dataproxy.h \ charts/statsgeneralchartwidget.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/statsqsosperbandbarchartwidget.o charts/statsqsosperbandbarchartwidget.cpp build/obj/setuppagesats.o: setuppagesats.cpp setuppagesats.h \ updatesatsdata.h \ utilities.h \ locator.h \ dataproxy.h \ dataproxy_sqlite.h \ database.h \ setuppagesatsnew.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setuppagesats.o setuppagesats.cpp build/obj/setuppagesatsnew.o: setuppagesatsnew.cpp setuppagesatsnew.h \ dataproxy.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setuppagesatsnew.o setuppagesatsnew.cpp build/obj/setuppagehamlib.o: setuppagehamlib.cpp setuppagehamlib.h \ hamlibclass.h \ dataproxy.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/setuppagehamlib.o setuppagehamlib.cpp build/obj/hamlibclass.o: hamlibclass.cpp hamlibclass.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/hamlibclass.o hamlibclass.cpp build/obj/qrc_klog.o: build/rcc/qrc_klog.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/qrc_klog.o build/rcc/qrc_klog.cpp build/obj/moc_setupdialog.o: build/moc/moc_setupdialog.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setupdialog.o build/moc/moc_setupdialog.cpp build/obj/moc_aboutdialog.o: build/moc/moc_aboutdialog.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_aboutdialog.o build/moc/moc_aboutdialog.cpp build/obj/moc_mainwindow.o: build/moc/moc_mainwindow.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_mainwindow.o build/moc/moc_mainwindow.cpp build/obj/moc_world.o: build/moc/moc_world.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_world.o build/moc/moc_world.cpp build/obj/moc_logwindow.o: build/moc/moc_logwindow.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_logwindow.o build/moc/moc_logwindow.cpp build/obj/moc_filemanager.o: build/moc/moc_filemanager.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_filemanager.o build/moc/moc_filemanager.cpp build/obj/moc_contest.o: build/moc/moc_contest.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_contest.o build/moc/moc_contest.cpp build/obj/moc_setuppagemisc.o: build/moc/moc_setuppagemisc.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setuppagemisc.o build/moc/moc_setuppagemisc.cpp build/obj/moc_dxcluster.o: build/moc/moc_dxcluster.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_dxcluster.o build/moc/moc_dxcluster.cpp build/obj/moc_awards.o: build/moc/moc_awards.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_awards.o build/moc/moc_awards.cpp build/obj/moc_setuppageuserdata.o: build/moc/moc_setuppageuserdata.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setuppageuserdata.o build/moc/moc_setuppageuserdata.cpp build/obj/moc_setuppagedxcluster.o: build/moc/moc_setuppagedxcluster.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setuppagedxcluster.o build/moc/moc_setuppagedxcluster.cpp build/obj/moc_setuppagecolors.o: build/moc/moc_setuppagecolors.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setuppagecolors.o build/moc/moc_setuppagecolors.cpp build/obj/moc_setuppagelogs.o: build/moc/moc_setuppagelogs.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setuppagelogs.o build/moc/moc_setuppagelogs.cpp build/obj/moc_setuppageworldeditor.o: build/moc/moc_setuppageworldeditor.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setuppageworldeditor.o build/moc/moc_setuppageworldeditor.cpp build/obj/moc_setupentitydialog.o: build/moc/moc_setupentitydialog.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setupentitydialog.o build/moc/moc_setupentitydialog.cpp build/obj/moc_startwizard.o: build/moc/moc_startwizard.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_startwizard.o build/moc/moc_startwizard.cpp build/obj/moc_downloadcty.o: build/moc/moc_downloadcty.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_downloadcty.o build/moc/moc_downloadcty.cpp build/obj/moc_dataproxy.o: build/moc/moc_dataproxy.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_dataproxy.o build/moc/moc_dataproxy.cpp build/obj/moc_dataproxy_sqlite.o: build/moc/moc_dataproxy_sqlite.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_dataproxy_sqlite.o build/moc/moc_dataproxy_sqlite.cpp build/obj/moc_mainwindowsattab.o: build/moc/moc_mainwindowsattab.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_mainwindowsattab.o build/moc/moc_mainwindowsattab.cpp build/obj/moc_setuppagelogsnew.o: build/moc/moc_setuppagelogsnew.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setuppagelogsnew.o build/moc/moc_setuppagelogsnew.cpp build/obj/moc_setuppageclublog.o: build/moc/moc_setuppageclublog.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setuppageclublog.o build/moc/moc_setuppageclublog.cpp build/obj/moc_elogclublog.o: build/moc/moc_elogclublog.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_elogclublog.o build/moc/moc_elogclublog.cpp build/obj/moc_softwareupdate.o: build/moc/moc_softwareupdate.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_softwareupdate.o build/moc/moc_softwareupdate.cpp build/obj/moc_softwareupdatedialog.o: build/moc/moc_softwareupdatedialog.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_softwareupdatedialog.o build/moc/moc_softwareupdatedialog.cpp build/obj/moc_dxccstatuswidget.o: build/moc/moc_dxccstatuswidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_dxccstatuswidget.o build/moc/moc_dxccstatuswidget.cpp build/obj/moc_mainwindowmydatatab.o: build/moc/moc_mainwindowmydatatab.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_mainwindowmydatatab.o build/moc/moc_mainwindowmydatatab.cpp build/obj/moc_mainwindowinputcomment.o: build/moc/moc_mainwindowinputcomment.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_mainwindowinputcomment.o build/moc/moc_mainwindowinputcomment.cpp build/obj/moc_mainwindowinputothers.o: build/moc/moc_mainwindowinputothers.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_mainwindowinputothers.o build/moc/moc_mainwindowinputothers.cpp build/obj/moc_mainwindowinputeqsl.o: build/moc/moc_mainwindowinputeqsl.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_mainwindowinputeqsl.o build/moc/moc_mainwindowinputeqsl.cpp build/obj/moc_mainwindowinputqsl.o: build/moc/moc_mainwindowinputqsl.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_mainwindowinputqsl.o build/moc/moc_mainwindowinputqsl.cpp build/obj/moc_setuppagebandmode.o: build/moc/moc_setuppagebandmode.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setuppagebandmode.o build/moc/moc_setuppagebandmode.cpp build/obj/moc_logmodel.o: build/moc/moc_logmodel.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_logmodel.o build/moc/moc_logmodel.cpp build/obj/moc_searchwidget.o: build/moc/moc_searchwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_searchwidget.o build/moc/moc_searchwidget.cpp build/obj/moc_infowidget.o: build/moc/moc_infowidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_infowidget.o build/moc/moc_infowidget.cpp build/obj/moc_showerrordialog.o: build/moc/moc_showerrordialog.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_showerrordialog.o build/moc/moc_showerrordialog.cpp build/obj/moc_udpserver.o: build/moc/moc_udpserver.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_udpserver.o build/moc/moc_udpserver.cpp build/obj/moc_setuppageudp.o: build/moc/moc_setuppageudp.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setuppageudp.o build/moc/moc_setuppageudp.cpp build/obj/moc_statisticswidget.o: build/moc/moc_statisticswidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statisticswidget.o build/moc/moc_statisticswidget.cpp build/obj/moc_barchartstats.o: build/moc/moc_barchartstats.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_barchartstats.o build/moc/moc_barchartstats.cpp build/obj/moc_updatesatsdata.o: build/moc/moc_updatesatsdata.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_updatesatsdata.o build/moc/moc_updatesatsdata.cpp build/obj/moc_statsgeneralchartwidget.o: build/moc/moc_statsgeneralchartwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statsgeneralchartwidget.o build/moc/moc_statsgeneralchartwidget.cpp build/obj/moc_statsqsosperyearbarchartwidget.o: build/moc/moc_statsqsosperyearbarchartwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statsqsosperyearbarchartwidget.o build/moc/moc_statsqsosperyearbarchartwidget.cpp build/obj/moc_statsentitiesperyearbarchartwidget.o: build/moc/moc_statsentitiesperyearbarchartwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statsentitiesperyearbarchartwidget.o build/moc/moc_statsentitiesperyearbarchartwidget.cpp build/obj/moc_statscqzperyearbarchartwidget.o: build/moc/moc_statscqzperyearbarchartwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statscqzperyearbarchartwidget.o build/moc/moc_statscqzperyearbarchartwidget.cpp build/obj/moc_statsqsosperbandbarchartwidget.o: build/moc/moc_statsqsosperbandbarchartwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statsqsosperbandbarchartwidget.o build/moc/moc_statsqsosperbandbarchartwidget.cpp build/obj/moc_statsqsospermodebarchartwidget.o: build/moc/moc_statsqsospermodebarchartwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statsqsospermodebarchartwidget.o build/moc/moc_statsqsospermodebarchartwidget.cpp build/obj/moc_statsqsosperdxccbarchartwidget.o: build/moc/moc_statsqsosperdxccbarchartwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statsqsosperdxccbarchartwidget.o build/moc/moc_statsqsosperdxccbarchartwidget.cpp build/obj/moc_statsqsospercontinentbarchartwidget.o: build/moc/moc_statsqsospercontinentbarchartwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statsqsospercontinentbarchartwidget.o build/moc/moc_statsqsospercontinentbarchartwidget.cpp build/obj/moc_statsqsosperhourbarchartwidget.o: build/moc/moc_statsqsosperhourbarchartwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statsqsosperhourbarchartwidget.o build/moc/moc_statsqsosperhourbarchartwidget.cpp build/obj/moc_statsqsospermonthbarchartwidget.o: build/moc/moc_statsqsospermonthbarchartwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statsqsospermonthbarchartwidget.o build/moc/moc_statsqsospermonthbarchartwidget.cpp build/obj/moc_statsworkedconfirmedpiechartwidget.o: build/moc/moc_statsworkedconfirmedpiechartwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statsworkedconfirmedpiechartwidget.o build/moc/moc_statsworkedconfirmedpiechartwidget.cpp build/obj/moc_statsworkedsentpiechartwidget.o: build/moc/moc_statsworkedsentpiechartwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statsworkedsentpiechartwidget.o build/moc/moc_statsworkedsentpiechartwidget.cpp build/obj/moc_statssentconfirmedpiechartwidget.o: build/moc/moc_statssentconfirmedpiechartwidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_statssentconfirmedpiechartwidget.o build/moc/moc_statssentconfirmedpiechartwidget.cpp build/obj/moc_setuppagesats.o: build/moc/moc_setuppagesats.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setuppagesats.o build/moc/moc_setuppagesats.cpp build/obj/moc_setuppagesatsnew.o: build/moc/moc_setuppagesatsnew.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setuppagesatsnew.o build/moc/moc_setuppagesatsnew.cpp build/obj/moc_setuppagehamlib.o: build/moc/moc_setuppagehamlib.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_setuppagehamlib.o build/moc/moc_setuppagehamlib.cpp build/obj/moc_hamlibclass.o: build/moc/moc_hamlibclass.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_hamlibclass.o build/moc/moc_hamlibclass.cpp ####### Install install_target: first FORCE @test -d $(INSTALL_ROOT)/usr/bin || mkdir -p $(INSTALL_ROOT)/usr/bin -$(QINSTALL_PROGRAM) build/target/$(QMAKE_TARGET) $(INSTALL_ROOT)/usr/bin/$(QMAKE_TARGET) -$(STRIP) $(INSTALL_ROOT)/usr/bin/$(QMAKE_TARGET) uninstall_target: FORCE -$(DEL_FILE) $(INSTALL_ROOT)/usr/bin/$(QMAKE_TARGET) -$(DEL_DIR) $(INSTALL_ROOT)/usr/bin/ install_datafiles: first FORCE @test -d $(INSTALL_ROOT)/usr/share/klog || mkdir -p $(INSTALL_ROOT)/usr/share/klog -$(QINSTALL) /home/devel/Desktop/klog-0.9.8.1/Changelog $(INSTALL_ROOT)/usr/share/klog/Changelog -$(QINSTALL) /home/devel/Desktop/klog-0.9.8.1/COPYING $(INSTALL_ROOT)/usr/share/klog/COPYING uninstall_datafiles: FORCE -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/share/klog/COPYING -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/share/klog/Changelog -$(DEL_DIR) $(INSTALL_ROOT)/usr/share/klog/ install: install_target install_datafiles FORCE uninstall: uninstall_target uninstall_datafiles FORCE FORCE: klog-0.9.8.1/database.cpp0000644000175000017500000113513613532572307014074 0ustar develdevel/*************************************************************************** database.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "database.h" //#include DataBase::DataBase(const QString _parentClass, const QString _DBName) { //qDebug() << "DataBase::DataBase: PLAIN: " << _parentClass << " / Name = " << _DBName << endl; constrid = 1; util = new Utilities(); softVersion = util->getVersion(); dbName = _DBName; //qDebug() << "DataBase::DataBase1: dbName: " << dbName << endl; //db = QSqlDatabase::database(); dbVersion = DBVersionf; createConnection(); //qDebug() << "DataBase::DataBase: PLAIN - connection Name: " << dbConnectionName << endl; //qDebug() << "DataBase::DataBase: PLAIN - DB Name: " << db.databaseName() << endl; insertPreparedQueries.clear(); insertQueryFields.clear(); //qDebug() << "DataBase::DataBase: PLAIN: - END" << endl; } DataBase::DataBase(const QString _parentClass, const QString _softVersion, const QString _DBName){ //qDebug() << "DataBase::DataBase2: " << _parentClass << "/" << _softVersion << " / Name = " << _DBName << endl; //TODO: Sometimes the DB is created without the proper calling (without passing softVersion) constrid = 2; dbVersion = DBVersionf; softVersion = _softVersion; //inMemoryOnly = inmemoryonly; latestReaded = 0.0; util = new Utilities(); util->setVersion(softVersion); //dbName = util->getKLogDBFile(); dbName = _DBName; //qDebug() << "DataBase::DataBase2: dbName: " << dbName << endl; //dbDir = dbName; //qDebug() << "DataBase::DataBase: DB(string): " << dbName << endl; //db = QSqlDatabase::database(); if (util->getVersionDouble()>0) { createConnection(); } //qDebug() << "DataBase::DataBase: - connection Name: " << dbConnectionName << endl; //qDebug() << "DataBase::DataBase: - DB Name: " << db.databaseName() << endl; insertPreparedQueries.clear(); insertQueryFields.clear(); //qDebug() << "DataBase::DataBase2: END" << endl; } /* bool DataBase::queryAddField(const QString _field, const QString value) { //QStringList insertPreparedQueries, insertQueryFields; insertQueryFields << _field << value; } bool DataBase::queryPrepare() { //insertPreparedQueries.clear(); //insertQueryFields.clear(); for (int i = 0; i < insertQueryFields.size(); ++i) { if (insertQueryFields.at(i) != "EOR") { insertPreparedQueries << insertQueryFields.at(i) << insertQueryFields.at(i+1); } else { insertPreparedQueries << "EOR"; return true; } } return true; } bool DataBase::queryExec() { //qDebug() << "DataBase::queryExec " << endl; bool sqlOK; //insertQueryFields.clear(); //insertPreparedQueries.clear(); //bool sqlOK = preparedQuery.exec(); QSqlQuery preparedQuery; //Prepare the Query for (int i = 0; i < insertPreparedQueries.size(); ++i) { preparedQuery.bindValue(insertPreparedQueries.at(i), insertPreparedQueries.at(i+1)); } if (!sqlOK) { queryErrorManagement("DataBase::queryExec", preparedQuery.lastError().databaseText(), preparedQuery.lastError().number(), preparedQuery.lastQuery()); //emit queryError(Q_FUNC_INFO, preparedQuery.lastError().databaseText(), preparedQuery.lastError().number(), preparedQuery.lastQuery()); //qDebug() << "DataBase::queryExec - FAILED execution: " << preparedQuery.lastQuery() << endl; } else { //qDebug() << "DataBase::queryExec - executed: " << preparedQuery.lastQuery() << endl; } return sqlOK; } */ DataBase::~DataBase() { //qDebug() << "DataBase::~DataBase" << endl; } QString DataBase::getSoftVersion() { QSqlQuery query; QString stringQuery ("SELECT MAX (softversion) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { return (query.value(0)).toString(); } else { query.finish(); return QString(); } } else { //ERROR in Query execution queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } return QString(); } QString DataBase::getDBVersion() { QSqlQuery query; QString stringQuery ("SELECT MAX (dbversion) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { return QString::number((query.value(0)).toDouble(), 'f', 3); } else { query.finish(); return QString(); } } else { //ERROR in Query execution queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return QString(); } return QString(); } /* bool DataBase::setDir(const QString _dir) { dbDir = _dir; return true; } */ QString DataBase::getDBName() { return db.databaseName(); } QStringList DataBase::getColumnNamesFromTable(const QString _tableName) { //qDebug() << "DataBase::getColumnNamesFromTable: " << _tableName << endl; QSqlQuery query; QString queryString = QString("PRAGMA table_info('%1')").arg(_tableName); bool sqlOK = query.exec(queryString); QStringList list; list.clear(); QString aux; if (sqlOK) { //qDebug() << "DataBase::getColumnNamesFromTable: OK" << endl; while(query.next()) { if (query.isValid()) { aux = (query.value(1)).toString(); if (( aux.toUpper() != "ID" ) && (aux.length()>0)) { list << aux; //qDebug() << "DataBase::getColumnNamesFromTable: " << (query.value(1)).toString() << endl; } } } query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } query.finish(); //qDebug() << "DataBase::getColumnNamesFromTable: " << QString::number(list.size()) << endl; return list; } void DataBase::compress() { //qDebug() << "DataBase::compress " << endl; //QSqlDatabase db = QSqlDatabase::database(); if (!db.open()) { QMessageBox::warning(0, QObject::tr("Database Error"), db.lastError().text()); } else { db.exec("VACUUM;"); } } bool DataBase::reConnect(const QString _DBName) { //qDebug() << "DataBase::reConnect:" << endl; db.close(); dbName = _DBName; //qDebug() << "DataBase::reConnect: DB closed" << endl; //dbName = util->getKLogDBFile(); //qDebug() << "DataBase::reConnect: DB: " << dbDir << endl; return createConnection(); //qDebug() << "DataBase::reConnect: END" << endl; } bool DataBase::createConnection(bool newDB) { //qDebug() << "DataBase::createConnection: " << QString::number(dbVersion) << "/" << softVersion << endl; QString stringQuery; QSqlQuery query; if (!db.isOpen()) { //qDebug() << "DataBase::createConnection: DB NOT Opened" << endl; //db = QSqlDatabase::database(); //qDebug) << "DataBase::createConnection: Start the test" << endl; if (db.isValid()) { //qDebug) << "DataBase::createConnection: DB is Valid" << endl; } else { //qDebug) << "DataBase::createConnection: DB is not valid, let's call addDataBase" << endl; db = QSqlDatabase::addDatabase("QSQLITE"); //qDebug) << "DataBase::createConnection: Now we call setDatabaseName" << endl; db.setDatabaseName(dbName); //qDebug) << "DataBase::createConnection: end of not valid" << endl; } //qDebug) << "DataBase::createConnection: end of valid check, let's try if it is open" << endl; if (!db.open()) { //qDebug) << "DataBase::createConnection:Not open " << endl; QMessageBox::warning(0, QObject::tr("Database Error"), db.lastError().text()); //qDebug() << "DataBase::createConnection: DB creation ERROR" << endl; return false; } else { //qDebug) << "DataBase::createConnection: created and opened after the creation" << endl; if (isTheDBCreated()) { //qDebug() << "DataBase::createConnection: DB Exists" << endl; } else { //qDebug() << "DataBase::createConnection: DB does not exist" << endl; createDataBase(); stringQuery ="PRAGMA main.page_size = 4096;"; query.exec(stringQuery); stringQuery ="PRAGMA main.cache_size=10000;"; query.exec(stringQuery); stringQuery ="PRAGMA main.locking_mode=EXCLUSIVE;"; query.exec(stringQuery); stringQuery ="PRAGMA main.synchronous=NORMAL;"; query.exec(stringQuery); stringQuery ="PRAGMA main.journal_mode=WAL;"; query.exec(stringQuery); stringQuery ="PRAGMA main.cache_size=5000;"; query.exec(stringQuery); stringQuery ="PRAGMA synchronous=OFF;"; query.exec(stringQuery); stringQuery ="PRAGMA main.temp_store = MEMORY;"; query.exec(stringQuery); //stringQuery="PRAGMA auto_vacuum = FULL;"; //query.exec(stringQuery); stringQuery ="PRAGMA case_sensitive_like=OFF;"; query.exec(stringQuery); } } } else { //qDebug() << "DataBase::createConnection: No Error, DB is open" << endl; } //qDebug() << "DataBase::createConnection: Going to run - createBandModeMaps " << endl; if (createBandModeMaps()) { //qDebug() << "DataBase::createConnection: createBandModeMaps true" << endl; } else { //qDebug() << "DataBase::createConnection: createBandModeMaps false SSSSSSSSSSSSSSSTOOOOOOOOOOOOOOOOOOOOOPPPPPPPPPPPPPPPPPPPP" << endl; } //created = true; //qDebug) << "DataBase::createConnection -------------------------------------------- END" << endl; return unMarkAllQSO(); } bool DataBase::isTheDBCreated() { //qDebug() << "DataBase::isTheDBCreated: Called from: " << QString::number(constrid) << endl; QSqlQuery query; int _num = 0; QString stringQuery ("SELECT count(id) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { //qDebug() << "DataBase::isTheDBCreated - SQL OK" << endl; query.next(); if (query.isValid()) { //qDebug() << "DataBase::isTheDBCreated - valid" << endl; _num = (query.value(0)).toInt(); if (_num > 0) { //qDebug() << "DataBase::isTheDBCreated - DB Exists" << endl; //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END TRUE" << endl; query.finish(); return true; } else { //qDebug() << "DataBase::isTheDBCreated - DB does not Exist" << endl; //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END FALSE-1" << endl; query.finish(); return false; } } else { //qDebug() << "DataBase::isTheDBCreated - not valid" << endl; //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END FALSE-2" << endl; query.finish(); return false; } } else { //ERROR in Query execution //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------ ERROR IN QUERY EXECUTION" << endl; queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } query.finish(); //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END FALSE-X" << endl; return false; } bool DataBase::recreateTableLog() { //qDebug() << "DataBase::recreateTableLog" << endl; if (!createTableLog(false)) // Create modetemp { //qDebug() << "DataBase::recreateTableLog: CreateTableLog returned false" << endl; return false; } QString queryString; queryString.clear(); QStringList columns; columns.clear(); columns << getColumnNamesFromTable("log"); queryString = columns.first(); for (int i=1;i= '%2'").arg(fr).arg(fr); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "DataBase::getBandIdFromFreq: Query: " << query.lastQuery() << endl; if (sqlOK) { //qDebug() << "DataBase::getBandIdFromFreq: Query OK" << endl; query.next(); if (query.isValid()) { //qDebug() << "DataBase::getBandIdFromFreq: Query OK - END" << endl; return (query.value(0)).toInt(); } else { //qDebug() << "DataBase::getBandIdFromFreq: Valid NOK - END" << endl; query.finish(); return -1; } } else { //qDebug() << "DataBase::getBandIdFromFreq: Query NOK" << endl; //qDebug() << "DataBase::getBandIdFromFreq: Query NOK: " << query.lastError().text() << endl; //qDebug() << "DataBase::getBandIdFromFreq: Query NOK: " << query.lastError().nativeErrorCode() << endl; if (query.lastError().isValid()) { //qDebug() << "DataBase::getBandIdFromFreq: Query NOK - Error VALID" << endl; } else { //qDebug() << "DataBase::getBandIdFromFreq: Query NOK - Error NOT-VALID" << endl; } //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); queryErrorManagement(Q_FUNC_INFO, query.lastError().text(), query.lastError().number(), query.lastQuery()); query.finish(); return -2; } //qDebug() << "DataBase::getBandIdFromFreq: END-X" << endl; query.finish(); return -3; } bool DataBase::isThisFreqInBand(const QString b, const QString fr) {//Freq should be in MHz //qDebug() << "DataBase::isThisFreqInBand: " << b << "/" << fr << endl; int bandNf = getBandIdFromFreq(fr); int bandN = getBandIDFromName2(b); //qDebug() << "DataBase::isThisFreqInBand: (b/f)" << QString::number(bandN) << "/" << QString::number(bandNf) << endl; if (bandNf == bandN) { //qDebug() << "DataBase::isThisFreqInBand: OK " << b << "/" << fr << endl; return true; } else { //qDebug() << "DataBase::isThisFreqInBand: NOK " << b << "/" << fr << endl; return false; } //qDebug() << "DataBase::isThisFreqInBand: END" << endl; return false; } bool DataBase::unMarkAllQSO() { //qDebug() << "DataBase::unMarkAllQSO" << endl; QString stringQuery = QString("UPDATE log SET marked = 'N' WHERE 1"); return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::updateIfNeeded() { //qDebug() << "DataBase::updateIfNeeded - Version: " << QString::number(dbVersion) << endl; /************************************************************************************** * This function should call to bool updateToXXX () being XXX dbVersion and * */ //float aux = 0.0; //int nameCol = -1; //int errorCode = -1; //bool toBeUpdated = false; //bool sqlOK; QSqlQuery query; QString stringQuery = QString("SELECT MAX (dbversion) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); latestReaded = (query.value(0)).toFloat(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } //QSqlQuery query("SELECT dbversion FROM softwarecontrol"); //QSqlRecord rec = query.record(); //query.next(); //latestReaded = (query.value(0)).toFloat(); query.finish(); //qDebug() << "DataBase::updateIfNeeded - LatestReaded: " << QString::number(latestReaded) << endl; if (latestReaded >= dbVersion) { // DB is updated, no update is needed //qDebug() << "DataBase::updateIfNeeded - DB updated (no need to update anything!) " << endl; //toBeUpdated = false; //qDebug() << "DataBase::updateIfNeeded - TRUE - END " << endl; return true; } else { // DB is outdated. We need to update!! //qDebug() << "DataBase::updateIfNeeded - DB outdated... upgrade starts now! " << endl; QMessageBox msgBox; msgBox.setWindowTitle("KLog"); msgBox.setText( QObject::tr("KLog DB needs to be upgraded.")); msgBox.setInformativeText( QObject::tr("Do you want to upgrade it now?") + "\n"+ QObject::tr("If DB is not upgraded KLog may not work properly.")); msgBox.setStandardButtons(QMessageBox::Apply | QMessageBox::Discard); msgBox.setDefaultButton(QMessageBox::Apply); msgBox.setIcon(QMessageBox::Warning); msgBox.raise(); //this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint); msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Apply: // Save was clicked updateToLatest(); break; case QMessageBox::Discard: // Discard was clicked break; default: // should never be reached //qDebug() << "DataBase::updateIfNeeded - FALSE - CHECK IF SEEN, shoud not be here! - END " << endl; return false; break; } } // If the DB needs to be updated... we update it! :-) //qDebug() << "DataBase::updateIfNeeded - END!" << endl; return true; } bool DataBase::createTheBandQuickReference() { /* KEY Value QHash bandIDHash; QHash modeIDHash; QHash IDBandHash; QHash IDModeHash QHash freqBandIdHash; */ //qDebug() << "DataBase::createTheBandQuickReference: " << endl; QString st = "NULL"; int in = 0; QString stringQuery = QString("SELECT id, name, lower FROM band"); QString fr = QString(); bandIDHash.clear(); IDBandHash.clear(); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } while (query.next()) { if (query.isValid()) { st = (query.value(1)).toString(); in = (query.value(0)).toInt(); fr = (query.value(2)).toString(); bandIDHash.insert(st, in ); IDBandHash.insert(in, st); freqBandIdHash.insert(in, fr); //qDebug() << "DataBase::createTheBandQuickReference: " << st <<"/" << QString::number(in)<< endl; } else { //qDebug() << "DataBase::createTheBandQuickReference: Query not valid -'RETURN FALSE - END" << endl; // QMessageBox::warning(0, QObject::tr("Database Error (DataBase::createTheBandQuickReference)"), // query.lastError().text()); query.finish(); return false; //TODO: Manage this error, in case the query is NOK. } //qDebug() << "DataBase::createTheBandQuickReference: Go for the next one!" << endl; } query.finish(); //qDebug() << "DataBase::createTheBandQuickReference: END" << endl; return true; } bool DataBase::createTheModeQuickReference() { /* KEY Value QHash modeIDHash; QHash IDModeHash */ //qDebug() << "DataBase::createTheModeQuickReference: " << endl; if (getDBVersion().toFloat()<0.010) { // If the version is not updated we don't create the reference return true; } QString st = QString(); QString sm = QString(); int in = 0; modeIDHash.clear(); IDModeHash.clear(); subModeIDHash.clear(); IDSubModeHash.clear(); QString stringQuery = QString("SELECT id, name, submode FROM mode"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } while (query.next()) { if (query.isValid()) { in = (query.value(0)).toInt(); st = (query.value(1)).toString(); sm = (query.value(2)).toString(); modeIDHash.insert(st, in ); IDModeHash.insert(in, st); subModeIDHash.insert(sm, in ); IDSubModeHash.insert(in, sm); //qDebug() << "DataBase::createTheModeQuickReference: " << st <<"/" << QString::number(in)<< endl; } else { //qDebug() << "DataBase::createTheModeQuickReference: Query not valid - END" << endl; //QMessageBox::warning(0, QObject::tr("Database Error (DataBase::createTheModeQuickReference)"), // query.lastError().text()); query.finish(); return false; //TODO: Manage this error, in case the query is NOK. } } query.finish(); //qDebug() << "DataBase::createTheModeQuickReference: END" << endl; return true; } int DataBase::getBandIDFromName2(const QString b) {//KEY, value //name, id /* KEY Value QHash bandIDHash; QHash modeIDHash; QHash IDBandHash; QHash IDModeHash */ //qDebug() << "DataBase::getBandIDFromName2: " << b << endl; //qDebug() << "DataBase::getBandIDFromName2: This line should be the last one... " << endl; return getBandIdFromName(b); //qDebug() << "DataBase::getBandIDFromName2: CHECK IF THIS LINE IS SEEN" << endl; if (b.length()<1) { return -3; } if (bandIDHash.contains(b)) { //qDebug() << "DataBase::getBandIDFromName2: " << b << ":" << bandIDHash.value(b) << endl; return bandIDHash.value(b); } else { //qDebug() << "DataBase::getBandIDFromName2: Contains - False" << endl; return -1; } //qDebug() << "DataBase::getBandIDFromName2: Safety exit" << endl; return -2; } int DataBase::getModeIDFromName2(const QString b) { //qDebug() << "DataBase::getModeIDFromName2: " << b << endl; return getModeIdFromSubMode(b); if (b.length()<2) { //qDebug() << "DataBase::getModeIDFromName2: END -3" << endl; return -3; } if (modeIDHash.contains(b)) { //qDebug() << "DataBase::getModeIDFromName2: END - " << b << ":" << modeIDHash.value(b) << endl; return modeIDHash.value(b); } else { //qDebug() << "DataBase::getModeIDFromName2: Contains - False - END" << endl; return -1; } //qDebug() << "DataBase::getModeIDFromName2: Safety exit - END" << endl; return -2; } int DataBase::getSubModeIDFromName2(const QString b) { //qDebug() << "DataBase::getSubModeIDFromName2: " << b << endl; return getModeIdFromSubMode(b); //return getModeIdFromName(b); if (b.length()<2) { //qDebug() << "DataBase::getSubModeIDFromName2: END -3" << endl; return -3; } if (subModeIDHash.contains(b)) { //qDebug() << "DataBase::getSubModeIDFromName2: END - " << b << ":" << modeIDHash.value(b) << endl; return subModeIDHash.value(b); } else { //qDebug() << "DataBase::getSubModeIDFromName2: Contains - False - END" << endl; return -1; } //qDebug() << "DataBase::getSubModeIDFromName2: Safety exit - END" << endl; return -2; } QString DataBase::getBandNameFromID2(const int _i) { //qDebug() << "DataBase::getBandNameFromid2: " << QString::number(_i) << endl; return getBandNameFromNumber(_i); if (IDBandHash.contains(_i)) { //qDebug() << "DataBase::getBandNameFromid2: END OK" << endl; return IDBandHash.value(_i); } else { //qDebug() << "DataBase::getBandNameFromid2: END-1" << endl; return "-1"; } //qDebug() << "DataBase::getBandNameFromid2: END-2" << endl; return "-2"; } QString DataBase::getModeNameFromID2(const int _i) { //qDebug() << "DataBase::getModeNameFromId2: " << QString::number(_i) << endl; return getSubModeNameFromNumber(_i); if (IDModeHash.contains(_i)) { //qDebug() << "DataBase::getModeNameFromId2: END OK - " << IDModeHash.value(_i) << endl; return IDModeHash.value(_i); } else { //qDebug() << "DataBase::getModeNameFromId2: END-1" << endl; return "-1"; } //qDebug() << "DataBase::getModeNameFromId2: END-2" << endl; return "-2"; } QString DataBase::getSubModeNameFromID2(const int _i) { //qDebug() << "DataBase::getSubModeNameFromId2: " << QString::number(_i) << endl; return getSubModeNameFromNumber(_i); if (IDSubModeHash.contains(_i)) { //qDebug() << "DataBase::getSubModeNameFromId2: END OK - " << IDModeHash.value(_i) << endl; return IDSubModeHash.value(_i); } else { //qDebug() << "DataBase::getSubModeNameFromId2: END-1" << endl; return "-1"; } //qDebug() << "DataBase::getSubModeNameFromId2: END-2" << endl; return "-2"; } bool DataBase::createBandModeMaps() { //qDebug() << "DataBase::createBandModeMaps" << endl; bool b = false; bool m = false; //return (b && m); if (isTheDBCreated()) { b = createTheBandQuickReference(); m = createTheModeQuickReference(); //qDebug() << "DataBase::createBandModeMaps - isTheDbCreated TRUE" << endl; return (b && m); } else { //qDebug() << "DataBase::createBandModeMaps - isTheDbCreated FALSE" << endl; return false; } return false; //qDebug() << "DataBase::createBandModeMaps END" << endl; } QString DataBase::getFreqFromBandId(const int _i) { //qDebug() << "DataBase::getFreqFromBandId" << endl; if (freqBandIdHash.contains(_i)) { //qDebug() << "DataBase::getFreqFromBandId OK END" << endl; return freqBandIdHash.value(_i); } else { //qDebug() << "DataBase::getFreqFromBandId END-1" << endl; return "-1.0"; } //qDebug() << "DataBase::getFreqFromBandId END-2" << endl; return "-2.0"; } int DataBase::getLogTypeNumber(const QString _logType) { //qDebug() << "DataBase::getLogTypeNumber: " << _logType << endl; QSqlQuery query; QString queryString = QString("SELECT id FROM supportedcontests WHERE name='%1'").arg(_logType); bool sqlOK = query.exec(queryString); if(!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); } query.next(); if ( query.isValid() ) { return (query.value(0)).toInt(); } else { query.finish(); return -1; } query.finish(); return -2; } QString DataBase::getLogTypeName(const int _logType) { //qDebug() << "DataBase::getLogTypeName: " << QString::number(_logType) << endl; QSqlQuery query; QString queryString = QString("SELECT name FROM supportedcontests WHERE id='%1'").arg(_logType); bool sqlOK = query.exec(queryString); if(!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); } query.next(); if ( query.isValid() ) { return (query.value(0)).toString(); } else { query.finish(); return QString(); } query.finish(); return QString(); } bool DataBase::updateToLatest() { /* * With the DB updates, the function that is called from here should be also updated. * The updateXXX are recursive calls that calls the previous one. * */ //qDebug() << "DataBase::updateToLatest " << endl; return updateTo016(); } bool DataBase::updateTo003() {// Updates the DB to 0.0.3 /* * This function should be used as a template to create the all the update functions implementing the needed changes * in the dB to update from one version to the following one. * * // dbVersion shows the DB version that is being deployed * // latestReaded shows the DB version that is currently deployed. *i.e.: * QString stringQuery = QString ("ALTER TABLE award_enumeration ADD COLUMN dxcc INTEGER;"); * */ //qDebug() << "DataBase::updateTo003: latestRead: " << QString::number(latestReaded) << endl; bool IAmIn003 = false; bool IAmIn002 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= float(0.003)) { //IAmIn003 = true; return true; } else { IAmIn003 = false; } while (!IAmIn003 && !ErrorUpdating) { while (!IAmIn002 && !ErrorUpdating) { //IAmIn002 = updateTo002(); IAmIn002 = true; } if (ErrorUpdating) { return false; } //DO ALL THE TASKS TO BE IN 0.003 from 0.002 HERE and set ErrorUpdating if it is not possible. IAmIn003 = true; } return IAmIn003; } bool DataBase::updateTo004() {// Updates the DB to 0.0.4 //qDebug() << "DataBase::updateTo004: latestRead: " << getDBVersion() << endl; //qDebug() << "DataBase::updateTo004: latestRead: " << QString::number(latestReaded) << endl; bool IAmIn004 = false; bool IAmIn003 = false; bool ErrorUpdating = false; QString stringQuery = QString(); QSqlQuery query; bool sqlOk = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= float(0.004)) { //qDebug() << "DataBase::updateTo004: - I am in 004" << endl; return true; } else { //qDebug() << "DataBase::updateTo004: - I am not in 004" << endl; IAmIn004 = false; } while (!IAmIn004 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo004: - And I am not in 004 nor ErrorUpdating" << endl; while (!IAmIn003 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo004: - And I am not in 003" << endl; //IAmIn002 = updateTo002(); IAmIn003 = true; } if (ErrorUpdating) { return false; } //qDebug() << "DataBase::updateTo004: - And I am in 003" << endl; sqlOk = updateDBVersion(softVersion, "0.004"); //qDebug() << "DataBase::updateTo004: - Update Version" << endl; if (sqlOk) { // Version updated //qDebug() << "DataBase::updateTo004: - Update OK" << endl; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE award_enumeration"); } else { // Version not updated //qDebug() << "DataBase::updateTo004: - Update NOK" << endl; } //DO ALL THE TASKS TO BE IN 0.004 from 0.003 HERE and set ErrorUpdating if it is not possible. //qDebug() << "DataBase::updateTo004: - IAmIn004 = true" << endl; IAmIn004 = true; } if (IAmIn004) { //qDebug() << "DataBase::updateTo004: - Return... TRUE" << endl; } else { //qDebug() << "DataBase::updateTo004: - Return... FALSE" << endl; } //qDebug() << "DataBase::updateTo004: UPDATED OK!" << endl; return IAmIn004; } bool DataBase::updateTo005() {// Updates the DB to 0.0.5 //qDebug() << "DataBase::updateTo005: latestRead: " << getDBVersion() << endl; bool IAmIn005 = false; bool IAmIn004 = false; bool ErrorUpdating = false; QString stringQuery = QString(); //QString dateString = (date.currentDateTime()).toString("yyyyMMdd"); QSqlQuery query; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); //int errorCode; bool sqlOk = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= float(0.005)) { //qDebug() << "DataBase::updateTo005 - Already in 005" << endl; return true; } else { //qDebug() << "DataBase::updateTo005 - 005 update false" << endl; IAmIn005 = false; } while (!IAmIn005 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo005 - I am not in 005" << endl; while (!IAmIn004 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo005 - I am not in 004" << endl; IAmIn004 = updateTo004(); } //qDebug() << "DataBase::updateTo005 - I am in 004" << endl; if (ErrorUpdating) { //qDebug() << "DataBase::updateTo005 - 005 update false2" << endl; return false; } sqlOk = updateDBVersion(softVersion, "0.005"); if (sqlOk) { // Version updated if (recreateContestData()) { //qDebug() << "DataBase::updateTo005 - recreateContestData OK" << endl; sqlOk = execQuery(Q_FUNC_INFO, "DROP table logs"); sqlOk = createTableLogs(true); if (!sqlOk) { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataBase::updateTo005 - logs table do not created" << endl; } if (howManyQSOsInLog(0)>0) { // If the user has QSOs that were added with previous versions... // We need to create a new log and rename all QSOs to that QSO. //stringQuery = QString("UPDATE log SET lognumber='1' WHERE lognumber='0'"); msgBox.setText(QObject::tr("KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you.")); msgBox.exec(); if (execQuery(Q_FUNC_INFO, "UPDATE log SET lognumber='1' WHERE lognumber='0'")) {} else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //showError(QObject::tr("QSOs not updated to main log")); //qDebug() << "DataBase::updateTo005 - QSOs not updated to main log" << endl; } QString dateString = (QDate::currentDate()).toString("yyyy/MM/dd"); QString callToUse = QString(); bool ok; //QString text; //text = QInputDialog::getText(this, QObject::tr("Station Callsign"), QObject::tr("Enter the Station Callsign you want to use in the imported log:"), QLineEdit::Normal, QObject::tr("N0CALL"), &ok); QString text = (QInputDialog::getText(0, QObject::tr("KLog: Enter Station callsign"), QObject::tr("Enter the station callsign used in this log"), QLineEdit::Normal, QObject::tr("Station Callsign"), &ok)).toUpper(); text = text.toUpper(); if (ok && !text.isEmpty()) { callToUse = text; } else { callToUse = "N0CALL"; } stringQuery = QString("INSERT INTO logs (logdate, stationcall, logtype, logtypen) values('%1','%2','DX', '1')").arg(dateString).arg(callToUse); sqlOk = execQuery(Q_FUNC_INFO, stringQuery); if (sqlOk) { } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //showError(QObject::tr("New Log not created")); //qDebug() << "DataBase::updateTo005 - New Log not created" << endl; //qDebug() << "DataBase::clearLog: Log deleted FAILED" << endl; } } else { } IAmIn005 = true; } else { //qDebug() << "DataBase::updateTo005 - recreateContestData FAILED" << endl; ErrorUpdating = true; } } else { // Version not updated //qDebug() << "DataBase::updateTo005 - 005 update false6" << endl; ErrorUpdating = true; } } //qDebug() << "DataBase::updateTo005 - 005 updated 3" << endl; //TODO: Delete the table and recreate it if (IAmIn005) { msgBox.setText(QObject::tr("All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is OK.")); msgBox.exec(); } //qDebug() << "DataBase::updateTo005 - I am in 005 already!! " << endl; //qDebug() << "DataBase::updateTo005: UPDATED OK!" << endl; return IAmIn005; } bool DataBase::recreateSatelliteData() { //qDebug() << "DataBase::recreateSatelliteData" << endl; QSqlQuery query; if (isTheTableExisting("satellites")) { if (execQuery(Q_FUNC_INFO, "DROP TABLE satellites")) { if (createTableSatellites(true)) { //qDebug() << "DataBase::recreateSatelliteData SAT table created" << endl; return populateTableSatellites(true); } else { //qDebug() << "DataBase::recreateSatelliteData SAT table NOT created" << endl; } } else { //qDebug() << "DataBase::recreateSatelliteData execQuery FAILED" << endl; } } else { if (createTableSatellites(true)) { //qDebug() << "DataBase::recreateSatelliteData SAT table created" << endl; return populateTableSatellites(true); } else { //qDebug() << "DataBase::recreateSatelliteData SAT table NOT created" << endl; } } //qDebug() << "DataBase::recreateSatelliteData END FALSE" << endl; return false; } bool DataBase::recreateContestData() { //qDebug() << "DataBase::recreateContestData" << endl; if (isTheTableExisting("contest")) { QSqlQuery query; bool sqlOk = false; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE contest"); if (sqlOk) { if (createTableContest()) { return populateContestData(); } } } else { if (createTableContest()) { return populateContestData(); } } return false; } bool DataBase::recreateSupportedContest() { //qDebug() << "DataBase::recreateSupportedContest" << endl; execQuery(Q_FUNC_INFO, "DROP TABLE IF exists supportedcontests"); if (isTheTableExisting("supportedcontests")) { QSqlQuery query; bool sqlOk = false; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE supportedcontests"); if (sqlOk) { //qDebug() << "DataBase::recreateSupportedContest SQLOK" << endl; if (createTableSupportedContest()) { //qDebug() << "DataBase::recreateSupportedContest - createTable OK" << endl; return populateTableSupportedContest(); } else { //qDebug() << "DataBase::recreateSupportedContest createTableSupportContest FALSE" << endl; return false; } } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } } else { if (createTableSupportedContest()) { //qDebug() << "DataBase::recreateSupportedContest - createTable OK" << endl; return populateTableSupportedContest(); } else { //qDebug() << "DataBase::recreateSupportedContest createTableSupportContest FALSE" << endl; return false; } } //qDebug() << "DataBase::recreateSupportedContest - FALSE end" << endl; return false; } bool DataBase::recreatePropModes() { //qDebug() << "DataBase::recreatePropModes" << endl; if (isTheTableExisting("prop_mode_enumeration")) { //qDebug() << "DataBase::recreatePropModes: Table Exist" << endl; bool sqlOk = false; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE prop_mode_enumeration"); if (sqlOk) { //qDebug() << "DataBase::recreatePropModes SQLOK" << endl; if (createTablePropModes()) { //qDebug() << "DataBase::recreatePropModes - createTable OK" << endl; if (populatePropagationModes()) { //qDebug() << "DataBase::recreatePropModes - populatePropModes OK" << endl; return true; } else { //qDebug() << "DataBase::recreatePropModes - populatePropModes NOK" << endl; return false; } } else { //qDebug() << "DataBase::recreatePropModes createTableSupportContest FALSE-1" << endl; return false; } } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataBase::recreatePropModes - prop_mode_enumeration table has not been dropped" << endl; //qDebug() << "DataBase::recreatePropModes : Table creation FAILED" << endl; } } else { //qDebug() << "DataBase::recreatePropModes: Table does NOT Exist" << endl; if (createTablePropModes()) { //qDebug() << "DataBase::recreatePropModes - createTable OK" << endl; if (populatePropagationModes()) { //qDebug() << "DataBase::recreatePropModes - populatePropModes OK" << endl; return true; } else { //qDebug() << "DataBase::recreatePropModes - populatePropModes NOK" << endl; return false; } } else { //qDebug() << "DataBase::recreatePropModes createTableSupportContest FALSE-2" << endl; } } //qDebug() << "DataBase::recreatePropModes - FALSE end" << endl; return false; } bool DataBase::createTableLogs(const bool real) { // NoTmp = false => TMP data table to operate and be deleted afterwards //Creating the Sats DB to be able to include satellites to the LOTW //qDebug() << "DataBase::createTableLogs" << endl; QString stringQuery = QString(); //QSqlQuery query; if (real) { //qDebug() << "DataBase::createTableLogs - logs" << endl; stringQuery = "CREATE TABLE logs" ; } else { //qDebug() << "DataBase::createTableLogs - logstemp" << endl; stringQuery = "CREATE TABLE logstemp" ; } stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "logdate VARCHAR(10), " "stationcall VARCHAR(15) NOT NULL, " "operators VARCHAR, " "comment VARCHAR, " "logtype VARCHAR, " "logtypen INTEGER, " "FOREIGN KEY (logtypen) REFERENCES supportedcontests(id)," "FOREIGN KEY (logtype) REFERENCES supportedcontests(name))"); //qDebug() << "DataBase::createTableLogs - END" << endl; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::createTablePropModes() { //qDebug() << "DataBase::createTablePropModes" << endl; execQuery(Q_FUNC_INFO, "DROP TABLE IF exists prop_mode_enumeration"); return execQuery(Q_FUNC_INFO, "CREATE TABLE prop_mode_enumeration (id INTEGER PRIMARY KEY AUTOINCREMENT, shortname VARCHAR(8), name VARCHAR(55) )"); } bool DataBase::createTableSupportedContest() { //qDebug() << "DataBase::createTableSupportedContest" << endl; execQuery(Q_FUNC_INFO, "DROP TABLE IF exists supportedcontests"); QString st = QString("CREATE TABLE supportedcontests (" "id INTEGER PRIMARY KEY, " "longname VARCHAR," "name VARCHAR)"); return execQuery(Q_FUNC_INFO, st); } bool DataBase::createTableContest() { //qDebug() << "DataBase::createTableContest" << endl; //QSqlQuery query; createTableSupportedContest(); execQuery(Q_FUNC_INFO, "DROP TABLE IF exists contest"); execQuery(Q_FUNC_INFO, "CREATE TABLE contest (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "contest INTEGER NOT NULL," "catoperator INTEGER NOT NULL," "catassisted INTEGER NOT NULL," "catpower INTEGER NOT NULL," "catband INTEGER NOT NULL," "catoverlay INTEGER NOT NULL," "catmode INTEGER NOT NULL," "FOREIGN KEY (contest) REFERENCES supportedcontests(id), " "FOREIGN KEY (catoperator) REFERENCES contestcatoperator(id), " "FOREIGN KEY (catassisted) REFERENCES contestcatassisted(id), " "FOREIGN KEY (catpower) REFERENCES contestcatpower(id), " "FOREIGN KEY (catband) REFERENCES contestcatband(id), " "FOREIGN KEY (catoverlay) REFERENCES contestcatoverlay(id), " "FOREIGN KEY (catmode) REFERENCES contestcatmode(id))"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatoperator (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatassisted (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatpower (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatband (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatoverlay (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatmode (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); populateTableSupportedContest(); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('1', 'Single-Operator')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('2', 'Multi-One')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('3', 'Multi-Two')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('4', 'Multi-Unlimited')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('5', 'CheckLog')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatassisted (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatassisted (id, name) VALUES ('1', 'Non-Assisted')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatassisted (id, name) VALUES ('2', 'Assisted')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('1', 'High-Power')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('2', 'Low-Power')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('3', 'QRP')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatband (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatband (id, name) VALUES ('1', 'All-Band')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatband (id, name) VALUES ('2', 'Single-Band')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoverlay (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoverlay (id, name) VALUES ('1', 'Classic')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoverlay (id, name) VALUES ('2', 'Rookie')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('1', 'SSB')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('2', 'CW')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('3', 'MIXED')"); //qDebug() << "DataBase::createTableContest END" << endl; return true; } bool DataBase::populateTableSupportedContest() { //qDebug() << "DataBase::populateTableSupportedContest" << endl; // ADDING ALL THE CATEGORIES OPTIONS return execQuery(Q_FUNC_INFO, "INSERT INTO supportedcontests (id, longname, name) VALUES ('0', 'Normal log', 'DX')"); } bool DataBase::createTableQSL_Via_enumeration() { execQuery(Q_FUNC_INFO, "DROP TABLE IF exists qsl_via_enumeration"); QString st = QString("CREATE TABLE qsl_via_enumeration (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "shortname VARCHAR(1) NOT NULL, " "name VARCHAR(15) NOT NULL)"); return execQuery(Q_FUNC_INFO, st); } bool DataBase::populateTableQSL_Via_enumeration() { execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('B', 'Bureau')"); execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('D', 'Direct')"); execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('E', 'Electronic')"); execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('M', 'Manager')"); return true; } bool DataBase::createTableMode(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //qDebug() << "DataBase::createTableMode" << endl; QString stringQuery = QString(); QSqlQuery query; if (NoTmp) { stringQuery = "CREATE TABLE mode" ; } else { stringQuery = "CREATE TABLE modetemp" ; } stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "cabrillo VARCHAR(2) NOT NULL, " "name VARCHAR(40) NOT NULL, " "submode VARCHAR(40) NOT NULL, " "deprecated VARCHAR(1) NOT NULL)"); //qDebug() << "DataBase::createTableMode END" << endl; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::populateTableMode(const bool NoTmp) { //qDebug() << "DataBase::populateTableMode" << endl; //QSqlQuery query; QString tableName = QString(); QString squery = QString(); if (NoTmp) { tableName = "mode"; } else { tableName = "modetemp"; } bool sqlOK = execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('AM', 'AM', 'PH', '0')").arg(tableName)); //int errorCode = -1; if (!sqlOK) { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataBase::populateTableMode: Mode table population FAILED" << endl; //errorCode = query.lastError().number(); } else { //qDebug() << "DataBase::populateTableMode: Mode table population OK" << endl; } execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ARDOP', 'ARDOP', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('AMTORFEC', 'TOR', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ASCI', 'RTTY', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ATV', 'ATV', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('C4FM', 'C4FM', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CHIP', 'CHIP', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CHIP64', 'CHIP', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CHIP128', 'CHIP', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CLO', 'CLO', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CONTESTI', 'CONTESTI', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CW', 'CW', 'CW', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DIGITALVOICE', 'DIGITALVOICE', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DSTAR', 'DSTAR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOMINO', 'DOMINO', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOMINOEX', 'DOMINO', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOMINOF', 'DOMINO', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FAX', 'FAX', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FM', 'FM', 'PH', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FMHELL', 'HELL', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FT4', 'MFSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FT8', 'FT8', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSK31', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSK441', 'FSK441', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSKHELL', 'HELL', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSQCALL', 'MFSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('GTOR', 'TOR', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('HELL', 'HELL', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('HELL80', 'HELL', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('HFSK', 'HELL', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ISCAT', 'ISCAT', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ISCAT-A', 'ISCAT', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ISCAT-B', 'ISCAT', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JS8', 'MFSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4', 'JT4', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4A', 'JT4', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4B', 'JT4', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4C', 'JT4', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4D', 'JT4', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4E', 'JT4', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4F', 'JT4', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4G', 'JT4', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT6M', 'JT6M', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-1', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-2', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-5', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-10', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-30', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9A', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9B', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9C', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9D', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9E', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9E FAST', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9F', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9F FAST', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9G', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9G FAST', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9H', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9H FAST', 'JT9', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT44', 'JT44', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65', 'JT65', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65A', 'JT65', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65B', 'JT65', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65B2', 'JT65', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65C', 'JT65', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65C2', 'JT65', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK', 'MFSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK4', 'MFSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK8', 'MFSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK11', 'MFSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK16', 'MFSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK22', 'MFSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK31', 'MFSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK32', 'MFSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK64', 'MFSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK128', 'MFSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MSK144', 'MSK144', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MT63', 'MT63', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA', 'OLIVIA', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 4/125', 'OLIVIA', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 4/250', 'OLIVIA', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 8/250', 'OLIVIA', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 8/500', 'OLIVIA', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 16/500', 'OLIVIA', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 16/1000', 'OLIVIA', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 32/1000', 'OLIVIA', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OPERA', 'OPERA', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OPERA-BEACON', 'OPERA', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OPERA-QSO', 'OPERA', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC', 'PAC', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC2', 'PAC', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC3', 'PAC', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC4', 'PAC', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAX', 'PAX', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAX2', 'PAX', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PCW', 'CW', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PKT', 'PKT', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK', 'PSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK10', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK31', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK63', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK63F', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK125', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK250', 'PSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK500', 'PSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK1000', 'PSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKAM10', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKAM31', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKAM50', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKFEC31', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK2K', 'PSK2K', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKHELL', 'HELL', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('Q15', 'Q15', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK31', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK63', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK125', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK250', 'PSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK500', 'PSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64', 'QRA64', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64A', 'QRA64', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64B', 'QRA64', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64C', 'QRA64', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64D', 'QRA64', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64E', 'QRA64', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS', 'ROS', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS-EME', 'ROS', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS-HF', 'ROS', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS-MF', 'ROS', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('RTTY', 'RTTY', 'RY', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('RTTYM', 'RTTYM', 'RY', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('SSB', 'SSB', 'PH', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('LSB', 'SSB', 'PH', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('USB', 'SSB', 'PH', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('SIM31', 'PSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('SSTV', 'SSTV', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('T10', 'T10', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THRB', 'THRB', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THRBX', 'THRB', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR', 'THOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('TOR', 'TOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('V4', 'V4', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('VOI', 'VOI', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('WINMOR', 'WINMOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('WSPR', 'WSPR', 'NO', '0')").arg(tableName)); createTheModeQuickReference(); //qDebug() << "DataBase::populateTableMode END" << endl; return true; } bool DataBase::createTableSatellites(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //Creating the Sats DB to be able to include satellites to the LOTW //qDebug() << "DataBase::createTableSatellites" << endl; // The satmode column has the following format: {Up/down-mode;Up/down-mode} // this way we can implement several freqs/modes per sat // Initially I will implement Up/Down only but KLog should be prepared to work with "-mode" also // being mode "SSB, CW, ... and other ADIF modes QString stringQuery = QString(); QString table = QString(); if (NoTmp) { table = "satellites" ; } else { table = "satellitestemp" ; } stringQuery = "CREATE TABLE "+ table; stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "satarrlid VARCHAR, " "satname VARCHAR, " "uplink VARCHAR," "downlink VARCHAR," "satmode VARCHAR, " "UNIQUE (satarrlid) )"); /* * * uplink/downlink format is the following: * Single frecuency: 145.950 * Segment: 145.950-145.975 * Several freqs: 145.950,435.950 * Several segments: 145.950-145.975,435.950-435.975 * * satmode format: * Single mode: FM * Modes complex Up/Downlink: USB/LSB * Several modes (one per uplink/downlink pair): FM,SSB * Several complex modes (one per uplink/downlink pair): USB/LSB,LSB/USB,FM * */ QString delS = QString(); delS = "DROP TABLE IF exists " + table; execQuery(Q_FUNC_INFO, delS); return execQuery(Q_FUNC_INFO, stringQuery); /* bool sqlOK = query.exec(stringQuery); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } */ //qDebug() << "DataBase::createTableSatellites END" << endl; //return sqlOK; } bool DataBase::populateTableSatellites(const bool NoTmp) { // Data must come from: // https://lotw.arrl.org/lotw-help/frequently-asked-questions/#sats //qDebug() << "DataBase::populateTableSatellites" << endl; //QSqlQuery query; QString tableName = QString(); QString squery = QString(); if (NoTmp) { tableName = "satellites"; } else { tableName = "satellitestemp"; } // The satmode column has the following format: {Up/down-mode;Up/down-mode} // this way we can implement several freqs/modes per sat // Initially I will implement Up/Down only but KLog should be prepared to work with "-mode" also // being mode "SSB, CW, ... and other ADIF modes //To add a band, just create another line: execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-10', 'AMSAT-OSCAR 10', '435.030,146.180', '145.81', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-13', 'AMSAT-OSCAR 13', '435.423-435.573', '145.975-145.825', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-16', 'AMSAT-OSCAR 16', '145.92', '437.026', 'FM/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-21', 'OSCAR 21/RS-14', '', '145.8', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-24', 'Arsene-OSCAR 24', '', '145.975', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-27', 'AMRAD-OSCAR 27', '145.85', '436.795', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-3', 'AMSAT-OSCAR 3', '145.975-146.025', '144.325-144.375', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-4', 'AMSAT-OSCAR 4', '432.145-432.155', '144.300-144.310', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-40', 'AMSAT-OSCAR 40','145.840-145.990,435.790-435.520', '2401.2225-2401.475', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-51', 'AMSAT-OSCAR 51', '145.92', '435.3', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-6', 'AMSAT-OSCAR 6', '145.900-146.000', '29.450-29.550', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-7', 'AMSAT-OSCAR 7', '145.850-145.950,432.180-432.120', '29.400-29.500,145.920-145.980', 'USB,LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-73', 'AMSAT-OSCAR 73', '435.150-435.130', '145.950-145.970', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-8', 'AMSAT-OSCAR 8', '145.850-145.900,145.900-146.000', '29.400-29.500,435.200-435.100', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-85', 'AMSAT-OSCAR 85 (Fox-1A)', '435.170', '145.980', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('ARISS', 'ARISS', '145.200,144.490', '145.800,145.800', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BIRD-BT', 'BHUTAN-1', '145.825', ',145.825', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BIRD-MY', 'UiTMSat-1', '145.825', ',145.825', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BIRD-PH', 'MAYA-1', '145.825', ',145.825', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BY70-1', 'Bayi Kepu Weixing 1', '145.92', '436.2', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('CAS-3H', 'LilacSat 2', '144.350,144.390', '437.225,144.390', 'FM,PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('CAS-4A', 'CAMSAT 4A', '435.210-435.230', '145.880-145.860', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('CAS-4B', 'CAMSAT 4B', '435.270-435.290', '145.935-145.915', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('DO-64', 'Delfi OSCAR-64', '', '145.870', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('EO-79', 'FUNcube-3', '435.047-435.077', '145.935-145.965', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('EO-88', 'Emirates OSCAR 88 (Nayif-1)', '435.045-435.015', '145.960-145.990', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FO-12', 'Fuji-OSCAR 12', '145.900-146.000,145.85', '435.900-435.800,435.91', 'SSB,PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FO-20', 'Fuji-OSCAR 20', '145.900-146.000', '435.900-435.800', 'SSB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FO-29', 'Fuji-OSCAR 29', '145.900-145.999', '435.900-435.800', 'LSB/USB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('HO-68', 'Hope OSCAR 68', '145.925-145.975,145.825', '435.765-435.715,435.675', 'LSB/USB,FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('IO-86', 'Indonesia OSCAR 86 (LAPAN-ORARI)', '435.880', '145.880', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-19', 'Lusat-OSCAR 19', '145.840-145.900', '437.125-437.150', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-78', 'LituanicaSAT-1', '145.95,145.85', '435.1755,437.543', 'FM,PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-87', 'LUSEX-OSCAR 87', '435.935-435.965', '145.935-145.965' 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('MIREX', 'Mir packet digipeater', '145.985', '145.985', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('NO-44', 'Navy-OSCAR 44', '145.827', '145.827', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('NO-83', 'BRICsat','145.825,28.120', '145.825,435.975' 'PKT,PSK31')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('NO-84', 'PSAT', '145.825,28.120', '435.350', 'PKT,PSK31')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-1', 'Radio Sputnik 1', '145', '29', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-10', 'Radio Sputnik 10', '','29.357,29.403', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-11', 'Radio Sputnik 11', '','29.357,29.403', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-12', 'Radio Sputnik 12', '21.210-21.250', '29.410-29.450', 'SSB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-13', 'Radio Sputnik 13', '21.260-21.300', '145.860-145.900', 'SSB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-15', 'Radio Sputnik 15', '', '29.3525-29.3987', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-2', 'Radio Sputnik 2', '145', '29', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-5', 'Radio Sputnik 5', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-6', 'Radio Sputnik 6', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-7', 'Radio Sputnik 7', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-8', 'Radio Sputnik 8', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SAREX', 'Shuttle Amateur Radio Experiment packet digipeater', '144.80,144.49', '144.55', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-35', 'Sunsat-OSCAR 35', '436.291', '145.825', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-41', 'Saudi-OSCAR 41', '145.850', '436.775', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-50', 'Saudi-OSCAR 50', '145.850', '436.795', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-67', 'Sumbandila OSCAR 67', '145.875', '435.345', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('UKUBE1', 'UKube-1 (FUNcube-2)', '435.080-435.060', '145.930-145.950,2401.0', 'LSB/USB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('UO-14', 'UOSAT-OSCAR 14', '145.975', '435.07', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('VO-52', 'VUsat-OSCAR 52', '435.220-435.280,435.225-435.275', '145.930-145.870,145.925-145.875', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2A', 'Hope 2A (CAS-3A)', '435.030-435.050', '145.665-145.685', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2B', 'Hope 2B (CAS-3B)', '435.090-435.110', '145.730-145.750', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2C', 'Hope 2C (CAS-3C)', '435.150-435.170', '145.795-145.815', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2D', 'Hope 2D (CAS-3D)', '435.210-435.230', '145.860-145.880', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2E', 'Hope 2E (CAS-3E)', '435.270-435.290', '145.915-145.935', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2F', 'Hope 2F (CAS-3F)', '435.330-435.350', '145.980-145.999', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-90', 'LilacSat-OSCAR 90 (LilacSat-1)', '145.985', '436.510', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-91', 'RadFxSat (Fox-1B)', '435.250', '145.960', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-92', 'Fox-1D', '435.350,1267.35', '145.880', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FS-3', 'FalconSat-3', '435.103', '145.840', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('QO-100', 'Es''hail-2', '2400.050-2409.500', '10489.550-10499.000', 'SSB,CW')").arg(tableName)); //qDebug() << "DataBase::populateTableSatellites - END" << endl; return true; } bool DataBase::createTableEntity(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //qDebug() << "DataBase::createTableEntity" << endl; QString stringQuery = QString(); //QSqlQuery query; if (NoTmp) { stringQuery = "CREATE TABLE entity" ; } else { stringQuery = "CREATE TABLE entitytemp" ; } stringQuery = stringQuery + QString( " (id INTEGER PRIMARY KEY AUTOINCREMENT, " "name VARCHAR(40) NOT NULL," "cqz INTEGER NOT NULL, " "ituz INTEGER NOT NULL, " "continent INTEGER NOT NULL, " "latitude REAL NOT NULL, " "longitude REAL NOT NULL, " "utc INTEGER NOT NULL, " "dxcc INTEGER NOT NULL, " "mainprefix VARCHAR(15) NOT NULL, " "deleted INTEGER, " "sincedate VARCHAR(10), " "todate VARCHAR(10), " "isoname VARCHAR(10), " "UNIQUE (dxcc, mainprefix), " "FOREIGN KEY (continent) REFERENCES continent(shortname) )"); //qDebug() << "DataBase::createTableEntity END" << endl; return execQuery(Q_FUNC_INFO, stringQuery); //TODO: To add some columns in this the table to mark if worked/confirmed/band/Mode } bool DataBase::createTableBand(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //qDebug() << "DataBase::createTableBand" << endl; QString stringQuery = QString(); //QSqlQuery query; if (NoTmp) { stringQuery = "CREATE TABLE band" ; } else { stringQuery = "CREATE TABLE bandtemp" ; } stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "lower REAL NOT NULL, " "upper REAL NOT NULL, " "cabrillo VARCHAR(6) NOT NULL, " "name VARCHAR(40) NOT NULL, " "UNIQUE (lower, upper, cabrillo, name) )"); //qDebug() << "DataBase::createTableBand END" << endl; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::populateTableBand(const bool NoTmp) { // Cabrillo definition: http://wwrof.org/cabrillo/cabrillo-specification-v3/ //qDebug() << "DataBase::populateTableBand" << endl; QString tableName = QString(); QString squery = QString(); if (NoTmp) { tableName = "band"; } else { tableName = "bandtemp"; } //To add a band, just create another line: execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('0', '0', '0', 'Light')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('1mm', '241000', '250000', '241G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2mm', '142000', '149000', '142G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2.5mm', '119980', '120020', '119G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('4mm', '75500', '81000', '75G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('6mm', '47000', '47200', '47G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('1.25CM', '24000', '24250', '24G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('3CM', '10000', '10500', '10G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('6CM', '5650', '5925', '5.7G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('9CM', '3300', '3500', '3.4G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('13CM', '2340', '2450', '2.3G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('23CM', '1240', '1300', '1.2G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('33CM', '902', '928', '902')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('70CM', '420', '450', '432')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('1.25M', '222', '225', '222')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2M', '144', '148', '144')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('4M', '70', '71', '4M')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('6M', '50', '54', '50')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('10M', '28.0', '29.7', '28000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('12M', '24.89', '24.99', '24000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('15M', '21.0', '21.45', '21000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('17M', '18.068', '18.168', '18100')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('20M', '14.0', '14.35', '14000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('30M', '10.0', '10.15', '10000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('40M', '7.0', '7.3', '7000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('60M', '5.102', '5.404', '5100')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('80M', '3.5', '4.0', '3500')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('160M', '1.8', '2.0', '1800')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('560M', '0.501', '0.504', '560M')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('630M', '0.472', '0.479', '630M')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2190M', '0.1357', '0.1378', '2190M')").arg(tableName)); createTheBandQuickReference(); //qDebug() << "DataBase::populateTableBand END" << endl; return true; } bool DataBase::populatePropagationModes() { //qDebug() << "DataBase::populatePropagationModes" << endl; //QSqlQuery query; execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AS', 'Aircraft Scatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AUR', 'Aurora')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AUE', 'Aurora-E')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('BS', 'Back scatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('ECH', 'EchoLink')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('EME', 'Earth-Moon-Earth')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('ES', 'Sporadic E')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('FAI', 'Field Aligned Irregularities')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('F2', 'F2 Reflection')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('INTERNET', 'Internet-assisted')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('ION', 'Ionoscatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('IRL', 'IRLP')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('MS', 'Meteor scatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('RPT', 'Terrestrial or atmospheric repeater or transponder')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('RS', 'Rain scatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('SAT', 'Satellite')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('TEP', 'Trans-equatorial')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('TR', 'Tropospheric ducting')")); //qDebug() << "DataBase::populatePropagationModes END" << endl; return true; } bool DataBase::populateContestData() { //qDebug() << "DataBase::populateContestData" << endl; // CONTEST DEFINITIONS START HERE // DX execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (0, 0, 0, 0, 0, 0, 0)"); // DX START /* // CQ WW DX SSB START execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 2, 0, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 2, 0, 2, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 3, 0, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 3, 0, 2, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 4, 0, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 5, 0, 0, 0, 0, 1)"); // CQ WW DX SSB END */ //qDebug() << "DataBase::populateContestData END" << endl; return true; } bool DataBase::howManyQSOsInLog(const int i) { //qDebug() << "DataBase::howManyQSOsInLog" << endl; QSqlQuery query; QString sqlQueryString = QString("SELECT COUNT(id) from log WHERE lognumber='%1'").arg(i); bool sqlOK = query.exec(sqlQueryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataBase::howManyQSOsInLog OK END" << endl; return (query.value(0)).toInt(); } else { //qDebug() << "DataBase::howManyQSOsInLog END-1" << endl; query.finish(); return -1; } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::howManyQSOsInLog END-2" << endl; return -1; } query.finish(); return -2; } bool DataBase::updateTo006() {// Updates the DB to 0.0.6 //qDebug() << "DataBase::updateTo006: latestRead: " << getDBVersion() << endl; bool IAmIn006 = false; bool IAmIn005 = false; bool ErrorUpdating = false; QString stringQuery = QString(); //QString dateString = (date.currentDateTime()).toString("yyyyMMdd"); bool sqlOk = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= float(0.006)) { return true; } else { IAmIn006 = false; } while (!IAmIn006 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo006: - Still not in 006" << endl; while (!IAmIn005 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo006: - And still not in 005" << endl; IAmIn005 = updateTo005(); } //qDebug() << "DataBase::updateTo006: - Already in 005" << endl; if (ErrorUpdating) { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(0)" << endl; return false; } sqlOk = updateDBVersion(softVersion, "0.006"); if(sqlOk) { //qDebug() << "DataBase::updateTo006: - DB Updated" << endl; sqlOk = recreatePropModes(); if(sqlOk) { //qDebug() << "DataBase::updateTo006: - recreatePropModes OK" << endl; sqlOk = updateTableLog(6); // We copy the log into logtemp } else { //qDebug() << "DataBase::updateTo006: - recreatePropModes NOK" << endl; ErrorUpdating = true; IAmIn006 = false; //qDebug() << "DataBase::updateTo006: UPDATED NOK!(1)" << endl; return false; } sqlOk = createTableBand(false); // We create the bandTemp if (sqlOk) { //qDebug() << "DataBase::updateTo006: - createTableBand OK" << endl; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(2)" << endl; ErrorUpdating = true; //return false; } sqlOk = populateTableBand(false); // Populate the bandTemp if (sqlOk) { //qDebug() << "DataBase::updateTo006: - populateTableBand OK" << endl; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(3)" << endl; ErrorUpdating = true; } sqlOk = updateBandIdTableLogToNewOnes(); if (sqlOk) { //qDebug() << "DataBase::updateTo006: - updateBandIdTableLogToNewOnes OK" << endl; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(4)" << endl; ErrorUpdating = true; } sqlOk = updateBandIdTableAward(1); // DXCC if (sqlOk) { //qDebug() << "DataBase::updateTo006: - updateBandIdTableAward 1 OK" << endl; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(5)" << endl; ErrorUpdating = true; } sqlOk = updateBandIdTableAward(2); // WAZ if (sqlOk) { //qDebug() << "DataBase::updateTo006: - updateBandIdTableAward 2 OK" << endl; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(6)" << endl; ErrorUpdating = true; } if (execQuery(Q_FUNC_INFO, "DROP TABLE band")) { if (execQuery(Q_FUNC_INFO, "ALTER TABLE bandtemp RENAME TO band")) { //qDebug() << "DataBase::updateTo006 - bandtemp renamed" << endl; } else { //qDebug() << "DataBase::updateTo006 - ERROR - bandtemp not renamed" << endl; ErrorUpdating = true; //qDebug() << "DataBase::updateTo006: UPDATED NOK!(7)" << endl; } } else { //qDebug() << "DataBase::updateTo006 - ERROR - bandtemp not dropped" << endl; ErrorUpdating = true; IAmIn006 = false; //qDebug() << "DataBase::updateTo006: UPDATED NOK!(8)" << endl; ErrorUpdating = true; } sqlOk = updateTheModeTableAndSyncLog(); if (sqlOk) { //qDebug() << "DataBase::updateTo006: - updateTheModeTableAndSyncLog OK" << endl; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(9)" << endl; ErrorUpdating = true; } sqlOk = createTableClubLogStatus(); if (sqlOk) { //qDebug() << "DataBase::updateTo006: - createTableClubLogStatus OK" << endl; sqlOk = populateTableClubLogStatus(); if (sqlOk) { //qDebug() << "DataBase::updateTo006: - populateTableClubLogStatus OK" << endl; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(10)" << endl; ErrorUpdating = true; } } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(11)" << endl; ErrorUpdating = true; } } else {// Version not updated //qDebug() << "DataBase::updateTo006: - DB NOT Updated" << endl; ErrorUpdating = true; IAmIn006 = false; //qDebug() << "DataBase::updateTo006: UPDATED NOK!(12)" << endl; ErrorUpdating = true; } //qDebug() << "DataBase::updateTo006: - IAmIn006 = TRUE" << endl; IAmIn006 = true; } //DO ALL THE TASKS TO BE IN 0.006 from 0.005 HERE and set ErrorUpdating if it is not possible. //qDebug() << "DataBase::updateTo006 - I am in 006 " << endl; //qDebug() << "DataBase::updateTo006 - END " << endl; //qDebug() << "DataBase::updateTo006: UPDATED OK!" << endl; return IAmIn006; } bool DataBase::updateTableLog(const int _v) { //qDebug() << "DataBase::updateTableLog " << endl; createTableLog(false); QString queryString; switch (_v) { case 6: // If 6, we copy in logtemp the full data coming from the old log. This way, the structure of // the log table is updated without any data loss. queryString = QString ("INSERT INTO logtemp (qso_date, time_on, call, rst_sent, rst_rcvd, bandid, modeid, srx, stx, points, multiplier, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, band_rx, checkcontest, class, contacted_op, contest_id, country, credit_submitted, credit_granted, distance, email, eq_call, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, force_init, freq, freq_rx, gridsquare, iota, iota_island_id, k_index, lat, lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, max_bursts, ms_shower, my_city, my_cnty, my_country, my_cq_zone, my_gridsquare, my_iota, my_iota_island_id, my_lat, my_lon, my_name, my_rig, my_sig, my_sig_info, my_state, my_street, name, notes, nr_bursts, nr_pings, operator, owner_callsign, pfx, precedence, prop_mode, public_key, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, qth, rx_pwr, sat_mode, sat_name, sfi, sig, sig_info, srx_string, stx_string, state, station_callsign, swl, ten_ten, tx_pwr, web, qso_date_off, time_off, transmiterid, marked, lognumber) SELECT qso_date, time_on, call, rst_sent, rst_rcvd, bandid, modeid, srx, stx, points, multiplier, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, band_rx, checkcontest, class, contacted_op, contest_id, country, credit_submitted, credit_granted, distance, email, eq_call, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, force_init, freq, freq_rx, gridsquare, iota, iota_island_id, k_index, lat, lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, max_bursts, ms_shower, my_city, my_cnty, my_country, my_cq_zone, my_gridsquare, my_iota, my_iota_island_id, my_lat, my_lon, my_name, my_rig, my_sig, my_sig_info, my_state, my_street, name, notes, nr_bursts, nr_pings, operator, owner_callsign, pfx, precedence, prop_mode, public_key, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, qth, rx_pwr, sat_mode, sat_name, sfi, sig, sig_info, srx_string, stx_string, state, station_callsign, swl, ten_ten, tx_pwr, web, qso_date_off, time_off, transmiterid, marked, lognumber FROM log"); break; default: //qDebug() << "DataBase::updateTableLog FALSE END" << endl; return false; break; } if (execQuery(Q_FUNC_INFO, queryString)) { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Query executed" << endl; queryString = "DROP TABLE log"; if (execQuery(Q_FUNC_INFO, queryString)) { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Table log dropped" << endl; queryString = "ALTER TABLE logtemp RENAME TO log" ; if (execQuery(Q_FUNC_INFO, queryString)) { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - tmp renamed - END" << endl; return true; } else { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Renaming failed" << endl; } } else { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Table log Not dropped" << endl; } } else { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - query failed" << endl; } //qDebug() << "DataBase::updateTableLog END" << endl; return false; } bool DataBase::createTableClubLogStatus() { //qDebug() << "createTableClubLogStatus" << endl; execQuery(Q_FUNC_INFO, "DROP TABLE IF exists clublog_status"); QString queryString = QString("CREATE TABLE clublog_status (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "shortname VARCHAR(1) NOT NULL, " "name VARCHAR(15) NOT NULL)"); return execQuery(Q_FUNC_INFO, queryString); } bool DataBase::populateTableClubLogStatus() { //qDebug() << "populateTableClubLogStatus" << endl; QString queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('Y', 'Uploaded')"; if (execQuery(Q_FUNC_INFO, queryString)) { queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('N', 'Do not upload')"; if (execQuery(Q_FUNC_INFO, queryString)) { queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('M', 'Modified')"; //qDebug() << "populateTableClubLogStatus END" << endl; return execQuery(Q_FUNC_INFO, queryString); } } //qDebug() << "populateTableClubLogStatus FALSE END" << endl; return false; } /* bool DataBase::moveFromModeIdToSubmodeId() { return false; } */ bool DataBase::updateTableEntity() { //qDebug() << "DataBase::updateTableEntity" << endl; bool result = false; QString stringQuery; bool sqlOk; result = createTableEntity(false); // Now we have a temp entity table with the correct format if (result) { //qDebug() << "DataBase::updateTableEntity: Table entitytemp created!" << endl; // Now we need to move all the data from the old to the temp entity table. stringQuery = QString("INSERT INTO entitytemp (name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix, deleted, sincedate, todate) SELECT name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix, deleted, sincedate, todate FROM entity"); sqlOk = execQuery(Q_FUNC_INFO, stringQuery); if (sqlOk) { //qDebug() << "DataBase::updateTableEntity: Data copied from entity to entitytemp!" << endl; stringQuery = "DROP TABLE entity"; if (execQuery(Q_FUNC_INFO, stringQuery)) { //qDebug() << "DataBase::updateTableEntity: Table entity DELETED" << endl; stringQuery = "ALTER TABLE entitytemp RENAME TO entity"; return execQuery(Q_FUNC_INFO, stringQuery); } else { return false; } } else { //qDebug() << "DataBase::updateTableEntity: Data NOT copied from entity to entitytemp!" << endl; //TODO: If it fails, we should manage errors... return false; } } else { //qDebug() << "DataBase::updateTableEntity: Table entitytemp NOT created!" << endl; return false; } return false; } bool DataBase::updateTableLogs() { //qDebug() << "DataBase::updateTableLogs" << endl; bool result = false; QString stringQuery; bool sqlOk; result = createTableLogs(false); // Now we have a temp entity table with the correct format if (result) { //qDebug() << "DataBase::updateTableLogs: Table logstemp created!" << endl; // Now we need to move all the data from the old to the temp logs table. stringQuery = QString("INSERT INTO logstemp (logdate, stationcall, comment, logtype, logtypen) SELECT logdate, stationcall, comment, logtype, logtypen FROM logs"); sqlOk = execQuery(Q_FUNC_INFO, stringQuery); if (sqlOk) { //qDebug() << "DataBase::updateTableLogs: data copied" << endl; stringQuery = "DROP TABLE logs"; if (execQuery(Q_FUNC_INFO, stringQuery)) { //qDebug() << "DataBase::updateTableLogs: Table logs DELETED" << endl; stringQuery = "ALTER TABLE logstemp RENAME TO logs"; return execQuery(Q_FUNC_INFO, stringQuery); } else { //qDebug() << "DataBase::updateTableLogs: Table logs NOT DELETED" << endl; return false; } } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataBase::updateTableLogs: data NOT copied" << endl; //TODO: If it fails, we should manage errors... return false; } } else { //qDebug() << "DataBase::updateTableLogs: Table logstemp NOT created!" << endl; return false; } //qDebug() << "DataBase::updateTableLogs: END" << endl; return false; } bool DataBase::updateModeIdFromSubModeId() {// Updates the log with the new mode IDs in each QSO: // STEP-1: Get the modeid and QSOid from the log // STEP-2: uses the modeid to get the name of the mode in the mode table (the old one) // STEP-3: uses the name of the mode in the modetemp table (the new one) to get the new ID // STEP-4: Updates the new ID in the QSO in the log //qDebug() << "DataBase::updateModeIdFromSubModeId: " << endl; bool cancel = false; bool alreadyCancelled = false; QString modetxt = QString(); QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int modeFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2; bool sqlOk = query.exec("SELECT COUNT (*) FROM log"); if (sqlOk) { //QSqlDatabase::database().commit(); query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::updateModeIdFromSubModeId: FALSE END" << endl; return false; } int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating mode information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sqlOk = query.exec("SELECT modeid, id FROM log ORDER BY modeid"); // STEP-1 if (sqlOk) { while (query.next()) { modetxt = QString(); modeFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating mode information...") + "\n" + QObject::tr("QSO: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } modeFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-1) modeFound (numb): " << QString::number(modeFound) << endl; modetxt = getModeNameFromNumber(modeFound, false); //STEP-2 //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-2) mode found (txt): " << modetxt << endl; //TODO The following query can be executed in: getModeIdFromSubMode() sq = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(modetxt); // STEP-3 sqlOk2 = query2.exec(sq); if (sqlOk2) { //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-3) sqlOK2 TRUE" << endl; if (query2.next()) { if (query2.isValid()) { modeFound = query2.value(0).toInt(); query2.finish(); sq = QString ("UPDATE log SET modeid='%1' WHERE id='%2'").arg(modeFound).arg(id); // STEP-4 sqlOk3 = execQuery(Q_FUNC_INFO, sq); if (sqlOk3) { //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-4) ID: " << QString::number(id) << " updated to: " << QString::number(modeFound) <<"/"<< modetxt << endl; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().number(), query3.lastQuery()); //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-4) ID: " << QString::number(id) << " NOT updated-2" << endl; } } else { query2.finish(); //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-3) query2 not valid " << endl; } } else { //qDebug() << "DataBase::updateModeIdFromSubModeId: query2 not next " << endl; } } else { queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().number(), query2.lastQuery()); query2.finish(); //qDebug() << "DataBase::updateModeIdFromSubModeId: ID: " << QString::number(id) << " NOT updated-1" << endl; } } if ( progress.wasCanceled() ) { if (alreadyCancelled) { } else { alreadyCancelled = true; QMessageBox msgBox; aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(0); break; default: // should never be reached cancel = false; break; } } } } query.finish(); if (cancel && (!alreadyCancelled)) { //qDebug() << "DataBase::updateModeIdFromSubModeId: FALSE END 2" << endl; query.finish(); return false; } //qDebug() << "DataBase::updateModeIdFromSubModeId: END" << endl; query.finish(); return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataBase::updateModeIdFromSubModeId: FALSE END 3" << endl; query.finish(); return false; } //qDebug() << "DataBase::updateModeIdFromSubModeId: CHECK IF this is seen - END" << endl; query.finish(); return false; } bool DataBase::updateBandIdTableLogToNewOnes() { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: " << endl; QString bandtxt = QString(); bool cancel = false; bool alreadyCancelled = false; //int errorCode = -1; QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int bandFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2; bool sqlOk = query.exec("SELECT COUNT (*) FROM log"); if (sqlOk) { query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END" << endl; query.finish(); return false; } int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating bands information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sqlOk = query.exec("SELECT bandid, id FROM log ORDER BY bandid DESC"); if (sqlOk) { while (query.next() && (!cancel) ) { bandtxt = QString(); bandFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating bands information...") + "\n" + QObject::tr("QSO: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } bandFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); bandtxt = getBandNameFromNumber(bandFound); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: band found: " << bandtxt << endl; sq = QString("SELECT id FROM bandtemp WHERE name='%1'").arg(bandtxt); sqlOk2 = query2.exec(sq); if (sqlOk2) { if (query2.next()) { if (query2.isValid()) { bandFound = query2.value(0).toInt(); sq = QString ("UPDATE log SET bandid='%1' WHERE id='%2'").arg(bandFound).arg(id); query.finish(); sqlOk3 = execQuery(Q_FUNC_INFO, sq); if (sqlOk3) { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt << endl; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().number(), query3.lastQuery()); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-2" << endl; //qDebug() << "DataBase::updateBandIdTableLogToNewOnes - QSOs not updated to main log" << endl; } } else { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: query2 not valid " << endl; } } else { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: query2 not next " << endl; } query2.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().number(), query2.lastQuery()); query2.finish(); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-1" << endl; } } if ( progress.wasCanceled() ) { if (alreadyCancelled) { } else { alreadyCancelled = true; QMessageBox msgBox; aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(0); break; default: // should never be reached cancel = false; break; } } } } query.finish(); if (cancel && (!alreadyCancelled)) { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END 2" << endl; return false; } //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: END OK" << endl; return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END 3" << endl; return false; } } bool DataBase::updateBandIdTableAward(const int _db) { //qDebug() << "DataBase::updateBandIdTableAward: " << endl; QString table = QString(); QString field = QString(); QString awardSelected = QString(); switch (_db) { case 1: // table = "awarddxcc"; field = "band"; awardSelected = "DXCC"; break; case 2: table = "awardwaz"; field = "band"; awardSelected = "WAZ"; break; default: //qDebug() << "DataBase::updateBandIdTableAward: FALSE END" << endl; return false; break; } QString bandtxt = QString(); bool cancel = false; bool alreadyCancelled = false; //int errorCode = -1; QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int bandFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2; sq = QString("SELECT COUNT (*) FROM %1").arg(table); bool sqlOk = query.exec(sq); if (sqlOk) { query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::updateBandIdTableAward: FALSE END-2" << endl; return false; } int step = util->getProgresStepForDialog(qsos); QString progressmsg = QString(QObject::tr("Updating bands information in %1 status...")).arg(awardSelected); QProgressDialog progress(progressmsg, QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sq = QString("SELECT %1, id FROM %2 ORDER BY %3 DESC").arg(field).arg(table).arg(field); sqlOk = query.exec(sq); if (sqlOk) { while (query.next() && (!cancel) ) { bandtxt = QString(); bandFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating bands information...") + "\n" + QObject::tr("Progress: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } bandFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); bandtxt = getBandNameFromNumber(bandFound); //qDebug() << "DataBase::updateBandIdTableAward: band found: " << bandtxt << endl; sq = QString("SELECT id FROM bandtemp WHERE name='%1'").arg(bandtxt); sqlOk2 = query2.exec(sq); if (sqlOk2) { if (query2.next()) { if (query2.isValid()) { bandFound = query2.value(0).toInt(); query2.finish(); sq = QString ("UPDATE %1 SET %2='%3' WHERE id='%4'").arg(table).arg(field).arg(bandFound).arg(id); sqlOk3 = execQuery(Q_FUNC_INFO, sq); if (sqlOk3) { //qDebug() << "DataBase::updateBandIdTableAward: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt << endl; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().number(), query3.lastQuery()); //qDebug() << "DataBase::updateBandIdTableAward: ID: " << QString::number(id) << " NOT updated-2" << endl; //qDebug() << "DataBase::updateBandIdTableAward - QSOs not updated to main log" << endl; } } else { //qDebug() << "DataBase::updateBandIdTableAward: query2 not valid " << endl; } } else { //qDebug() << "DataBase::updateBandIdTableAward: query2 not next " << endl; } query2.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().number(), query2.lastQuery()); query2.finish(); //qDebug() << "DataBase::updateBandIdTableAward: ID: " << QString::number(id) << " NOT updated-1" << endl; } } if ( progress.wasCanceled() ) { if (alreadyCancelled) { } else { alreadyCancelled = true; QMessageBox msgBox; aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(0); break; default: // should never be reached cancel = false; break; } } } } if (cancel && (!alreadyCancelled)) { //qDebug() << "DataBase::updateBandIdTableAward: FALSE END-3" << endl; query.finish(); return false; } //qDebug() << "DataBase::updateBandIdTableAward: END OK" << endl; query.finish(); return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataBase::updateBandIdTableAward: FALSE END-4" << endl; query.finish(); return false; } //qDebug() << "DataBase::updateBandIdTableAward: CHECK IF SEEN END" << endl; query.finish(); return false; } bool DataBase::updateModeIdTableAward(const int _db) { //qDebug() << "DataBase::updateModeIdTableAward: " << QString::number(_db) << endl; QString table = QString(); QString field = "mode"; QString awardSelected = QString(); switch (_db) { case 1: // table = "awarddxcc"; awardSelected = "DXCC"; break; case 2: table = "awardwaz"; awardSelected = "WAZ"; break; default: //qDebug() << "DataBase::updateModeIdTableAward: FALSE END" << endl; return false; break; } QString bandtxt = QString(); bool cancel = false; bool alreadyCancelled = false; //int errorCode = -1; QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int bandFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2; sq = QString("SELECT COUNT (*) FROM %1").arg(table); bool sqlOk = query.exec(sq); if (sqlOk) { query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataBase::updateModeIdTableAward: FALSE END-2" << endl; query.finish(); return false; } int step = util->getProgresStepForDialog(qsos); QString progressmsg = QString(QObject::tr("Updating mode information in %1 status...")).arg(awardSelected); QProgressDialog progress(progressmsg, QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sq = QString("SELECT %1, id FROM %2 ORDER BY %3 DESC").arg(field).arg(table).arg(field); sqlOk = query.exec(sq); //qDebug() << "DataBase::updateModeIdTableAward (query): " << query.lastQuery() << endl; if (sqlOk) { while (query.next() && (!cancel) ) { bandtxt = QString(); bandFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating bands information...") + "\n" + QObject::tr("Progress: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } bandFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); //qDebug() << "DataBase::updateModeIdTableAward: bandfound: " << QString::number(bandFound) << endl; //qDebug() << "DataBase::updateModeIdTableAward: id: " << QString::number(id) << endl; bandtxt = getSubModeNameFromNumber(bandFound, true); //qDebug() << "DataBase::updateModeIdTableAward: mode found: " << bandtxt << "/" << QString::number(bandFound) << endl; sq = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(bandtxt); sqlOk2 = query2.exec(sq); //qDebug() << "DataBase::updateModeIdTableAward (query2): " << query2.lastQuery() << endl; if (sqlOk2) { if (query2.next()) { if (query2.isValid()) { bandFound = query2.value(0).toInt(); query2.finish(); sq = QString ("UPDATE %1 SET %2='%3' WHERE id='%4'").arg(table).arg(field).arg(bandFound).arg(id); sqlOk3 = execQuery(Q_FUNC_INFO, sq); if (sqlOk3) { //qDebug() << "DataBase::updateModeIdTableAward: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt << endl; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().number(), query3.lastQuery()); //qDebug() << "DataBase::updateModeIdTableAward: ID: " << QString::number(id) << " NOT updated-2" << endl; //qDebug() << "DataBase::updateModeIdTableAward - QSOs not updated to main log" << endl; } } else { //qDebug() << "DataBase::updateModeIdTableAward: query2 not valid " << endl; } } else { //qDebug() << "DataBase::updateModeIdTableAward: query2 not next " << endl; } } else { queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().number(), query2.lastQuery()); query2.finish(); //qDebug() << "DataBase::updateModeIdTableAward: ID: " << QString::number(id) << " NOT updated-1" << endl; } } if ( progress.wasCanceled() ) { if (alreadyCancelled) { } else { alreadyCancelled = true; QMessageBox msgBox; aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(0); break; default: // should never be reached cancel = false; break; } } } } if (cancel && (!alreadyCancelled)) { //qDebug() << "DataBase::updateModeIdTableAward: FALSE END-3" << endl; query.finish(); return false; } //qDebug() << "DataBase::updateModeIdTableAward: END OK" << endl; query.finish(); return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataBase::updateModeIdTableAward: FALSE END-4" << endl; query.finish(); return false; } //qDebug() << "DataBase::updateModeIdTableAward: Checkif seen END" << endl; query.finish(); return false; } /* bool DataBase::updateModeIdTableLogToNewOnes() { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: " << endl; QString bandtxt = QString(); bool cancel = false; bool alreadyCancelled = false; int errorCode = -1; QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int bandFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2, query3; bool sqlOk = query.exec("SELECT COUNT (*) FROM log"); if (sqlOk) { query.next(); qsos = (query.value(0)).toInt(); } else { return false; } int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating mode information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sqlOk = query.exec("SELECT modeid, id FROM log ORDER BY bandid DESC"); if (sqlOk) { while (query.next() && (!cancel) ) { bandtxt = QString(); bandFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating mode information...\n QSO: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } bandFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); bandtxt = getModeNameFromNumber(bandFound, false); //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: mode found: " << bandtxt << endl; sq = QString("SELECT id FROM modetemp WHERE name='%1'").arg(bandtxt); sqlOk2 = query2.exec(sq); if (sqlOk2) { if (query2.next()) { if (query2.isValid()) { bandFound = query2.value(0).toInt(); sq = QString ("UPDATE log SET modeid='%1' WHERE id='%2'").arg(bandFound).arg(id); sqlOk3 = query3.exec(sq); if (sqlOk3) { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt << endl; } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-2" << endl; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes - QSOs not updated to main log" << endl; errorCode = query3.lastError().number(); //qDebug() << "DataBase::updateModeIdTableLogToNewOnes - query error: " << QString::number(errorCode) << endl; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastQuery: " << query3.lastQuery() << endl; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-data: " << query3.lastError().databaseText() << endl; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-driver: " << query3.lastError().driverText() << endl; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-n: " << QString::number(query3.lastError().number() ) << endl; } } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: query2 not valid " << endl; } } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: query2 not next " << endl; } } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-1" << endl; } } if ( progress.wasCanceled() ) { if (alreadyCancelled) { } else { alreadyCancelled = true; QMessageBox msgBox; aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(0); break; default: // should never be reached cancel = false; break; } } } } if (cancel && (!alreadyCancelled)) { return false; } //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: FINISHED OK" << endl; return true; } else { return false; } } */ bool DataBase::updateTo007() {// Updates the DB to 0.0.7 //qDebug() << "DataBase::updateTo007: latestRead: " << getDBVersion() << endl; bool IAmIn007 = false; bool IAmIn006 = false; bool ErrorUpdating = false; QString stringQuery = QString(); //QString dateString = (date.currentDateTime()).toString("yyyyMMdd"); QSqlQuery query; latestReaded = getDBVersion().toFloat(); bool sqlOk = false; if (latestReaded >= float(0.007)) { //qDebug() << "DataBase::updateTo007: - I am in 007" << endl; return true; } else { //qDebug() << "DataBase::updateTo007: - I am not in 007" << endl; IAmIn007 = false; } while (!IAmIn007 && !ErrorUpdating) { while (!IAmIn006 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo007: - And I am not in 006" << endl; IAmIn006 = updateTo006(); } //qDebug() << "DataBase::updateTo007: - And I am in 006!!!!" << endl; if (ErrorUpdating) { //qDebug() << "DataBase::updateTo007: NOK-1" << endl; return false; } sqlOk = updateDBVersion(softVersion, "0.007"); if (sqlOk) { // Version updated IAmIn007 = updateTableLog(6); } else { // Version not updated //qDebug() << "DataBase::updateTo007: NOK-2" << endl; return false; } //DO ALL THE TASKS TO BE IN 0.007 from 0.006 HERE and set ErrorUpdating if it is not possible. IAmIn007 = true; } //qDebug() << "DataBase::updateTo007: END" << endl; return IAmIn007; } bool DataBase::updateTo008() {// Updates the DB to 0.0.8 //qDebug() << "DataBase::updateTo008: latestRead: " << getDBVersion() << endl; bool IAmIn008 = false; bool IAmIn007 = false; bool ErrorUpdating = false; //QString stringQuery = QString(); //QString dateString = (date.currentDateTime()).toString("yyyyMMdd"); //QSqlQuery query; bool sqlOk = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= (0.008)) { //qDebug() << "DataBase::updateTo008: - I am in 008" << endl; return true; } else { //qDebug() << "DataBase::updateTo008: - I am not in 008" << endl; IAmIn008 = false; } while (!IAmIn008 && !ErrorUpdating) { while (!IAmIn007 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo008: - And I am not in 007" << endl; IAmIn007 = updateTo007(); } //qDebug() << "DataBase::updateTo008: - I am in 007" << endl; if (ErrorUpdating) { //qDebug() << "DataBase::updateTo008: - NOK-1" << endl; return false; } //DO ALL THE TASKS TO BE IN 0.008 from 0.007 HERE and set ErrorUpdating if it is not possible. IAmIn008 = updateTheModeTableAndSyncLog(); if (IAmIn008) { sqlOk = updateDBVersion(softVersion, "0.008"); if (sqlOk) { // Version updated //qDebug() << "DataBase::updateTo008: - OK" << endl; } else { // Version not updated //qDebug() << "DataBase::updateTo008: - NOK-3" << endl; return false; } } else { //qDebug() << "DataBase::updateTo008: - NOK-2" << endl; return false; } } //qDebug() << "DataBase::updateTo008: - END" << endl; return IAmIn008; } bool DataBase::updateTo009() {// Updates the DB to 0.0.9 - We add the Satellite tables //qDebug() << "DataBase::updateTo009: latestRead: " << getDBVersion() << endl; bool IAmIn009 = false; bool IAmIn008 = false; bool ErrorUpdating = false; //QString stringQuery = QString(); //QString dateString = (date.currentDateTime()).toString("yyyyMMdd"); //QSqlQuery query; bool sqlOk = false; //if (latestReaded >= 0.009) //qDebug() << "DataBase::updateTo009: Checking:" << QString::number(latestReaded) << ":" << QString::number(0.009)<< endl; latestReaded = getDBVersion().toFloat(); if (latestReaded >= float(0.009)) //if ((latestReaded = 0.009) || (latestReaded > 0.009)) { //qDebug() << "DataBase::updateTo009: - I am in 009" << endl; //IAmIn009 = true; return true; } else { //qDebug() << "DataBase::updateTo009: - I am not in 009 I am in: " << QString::number(latestReaded)<< endl; IAmIn009 = false; } //qDebug() << "DataBase::updateTo009: compared latestRead: " << QString::number(latestReaded) << endl; while (!IAmIn009 && !ErrorUpdating) { while (!IAmIn008 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo009: - And I am not in 008" << endl; IAmIn008 = updateTo008(); } //qDebug() << "DataBase::updateTo009: - And I am already at least in 008" << endl; if (ErrorUpdating) { return false; } sqlOk = updateDBVersion(softVersion, "0.009"); if (sqlOk) { // Version updated //qDebug() << "DataBase::updateTo009: - version updated" << endl; //IAmIn009 = updateTableLog(6); } else { // Version not updated //qDebug() << "DataBase::updateTo009: - version not updated" << endl; } //DO ALL THE TASKS TO BE IN 0.009 from 0.008 HERE and set ErrorUpdating if it is not possible. if (recreateSatelliteData()) //if (createTableSatellites(true)) { //qDebug() << "DataBase::updateTo009: - createTableSatellites OK" << endl; //if (populateTableSatellites(true)) if (true) { //qDebug() << "DataBase::updateTo009: - populateTableSatellites OK" << endl; if (updateTableEntity()) { //qDebug() << "DataBase::updateTo009: - updateTableEntity OK" << endl; if (updateTheEntityTableISONames()) { //qDebug() << "DataBase::updateTo009: - isonames updated" << endl; // Now I need to update the logs table if (updateTableLogs()) { //qDebug() << "DataBase::updateTo009: - logs updated and Function finished successfuly!!" << endl; IAmIn009 = true; } else { //qDebug() << "DataBase::updateTo009: - logs NOT updated" << endl; IAmIn009 = false; ErrorUpdating = true; } } else { //qDebug() << "DataBase::updateTo009: - isonames NOT updated" << endl; IAmIn009 = false; ErrorUpdating = true; } } else { ErrorUpdating = true; IAmIn009 = false; } } else { //qDebug() << "DataBase::updateTo009: - populateTableSatellites FALSE" << endl; ErrorUpdating = true; IAmIn009 = false; } } else { //qDebug() << "DataBase::updateTo009: - createTableSatellites FALSE" << endl; ErrorUpdating = true; IAmIn009 = false; } } //qDebug() << "DataBase::updateTo009: - END" << endl; return IAmIn009; } bool DataBase::updateTo010() {// Updates the DB to 0.010: // We add FT8 mode and // AS Propagation //qDebug() << "DataBase::updateTo010: latestRead: " << getDBVersion() << endl; bool IAmIn010 = false; bool IAmIn009 = false; bool ErrorUpdating = false; QString stringQuery = QString(); QSqlQuery query; bool sqlOk = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateTo010: Checking (latestRead/dbVersion):" << QString::number(latestReaded) << "/" << QString::number(dbVersion) << endl; if (latestReaded >= float(0.01)) { //qDebug() << "DataBase::updateTo010: - I am in 010" << endl; IAmIn010 = true; return true; } else { //qDebug() << "DataBase::updateTo010: - I am not in 010 I am in: " << QString::number(latestReaded)<< endl; while (!IAmIn009 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo010: - Check if I am in 009: !" << endl; IAmIn009 = updateTo009(); if (IAmIn009) { //qDebug() << "DataBase::updateTo010: - updateTo009 returned TRUE - I am in 0.009: " << QString::number(latestReaded) << endl; } else { //qDebug() << "DataBase::updateTo010: - updateTo009 returned FALSE - I am NOT in 0.009: " << QString::number(latestReaded) << endl; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo010: - I Could not update to: " << QString::number(dbVersion) << endl; return false; } } sqlOk = execQuery(Q_FUNC_INFO, "UPDATE band SET lower = '0.1357', upper = '0.1378' WHERE name='2190M'"); if (sqlOk) { //qDebug() << "DataBase::updateTo010: - Band update OK" << endl; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataBase::updateTo010: - Band update NOK" << endl; } execQuery(Q_FUNC_INFO, QString("INSERT INTO mode (submode, name, cabrillo, deprecated) VALUES ('FT8', 'FT8', 'NO', '0')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AS', 'Aircraft Scatter')")); if (updateDBVersion(softVersion, "0.010")) { //qDebug() << "DataBase::updateTo010: - We are in 010! " << endl; IAmIn010 = true; } else { //qDebug() << "DataBase::updateTo010: - Failed to go to 010! " << endl; IAmIn010 = false; } //qDebug() << "DataBase::updateTo010: - END" << endl; return IAmIn010; } bool DataBase::updateDBVersion(QString _softV, QString _dbV) { QString dateString = (QDate::currentDate()).toString("yyyyMMdd"); //qDebug() << "DataBase::updateDBVersion: (date/SoftVersion/dbVersion): " << dateString << "/" << _softV << "/" << _dbV << endl; QString stringQuery = "INSERT INTO softwarecontrol (dateupgrade, softversion, dbversion) VALUES ('" + dateString + "', '" + _softV + "', '" + _dbV + "')"; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::updateTheModeTableAndSyncLog() { //qDebug() << "DataBase::updateTheModeTableAndSyncLog" << endl; QSqlQuery query; createTableMode(false); // Create modetemp populateTableMode(false); // Populate modetemp updateModeIdFromSubModeId(); // Updates the log with the new mode IDs in each QSO //updateModeIdTableAward(1); //DXCC //updateModeIdTableAward(2); // WAZ bool sqlOK; //QSqlDatabase::database().commit(); sqlOK = execQuery(Q_FUNC_INFO, "DROP TABLE mode"); if (sqlOK) { //QSqlDatabase::database().commit(); //qDebug() << "DataBase::updateTheModeTableAndSyncLog - OK - mode was dropped" << endl; return execQuery(Q_FUNC_INFO, "ALTER TABLE modetemp RENAME TO mode"); } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataBase::updateTheModeTableAndSyncLog - ERROR - modetemp not dropped" << endl; return false; } //qDebug() << "DataBase::updateTheModeTableAndSyncLog END" << endl; return true; } bool DataBase::recreateTableBand() { //qDebug() << "DataBase::recreateTableBand" << endl; QSqlQuery query; createTableBand(false); // Create modetemp populateTableBand(false); // Populate modetemp if (execQuery(Q_FUNC_INFO, "DROP TABLE band")) { return execQuery(Q_FUNC_INFO, "ALTER TABLE bandtemp RENAME TO mode"); } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "DataBase::recreateTableBand - ERROR - bandtemp not dropped" << endl; return false; } //qDebug() << "DataBase::recreateTableBand END" << endl; return true; } bool DataBase::updateTheEntityTableISONames() { //qDebug() << "DataBase::updateTheEntityTableISONames" << endl; QSqlQuery query; QString sq; bool sqlOK; //First of all we will check if the entity table does contain data. We can't update something non existent! if (!hasTheTableData("entity")) { //qDebug() << "DataBase::updateTheEntityTableISONames: Entity has NO data" << endl; return false; } //qDebug() << "DataBase::updateTheEntityTableISONames-1" << endl; sq = QString ("UPDATE entity SET isoname='mt' WHERE dxcc='246'"); //Sovereign Order of Malta sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); return false; } //qDebug() << "DataBase::updateTheEntityTableISONames-2" << endl; sq = QString ("UPDATE entity SET isoname='un' WHERE dxcc='247'"); //Spratly sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); return false; } sq = QString ("UPDATE entity SET isoname='mc' WHERE dxcc='260'"); //Monaco sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mu' WHERE dxcc='4'"); // Agalega sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mu' WHERE dxcc='165'"); //Mauricio sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mu' WHERE dxcc='207'"); //Rodriguez sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gq' WHERE dxcc='49'"); // Equatorial Guinea sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fj' WHERE dxcc='176'"); //Fidji sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gq' WHERE dxcc='195'"); //Annobon sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fj' WHERE dxcc='489'"); // Conway reef sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fj' WHERE dxcc='460'"); // Rotuma sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sz' WHERE dxcc='468'"); // Swaziland sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tn' WHERE dxcc='474'"); // Tunisia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='vn' WHERE dxcc='293'"); // Vietnam sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gn' WHERE dxcc='107'"); // Guinea sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bv' WHERE dxcc='24'"); // Bouvet sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='no' WHERE dxcc='199'"); // Peter 1 Is" sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='az' WHERE dxcc='18'"); // Azerbaijan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ge' WHERE dxcc='75'"); // Georgia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='me' WHERE dxcc='514'"); // Montenegro sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='lk' WHERE dxcc='315'"); // Sri lanka sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ch' WHERE dxcc='117'"); // ITU HQ sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='289'"); // UN HQ sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tl' WHERE dxcc='511'"); // Timor Leste sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='il' WHERE dxcc='336'"); // Israel sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ly' WHERE dxcc='436'"); // Libya sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cy' WHERE dxcc='215'"); // Cyprus sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tz' WHERE dxcc='470'"); // Tanzania sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ng' WHERE dxcc='450'"); // Nigeria sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mg' WHERE dxcc='438'"); // Madagascar sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mr' WHERE dxcc='444'"); // Mauritania sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ne' WHERE dxcc='187'"); // Niger sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tg' WHERE dxcc='483'"); // Togo sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ws' WHERE dxcc='190'"); // Samoa sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ug' WHERE dxcc='286'"); // Uganda sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ke' WHERE dxcc='430'"); // Kenya sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sn' WHERE dxcc='456'"); // Senegal sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='jm' WHERE dxcc='82'"); // Jamaica sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='es' WHERE dxcc='281'"); // Spain sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ls' WHERE dxcc='432'"); //Lesotho sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mw' WHERE dxcc='440'"); // Malawi sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='dz' WHERE dxcc='400'"); // Algeria sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ye' WHERE dxcc='492'"); // Yemen sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bb' WHERE dxcc='62'"); // Barbados sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mv' WHERE dxcc='159'"); // Maldives sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gy' WHERE dxcc='129'"); // Guyana sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='hr' WHERE dxcc='497'"); // Croatia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gh' WHERE dxcc='424'"); // Ghana sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mt' WHERE dxcc='257'"); // Malta sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='zm' WHERE dxcc='482'"); // Zambia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='kw' WHERE dxcc='348'"); // Kuwait sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sl' WHERE dxcc='458'"); // Sierra Leone sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='my' WHERE dxcc='299'"); // West Malaysia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='my' WHERE dxcc='46'"); // East Malaysia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='np' WHERE dxcc='369'"); // Nepal sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cd' WHERE dxcc='414'"); // Dem Rep Congo sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bi' WHERE dxcc='404'"); // Burundi sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sg' WHERE dxcc='381'"); // Singapore sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='rw' WHERE dxcc='454'"); // Rwanda sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tt' WHERE dxcc='90'"); // Trinidad & Tobago sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bw' WHERE dxcc='402'"); // Botswana sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='to' WHERE dxcc='160'"); // Tonga sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='om' WHERE dxcc='370'"); // Oman sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bt' WHERE dxcc='306'"); // Bhutan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ae' WHERE dxcc='391'"); // Un Arab Emirates sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='qa' WHERE dxcc='376'"); // Qatar sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bh' WHERE dxcc='304'"); // Bahrain sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pk' WHERE dxcc='372'"); // Pakistan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tw' WHERE dxcc='386'"); // Taiwan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tw' WHERE dxcc='505'"); // Pratas Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cn' WHERE dxcc='318'"); // China sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='nr' WHERE dxcc='157'"); // Nauru sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ad' WHERE dxcc='203'"); // Andorra sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gm' WHERE dxcc='422'"); // Gambia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bs' WHERE dxcc='60'"); // Bahamas sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mz' WHERE dxcc='181'"); // Mozambique sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cl' WHERE dxcc='112'"); // Chile sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cl' WHERE dxcc='217'"); // San Felix sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cl' WHERE dxcc='47'"); // Easter Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cl' WHERE dxcc='125'"); // Juan Fernandez is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cu' WHERE dxcc='70'"); // Cuba sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ma' WHERE dxcc='446'"); // Morocco sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bo' WHERE dxcc='104'"); // Bolivia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pt' WHERE dxcc='272'"); // Portugal sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pt' WHERE dxcc='256'"); // Madeira sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pt' WHERE dxcc='149'"); // Azores sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='uy' WHERE dxcc='144'"); // Uruguay sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ca' WHERE dxcc='211'"); // Sable Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ca' WHERE dxcc='252'"); // St Paul is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ao' WHERE dxcc='401'"); // Angola sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cv' WHERE dxcc='409'"); // Cape Verde sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='km' WHERE dxcc='411'"); // Comoros sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='de' WHERE dxcc='230'"); // Fed Rep Germany sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ph' WHERE dxcc='375'"); //Philippines sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='er' WHERE dxcc='51'"); // Eritrea sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ps' WHERE dxcc='510'"); // Palestine sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ck' WHERE dxcc='191'"); // North Cook sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ck' WHERE dxcc='234'"); // South Cook sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='nu' WHERE dxcc='188'"); // Niue sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ba' WHERE dxcc='501'"); // Bosnia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='balear' WHERE dxcc='21'"); // Balearic is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='canary' WHERE dxcc='29'"); // Canary Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ceuta' WHERE dxcc='32'"); // Ceuta & Melilla //TODO: Fix the flag sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ie' WHERE dxcc='245'"); // Ireland sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='am' WHERE dxcc='14'"); // Armenia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='lr' WHERE dxcc='434'"); // Liberia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ir' WHERE dxcc='330'"); // Iran sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mv' WHERE dxcc='179'"); // Moldova sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ee' WHERE dxcc='52'"); // Estonia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='et' WHERE dxcc='53'"); // Ethiopia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='by' WHERE dxcc='27'"); // Belarus sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='kg' WHERE dxcc='135'"); // Kyrgyzstan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tm' WHERE dxcc='280'"); // Turkmenistan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tj' WHERE dxcc='262'"); // Turkmenistan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fr' WHERE dxcc='227'"); // France sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fr' WHERE dxcc='79'"); // Guadeloupe sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='yt' WHERE dxcc='169'"); // Mayotte sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fr' WHERE dxcc='516'"); // St Barthelemy sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fr' WHERE dxcc='36'"); // Clipperton Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='nc' WHERE dxcc='162'"); // New Caledonia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='nc' WHERE dxcc='512'"); // Chesterfield Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mq' WHERE dxcc='84'"); // Martinique sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pf' WHERE dxcc='175'"); // French Polynesia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pf' WHERE dxcc='508'"); // Austral Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pm' WHERE dxcc='277'"); // St Pierre & Miquelon sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='re' WHERE dxcc='453'"); //Reunion Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fr' WHERE dxcc='213'"); // St Marteen sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fr' WHERE dxcc='99'"); // Glorioso is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fr' WHERE dxcc='124'"); // Juan de nova, Europa sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fr' WHERE dxcc='276'"); // Tromelin - TODO: Add the wikipedia flag sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fr' WHERE dxcc='41'"); // Crozet sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fr' WHERE dxcc='131'"); // Kerguelen sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag http://es.wikipedia.org/wiki/Tierras_Australes_y_Ant%C3%A1rticas_Francesas sq = QString ("UPDATE entity SET isoname='fr' WHERE dxcc='10'"); //Amsterdam & St Paul is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='wf' WHERE dxcc='298'"); // Wallis & Futuna is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gf' WHERE dxcc='63'"); // French Guiana sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='england' WHERE dxcc='223'"); // England sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gb' WHERE dxcc='114'"); //Isle of Man sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='northernireland' WHERE dxcc='265'"); // Northern Ireland sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gb' WHERE dxcc='122'"); // Jersey sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='scotland' WHERE dxcc='279'"); // Scotland sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='scotland' WHERE dxcc='1279'"); // Shetland is (Scotland) sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gb' WHERE dxcc='106'"); // Guernsey sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='wales' WHERE dxcc='294'"); // Wales sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sb' WHERE dxcc='185'"); // Solomon sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sb' WHERE dxcc='507'"); // Temotu Province sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='hu' WHERE dxcc='239'"); // Hungary sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ch' WHERE dxcc='287'"); // Switzerland sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='li' WHERE dxcc='251'"); // Liechtenstein sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ec' WHERE dxcc='120'"); // Ecuador sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ec' WHERE dxcc='71'"); // Galapagos Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ht' WHERE dxcc='78'"); // Haiti sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='do' WHERE dxcc='72'"); // Dominican Rep sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='co' WHERE dxcc='116'"); // Colombia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='co' WHERE dxcc='216'"); // San Andres & Providencia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='co' WHERE dxcc='161'"); // Malpelo sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='kr' WHERE dxcc='137'"); // Rep Korea sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pa' WHERE dxcc='88'"); // Panama sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='hn' WHERE dxcc='80'"); // Honduras sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='th' WHERE dxcc='387'"); // Thailand sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='va' WHERE dxcc='295'"); // Vatican City sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sa' WHERE dxcc='378'"); // Saudi Arabia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='it' WHERE dxcc='248'"); // Italy sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='it' WHERE dxcc='1248'"); // African Italy sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='it' WHERE dxcc='2248'"); // Sicily sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='it' WHERE dxcc='225'"); // Sardinia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='dj' WHERE dxcc='382'"); // Djibouti sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gd' WHERE dxcc='77'"); // Grenada sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gw' WHERE dxcc='109'"); // Guinea-Bissau sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='lc' WHERE dxcc='97'"); // St Lucia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='dm' WHERE dxcc='95'"); // Dominica sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='vc' WHERE dxcc='98'"); // St Vicent sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='jp' WHERE dxcc='339'"); // Japan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='jp' WHERE dxcc='177'"); // Minami Torishima sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='jp' WHERE dxcc='192'"); // Ogasawara sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mn' WHERE dxcc='363'"); // Mongolia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sj' WHERE dxcc='259'"); // Svalbard sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sj' WHERE dxcc='1259'"); // Svalbard sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sj' WHERE dxcc='118'"); // Jan Mayen sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='jo' WHERE dxcc='342'"); // Jordan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='291'"); // United States sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='105'"); // Guantanamo Bay sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mp' WHERE dxcc='166'"); // Mariana is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='20'"); // Baker & Howland is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gu' WHERE dxcc='103'"); // Guam sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='123'"); // Johnston is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='174'"); // Midway is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='197'"); // Palmyra & Jarbis is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='134'"); // Kingman Reef sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='110'"); // Hawaii sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='138'"); // Kure is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='as' WHERE dxcc='9'"); // American Samoa sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='as' WHERE dxcc='515'"); // Swains is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='297'"); // Wake is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='6'"); // Alaska sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='182'"); // Navassa Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='vi' WHERE dxcc='285'"); // Us Virgin is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pr' WHERE dxcc='202'"); // Puerto Rico sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='us' WHERE dxcc='43'"); // Desecheo Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='no' WHERE dxcc='266'"); // Norway sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ar' WHERE dxcc='100'"); // Argentina sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='lu' WHERE dxcc='254'"); // Luxembourg sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='lt' WHERE dxcc='146'"); // Lithuania sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bg' WHERE dxcc='212'"); // Bulgaria sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pe' WHERE dxcc='136'"); // Peru sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='lb' WHERE dxcc='354'"); // Lebanon sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='at' WHERE dxcc='206'"); // Austria & Viena Intl HQ sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fi' WHERE dxcc='224'"); // Findland sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fi' WHERE dxcc='5'"); // Aland is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fi' WHERE dxcc='167'"); // Market Reef sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cz' WHERE dxcc='503'"); // Czech Rep sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sk' WHERE dxcc='504'"); // Slovak Rep sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='be' WHERE dxcc='209'"); // Belgium sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gl' WHERE dxcc='237'"); // Greenland sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='dk' WHERE dxcc='222'"); // Faroe is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='dk' WHERE dxcc='221'"); // Denmark sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pg' WHERE dxcc='163'"); // Papua New Guinea sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='aw' WHERE dxcc='91'"); // Aruba sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='kp' WHERE dxcc='344'"); //Dpr Korea sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='nl' WHERE dxcc='263'"); // Netherlands sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cw' WHERE dxcc='517'"); // Curacao sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='bq' WHERE dxcc='520'"); // Bonaire sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='nl' WHERE dxcc='519'"); // Saba & St Eustatius sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='shm' WHERE dxcc='518'"); // Sint Marteen sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='br' WHERE dxcc='108'"); // Brazil sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='br' WHERE dxcc='56'"); // Fernando de Noronha sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='br' WHERE dxcc='253'"); // St Peter & St Paul sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='br' WHERE dxcc='273'"); // Trindade & Martim Vaz sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sr' WHERE dxcc='140'"); // Suriname sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ru' WHERE dxcc='61'"); // Franz Josef Land sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='eh' WHERE dxcc='302'"); // Western Sahara sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='bd' WHERE dxcc='305'"); // Bangladesh sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='si' WHERE dxcc='499'"); // Slovenia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sc' WHERE dxcc='379'"); // Seychelles sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='st' WHERE dxcc='219'"); // Sao Tome & Principe sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='se' WHERE dxcc='284'"); // Sweden sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pl' WHERE dxcc='269'"); // Poland sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sd' WHERE dxcc='466'"); // Sudan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='eg' WHERE dxcc='478'"); // Egypt sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gr' WHERE dxcc='236'"); // Greece sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gr' WHERE dxcc='180'"); // Mount Athos sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gr' WHERE dxcc='45'"); // Dodecanese sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gr' WHERE dxcc='40'"); // Crete sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tv' WHERE dxcc='282'"); // Tuvalu sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ki' WHERE dxcc='301'"); // Western Kiribati sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ki' WHERE dxcc='31'"); // Central Kiribati sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ki' WHERE dxcc='48'"); // Eastern Kiribati sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ki' WHERE dxcc='490'"); // Banaba is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='so' WHERE dxcc='232'"); // Somalia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sm' WHERE dxcc='278'"); // San Marino sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pw' WHERE dxcc='22'"); // Palau sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tr' WHERE dxcc='390'"); // Turkey sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tr' WHERE dxcc='1390'"); // European Turkey sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='is' WHERE dxcc='242'"); // Iceland sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gt' WHERE dxcc='76'"); // Guatemala sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='cr' WHERE dxcc='308'"); // Costa Rica sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cr' WHERE dxcc='37'"); // Coco is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cm' WHERE dxcc='406'"); // Cameroon sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fr' WHERE dxcc='214'"); // Corsica sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} // TODO: Add the wikipedia flag sq = QString ("UPDATE entity SET isoname='cf' WHERE dxcc='408'"); // Central African Rep sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cg' WHERE dxcc='412'"); // Rep of Congo sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ga' WHERE dxcc='420'"); // Gabon sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='td' WHERE dxcc='410'"); // Chad sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ci' WHERE dxcc='428'"); // Cote d'Ivoire sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bj' WHERE dxcc='416'"); // Benin sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ml' WHERE dxcc='442'"); // Mali sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ru' WHERE dxcc='54'"); // European Russia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ru' WHERE dxcc='15'"); // Asiatic Russia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ru' WHERE dxcc='126'"); // Kaliningrad sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) sq = QString ("UPDATE entity SET isoname='ru' WHERE dxcc='15'"); // Asiatic Rusia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='uz' WHERE dxcc='292'"); // Uzbekistan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='kz' WHERE dxcc='130'"); // Kazakhstan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ua' WHERE dxcc='288'"); // Ukraine sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ag' WHERE dxcc='94'"); // Antigua & Barbuda sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bz' WHERE dxcc='66'"); // Belize sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='kn' WHERE dxcc='249'"); // St Kitts & Nevis sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='na' WHERE dxcc='464'"); // Namibia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fm' WHERE dxcc='173'"); // Micronesia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fm' WHERE dxcc='168'"); // Marshall Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bn' WHERE dxcc='345'"); // Brunei Darusalam sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ca' WHERE dxcc='1'"); // Canada sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='au' WHERE dxcc='150'"); // Australia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='hm' WHERE dxcc='111'"); // Heard Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='au' WHERE dxcc='153'"); // Macquarie is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cc' WHERE dxcc='38'"); // Cocos / Keeling is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='au' WHERE dxcc='147'"); // Lord Howe is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='au' WHERE dxcc='171'"); // Mellish Reed sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='nf' WHERE dxcc='189'"); // Norkfolk is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='au' WHERE dxcc='303'"); // Willis Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='cx' WHERE dxcc='35'"); // Christmas is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ai' WHERE dxcc='12'"); // Anguilla sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ms' WHERE dxcc='96'"); // Montserrat sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='vg' WHERE dxcc='65'"); // British is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tc' WHERE dxcc='89'"); // Turks & Caicos is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='pn' WHERE dxcc='172'"); // Pitcairn sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gb' WHERE dxcc='513'"); // Ducie is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='fk' WHERE dxcc='141'"); // Falkland is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gs' WHERE dxcc='235'"); // South Georgia is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='southbritish' WHERE dxcc='241'"); // South Shetland is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='un' WHERE dxcc='238'"); // South Orkney is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gs' WHERE dxcc='240'"); // South Sandwich Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bm' WHERE dxcc='64'"); // Bermuda sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='io' WHERE dxcc='33'"); // Chagos is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='hk' WHERE dxcc='321'"); // Hong Kong sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='in' WHERE dxcc='324'"); // India sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='in' WHERE dxcc='11'"); // Andaman & Nicobar sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='in' WHERE dxcc='142'"); // Lakshadweep Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mx' WHERE dxcc='50'"); // Mexico sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mx' WHERE dxcc='204'"); // Revilagigedo sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='bf' WHERE dxcc='480'"); // Burkina Faso sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='kh' WHERE dxcc='312'"); // Cambodia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='la' WHERE dxcc='143'"); // Laos sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mo' WHERE dxcc='152'"); // Macao sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mm' WHERE dxcc='309'"); // Myanmar sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='af' WHERE dxcc='3'"); // Afganistan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='id' WHERE dxcc='327'"); // Indonesia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='iq' WHERE dxcc='333'"); // Iraq sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='vu' WHERE dxcc='158'"); // Vanuatu sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sy' WHERE dxcc='384'"); // Syria sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='lv' WHERE dxcc='145'"); // Latvia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ni' WHERE dxcc='86'"); // Nicaragua sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ro' WHERE dxcc='275'"); // Romania sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sv' WHERE dxcc='74'"); // El Salvador sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='rs' WHERE dxcc='296'"); // Serbia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ve' WHERE dxcc='148'"); // Venezuela sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ve' WHERE dxcc='17'"); // Aves Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='zw' WHERE dxcc='452'"); // Zimbabwe sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='mk' WHERE dxcc='502'"); // Macedonia sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ss' WHERE dxcc='521'"); //Rep South Sudan sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='al' WHERE dxcc='7'"); // Albania sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gi' WHERE dxcc='233'"); // Gibraltar sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='gb' WHERE dxcc='283'"); // UK Base Aereas Cyprus sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sh' WHERE dxcc='250'"); // St Helena sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sh' WHERE dxcc='205'"); // Ascension is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='sh' WHERE dxcc='274'"); // Tristan da Cunha & Gough is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='ky' WHERE dxcc='69'"); // Cayman Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='tk' WHERE dxcc='270'"); // Tokelau Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='marquesas' WHERE dxcc='509'"); // Marquesas Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='nz' WHERE dxcc='170'"); // New Zeland sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='nz' WHERE dxcc='34'"); // Chatham Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='nz' WHERE dxcc='133'"); // Kermadec is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='nz' WHERE dxcc='16'"); // Auckland & Campbell is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='py' WHERE dxcc='132'"); // Paraguay sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='za' WHERE dxcc='462'"); // South Africa sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='za' WHERE dxcc='201'"); // Pr Edward & Marion Is sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='xk' WHERE dxcc='522'"); // Kosovo sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} // Countries without flag or controversial - Data is added just to keep the DB filled-up sq = QString ("UPDATE entity SET isoname='un' WHERE dxcc='506'"); // Scarboroug Reef sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} sq = QString ("UPDATE entity SET isoname='un' WHERE dxcc='13'"); // Antartica sqlOK = execQuery(Q_FUNC_INFO, sq); if (!sqlOK) {return false;} //qDebug() << "DataBase::updateTheEntityTableISONames-END" << endl; return true; } bool DataBase::isTheTableExisting(const QString _tableName) { QSqlQuery query; int _n; QString sq = QString("SELECT name FROM sqlite_master WHERE name='%1'").arg(_tableName); bool sqlOK = query.exec(sq); if (sqlOK) { if (query.next()) { if (query.isValid()) { _n = (query.value(0)).toInt(); query.finish(); if (_n > 0) { //qDebug() << "DataBase::isTheTableExisting - Table Exists" << endl; return true; } else { //qDebug() << "DataBase::isTheTableExisting - Table does not Exist" << endl; return false; } } } } else { return false; } return false; } bool DataBase::hasTheTableData(const QString _tableName) { //qDebug() << "DataBase::hasTheTableData" << _tableName << endl; QSqlQuery query; int _num = 0; QString stringQuery = QString("SELECT count(id) FROM %1").arg(_tableName); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataBase::hasTheTableData - valid" << endl; _num = (query.value(0)).toInt(); query.finish(); if (_num > 0) { //qDebug() << "DataBase::hasTheTableData - DB Exists" << endl; return true; } else { //qDebug() << "DataBase::hasTheTableData - DB does not Exist" << endl; return false; } } else { //qDebug() << "DataBase::hasTheTableData - not valid" << endl; query.finish(); return false; } } else { //qDebug() << "DataBase::hasTheTableData: LastQuery: " << query.lastQuery() << endl; //qDebug() << "DataBase::hasTheTableData: LastError-data: " << query.lastError().databaseText() << endl; //qDebug() << "DataBase::hasTheTableData: LastError-driver: " << query.lastError().driverText() << endl; //qDebug() << "DataBase::hasTheTableData LastError-n: " << QString::number(query.lastError().number() ) << endl; //qDebug() << "DataBase::updateTheEntityTableISONames" << endl; queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } //qDebug() << "DataBase::isTheDBCreated: END FALSE" << endl; query.finish(); return false; } bool DataBase::updateTo011() {// Updates the DB to 0.011: // We add FT8 mode and // AS Propagation //qDebug() << "DataBase::updateTo011: latestRead: " << getDBVersion() << endl; bool IAmIn011 = false; bool IAmIn010 = false; bool ErrorUpdating = false; QString stringQuery = QString(); //QSqlQuery query; //bool sqlOk = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateTo011: Checking (latestRead/dbVersion):" << QString::number(latestReaded) << "/" << QString::number(dbVersion) << endl; if (latestReaded >= float(0.011)) { //qDebug() << "DataBase::updateTo011: - I am in 011" << endl; IAmIn011 = true; return true; } else { //qDebug() << "DataBase::updateTo011: - I am not in 0.012 I am in: " << QString::number(latestReaded)<< endl; while (!IAmIn010 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo011: - Check if I am in 010: !" << endl; IAmIn010 = updateTo010(); if (IAmIn010) { //qDebug() << "DataBase::updateTo011: - updateTo010 returned TRUE - I am in 0.010: " << QString::number(latestReaded) << endl; } else { //qDebug() << "DataBase::updateTo011: - updateTo009 returned FALSE - I am NOT in 0.010: " << QString::number(latestReaded) << endl; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo011: - I Could not update to: " << QString::number(dbVersion) << endl; return false; } } if (!recreateSatelliteData()) { //qDebug() << "DataBase::updateTo011: - Sats update NOK " << endl; return false; } if (!recreateTableDXCC()) { //qDebug() << "DataBase::updateTo011: - recreateTableDXCC NOK " << endl; return false; } if (!recreateTableWAZ()) { //qDebug() << "DataBase::updateTo011: - recreateTableWAZ NOK " << endl; return false; } if(!execQuery(Q_FUNC_INFO, "INSERT INTO mode (submode, name, cabrillo, deprecated) VALUES ('MSK144', 'MSK144', 'NO', '0')")) { //qDebug() << "DataBase::updateTo011: - MSK NOK " << endl; return false; } if (!recreateTableLog()) { //qDebug() << "DataBase::updateTo011: - Failed to recreate Table Log " << endl; return false; } if (updateDBVersion(softVersion, "0.011")) { //qDebug() << "DataBase::updateTo011: - We are in 011! " << endl; IAmIn011 = true; } else { //qDebug() << "DataBase::updateTo011: - Failed to go to 011! " << endl; IAmIn011 = false; } if (!updateAwardDXCCTable()) { //qDebug() << "DataBase::updateTo011: - updateAwardDXCCTable NOK " << endl; IAmIn011 = false; return false; } if (!updateAwardWAZTable()) { //qDebug() << "DataBase::updateTo011: - updateAwardWAZTable NOK " << endl; IAmIn011 = false; } //qDebug() << "DataBase::updateTo011: - END" << endl; return IAmIn011; } bool DataBase::updateTo012() { // Updates the DB to 0.012: // Change the table qsl_via to qsl_via_enumeration // Solve the supportedContest table missing bug in some deployments //qDebug() << "DataBase::updateTo012: latestRead: " << getDBVersion() << endl; bool IAmIn012 = false; bool IAmIn011 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateTo012: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << endl; if (latestReaded >= float(0.012)) { //qDebug() << "DataBase::updateTo012: - I am in 012" << endl; IAmIn012 = true; return true; } else { //qDebug() << "DataBase::updateTo012: - I am not in 0.012 I am in: " << getDBVersion() << endl; while (!IAmIn011 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo012: - Check if I am in 011: !" << endl; IAmIn011 = updateTo011(); if (IAmIn011) { //qDebug() << "DataBase::updateTo012: - updateTo011 returned TRUE - I am in 0.011: " << QString::number(latestReaded) << endl; } else { //qDebug() << "DataBase::updateTo012: - updateTo011 returned FALSE - I am NOT in 0.011: " << QString::number(latestReaded) << endl; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo012: - I Could not update to: " << QString::number(dbVersion) << endl; return false; } } // Now I am in the previous version and I can update the DB. bool sqlOK = false; if (isTheTableExisting("supportedcontest")) { sqlOK = execQuery(Q_FUNC_INFO, "DROP TABLE supportedcontest"); if (sqlOK) { if (createTableSupportedContest()) { sqlOK = recreateSupportedContest(); } else { //qDebug() << "DataBase::updateTo012: UPDATED NOK-1!" << endl; return false; } } } else { if (createTableSupportedContest()) { if (!recreateSupportedContest()) { //qDebug() << "DataBase::updateTo012: UPDATED NOK-2!" << endl; return false; } } } if (updateDBVersion(softVersion, "0.012")) { //qDebug() << "DataBase::updateTo012: - We are in 012! " << endl; } else { //qDebug() << "DataBase::updateTo011: - Failed to go to 012! " << endl; return false; } //qDebug() << "DataBase::updateTo012: UPDATED OK!" << endl; return true; } bool DataBase::updateTo013() { // Updates the DB to 0.013: // Change the table qsl_via to qsl_via_enumeration // Solve the supportedContest table missing bug in some deployments //qDebug() << "DataBase::updateTo013: latestRead: " << getDBVersion() << endl; bool IAmIn013 = false; bool IAmIn012 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateTo013: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << endl; if (latestReaded >= float(0.013)) { //qDebug() << "DataBase::updateTo013: - I am in 013" << endl; IAmIn013 = true; return true; } else { //qDebug() << "DataBase::updateTo013: - I am not in 0.013 I am in: " << getDBVersion() << endl; while (!IAmIn012 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo013: - Check if I am in 012: !" << endl; IAmIn012 = updateTo012(); if (IAmIn012) { //qDebug() << "DataBase::updateTo013: - updateTo012 returned TRUE - I am in 0.012: " << QString::number(latestReaded) << endl; } else { //qDebug() << "DataBase::updateTo013: - updateTo011 returned FALSE - I am NOT in 0.012: " << QString::number(latestReaded) << endl; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo013: - I Could not update to: " << QString::number(dbVersion) << endl; return false; } } // Now I am in the previous version and I can update the DB. if (!recreateSupportedContest()) { return false; } execQuery(Q_FUNC_INFO, "DROP TABLE IF exists qsl_via"); if (createTableQSL_Via_enumeration()) { if (populateTableQSL_Via_enumeration()) { } else { return false; } } else { return false; } if (updateDBVersion(softVersion, "0.013")) { //qDebug() << "DataBase::updateTo013: - We are in 013! " << endl; } else { //qDebug() << "DataBase::updateTo013: - Failed to go to 013! " << endl; return false; } //qDebug() << "DataBase::updateTo013: UPDATED OK!" << endl; return true; } bool DataBase::updateTo014() { // Updates the DB to 0.014: // Updates the Satellite DB //qDebug() << "DataBase::updateto014: latestRead: " << getDBVersion() << endl; bool IAmIn014 = false; bool IAmIn013 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateto014: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << endl; if (latestReaded >= float(0.14)) { //qDebug() << "DataBase::updateto014: - I am in 013" << endl; IAmIn014 = true; return true; } else { //qDebug() << "DataBase::updateto014: - I am not in 0.013 I am in: " << getDBVersion() << endl; while (!IAmIn013 && !ErrorUpdating) { //qDebug() << "DataBase::updateto014: - Check if I am in 013: !" << endl; IAmIn013 = updateTo013(); if (IAmIn013) { //qDebug() << "DataBase::updateto014: - updateTo012 returned TRUE - I am in 0.013: " << QString::number(latestReaded) << endl; } else { //qDebug() << "DataBase::updateto014: - updateTo011 returned FALSE - I am NOT in 0.013: " << QString::number(latestReaded) << endl; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto014: - I Could not update to: " << QString::number(dbVersion) << endl; return false; } } // Now I am in the previous version and I can update the DB. if (!recreateSatelliteData()) { //qDebug() << "DataBase::updateTo014: - Sats update NOK " << endl; return false; } if (updateDBVersion(softVersion, "0.014")) { //qDebug() << "DataBase::updateto014: - We are in 013! " << endl; } else { //qDebug() << "DataBase::updateto014: - Failed to go to 013! " << endl; return false; } //qDebug() << "DataBase::updateTo014: UPDATED OK!" << endl; return true; } bool DataBase::updateTo015() { // Updates the DB to 0.015: // Adds the FT4 mode //qDebug() << "DataBase::updateto015: latestRead: " << getDBVersion() << endl; bool IAmIn015 = false; bool IAmIn014 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateto015: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << endl; if (latestReaded >= float(0.15)) { //qDebug() << "DataBase::updateto015: - I am in 013" << endl; IAmIn015 = true; return true; } else { //qDebug() << "DataBase::updateto014: - I am not in 0.014 I am in: " << getDBVersion() << endl; while (!IAmIn014 && !ErrorUpdating) { //qDebug() << "DataBase::updateto015: - Check if I am in 014: !" << endl; IAmIn014 = updateTo014(); if (IAmIn014) { //qDebug() << "DataBase::updateto015: - updateTo013 returned TRUE - I am in 0.014: " << QString::number(latestReaded) << endl; } else { //qDebug() << "DataBase::updateto015: - updateTo011 returned FALSE - I am NOT in 0.014: " << QString::number(latestReaded) << endl; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto015: - I Could not update to: " << QString::number(dbVersion) << endl; return false; } } // Now I am in the previous version and I can update the DB. if (updateTheModeTableAndSyncLog()) { //qDebug() << "DataBase::updateTo015: - updateTheModeTableAndSyncLog OK" << endl; } else { //qDebug() << "DataBase::updateTo015: UPDATED NOK!(9)" << endl; ErrorUpdating = true; } if (updateDBVersion(softVersion, "0.015")) { //qDebug() << "DataBase::updateto015: - We are in 015! " << endl; } else { //qDebug() << "DataBase::updateto015: - Failed to go to 014! " << endl; return false; } //qDebug() << "DataBase::updateTo015: UPDATED OK!" << endl; return true; } bool DataBase::updateTo016() { // Updates the DB to 0.016: // Updates the Satellite DB //qDebug() << "DataBase::updateto016: latestRead: " << getDBVersion() << endl; bool IAmIn016 = false; bool IAmIn015 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateto016: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << endl; if (latestReaded >= float(0.16)) { //qDebug() << "DataBase::updateto016: - I am in 015" << endl; IAmIn016 = true; return true; } else { //qDebug() << "DataBase::updateto016: - I am not in 0.015 I am in: " << getDBVersion() << endl; while (!IAmIn015 && !ErrorUpdating) { //qDebug() << "DataBase::updateto014: - Check if I am in 015: !" << endl; IAmIn015 = updateTo015(); if (IAmIn015) { //qDebug() << "DataBase::updateto016: - updateTo015 returned TRUE - I am in 0.015: " << QString::number(latestReaded) << endl; } else { //qDebug() << "DataBase::updateto016: - updateTo015 returned FALSE - I am NOT in 0.015: " << QString::number(latestReaded) << endl; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto016: - I Could not update to: " << QString::number(dbVersion) << endl; return false; } } // Now I am in the previous version and I can update the DB. if (!recreateSatelliteData()) { //qDebug() << "DataBase::updateTo016: - Sats update NOK " << endl; return false; } if (updateDBVersion(softVersion, "0.016")) { //qDebug() << "DataBase::updateto014: - We are in 016! " << endl; } else { //qDebug() << "DataBase::updateto014: - Failed to go to 016! " << endl; return false; } //qDebug() << "DataBase::updateTo016: UPDATED OK!" << endl; return true; } bool DataBase::updateAwardDXCCTable() { //qDebug() << "DataBase::updateAwardDXCCTable" << endl; QList dxccStatusList; //QList dxccStatusListCheck; dxccStatusList.clear(); //dxccStatusListCheck.clear(); AwarddxccEntry awardEntry; awardEntry.dxcc = QString(); awardEntry.band = QString(); awardEntry.status = QString(); awardEntry.logNumber = QString(); awardEntry.qsoID = QString(); //AwarddxccEntryCheck awardEntryCheck; //awardEntryCheck.dxcc = QString(); //awardEntryCheck.band = QString(); //awardEntryCheck.status = QString(); QString stringQuery = QString("SELECT id, bandid, modeid, dxcc, qsl_rcvd, lognumber FROM log ORDER BY dxcc"); QSqlQuery query;//, query2; bool sqlOK = query.exec(stringQuery); QSqlRecord rec = query.record(); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } else { //qDebug() << "DataBase::updateAwardDXCCTable SELECT when OK" << endl; } QStringList dxccStatus = QStringList(); //dxcc, band, mode, confirmed, lognumber, qsoid (per award set) QStringList dxccStatusCheck = QStringList(); //dxcc, band, mode, confirmed, lognumber (per award set) just to check int nameCol = -1; QString _aux = QString(); //qDebug() << "DataBase::updateAwardDXCCTable before the while" << endl; while (query.next()) { //qDebug() << "DataBase::updateAwardDXCCTable IN the while" << endl; if (query.isValid()) { //qDebug() << "DataBase::updateAwardDXCCTable VALID" << endl; awardEntry.dxcc.clear(); awardEntry.band.clear(); awardEntry.status.clear(); awardEntry.logNumber.clear(); awardEntry.qsoID.clear(); //qDebug() << "DataBase::updateAwardDXCCTable in the while" << endl; nameCol = rec.indexOf("qsl_rcvd"); if ((query.value(nameCol)).toString() == "Y") { awardEntry.status = "1"; } else { awardEntry.status = "0"; } //qDebug() << "DataBase::updateAwardDXCCTable - status" << awardEntry.status << endl; if ((awardEntry.status == "1") || (awardEntry.status == "0") ) { nameCol = rec.indexOf("dxcc"); awardEntry.dxcc = (query.value(nameCol)).toString(); if ((awardEntry.dxcc).toInt()>0) { nameCol = rec.indexOf("bandid"); awardEntry.band = (query.value(nameCol)).toString(); nameCol = rec.indexOf("modeid"); awardEntry.mode = (query.value(nameCol)).toString(); nameCol = rec.indexOf("id"); awardEntry.qsoID = (query.value(nameCol)).toString(); nameCol = rec.indexOf("lognumber"); awardEntry.logNumber = (query.value(nameCol)).toString(); //qDebug() << "DataBase::updateAwardDXCCTable: Adding: " << awardEntry.dxcc <<"/" << awardEntry.band <<"/" << awardEntry.mode <<"/" << awardEntry.status <<"/" << awardEntry.logNumber <<"/" << awardEntry.qsoID << endl; dxccStatusList.append(awardEntry); } } // END OF IF VALID } } // END OF WHILE //qDebug() << "DataBase::updateAwardDXCCTable - END OF WHILE" << endl; query.finish(); //qDebug() << "DataBase::updateAwardDXCCTable: Log analized... let's clean the table!" << endl; stringQuery = QString("DELETE FROM awarddxcc"); sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {return false;} else { //qDebug() << "DataBase::updateAwardDXCCTable: awarddxcc table DELETED" << endl; } //qDebug() << "DataBase::updateAwardDXCCTable: Now we start writing the table!!" << endl; //int i = 0; _aux.clear(); int qsos = dxccStatusList.length(); int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating DXCC award information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); //qDebug() << "DataBase::updateAwardDXCCTable: INSERTING: " << QString::number(qsos) << " QSOS..." << endl; for (int j=0;j dxccStatusList; //QList dxccStatusListCheck; dxccStatusList.clear(); //dxccStatusListCheck.clear(); AwarddxccEntry awardEntry; awardEntry.dxcc = QString(); awardEntry.band = QString(); awardEntry.status = QString(); awardEntry.logNumber = QString(); awardEntry.qsoID = QString(); QString stringQuery = QString("SELECT id, bandid, modeid, cqz, qsl_rcvd, lognumber FROM log ORDER BY cqz"); QSqlQuery query;//, query2; bool sqlOK = query.exec(stringQuery); QSqlRecord rec = query.record(); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); return false; } else { //qDebug() << "DataBase::updateAwardWAZTable SELECT when OK" << endl; } QStringList dxccStatus = QStringList(); //cqz, band, mode, confirmed, lognumber, qsoid (per award set) QStringList dxccStatusCheck = QStringList(); //cqz, band, mode, confirmed, lognumber (per award set) just to check int nameCol = -1; QString _aux = QString(); //qDebug() << "DataBase::updateAwardWAZTable before the while" << endl; while (query.next()) { //qDebug() << "DataBase::updateAwardWAZTable IN the while" << endl; if (query.isValid()) { //qDebug() << "DataBase::updateAwardWAZTable VALID" << endl; awardEntry.dxcc.clear(); awardEntry.band.clear(); awardEntry.status.clear(); awardEntry.logNumber.clear(); awardEntry.qsoID.clear(); //qDebug() << "DataBase::updateAwardWAZTable in the while" << endl; nameCol = rec.indexOf("qsl_rcvd"); if ((query.value(nameCol)).toString() == "Y") { awardEntry.status = "1"; } else { awardEntry.status = "0"; } //qDebug() << "DataBase::updateAwardWAZTable - status" << awardEntry.status << endl; if ((awardEntry.status == "1") || (awardEntry.status == "0") ) { nameCol = rec.indexOf("cqz"); awardEntry.dxcc = (query.value(nameCol)).toString(); if ((awardEntry.dxcc).toInt()>0) { nameCol = rec.indexOf("bandid"); awardEntry.band = (query.value(nameCol)).toString(); nameCol = rec.indexOf("modeid"); awardEntry.mode = (query.value(nameCol)).toString(); nameCol = rec.indexOf("id"); awardEntry.qsoID = (query.value(nameCol)).toString(); nameCol = rec.indexOf("lognumber"); awardEntry.logNumber = (query.value(nameCol)).toString(); //qDebug() << "DataBase::updateAwardWAZTable: Adding: " << awardEntry.dxcc <<"/" << awardEntry.band <<"/" << awardEntry.mode <<"/" << awardEntry.status <<"/" << awardEntry.logNumber <<"/" << awardEntry.qsoID << endl; dxccStatusList.append(awardEntry); } } // END OF IF VALID } } // END OF WHILE //qDebug() << "DataBase::updateAwardWAZTable - END OF WHILE" << endl; query.finish(); //qDebug() << "DataBase::updateAwardWAZTable: Log analized... let's clean the table!" << endl; stringQuery = QString("DELETE FROM awardwaz"); sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {return false;} else { //qDebug() << "DataBase::updateAwardWAZTable: awardwaz table DELETED" << endl; } //qDebug() << "DataBase::updateAwardWAZTable: Now we start writing the table!!" << endl; //int i = 0; _aux.clear(); int qsos = dxccStatusList.length(); int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating WAZ award information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); //qDebug() << "DataBase::updateAwardWAZTable: INSERTING: " << QString::number(qsos) << " QSOS..." << endl; for (int j=0;j. * * * *****************************************************************************/ //#include #include #include #include #include "dataproxy.h" #include "setuppagelogsnew.h" const int CONTEST_DX = 0; const int CONTEST_CQ_WW_SSB = 1; const int CONTEST_CQ_WW_CW = 2; const int CONTEST_CQ_WPX_SSB = 3; const int CONTEST_CQ_WPX_CW = 4; class SetupPageLogs : public QWidget { Q_OBJECT public: SetupPageLogs(DataProxy *dp, QWidget *parent=0); ~SetupPageLogs(); int getSelectedLog(); void setSelectedLog(const int _i); void createNewLog(); void setDefaultStationCallsign (const QString _p); void setDefaultOperators(const QString _p); /* QString getBands(); // 10m, 12m, 15m QString getModes(); //ssb, CW void setActiveBands(QStringList q); void setActiveModes(QStringList q); */ private slots: /* void slotBandActiveItemDoubleClicked ( QListWidgetItem * item ); void slotBandNotActiveItemDoubleClicked ( QListWidgetItem * item ); void slotBandSelButtonClicked( ); void slotBandUnSelButtonClicked( ); void slotModeSelButtonClicked( ); void slotModeUnSelButtonClicked( ); */ void slotNewButtonClicked(); void slotEditButtonClicked(); void slotRemoveButtonClicked(); void slotAnalyzeNewLogData(const QStringList _qs); void slotLogSelected(const QModelIndex & index); void slotLogDoubleClicked(const QModelIndex & index); void slotLogsCancelled(const bool _q); //void slotCreateLog(); // signals: //void exitSignal(const int status); // 1 = OK, -1 = NOK, 2 = Cancel clicked void newLogData(const QStringList _qs); // Station QRZ + Operators to be shown in the main tab void queryError(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); // To alert about any failed query execution private: //void createActions(); QStringList readLogs(); void createLogsPanel(); void createLogsModel(); void createActions(); //bool addNewLog(const QStringList _qs); void updateSelectedLogs(); void readSelectedLog(const int _i); void showError(const QString _errorC); /* Wizard to create a new log*/ //QWizardPage *createLogTypePage(); //QWizard *newLogWizard; // Wizard to create a new log /*^Wizard to create a new log^*/ QSqlRelationalTableModel *logsModel; QWidget *logsPanel; QTableView *logsView; QAbstractButton *finishButton; //QWidget *logsWidget; //QTreeWidget *logsQTreeWidget; //QListWidget *bandsNotActiveListWidget, *bandsActiveListWidget; //QListWidget *modesNotActiveListWidget, *modesActiveListWidget; //QStringList bands, modes; QPushButton *newLogPushButton, *editPushButton, *removePushButton; //*loadAllPushButton, *loadSelectedPushButton, *clearPushButton,; int lastLog; QString currentLogComment; QString currentStationCallSign; QComboBox *currentLogs; QStringList logsAvailable; SetupPageLogsNew *newLog; QString stationCallsign, operators, comment, dateString, typeContest; int contestCatMode, contestCatOperators, contestCatAssisted, contestCatPower, contestCatBands, contestBands, typeContestN; DataProxy *dataProxy; int selectedLog; QString defaultStationCallSign, defaultOperators; }; #endif // SETUPPAGELOGS_H klog-0.9.8.1/dataproxy.cpp0000644000175000017500000003701713532572307014341 0ustar develdevel/*************************************************************************** dataproxy.cpp - description ------------------- begin : sept 2014 copyright : (C) 2014 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "dataproxy.h" DataProxy::DataProxy() { //qDebug() << "DataProxy::DataProxy" << endl; } DataProxy::~DataProxy() { } QString DataProxy::getSoftVersion() { return QString(); } bool DataProxy::reconnectDB() { return false; } QString DataProxy::getDBVersion() { return QString(); } void DataProxy::createLogModel(){} void DataProxy::createLogPanel(){} bool DataProxy::haveAtLeastOneLog(){return true;} //QStringList DataProxy::getColumnNamesFromTable(const QString _tableName){return QStringList();} QStringList DataProxy::getColumnNamesFromTableLog(){return QStringList();} bool DataProxy::setDXCCAwardStatus(const int _qsoId){return false;} bool DataProxy::setWAZAwardStatus(const int _qsoId){return false;} int DataProxy::getIdFromModeName(const QString& _modeName) { return -1; } int DataProxy::getIdFromBandName(const QString& _bandName) { return -1; } int DataProxy::getSubModeIdFromSubMode(const QString _subModeName) { return -1; } int DataProxy::getModeIdFromSubModeId(const int _sm) { return -1; } bool DataProxy::isModeDeprecated (const QString _sm) { return false; } QString DataProxy::getNameFromBandId (const int _id) { return ""; } QString DataProxy::getNameFromModeId (const int _id) { return ""; } QString DataProxy::getNameFromSubModeId (const int _id) { return ""; } QString DataProxy::getSubModeFromId (const int _id) { return QString(); } QString DataProxy::getNameFromSubMode (const QString _sm) { return ""; } QString DataProxy::getFreqFromBandId(const int _id) { return ""; } int DataProxy::getBandIdFromFreq(const double _n) { return -1; } QString DataProxy::getBandNameFromFreq(const double _n) { return QString(); } double DataProxy::getLowLimitBandFromBandName(const QString _sm) { return -1.0; } double DataProxy::getLowLimitBandFromBandId(const QString _sm) { return -1.0; } bool DataProxy::isThisFreqInBand(const QString b, const QString fr) { return false; } QStringList DataProxy::getBands() { return QStringList(); } QStringList DataProxy::getModes() { return QStringList(); } QStringList DataProxy::sortBandNamesBottonUp(const QStringList _qs) { return QStringList(); } QStringList DataProxy::sortBandIdBottonUp(const QStringList _qs) { return QStringList(); } QStringList DataProxy::getBandIDs() { return QStringList(); } QStringList DataProxy::getModesIDs() { return QStringList(); } QStringList DataProxy::getBandsInLog(const int _log) { return QStringList(); } QStringList DataProxy::getModesInLog(const int _log) { return QStringList(); } int DataProxy::getMostUsedBand(const int _log) { return -1; } int DataProxy::getMostUsedMode(const int _log) { return -1; } int DataProxy::getLastQSOid() { return -1; } bool DataProxy::clearLog() { return false; } bool DataProxy::qslSentViaDirect(const int _qsoId, const QString _updateDate) { return false; } bool DataProxy::qslSentViaBureau(const int _qsoId, const QString _updateDate) { return false; } bool DataProxy::qslRecViaBureau(const int _qsoId, const QString _updateDate) { return false; } bool DataProxy::qslRecViaBureau(const int _qsoId, const QString _updateDate, const bool _queueSentQSL) { return false; } bool DataProxy::qslRecViaDirect(const int _qsoId, const QString _updateDate, const bool _queueSentQSL) { return false; } bool DataProxy::qslRecViaDirect(const int _qsoId, const QString _updateDate) { return false; } bool DataProxy::qslSentAsRequested(const int _qsoId, const QString _updateDate) { return false; } bool DataProxy::qslRecAsRequested(const int _qsoId, const QString _updateDate) { return false; } bool DataProxy::setClubLogSent(const int _qsoId, const QString _st, const QString _updateDate) { return false; } bool DataProxy::isQSLReceived(const int _qsoId) { return false; } bool DataProxy::isQSLSent(const int _qsoId) { return false; } int DataProxy::getBandFromId(const int _qsoId) { return -1; } int DataProxy::getModeFromId(const int _qsoId) { return -1; } int DataProxy::getDXCCFromId(const int _qsoId) { return -1; } int DataProxy::getCQZFromId(const int _qsoId) { return -1; } QString DataProxy::getCallFromId(const int _qsoId) { return ""; } QStringList DataProxy::getClubLogRealTimeFromId(const int _qsoId) { return QStringList(); } QString DataProxy::getNameFromQRZ(const QString _call) { return QString(); } QString DataProxy::getQTHFromQRZ(const QString _call) { return QString(); } QString DataProxy::getLocatorFromQRZ(const QString _call) { return QString(); } QString DataProxy::getIOTAFromQRZ(const QString _call) { return QString(); } QString DataProxy::getQSLViaFromQRZ(const QString _call) { return QString(); } bool DataProxy::updateAwardDXCC() { return false; } bool DataProxy::updateAwardWAZ() { return false; } bool DataProxy::addQSOFromWSJTX(const QString _dxcall, const double _freq, const QString _mode, const QString _dx_grid, const QString _time_off, const QString _report_sent, const QString _report_rec, const QString _tx_power, const QString _comments, const QString _name, const QString _time_on, const int _dxcc, const QString _opQrz, const QString _stQrz, const QString _myLoc, const int _logN) { return false; } bool DataProxy::deleteQSO(const int _qsoId) { return false; } int DataProxy::isWorkedB4(const QString _qrz, const int _currentLog) { return -1; } bool DataProxy::isThisQSODuplicated(const QString _qrz, const QString _date, const QString _time, const int _band, const int _mode) { return false; } int DataProxy::getDuplicatedQSOId(const QString _qrz, const QString _date, const QString _time, const int _band, const int _mode) { return -1; } bool DataProxy::isDXCCConfirmed(const int _dxcc, const int _currentLog) { return false; } bool DataProxy::isHF(const int _band) { return false; } bool DataProxy::isWARC(const int _band) { return false; } bool DataProxy::isVHF(const int _band) { return false; } bool DataProxy::isUHF(const int _band) { return false; } QStringList DataProxy::getOperatingYears(const int _currentLog) { return QStringList(); } void DataProxy::compressDB() { } bool DataProxy::unMarkAllQSO() { return false; } bool DataProxy::lotwSentQueue(const QString _updateDate, const int _currentLog) {// Mark LOTW QSL SENT as Q (Queued) return false; } bool DataProxy::lotwSentYes(const QString _updateDate, const int _currentLog, const QString _station) { return false; } int DataProxy::getQSOonYear(const int _year, const int _logNumber) { return -1; } int DataProxy::getDXCConYear(const int _year, const int _logNumber) { return -1; } int DataProxy::getCQzonYear(const int _year, const int _logNumber) { return -1; } int DataProxy::getQSOsWithDXCC(const int _dxcc, const int _logNumber) { return -1; } int DataProxy::getQSOsAtHour(const int _hour, const int _log) { return -1; } int DataProxy::getQSOsAtHourOnBand(const int _hour, const int _band ,const int _log) { return -1; } int DataProxy::getQSOsOnMonth(const int _month, const int _log) { return -1; } bool DataProxy::newDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber) { return false; } QStringList DataProxy::getContestNames() { return QStringList(); } QStringList DataProxy::getContestCat(const int _catn){ return QStringList(); } QStringList DataProxy::getContestOverlays() { return QStringList(); } QStringList DataProxy::getBandNames(){ return QStringList(); } QStringList DataProxy::getPropModeList() { return QStringList(); } bool DataProxy::clearSatList() { return false; } bool DataProxy::addSatellite(const QString _arrlId, const QString _name, const QString _downLink, const QString _upLink, const QString _mode, int id) { return false; } int DataProxy::getDBSatId(const QString _arrlId) { return -1; } QStringList DataProxy::getSatellitesList() { return QStringList(); } QString DataProxy::getSatelliteUplink(const QString _sat) { return QString(); } QString DataProxy::getSatelliteDownlink(const QString _sat) { return QString(); } QString DataProxy::getSatelliteMode(const QString _sat) { return QString(); } QString DataProxy::getSatelliteFullUplink(const QString _sat) { return QString(); } QString DataProxy::getSatelliteFullDownlink(const QString _sat) { return QString(); } QString DataProxy::getSatelliteFullMode(const QString _sat) { return QString(); } QString DataProxy::getSatelliteName(const QString _sat) { return QString(); } QString DataProxy::getSateliteArrlIdFromId(const int _id) { return QString(); } QStringList DataProxy::getQSLRcvdList() { return QStringList(); } QStringList DataProxy::getQSLSentList() { return QStringList(); } QStringList DataProxy::getClubLogStatusList() { return QStringList(); } QStringList DataProxy::getQSLViaList() { return QStringList(); } QStringList DataProxy::getValidCatOptions(const int _currentCat, const int _lowerCa) { return QStringList(); } int DataProxy::getNumberOfManagedLogs() { return -1; } int DataProxy::getMaxLogNumber() { return -1; } QStringList DataProxy::getListOfManagedLogs() { return QStringList(); } QString DataProxy::getStationCallSignFromLog(const int _log) { return QString(); } QStringList DataProxy::getStationCallSignsFromLog(const int _log) { return QStringList(); } QString DataProxy::getOperatorsFromLog(const int _log) { return QString(); } QString DataProxy::getCommentsFromLog(const int _log) { return QString(); } QString DataProxy::getLogDateFromLog(const int _log) { return QString(); } QString DataProxy::getLogTypeNFromLog(const int _log) { return QString(); } int DataProxy::getContestTypeN(const int _co, const int _catop, const int _catas, const int _catpo, const int _catba, const int _catov, const int _catmo) { return -1; } QStringList DataProxy::getDataFromContestType(const int _n) { return QStringList(); } int DataProxy::getLogTypeNumber(const QString _logType) { return -1; } QString DataProxy::getLogTypeName(const int _logType) { return QString(); } QString DataProxy::getLogTypeOfUserLog(const int _logN) { return QString(); } int DataProxy::getLogNumberFromQSOId(const int _qsoId) { return -1; } bool DataProxy::fillEmptyDXCCInTheLog() { return false; } int DataProxy::getHowManyQSOInLog(const int _log) { return 0; } int DataProxy::getHowManyConfirmedQSLInLog(const int _log) { return 0; } int DataProxy::getHowManyQSLSentInLog(const int _log) { return 0; } int DataProxy::getQSOsWithContinent(const QString _cont, const int _logNumber) { return 0; } int DataProxy::getQSOsInBand(const QString _band, const int _log) { return 0; } int DataProxy::getQSOsInMode(const QString _mode, const int _log) { return 0; } bool DataProxy::addNewLog (const QStringList _qs) { return false; } bool DataProxy::doesThisLogExist(const int _log) { return false; } int DataProxy::getContinentIdFromContinentShortName(const QString _n) { return -1; } QString DataProxy::getContinentShortNameFromEntity(const int _n) { return QString(); } int DataProxy::getContinentIdFromEntity(const int _n) { return -1; } QStringList DataProxy::getContinentShortNames() { return QStringList(); } bool DataProxy::isValidContinentShortName(const QString _n) { return false; } int DataProxy::getCQzFromPrefix(const QString _p) { return -1; } int DataProxy::getITUzFromPrefix(const QString _p) { return -1; } int DataProxy::getCQzFromEntity(const int _n) { return -1; } int DataProxy::getITUzFromEntity(const int _n) { return -1; } QString DataProxy::getEntityNameFromId(const int _n) { return QString(); } int DataProxy::getEntityIdFromName(const QString _e) { return -1; } QString DataProxy::getEntityMainPrefix(const int _entityN) { return QString(); } int DataProxy::getDXCCFromPrefix(const QString _p) { return -1; } bool DataProxy::isNewCQz(int _c) { return false; } bool DataProxy::isNewEntity(int _e) { return false; } double DataProxy::getLongitudeFromEntity(const int _e) { return 0.0; } double DataProxy::getLatitudeFromEntity(const int _e) { return 0.0; } QString DataProxy::getEntityPrefixes(const int _enti) { return QString(); } QStringList DataProxy::getEntitiesNames() { return QStringList(); } QStringList DataProxy::getEntitiesIds() { return QStringList(); } int DataProxy::getHowManyEntities() { return -1; } int DataProxy::getMaxEntityID(bool limit) { return -1; } bool DataProxy::updateISONames() { return false; } QString DataProxy::getISOName(const int _n) { return QString(); } void DataProxy::getFoundInLog(const QString _txt, const int _log) { //return false; } /* bool DataProxy::queryPrepare(const QString _query) { return false; } bool DataProxy::queryBind(const QString _field, const QString value) { return false; } bool DataProxy::queryExec() { return false; } */ klog-0.9.8.1/elogclublog.h0000644000175000017500000000661613532572307014272 0ustar develdevel#ifndef ELOGCLUBLOG_H #define ELOGCLUBLOG_H /*************************************************************************** elogclublog.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include class eLogClubLog : public QObject { Q_OBJECT public: explicit eLogClubLog(); ~eLogClubLog(); void setCredentials(const QString _call, const QString _email, const QString _pass, const bool _useQSOStationCall); int sendQSO(QStringList _qso); int deleteQSO(QStringList _qso); int modifyQSO (QStringList _oldQSO, QStringList _newQSO); private: QString getClubLogAdif(const QStringList _q); int sendData(const QString _q); // Sends the data (http post) to ClubLog QString prepareToTranslate(const QString _m); // Get the message and put it in a tr to be able to translate it QString call, email, pass, api, stationCallsign; QNetworkAccessManager *manager; QNetworkReply* reply; int currentQSO; int result; QString target; bool useQSOStationCallsign; private slots: void slotQsoUploadFinished(QNetworkReply* data); void slotFileUploadFinished(QNetworkReply* data); void downloadProgress(qint64 received, qint64 total); void slotErrorManagement(QNetworkReply::NetworkError networkError); signals: void actionReturnDownload(const int _i, const int _qsoId); void done(); void actionShowProgres(qint64 received, qint64 total); void actionError(const int _i); void showMessage(const QString _t); void disableClubLogAction(const bool _b); }; #endif // DOWNLOADCTY_H klog-0.9.8.1/awarddxmarathon.cpp0000644000175000017500000000600213532572307015500 0ustar develdevel/*************************************************************************** awarddxmarathon.cpp - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "awarddxmarathon.h" #include DXMarathon::DXMarathon(DataProxy *dp) { //qDebug() << "DXMarathon::DXMarathon" << endl; dataProxy = dp; //qDebug() << "DXMarathon::DXMarathon - END" << endl; } int DXMarathon::getDXMarathonQSO(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonQSO: " << QString::number(_year) << endl; return dataProxy->getQSOonYear(_year, _logNumber); } int DXMarathon::getDXMarathonDXCC(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonDXCC: " << QString::number(_year) << endl; return dataProxy->getDXCConYear(_year, _logNumber); } int DXMarathon::getDXMarathonCQ(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonCQ: " << QString::number(_year) << endl; return dataProxy->getCQzonYear(_year, _logNumber); } int DXMarathon::getDXMarathonScore(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonScore: " << QString::number(_year) << endl; return ( getDXMarathonDXCC(_year, _logNumber) + getDXMarathonCQ(_year, _logNumber)); } bool DXMarathon::neededForDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber) { return dataProxy->newDXMarathon(_dxcc, _cq, _year, _logNumber); } klog-0.9.8.1/INSTALL-es.txt0000644000175000017500000000034013532572307014063 0ustar develdevelEste fichero es sobre el proceso de instalación de KLog: Por favor, lea:: INSTALL-linux.txt para instrucciones de linux. INSTALL-macOS.txt para instrucciones en macOS. INSTALL-win.txt para instrucciones en Windowns.. klog-0.9.8.1/softwareupdatedialog.cpp0000644000175000017500000000474113532572307016541 0ustar develdevel#include "softwareupdatedialog.h" //#include SoftwareUpdateDialog::SoftwareUpdateDialog() { //qDebug) << "SoftwareUpdateDialog::SoftwareUpdateDialog" << endl; textBrowser = new QTextBrowser; textBrowser->setOpenLinks(true); textBrowser->setOpenExternalLinks(true); //textBrowser->setFrameShadow(QFrame::Raised); //textBrowser->setFrameStyle(QFrame::StyledPanel); QPushButton *acceptButton = new QPushButton(tr("Ok")); textBrowser->setOpenExternalLinks(true); //textBrowser->setHTML(url); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(acceptButton); /// QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(textBrowser); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); setWindowTitle(tr("KLog update")); /// connect(acceptButton, SIGNAL(clicked()), this, SLOT(slotAcceptButtonClicked())); //qDebug) << "SoftwareUpdateDialog::SoftwareUpdateDialog - END" << endl; } void SoftwareUpdateDialog::setVersion(const QString tversion, const bool updateNeeded) { //qDebug) << "SoftwareUpdateDialog::setVersion: " << tversion << endl; _version = tversion; if (updateNeeded) { text = "

KLog new version ("+ tversion + ") is available!


There is a new version of KLog available.

You can get the new version from:

https://www.klog.xyz
"; } else { text = "

" + tr("Congratulations!") + "



" + tr("Your KLog has been updated.") + "

" + tr("You already have the latest version.") + "
("+ tversion + ")
"; } textBrowser->setHtml(text); //qDebug) << "SoftwareUpdateDialog::setVersion: END"<< endl; } SoftwareUpdateDialog::~SoftwareUpdateDialog() { //qDebug) << "SoftwareUpdateDialog::~SoftwareUpdateDialog" << endl; } void SoftwareUpdateDialog::slotAcceptButtonClicked() { //qDebug) << "SoftwareUpdateDialog::slotAcceptButtonClicked" << endl; accept(); //qDebug) << "SoftwareUpdateDialog::slotAcceptButtonClicked END" << endl; } void SoftwareUpdateDialog::keyPressEvent(QKeyEvent *event) { //qDebug) << "SoftwareUpdateDialog::keyPressEvent" << endl; switch (event->key()) { break; default: //QFrame::keyPressEvent(event) slotAcceptButtonClicked(); } //qDebug) << "SoftwareUpdateDialog::keyPressEvent END" << endl; } klog-0.9.8.1/awards.h0000644000175000017500000001640213532572307013247 0ustar develdevel#ifndef AWARDS_H #define AWARDS_H /*************************************************************************** awards.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include // For the "tr" function #include #include #include #include #include #include #include #include #include #include #include "world.h" #include "awarddxmarathon.h" #include "dataproxy.h" #include "utilities.h" class QProgressDialog; class Awards : public QObject { Q_OBJECT //friend class World; public: Awards(DataProxy *dp, const QString _parentFunction); ~Awards(); void setAwards(const int _qsoId); void setAwards(const int _dxcc, const int _waz, const int _band, const int _mode, const int _workedOrConfirmed, const int _logNumber, const int _qsoId); /* _workedOrConfirmed = 0 Set as Worked _workedOrConfirmed = 1 Set as Confirmed */ void setManageModes(const bool _manageModes=false); // Defines if the mode is to be taken into account when calculating an award void recalculateAwards(); //void recalculateDXCC(const int _logNumber); //void setAwards(const int _qsoId, bool modify); int getDXCCWorked(const int _logNumber); int getDXCCConfirmed(const int _logNumber); int getWAZWorked(const int _logNumber); int getWAZConfirmed(const int _logNumber); int getQSOsInLog(const int _logNumber); bool getIsDXCCConfirmed(const int _dxcc, const int _logNumber); bool isThisSpotConfirmed(const QStringList _qs); QString checkIfValidIOTA(const QString _tiota); //TODO: There is an equivalent function in the MainWindowInputOthers class. I should use only one! int getEntityDXStatus (const int _enti, const int _bandid, int _modeid = -1, int _log = -1); QString getQSOofAward (const int _enti, const int _bandid); int getQSOIdofAward (const int _enti, const int _bandid); int getDXStatus (const QStringList _qs); QString getDXStatusString (const int _status); // Needs to be called with the output of getDXStatus QString getDXCCStatusBand(const int _dxcc, const int _band, const int _logNumber=0); // Returns -, W or C (Not worked, worked, Confirmed) void setColors (const QString _newOne, const QString _needed, const QString _worked, const QString _confirmed, const QString _default); QColor getQRZDXStatusColor(const QStringList _qs); // Receives Entity, band, mode & log QColor getDefaultColor(); int getDXMarathonQSO(const int _year, const int _logNumber); int getDXMarathonDXCC(const int _year, const int _logNumber); int getDXMarathonCQ(const int _year, const int _logNumber); int getDXMarathonScore(const int _year, const int _logNumber); bool isDXMarathonNeed(const int _dxcc, const int _cq, const int _year, const int _logNumber); // Receives: QStringList _qs; //_qs << QRZ << BandId << lognumber; /* 0 - New one. 1 - Worked but not confirmed: New one in this band. 2 - Worked but not confirmed: Worked in this band. 3 - Confirmed: New one in this band. 4 - Confirmed: Worked in this band. 5 - Confirmed: Confirmed in this band. 6 - Default: Not applicable */ private: void setAwardDXCC(const int _qsoId); //bool setAwardDXCC(const int _dxcc, const int _band, const int _mode, const QString _workedOrConfirmed, const int _logNumber, const int _qsoId); int setAwardDXCCst(const int _dxcc, const int _band, const int _mode, const bool _confirmed, const int _logNumber, const int _qsoId); int setAwardDXCCConfirmed(const int _band, const int _mode, const int _dxcc, const int _newQSOid); // Changes the status of a DXCC from worked to confirmed int setDXCCToQSO(const int _dxcc, const int _qsoid); // Defines the DXCC in a QSO int setCQToQSO(const int _cqz, const int _qsoid); // Defines the CQ zone in a QSO int dxccStatusBandMode(const int _ent, const int _band, const int _mode, const int _logNumber, bool _checkingMode); //-1 error / 0 Not worked / 1 worked / 2 confirmed int dxccStatus(const int _ent, const int _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed /* _confirmed = 0 Set as Worked _cConfirmed = 1 Set as Confirmed */ /**/ int dxccStatusBand(const int _ent, const int band, const int _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed int dxccStatusMode(const int _ent, const int band, const int _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed /**/ void setAwardWAZ(const int _qsoId); //bool setAwardWAZ(const int _cqz, const int _band, const int _mode, const QString _workedOrConfirmed, const int _logNumber, const int _qsoId); int setAwardWAZst(const int _cqz, const int _band, const int _mode, const bool _confirmed, const int _logNumber, const int _qsoId); /* _confirmed = 0 Set as Worked _confirmed = 1 Set as Confirmed */ //int getProgresStepForDialog(int totalSteps); QColor newOneColor; // QColor neededColor; // QColor workedColor; // QColor confirmedColor; // QColor defaultColor; World *world; DataProxy *dataProxy; DXMarathon *dxMarathon; Utilities *util; typedef QMultiHash DXStatus; DXStatus dxccWorked, dxccConfirmed, wazWorked, wazConfirmed; bool manageModes; signals: void queryError(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); // To alert about any failed query execution void awardDXCCUpdated(); }; #endif // AWARDS_H klog-0.9.8.1/setuppageuserdata.cpp0000644000175000017500000005706413532572307016060 0ustar develdevel/*************************************************************************** userdatapage.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * Foobar is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setuppageuserdata.h" SetupPageUserDataPage::SetupPageUserDataPage(DataProxy *dp, QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageUserDataPage::SetupPageUserDataPage" << endl; locator = new Locator(); dataProxy = dp; world = new World(dataProxy, Q_FUNC_INFO); operatorOK = false; operatorsOK = false; tabWidget = new QTabWidget; QWidget *personalTab = new QWidget; QWidget *stationTab = new QWidget; tabWidget->addTab(personalTab, tr("&Personal data")); tabWidget->addTab(stationTab, tr("Station &data")); qrzLineEdit = new QLineEdit; operatorsLineEdit = new QLineEdit; nameLineEdit = new QLineEdit; cqzLineEdit = new QLineEdit; ituzLineEdit = new QLineEdit; myLocatorLineEdit = new QLineEdit; defaultPalette = new QPalette; //defaultPalette = operatorsLineEdit->palette(); wrongPalette = new QPalette; //wrongPalette->setColor(QPalette::WindowText, setNamedColor(Qt::red)); //redColor.setNamedColor(Qt::red); //redColor->setNamedColor(Qt::red); wrongPalette->setColor(QPalette::Text, Qt::red); //Personal Tab nameLineEdit = new QLineEdit; address1LineEdit = new QLineEdit; address2LineEdit = new QLineEdit; address3LineEdit = new QLineEdit; address4LineEdit = new QLineEdit; cityLineEdit = new QLineEdit; zipLineEdit = new QLineEdit; provinceLineEdit = new QLineEdit; countryLineEdit = new QLineEdit; nameLineEdit->setToolTip(tr("Enter your name.")); address1LineEdit->setToolTip(tr("Enter your address - 1st line.")); address2LineEdit->setToolTip(tr("Enter your address - 2nd line.")); address3LineEdit->setToolTip(tr("Enter your address - 3rd line.")); address4LineEdit->setToolTip(tr("Enter your address - 4th line.")); cityLineEdit->setToolTip(tr("Enter your city.")); zipLineEdit->setToolTip(tr("Enter your zip code.")); provinceLineEdit->setToolTip(tr("Enter your province or state.")); countryLineEdit->setToolTip(tr("Enter your country.")); QLabel *nameLabel = new QLabel(tr("&Name")); QLabel *addressLabel = new QLabel(tr("&Address")); QLabel *cityLabel = new QLabel(tr("Cit&y")); QLabel *zipLabel = new QLabel(tr("&Zip Code")); QLabel *provLabel = new QLabel(tr("Pro&v/State")); QLabel *countryLabel = new QLabel(tr("Countr&y")); nameLabel->setBuddy(nameLineEdit); addressLabel->setBuddy(address1LineEdit); cityLabel->setBuddy(cityLineEdit); zipLabel->setBuddy(zipLineEdit); provLabel->setBuddy(provinceLineEdit); countryLabel->setBuddy(countryLineEdit); //void addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 ) // 0 1 2 3 QGridLayout *personalLayout = new QGridLayout(); personalLayout->addWidget(nameLabel, 0, 0); personalLayout->addWidget(nameLineEdit, 1, 0); personalLayout->addWidget(addressLabel, 2, 0); personalLayout->addWidget(address1LineEdit, 3, 0, 1, 2); personalLayout->addWidget(address2LineEdit, 4, 0, 1, 2); personalLayout->addWidget(address3LineEdit, 5, 0, 1, 2); personalLayout->addWidget(address4LineEdit, 6, 0, 1, 2); personalLayout->addWidget(cityLabel, 2, 2); personalLayout->addWidget(cityLineEdit, 3, 2, 1, 1); personalLayout->addWidget(zipLabel, 2, 5); personalLayout->addWidget(zipLineEdit, 3, 5, 1, 1); personalLayout->addWidget(provLabel, 4, 2); personalLayout->addWidget(provinceLineEdit, 5, 2, 1, 1); personalLayout->addWidget(countryLabel, 4, 5); personalLayout->addWidget(countryLineEdit, 5, 5, 1, 1); //personalLayout->addWidget(); //QHBoxLayout *personalAllLayout = new QHBoxLayout(); //personalAllLayout->addLayout(nameLayout); //personalAllLayout->addLayout(personalLayout); personalTab->setLayout(personalLayout); // Station Tab rig1LineEdit = new QLineEdit; rig2LineEdit = new QLineEdit; rig3LineEdit = new QLineEdit; ant1LineEdit = new QLineEdit; ant2LineEdit = new QLineEdit; ant3LineEdit = new QLineEdit; //powerLineEdit = new QLineEdit; myPowerSpinBox = new QDoubleSpinBox; myPowerSpinBox->setDecimals(2); myPowerSpinBox->setMaximum(9999); rig1LineEdit->setToolTip(tr("Enter your information for rig") + " #1."); rig2LineEdit->setToolTip(tr("Enter your information for rig") + " #2."); rig3LineEdit->setToolTip(tr("Enter your information for rig") + " #3."); ant1LineEdit->setToolTip(tr("Enter your information for antenna") + " #1."); ant2LineEdit->setToolTip(tr("Enter your information for antenna") + " #2."); ant3LineEdit->setToolTip(tr("Enter your information for antenna") + " #3."); myPowerSpinBox->setToolTip(tr("Enter your power information.")); QLabel *rig1Label = new QLabel(tr("&Rig 1")); QLabel *rig2Label = new QLabel(tr("R&ig 2")); QLabel *rig3Label = new QLabel(tr("Ri&g 3")); QLabel *antenna1Label = new QLabel(tr("Antenna &1")); QLabel *antenna2Label = new QLabel(tr("Antenna &2")); QLabel *antenna3Label = new QLabel(tr("Antenna &3")); QLabel *powerLabel = new QLabel(tr("Po&wer")); rig1Label->setBuddy(rig1LineEdit); rig2Label->setBuddy(rig2LineEdit); rig3Label->setBuddy(rig3LineEdit); antenna1Label->setBuddy(ant1LineEdit); antenna2Label->setBuddy(ant2LineEdit); antenna3Label->setBuddy(ant3LineEdit); powerLabel->setBuddy(myPowerSpinBox); //void addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 ) // 0 1 2 3 QGridLayout *stationLayout = new QGridLayout(); stationLayout->addWidget(rig1Label, 0, 0); stationLayout->addWidget(rig1LineEdit, 1, 0, 1, 1); stationLayout->addWidget(rig2Label, 2, 0); stationLayout->addWidget(rig2LineEdit, 3, 0, 1, 1); stationLayout->addWidget(rig3Label, 4, 0); stationLayout->addWidget(rig3LineEdit, 5, 0, 1, 1); stationLayout->addWidget(antenna1Label, 0, 2); stationLayout->addWidget(ant1LineEdit, 1, 2, 1, 1); stationLayout->addWidget(antenna2Label, 2, 2); stationLayout->addWidget(ant2LineEdit, 3, 2, 1, 1); stationLayout->addWidget(antenna3Label, 4, 2); stationLayout->addWidget(ant3LineEdit, 5, 2, 1, 1); stationLayout->addWidget(powerLabel, 0, 4); stationLayout->addWidget(myPowerSpinBox, 1, 4); stationTab->setLayout(stationLayout); //TODO:Defining ALL the tooltips qrzLineEdit->setToolTip(tr("Enter the station callsign that will be used for logging.")); operatorsLineEdit->setToolTip(tr("Enter the operators (comma separated if more than one).")); myLocatorLineEdit->setToolTip(tr("Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign.")); QLabel *qrzLabel = new QLabel(tr("&QRZ")); QLabel *operatorsLabel = new QLabel (tr("&Operators")); QLabel *cqzLabel = new QLabel(tr("&CQ Zone")); QLabel *ituzLabel = new QLabel(tr("&ITU Zone")); myLocatorLabel = new QLabel(tr("&Locator")); qrzLabel->setBuddy(qrzLineEdit); operatorsLabel->setBuddy(operatorsLineEdit); cqzLabel->setBuddy(cqzLineEdit); ituzLabel->setBuddy(ituzLineEdit); myLocatorLabel->setBuddy(myLocatorLineEdit); cqzLineEdit->setInputMask("09"); ituzLineEdit->setInputMask("09"); cqzLineEdit->setText("00"); ituzLineEdit->setText("00"); //QHBoxLayout *operatorLayout = new QHBoxLayout; //operatorLayout->addWidget(qrzLabel); //operatorLayout->addWidget(qrzLineEdit); //operatorLayout->addWidget(operatorsLabel); //operatorLayout->addWidget(operatorsLineEdit); //QGridLayout *operatorLayout = new QGridLayout(); //operatorLayout->addWidget(qrzLabel, 0, 0); //operatorLayout->addWidget(qrzLineEdit, 1, 0); ////operatorLayout->addWidget(nameLabel, 0, 1); ////operatorLayout->addWidget(nameLineEdit, 1, 1); /* QGridLayout *zonesBoxLayout = new QGridLayout; zonesBoxLayout->addWidget(myLocatorLabel,0,0); zonesBoxLayout->addWidget(cqzLabel,0,1); zonesBoxLayout->addWidget(ituzLabel,0,2); zonesBoxLayout->addWidget(myLocatorLineEdit,1,0); zonesBoxLayout->addWidget(cqzLineEdit,1,1); zonesBoxLayout->addWidget(ituzLineEdit,1,2); QVBoxLayout *userdataLayout = new QVBoxLayout(); userdataLayout->addLayout(operatorLayout); userdataLayout->addLayout(zonesBoxLayout); */ QGridLayout *userdataLayout = new QGridLayout; userdataLayout->addWidget(qrzLabel, 0, 0); userdataLayout->addWidget(qrzLineEdit, 1, 0); userdataLayout->addWidget(operatorsLabel, 0, 1); userdataLayout->addWidget(operatorsLineEdit, 1, 1, 1, -1); userdataLayout->addWidget(myLocatorLabel, 3, 0); userdataLayout->addWidget(myLocatorLineEdit, 4, 0); userdataLayout->addWidget(cqzLabel, 3, 1); userdataLayout->addWidget(cqzLineEdit, 4, 1); userdataLayout->addWidget(ituzLabel, 3, 2); userdataLayout->addWidget(ituzLineEdit, 4, 2); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(userdataLayout); mainLayout->addWidget(tabWidget); //mainLayout->addStretch(1); connect(qrzLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotQRZTextChanged() ) ); connect(qrzLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(operatorsLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(nameLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(cqzLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(ituzLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(myLocatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(address1LineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(address2LineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(address3LineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(address4LineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(cityLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(zipLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(provinceLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(countryLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(myLocatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotMyLocatorTextChanged() ) ); connect(operatorsLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotOperatorsChanged() ) ); setLayout(mainLayout); qrzLineEdit->setFocus(); //qDebug() << "SetupPageUserDataPage::SetupPageUserDataPage - END" << endl; } SetupPageUserDataPage::~SetupPageUserDataPage() { //qDebug() << "SetupPageUserDataPage::~SetupPageUserDataPage" << endl; } QString SetupPageUserDataPage::getStationQrz() { operatorOK = world->checkQRZValidFormat(qrzLineEdit->text()); if (operatorOK) { return qrzLineEdit->text(); } else { return QString(); } } void SetupPageUserDataPage::slotEnterKeyPressed() { emit enterKey(); } void SetupPageUserDataPage::slotQRZTextChanged() { //qDebug() << "SetupPageUserDataPage::slotQRZTextChanged: " << qrzLineEdit->text() << " / Length: " << QString::number((qrzLineEdit->text()).size()) << endl; int i = qrzLineEdit->cursorPosition(); QString _a = qrzLineEdit->text(); if ((_a.at(i-1)).isSpace()) { qrzLineEdit->setText(_a.remove(i-1, 1)); } qrzLineEdit->setText(((qrzLineEdit->text())).simplified()); qrzLineEdit->setText((qrzLineEdit->text()).toUpper()); cqzLineEdit->setText(QString::number(world->getQRZCqz(qrzLineEdit->text()))); ituzLineEdit->setText(QString::number(world->getQRZItuz(qrzLineEdit->text()))); myLocatorLineEdit->setText(world->getQRZLocator(qrzLineEdit->text())); qrzLineEdit->setCursorPosition(i); emit stationCallSignal(qrzLineEdit->text()); //emit stationCallSignal("TEST"); /* if (!locator->isValidLocator(myLocatorLineEdit->text()) ) { myLocatorLineEdit->setText(world->getQRZLocator(qrzLineEdit->text())); } */ } int SetupPageUserDataPage::getCQz(){ return (cqzLineEdit->text()).toInt(); } int SetupPageUserDataPage::getITUz(){ return (ituzLineEdit->text()).toInt(); } bool SetupPageUserDataPage::setStationQrz(const QString _qrz){ qrzLineEdit->setText((_qrz).toUpper()); return true; } bool SetupPageUserDataPage::setCQz(const int _cqz){ cqzLineEdit->setText(QString::number(_cqz)); return true; } bool SetupPageUserDataPage::setITUz(const int _ituz){ ituzLineEdit->setText(QString::number(_ituz)); return true; } void SetupPageUserDataPage::slotMyLocatorTextChanged() { //qDebug() << "SetupPageUserDataPage::slotMyLocatorTextChanged: " << myLocatorLineEdit->text() << endl; //int i; myLocatorLineEdit->setText(((myLocatorLineEdit->text())).simplified()); myLocatorLineEdit->setText((myLocatorLineEdit->text()).toUpper()); if ( ((myLocatorLineEdit->text()).length()) >3 ) { if (!(locator->isValidLocator(myLocatorLineEdit->text()) )) { myLocatorLabel->setText(tr("&Locator (not valid)")); } else { myLocatorLabel->setText(tr("&Locator")); } } } QString SetupPageUserDataPage::getStationLocator() { if (!(locator->isValidLocator(myLocatorLineEdit->text()) )) { return ""; } else { return (myLocatorLineEdit->text()).toUpper(); } } bool SetupPageUserDataPage::setStationLocator(const QString _loc) { if (!(locator->isValidLocator(_loc) )) { return false; } else { myLocatorLineEdit->setText((_loc).toUpper()); return true; } } QString SetupPageUserDataPage::getName() { return nameLineEdit->text(); } QStringList SetupPageUserDataPage::getAddress() { QStringList a; a.clear(); a << address1LineEdit->text() << address2LineEdit->text() << address3LineEdit->text() << address4LineEdit->text(); return a; } QString SetupPageUserDataPage::getAddress1() { return address1LineEdit->text(); } QString SetupPageUserDataPage::getAddress2() { return address2LineEdit->text(); } QString SetupPageUserDataPage::getAddress3() { return address3LineEdit->text(); } QString SetupPageUserDataPage::getAddress4() { return address4LineEdit->text(); } QString SetupPageUserDataPage::getRig1() { return rig1LineEdit->text(); } QString SetupPageUserDataPage::getRig2() { return rig2LineEdit->text(); } QString SetupPageUserDataPage::getRig3() { return rig3LineEdit->text(); } QString SetupPageUserDataPage::getAntenna1() { return ant1LineEdit->text(); } QString SetupPageUserDataPage::getAntenna2() { return ant2LineEdit->text(); } QString SetupPageUserDataPage::getAntenna3() { return ant3LineEdit->text(); } QString SetupPageUserDataPage::getCity() { return cityLineEdit->text(); } QString SetupPageUserDataPage::getZipCode() { return zipLineEdit->text(); } QString SetupPageUserDataPage::getProvince() { return provinceLineEdit->text(); } QString SetupPageUserDataPage::getCountry() { return countryLineEdit->text(); } bool SetupPageUserDataPage::setName (const QString _aux) { nameLineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAddress (const QStringList _aux) { address1LineEdit->setText(_aux.at(0)); address2LineEdit->setText(_aux.at(1)); address3LineEdit->setText(_aux.at(2)); address4LineEdit->setText(_aux.at(3)); return true; } bool SetupPageUserDataPage::setAddress1 (const QString _aux) { address1LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAddress2 (const QString _aux) { address2LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAddress3 (const QString _aux) { address3LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAddress4 (const QString _aux) { address4LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setCity (const QString _aux) { cityLineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setZipCode(const QString _aux) { zipLineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setProvince (const QString _aux) { provinceLineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setCountry (const QString _aux) { countryLineEdit->setText(_aux); return true; } QStringList SetupPageUserDataPage::getRigs() { QStringList a; a.clear(); a << rig1LineEdit->text() << rig2LineEdit->text() << rig3LineEdit->text(); return a; } QStringList SetupPageUserDataPage::getAntennas() { QStringList a; a.clear(); a << ant1LineEdit->text() << ant2LineEdit->text() << ant3LineEdit->text(); return a; } QString SetupPageUserDataPage::getPower() { return QString::number(myPowerSpinBox->value()); } bool SetupPageUserDataPage::setPower(const QString _aux) { myPowerSpinBox->setValue(_aux.toFloat()); return true; } bool SetupPageUserDataPage::setRig1 (const QString _aux) { rig1LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setRig2 (const QString _aux) { rig2LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setRig3 (const QString _aux) { rig3LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAntenna1 (const QString _aux) { ant1LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAntenna2 (const QString _aux) { ant2LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAntenna3 (const QString _aux) { ant3LineEdit->setText(_aux); return true; } void SetupPageUserDataPage::slotOperatorsChanged() { //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged" << endl; //QString _operators = operatorsLineEdit->text(); if (operatorsLineEdit->text().length() < 1) return; int i = operatorsLineEdit->cursorPosition(); //QColor defaultColor = (operatorsLineEdit->palette()).color(QPalette::WindowText); //int ent = -1; //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-00" << endl; QString _a = operatorsLineEdit->text(); if ((_a.at(i-1)).isSpace()) { operatorsLineEdit->setText(_a.remove(i-1, 1)); } //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-01" << endl; //operatorsLineEdit->setText(((operatorsLineEdit->text())).simplified()); //operatorsLineEdit->setText((operatorsLineEdit->text()).toUpper()); operatorsLineEdit->setText(_a.simplified().toUpper()); _a = operatorsLineEdit->text(); QStringList operators = _a.split(",", QString::SkipEmptyParts); //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-02" << endl; //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-02.5 Size: " << QString::number(operators.size()) << endl; for (int ii = 0; ii < operators.size(); ++ii) { //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-03 - " << QString::number(ii) << endl; operatorsOK = world->checkQRZValidFormat(operators.at(ii)); //ent = world->getQRZARRLId(operators.at(ii)); if (operatorsOK) { //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged: NO VALID CALL: " << operators.at(ii) << endl; } else { //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged: VALID CALL: " << operators.at(ii) << endl; } } // cout << fonts.at(i).toLocal8Bit().constData() << endl; //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-04" << endl; if (operatorsOK) { //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged: VALID FORMAT" << endl; //QColor defaultColor = (operatorsLineEdit->palette()).color(QPalette::WindowText); operatorsLineEdit->setPalette(*defaultPalette); emit operatorsSignal(operatorsLineEdit->text()); } else { operatorsLineEdit->setPalette(*wrongPalette); //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged: NOT VALID FORMAT" << endl; } //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-05" << endl; /* cqzLineEdit->setText(QString::number(world->getQRZCqz(qrzLineEdit->text()))); ituzLineEdit->setText(QString::number(world->getQRZItuz(qrzLineEdit->text()))); myLocatorLineEdit->setText(world->getQRZLocator(qrzLineEdit->text())); */ //operatorsLineEdit->setText(_a); operatorsLineEdit->setCursorPosition(i); //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-END" << endl; } QString SetupPageUserDataPage::getOperators() { if (operatorsOK) { return operatorsLineEdit->text(); } else { return QString(); } } bool SetupPageUserDataPage::setOperators(const QString _aux) { if (checkOperatorsLineQString(_aux)) { operatorsLineEdit->setText(_aux); return true; } return false; } bool SetupPageUserDataPage::checkOperatorsLineQString(const QString _auxLine) { QStringList _aux = _auxLine.split(','); for (int ii = 0; ii < _aux.size(); ++ii) { operatorsOK = world->checkQRZValidFormat(_aux.at(ii)); if (!operatorsOK) return operatorsOK; } return true; } klog-0.9.8.1/awarddxmarathon.h0000644000175000017500000000440513532572307015152 0ustar develdevel#ifndef AWARDDXMARATHON_H #define AWARDDXMARATHON_H /*************************************************************************** awarddxmarathon.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "dataproxy.h" class DXMarathon { public: DXMarathon(DataProxy *dp); int getDXMarathonQSO(const int _year, const int _logNumber); int getDXMarathonDXCC(const int _year, const int _logNumber); int getDXMarathonCQ(const int _year, const int _logNumber); int getDXMarathonScore(const int _year, const int _logNumber); bool neededForDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber); private: DataProxy *dataProxy; }; #endif // AWARDDXMARATHON_H klog-0.9.8.1/infowidget.cpp0000644000175000017500000004625213532572307014466 0ustar develdevel#include "infowidget.h" InfoWidget::InfoWidget(DataProxy *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "InfoWidget::InfoWidget: " << endl; dataProxy = dp; awards = new Awards(dataProxy, Q_FUNC_INFO); //Just to know colors locator = new Locator(); world = new World(dataProxy, Q_FUNC_INFO); bandLabel1 = new QLabel; bandLabel2 = new QLabel; bandLabel3 = new QLabel; bandLabel4 = new QLabel; bandLabel5 = new QLabel; bandLabel6 = new QLabel; bandLabel7 = new QLabel; bandLabel8 = new QLabel; bandLabel9 = new QLabel; bandLabel10 = new QLabel; bandLabel11 = new QLabel; bandLabel12 = new QLabel; continentLabel = new QLabel; prefixLabel = new QLabel; cqzLabel = new QLabel; ituzLabel = new QLabel; gradShortLabel = new QLabel; distShortLabel = new QLabel; gradLongLabel = new QLabel; distLongLabel = new QLabel; distShortLabelN = new QLabel; distLongLabelN = new QLabel; imperialSystem=false; dxLocator.clear(); createUI(); clearBandLabels(); //qDebug() << "InfoWidget::InfoWidget: - END" << endl; } void InfoWidget::createUI() { bandLabel1->setText(tr("10M")); bandLabel2->setText(tr("15M")); bandLabel3->setText(tr("20M")); bandLabel4->setText(tr("40M")); bandLabel5->setText(tr("80M")); bandLabel6->setText(tr("160M")); bandLabel7->setText(tr("2M")); bandLabel8->setText(tr("6M")); bandLabel9->setText(tr("12M")); bandLabel10->setText(tr("17M")); bandLabel11->setText(tr("30M")); bandLabel12->setText(tr("70CM")); bandLabel1->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel2->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel3->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel4->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel5->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel6->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel7->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel8->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel9->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel10->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel11->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel12->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *continentLabelN = new QLabel(tr("Continent")); continentLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); continentLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *prefixLabelN = new QLabel(tr("Prefix")); prefixLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); prefixLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *cqzLabelN = new QLabel(tr("CQ")); cqzLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); cqzLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *ituzLabelN = new QLabel(tr("ITU")); ituzLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); ituzLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *shortLabelN = new QLabel(tr("Short Path")); shortLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *longLabelN = new QLabel(tr("Long Path")); longLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *gradShortLabelN = new QLabel(tr("Deg")); gradShortLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); gradShortLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); distShortLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *gradLongLabelN = new QLabel(tr("Deg")); gradLongLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); gradLongLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); distShortLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); distLongLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); distLongLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); clear(); //continentLabel->setText("--"); //prefixLabel->setText("--"); //cqzLabel->setText("0"); //ituzLabel->setText("0"); //gradShortLabel->setText("0"); //gradLongLabel->setText("0"); //distLongLabel->setText("0"); //distShortLabel->setText("0"); QGridLayout *infoLayout1 = new QGridLayout; infoLayout1->addWidget(continentLabelN, 0, 0); infoLayout1->addWidget(continentLabel, 1, 0); infoLayout1->addWidget(prefixLabelN, 0, 1); infoLayout1->addWidget(prefixLabel, 1, 1); infoLayout1->addWidget(cqzLabelN, 0, 2); infoLayout1->addWidget(cqzLabel, 1, 2); infoLayout1->addWidget(ituzLabelN, 0, 3); infoLayout1->addWidget(ituzLabel, 1, 3); QGridLayout *shortPathLayout = new QGridLayout; shortPathLayout->addWidget(shortLabelN, 0, 0, 1, 0); shortPathLayout->addWidget(gradShortLabelN, 1, 0); shortPathLayout->addWidget(gradShortLabel, 1, 1); shortPathLayout->addWidget(distShortLabelN, 1, 2); shortPathLayout->addWidget(distShortLabel, 1, 3); QGridLayout *longPathLayout = new QGridLayout; longPathLayout->addWidget(longLabelN, 0, 0, 1, 0); longPathLayout->addWidget(gradLongLabelN, 1, 0); longPathLayout->addWidget(gradLongLabel, 1, 1); longPathLayout->addWidget(distLongLabelN, 1, 2); longPathLayout->addWidget(distLongLabel, 1, 3); QHBoxLayout *pathsLayout = new QHBoxLayout; pathsLayout->addLayout(shortPathLayout); pathsLayout->addLayout(longPathLayout); QGridLayout *bandsLayout = new QGridLayout; bandsLayout->addWidget(bandLabel1, 0, 0); bandsLayout->addWidget(bandLabel2, 0, 1); bandsLayout->addWidget(bandLabel3, 0, 2); bandsLayout->addWidget(bandLabel4, 0, 3); bandsLayout->addWidget(bandLabel5, 0, 4); bandsLayout->addWidget(bandLabel6, 0, 5); bandsLayout->addWidget(bandLabel7, 1, 0); bandsLayout->addWidget(bandLabel8, 1, 1); bandsLayout->addWidget(bandLabel9, 1, 2); bandsLayout->addWidget(bandLabel10, 1, 3); bandsLayout->addWidget(bandLabel11, 1, 4); bandsLayout->addWidget(bandLabel12, 1, 5); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(bandsLayout); mainLayout->addLayout(infoLayout1); mainLayout->addLayout(pathsLayout); #ifdef Q_OS_WIN continentLabel->setFrameShadow(QFrame::Raised); continentLabel->setFrameStyle(QFrame::StyledPanel); continentLabelN->setFrameShadow(QFrame::Raised); continentLabelN->setFrameStyle(QFrame::StyledPanel); prefixLabelN->setFrameShadow(QFrame::Raised); prefixLabelN->setFrameStyle(QFrame::StyledPanel); prefixLabel->setFrameShadow(QFrame::Raised); prefixLabel->setFrameStyle(QFrame::StyledPanel); cqzLabelN->setFrameShadow(QFrame::Raised); cqzLabelN->setFrameStyle(QFrame::StyledPanel); cqzLabel->setFrameShadow(QFrame::Raised); cqzLabel->setFrameStyle(QFrame::StyledPanel); ituzLabel->setFrameShadow(QFrame::Raised); ituzLabel->setFrameStyle(QFrame::StyledPanel); ituzLabelN->setFrameShadow(QFrame::Raised); ituzLabelN->setFrameStyle(QFrame::StyledPanel); shortLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); shortLabelN->setFrameShadow(QFrame::Raised); shortLabelN->setFrameStyle(QFrame::StyledPanel); longLabelN->setFrameShadow(QFrame::Raised); longLabelN->setFrameStyle(QFrame::StyledPanel); gradShortLabelN->setFrameShadow(QFrame::Raised); gradShortLabelN->setFrameStyle(QFrame::StyledPanel); gradShortLabel->setFrameShadow(QFrame::Raised); gradShortLabel->setFrameStyle(QFrame::StyledPanel); distShortLabelN->setFrameShadow(QFrame::Raised); distShortLabelN->setFrameStyle(QFrame::StyledPanel); distShortLabel->setFrameShadow(QFrame::Raised); distShortLabel->setFrameStyle(QFrame::StyledPanel); gradLongLabelN->setFrameShadow(QFrame::Raised); gradLongLabelN->setFrameStyle(QFrame::StyledPanel); gradLongLabel->setFrameShadow(QFrame::Raised); gradLongLabel->setFrameStyle(QFrame::StyledPanel); distLongLabelN->setFrameShadow(QFrame::Raised); distLongLabelN->setFrameStyle(QFrame::StyledPanel); distLongLabel->setFrameShadow(QFrame::Raised); distLongLabel->setFrameStyle(QFrame::StyledPanel); bandLabel1->setFrameShadow(QFrame::Raised); bandLabel1->setFrameStyle(QFrame::StyledPanel); bandLabel2->setFrameShadow(QFrame::Raised); bandLabel2->setFrameStyle(QFrame::StyledPanel); bandLabel3->setFrameShadow(QFrame::Raised); bandLabel3->setFrameStyle(QFrame::StyledPanel); bandLabel4->setFrameShadow(QFrame::Raised); bandLabel4->setFrameStyle(QFrame::StyledPanel); bandLabel5->setFrameShadow(QFrame::Raised); bandLabel5->setFrameStyle(QFrame::StyledPanel); bandLabel6->setFrameShadow(QFrame::Raised); bandLabel6->setFrameStyle(QFrame::StyledPanel); bandLabel7->setFrameShadow(QFrame::Raised); bandLabel7->setFrameStyle(QFrame::StyledPanel); bandLabel8->setFrameShadow(QFrame::Raised); bandLabel8->setFrameStyle(QFrame::StyledPanel); bandLabel9->setFrameShadow(QFrame::Raised); bandLabel9->setFrameStyle(QFrame::StyledPanel); bandLabel10->setFrameShadow(QFrame::Raised); bandLabel10->setFrameStyle(QFrame::StyledPanel); bandLabel11->setFrameShadow(QFrame::Raised); bandLabel11->setFrameStyle(QFrame::StyledPanel); bandLabel12->setFrameShadow(QFrame::Raised); bandLabel12->setFrameStyle(QFrame::StyledPanel); #else continentLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); continentLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); prefixLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); prefixLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); cqzLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); cqzLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); ituzLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); ituzLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); shortLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); longLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); gradShortLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); gradShortLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); distShortLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); distShortLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); gradLongLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); distLongLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); distLongLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); gradLongLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel1->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel2->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel3->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel4->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel5->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel6->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel7->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel8->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel9->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel10->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel11->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel12->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); #endif setLayout(mainLayout); } void InfoWidget::clearBandLabels() { QString defaultColorName = (awards->getDefaultColor()).name(); bandLabel1->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel2->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel3->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel4->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel5->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel6->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel7->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel8->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel9->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel10->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel11->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel12->setStyleSheet("* { background-color: " + defaultColorName + "; }"); } void InfoWidget::clearInfoFromLocators() { //qDebug() << "InfoWidget::clearInfoFromLocators" << endl; gradShortLabel->setText( "0" ); gradLongLabel->setText( "0" ); distShortLabel->setText( "0" ); distLongLabel->setText( "0" ); cqzLabel->setText("0"); ituzLabel->setText("0"); } void InfoWidget::clear() { continentLabel->setText("--"); prefixLabel->setText("--"); clearBandLabels(); clearInfoFromLocators(); } void InfoWidget::setColors (const QString _newOne, const QString _needed, const QString _worked, const QString _confirmed, const QString _default) { awards->setColors (_newOne, _needed, _worked, _confirmed, _default); } void InfoWidget::setCurrentLog(const int _log) { currentLog = _log; } void InfoWidget::setImperialSystem (const bool _imp) { imperialSystem = _imp; if (imperialSystem) { distShortLabelN->setText(tr("Miles")); distLongLabelN->setText(tr("Miles")); //distShortLabel->setText( QString::number( Km2Mile(imperialSystem, (distShortLabel->text()).toInt() )) ); //distLongLabel->setText( QString::number(Km2Mile(imperialSystem, (distLongLabel->text()).toInt()) ) ); } else { distShortLabelN->setText(tr("Km")); distLongLabelN->setText(tr("Km")); } } QString InfoWidget::getStyleColorToLabelFromBand(const QString _b, const QString _q) { // Receives band name, Entity number (as a String) //qDebug() << "InfoWidget::getStyleColorToLabelFromBand: " << _b << "/" << _q << endl; QStringList _qs; _qs.clear(); _qs << _q << QString::number(dataProxy->getIdFromBandName(_b)) << QString::number(-1) << QString::number(currentLog); //TODO: Check if we can know the mode and replace the -1 //qDebug() << "InfoWidget::getStyleColorToLabelFromBand (Band/background-color): " << _b << (awards->getQRZDXStatusColor(_qs)).name() << endl; return "* { background-color: " + (awards->getQRZDXStatusColor(_qs)).name() + "; }"; } //void InfoWidget::showInfo(const int _entity, const int _bandid, const int _modeid, const int _log) void InfoWidget::showInfo(const int _entity) { // Default values of _modeid & _log = -1 //qDebug() << "InfoWidget::showInfo: " << QString::number(_entity) << endl; //QColor getQRZDXStatusColor(const QStringList _qs); // Receives Entity, band, mode & log bandLabel1->setStyleSheet(getStyleColorToLabelFromBand(bandLabel1->text(), QString::number(_entity))); bandLabel2->setStyleSheet(getStyleColorToLabelFromBand(bandLabel2->text(), QString::number(_entity))); bandLabel3->setStyleSheet(getStyleColorToLabelFromBand(bandLabel3->text(), QString::number(_entity))); bandLabel4->setStyleSheet(getStyleColorToLabelFromBand(bandLabel4->text(), QString::number(_entity))); bandLabel5->setStyleSheet(getStyleColorToLabelFromBand(bandLabel5->text(), QString::number(_entity))); bandLabel6->setStyleSheet(getStyleColorToLabelFromBand(bandLabel6->text(), QString::number(_entity))); bandLabel7->setStyleSheet(getStyleColorToLabelFromBand(bandLabel7->text(), QString::number(_entity))); bandLabel8->setStyleSheet(getStyleColorToLabelFromBand(bandLabel8->text(), QString::number(_entity))); bandLabel9->setStyleSheet(getStyleColorToLabelFromBand(bandLabel9->text(), QString::number(_entity))); bandLabel10->setStyleSheet(getStyleColorToLabelFromBand(bandLabel10->text(), QString::number(_entity))); bandLabel11->setStyleSheet(getStyleColorToLabelFromBand(bandLabel11->text(), QString::number(_entity))); bandLabel12->setStyleSheet(getStyleColorToLabelFromBand(bandLabel12->text(), QString::number(_entity))); } void InfoWidget::showEntityInfo(const int _enti, int _cq, int _itu) { //qDebug() << "InfoWidget::showEntityInfo" << QString::number(_enti) << endl; if (_enti<=0) { return; } /* TO paint a flag of the Worked entity QString flagSt; flagSt.clear(); QString aux; aux = dataProxy->getISOName(_enti); if (aux.length()>1) { flagSt = ":/" + aux + ".png"; } else { flagSt.clear(); } flagSt = ":/flags/" + dataProxy->getISOName(_enti) + ".png"; flagIcon->setIcon(QIcon(flagSt)); */ //infoLabel2->setText(world->getEntityName(_enti)); continentLabel->setText( world->getContinentShortName(_enti) ); prefixLabel->setText( world->getEntityMainPrefix(_enti)); //if ( locator->isValidLocator((locatorLineEdit->text()).toUpper()) ) //{ // dxLocator = (locatorLineEdit->text()).toUpper(); //} //else //{ // dxLocator = world->getLocator(_enti); //} //showDistanceAndBearing (myLocator, dxLocator); int i = -1; if ((_cq>0) && (_cq<41)) { cqzLabel->setText( QString::number(_cq) ); } else { i = world->getEntityCqz(_enti); if( i > 0 ) { cqzLabel->setText( QString::number(i) ); } else { cqzLabel->setText("0"); } } if (_itu>0) { ituzLabel->setText( QString::number(_itu) ); } else { i = world->getEntityItuz(_enti); if ( i > 0 ) { ituzLabel->setText( QString::number(i) ); } else { ituzLabel->setText("0"); } } } void InfoWidget::showDistanceAndBearing(const QString _locLocal, const QString _locDX) {// Local / DX //qDebug() << "InfoWidget::showDistanceAndBearing: " << _locLocal << "/" << _locDX << endl; QString lloc = _locLocal.toUpper(); QString ldx = _locDX.toUpper(); if ( locator->isValidLocator(lloc) ) { if ( locator->isValidLocator(ldx) ) { dxLocator = ldx; int beam = locator->getBeamBetweenLocators(lloc, dxLocator); gradShortLabel->setText( QString::number(beam) ); if (beam >= 180) { gradLongLabel->setText( QString::number(beam -180 ) ); } else { gradLongLabel->setText( QString::number(beam + 180 ) ); } distShortLabel->setText( QString::number( locator->getDistanceBetweenLocators(lloc, dxLocator, imperialSystem) ) ); distLongLabel->setText( QString::number( 40000 - locator->getDistanceBetweenLocators(lloc, dxLocator, imperialSystem) ) ); } else { clearInfoFromLocators(); return; } } else { clearInfoFromLocators(); return ; } } void InfoWidget::setLocalLocator(const QString _loc) { if (locator->isValidLocator(_loc)) { localLocator = _loc; } } void InfoWidget::setDXLocator(const QString _loc) { if (locator->isValidLocator(_loc)) { dxLocator = _loc; } } klog-0.9.8.1/INSTALL.txt0000644000175000017500000000031213532572307013455 0ustar develdevelThis file is about the installation process of KLog. Please read: INSTALL-linux.txt for linux installations. INSTALL-macOS.txt for macOS installations. INSTALL-win.txt for Windows installations. klog-0.9.8.1/softwareupdate.cpp0000644000175000017500000002244113532572307015356 0ustar develdevel#include "softwareupdate.h" //#include SoftwareUpdate::SoftwareUpdate(const QString _klogVersion) : QObject(0) { //qDebug() << "SoftwareUpdate::SoftwareUpdate(): " << _klogVersion << endl; util = new Utilities; updateDialog = new SoftwareUpdateDialog(); latestVersion = "0.0"; //updateDialog->setVersion(_klogVersion, fale); //toUpdate = false; repositoryFound = false; url = new QUrl; //klogDir = _klogDir; setVersion(_klogVersion); //klogVersion = _klogVersion; //latestVersion = "0.0"; callsign = QString(); //result = -1; // Error unknown //reply = new QNetworkReply; //manager = new QNetworkAccessManager(this); //request = new QNetworkRequest(this); //request.setUrl(QUrl("http://localhost")); //request.setUrl(QUrl("https://download.savannah.gnu.org/releases/klog/")); //request.setUrl(QUrl("http://www.klog.xyz/download")); setTheURL("http://download.klog.xyz"); //request.setUrl(QUrl("http://download.klog.xyz")); messageShown = false; setHeader(); //qDebug() << "SoftwareUpdate::SoftwareUpdate(): - END" << endl; } SoftwareUpdate::~SoftwareUpdate() { } void SoftwareUpdate::setTheURL(QString _url) { //qDebug() << "SoftwareUpdate::setTheURL: " << _url << endl; // request.setUrl(QUrl(_url)); } void SoftwareUpdate::setVersion(const QString _klogVersion) { //qDebug() << "SoftwareUpdate::setVersion: " << _klogVersion << endl; klogVersion = _klogVersion; latestVersion = klogVersion; setHeader(); //qDebug() << "SoftwareUpdate::setVersion: END " << endl; } void SoftwareUpdate::slotReadyRead() { //qDebug() << "SoftwareUpdate::slotReadyRead: " << endl; } void SoftwareUpdate::slotError(int _p) { //qDebug() << "SoftwareUpdate::slotError: " << endl; } void SoftwareUpdate::slotDownloadFinished(QNetworkReply *reply) { //qDebug() << "SoftwareUpdate::slotDownloadFinished" << endl; QUrl url = reply->url(); //qDebug() << "SoftwareUpdate::slotDownloadFinished - URL: " << url.toString() << endl; //QMessageBox msgBox; //QString aux; //aux.clear(); QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (reply->error()) { //qDebug() << "SoftwareUpdate::slotDownloadFinished: reply error" << endl; } else if (!redirectionTarget.isNull()) { repositoryFound = false; QUrl newUrl = url.resolved(redirectionTarget.toUrl()); //qDebug() << "SoftwareUpdate::slotDownloadFinished: Redirect: " << newUrl.toString() << endl; url = newUrl; reply->deleteLater(); //request.setUrl(QUrl(url.toString())); //setTheURL(url.toString()); connectToURL(url.toString()); return; } else { //qDebug() << "SoftwareUpdate::slotDownloadFinished: no redirection" << endl; if (checkUpdates(reply)) { //qDebug() << "SoftwareUpdate::slotDownloadFinished checkupdates true" << endl; if (repositoryFound) { //qDebug() << "SoftwareUpdate::slotDownloadFinished repository found" << endl; if(latestVersion>klogVersion) { //qDebug() << "SoftwareUpdate::slotDownloadFinished checkupdates should update!" << endl; updateDialog->setVersion(latestVersion, true); } updateDialog->show(); latestVersion = klogVersion; repositoryFound = false; } } else { if (repositoryFound && messageShown) { //qDebug() << "SoftwareUpdate::slotDownloadFinished checkupdates false!" << endl; updateDialog->setVersion(latestVersion, false); updateDialog->show(); } //qDebug() << "SoftwareUpdate::slotDownloadFinished: checkupdates false" << endl; } } reply->deleteLater(); //manager->deleteLater(); //qDebug() << "SoftwareUpdate::slotDownloadFinished end" << endl; } bool SoftwareUpdate::checkUpdates(QIODevice *data) { // Checks if there is a new version in the repository //qDebug() << "SoftwareUpdate::checkUpdates: " << QString::number(data->size()) << endl; QString line, release; QStringList stringList, klogStringList; /* #ifdef Q_OS_WIN //qDebug() << "MainWindow::createUIDX - WINDOWS DETECTED!" << endl; QRegularExpression rx("href=\"klog-(\\d\\.)+tar.gz"); #elif Q_OS_MACOS QRegularExpression rx("href=\"klog-(\\d\\.)+tar.gz"); #elif Q_OS_UNIX QRegularExpression rx("href=\"klog-(\\d\\.)+tar.gz"); #else QRegularExpression rx("href=\"klog-(\\d\\.)+tar.gz"); #endif */ QRegularExpression rx("href=\"klog-(\\d\\.)+tar.gz"); //qDebug() << "SoftwareUpdate::checkUpdates: Before entering the while"<< endl; while (!data->atEnd()) { //qDebug() << "SoftwareUpdate::checkUpdates: In the while"<< endl; stringList.clear(); klogStringList.clear(); line.clear(); line = data->readLine(); //qDebug() << "SoftwareUpdate::checkUpdates: line: " << line << endl; if (line.contains("klog-")) { repositoryFound = true; stringList << line.split(">", QString::SkipEmptyParts); klogStringList << stringList.filter("klog"); foreach (const QString &str, klogStringList) { //qDebug() << "SoftwareUpdate::checkUpdates klog: " << str << endl; if (rx.match(str).hasMatch()) { //qDebug() << "SoftwareUpdate::checkUpdates: MATCH: " << str << endl; release = str.section("-",1); release = release.section(".tar.gz", 0, 0); //release = release.section("^.*([.]tar[.]gz)", 0, 0); //release = release.section("^.*\\.(tar.gz)?", 0, 0); updateNeeded(release); } else { //qDebug() << "SoftwareUpdate::checkUpdates: DOES NOT MATCH: " << str << endl; } } //qDebug() << "SoftwareUpdate::checkUpdates: " << line << endl; } } //qDebug() << "SoftwareUpdate::checkUpdates:Latest/Actual: " << latestVersion << "/" << klogVersion << endl; if (latestVersion > klogVersion) { emit updateNeededSignal (true); //qDebug() << "SoftwareUpdate::checkUpdates: signal true" << endl; return true; } else { //emit updateNeededSignal (false); //qDebug() << "SoftwareUpdate::checkUpdates: signal false 1" << endl; return false; } //emit updateNeededSignal (false); //qDebug() << "SoftwareUpdate::checkUpdates: signal false 2" << endl; return false; } void SoftwareUpdate::updateNeeded(QString _newVer) { //qDebug() << "SoftwareUpdate::updateNeeded: new: " << _newVer << endl; //qDebug() << "SoftwareUpdate::updateNeeded: cur: " << latestVersion << endl; if (latestVersion< _newVer) { latestVersion = _newVer; } /* if (klogVersion < _newVer) { //qDebug() << "SoftwareUpdate::updateNeeded TRUE: " << _newVer << endl; if } else { //qDebug() << "SoftwareUpdate::updateNeeded - FALSE " << _newVer << endl; } */ //qDebug() << "SoftwareUpdate::updateNeeded - KLogVersion/latestVersion/newver: "<< klogVersion <<"/"<< latestVersion << "/"<<_newVer << endl; } void SoftwareUpdate::needToUpdate(bool _showWithoutVersion) { // This is used to connect to the main server URL. // If _showWithoutVersion is false: We are checking for new versions at KLog start: No message should be shown if no new version is found. // If _showWithoutVersion is true: The user is manually asking to check. A message should is shown if no new version is found. //qDebug() << "SoftwareUpdate::needToUpdate (current version: " << klogVersion << ")" << endl; messageShown = _showWithoutVersion; setVersion(klogVersion); //setTheURL("http://download.klog.xyz"); connectToURL("http://download.klog.xyz"); } void SoftwareUpdate::connectToURL(const QString _url) { // This is where the connection takes place.... so first connection may be the main URL but it launches connection after redirections QNetworkAccessManager *manager = new QNetworkAccessManager(this); //connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); //request.setUrl(QUrl(_url)); manager->get(QNetworkRequest(QUrl(_url))); QNetworkReply *reply = manager->get(request); connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(slotDownloadFinished(QNetworkReply*))); } void SoftwareUpdate::setHeader() { QString ver = util->getAgent(klogVersion); if (callsign.length()>2) { ver = ver + "-" + callsign; } QByteArray str; str.clear(); str.append(ver); //qDebug() << "SoftwareUpdate::setHeader: " << str << endl; request.setRawHeader("User-Agent", str); } void SoftwareUpdate::addCall(const QString _call) { if (_call.length()>2) { callsign = _call; setHeader(); } } klog-0.9.8.1/mainwindow.cpp0000644000175000017500000110054713532600230014465 0ustar develdevel/*************************************************************************** mainwindow.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "database.h" #include "mainwindow.h" //#include MainWindow::MainWindow(const QString _klogDir, const QString tversion) { //qDebug() << "MainWindow::MainWindow: "<< _klogDir << " Ver: " << tversion << endl; //qDebug() << "MainWindow::MainWindow: Con func: "<< Q_FUNC_INFO << endl; QTime start; start = QTime::currentTime(); //qDebug() << "MainWindow::MainWindow: "<< (QTime::currentTime()).toString("hhmmsszzz")<< endl; showErrorDialog = new ShowErrorDialog(); UDPLogServer = new UDPServer(); //qDebug() << "MainWindow::MainWindow: BEFORE HAMLIB " << endl; hamlib = new HamLibClass(); //qDebug() << "MainWindow::MainWindow: AFTER HAMLIB " << endl; hamlibActive = false; upAndRunning = false; // To define some actions that can only be run when starting the software softwareVersion = tversion; itIsANewversion = false; dataProxy = new DataProxy_SQLite(softwareVersion, Q_FUNC_INFO); doc = new QTextDocument; util = new Utilities; //qDebug() << "MainWindow::MainWindow: Before DXCCStatusWidget " << endl; dxccStatusWidget = new DXCCStatusWidget(dataProxy, Q_FUNC_INFO); //qDebug() << "MainWindow::MainWindow: After DXCCStatusWidget " << endl; needToEnd = false; cleaning = false; qrzAutoChanging = false; dxclusterServerToConnect = "dxfun.com"; dxclusterServerPort = 8000; contestMode = "DX"; infoTimeout = 2000; // default timeout defaultADIFLogFile = "klog.adi"; klogDir = _klogDir; InValidCharsInPrevCall = false; //stationCallSignShownInSearch = true; checkNewVersions = true; reportInfo = false; configured = false; modify = false; noMoreErrorShown = false; noMoreModeErrorShown = false; qslingNeeded = false; // When clicking on Find QSO to QSL manageMode = false; txFreqBeingChanged = false; txFreqBeingAutoChanged = false; rxFreqBeingChanged = false; updatingBands = false; selectedYear = 0; defaultMode = 1; defaultBand = 1; //qDebug() << "MainWindow::MainWindow: 1 - currentMode: " << QString::number(currentMode) << endl; currentMode = 1; //qDebug() << "MainWindow::MainWindow: 2 - currentMode: " << QString::number(currentMode) << endl; currentModeShown = currentMode; currentBand = 1; currentBandShown = currentBand; currentLog = 1; points = 0; multipliers = 0; qsoPoints = 0; qsoMultiplier = 0; operatorQRZ = ""; stationQRZ = ""; mainQRZ = ""; myLocator = ""; dxLocator =""; myPower = 0.0; UDPServerStart = false; // By default the UDP server is started //qDebug() << "MainWindow::MainWindow: 0007" << endl; currentEntity = -1; // To optimize the calls to different world methods if the entity does not change. Used in slotQRZTextChanged previousEntity = -1;// To optimize the calls to different world methods if the entity does not change. realTime=true; UTCTime=true; keepMyData=true; completeWithPrevious=false; completedWithPreviousQTH=false; completedWithPreviousLocator=false; completedWithPreviousName=false; completedWithPreviousIOTA=false; completedWithPreviousQSLVia=false; alwaysADIF=false; useDefaultLogFileName=false; needToSave=false; qrzSmallModDontCalculate=false; imperialSystem=false; sendQSLWhenRec = true; manageDxMarathon = false; dxClusterShowHF=true; dxClusterShowVHF=true; dxClusterShowWARC=true; dxClusterShowWorked=true; dxClusterShowConfirmed=true; dxClusterShowAnn=true; dxClusterShowWWV=true; dxClusterShowWCY=true; keepSatPage = false; //qDebug() << "MainWindow::MainWindow: 0008" << endl; clublogActive = false; clublogRealTime = false; clublogUser = QString(); clublogPass = QString(); clublogEmail = QString(); infoLabel1T = QString(); infoLabel2T = QString(); //qDebug() << "MainWindow::MainWindow: 00081" << endl; elogClublog = new eLogClubLog(); //qDebug() << "MainWindow::MainWindow: 00082" << endl; clublogAnswer = -1; defaultColor.setNamedColor("slategrey"); neededColor.setNamedColor("yellow"); workedColor.setNamedColor("blue"); confirmedColor.setNamedColor("red"); newOneColor.setNamedColor("green"); //qDebug() << "MainWindow::MainWindow: 00083" << endl; updateSatsData = new UpdateSatsData(dataProxy); //qDebug() << "MainWindow::MainWindow: 00084" << endl; statsWidget = new StatisticsWidget(dataProxy); //qDebug() << "MainWindow::MainWindow: 00085" << endl; //statsWidget->show(); //Default band/modes bands << "10M" << "15M" << "20M" << "40M" << "80M" << "160M"; modes << "SSB" << "CW" << "RTTY"; //qDebug() << "MainWindow::MainWindow: 00086" << endl; logWindow = new LogWindow(dataProxy, this); //qDebug() << "MainWindow::MainWindow: 00087" << endl; connect(logWindow, SIGNAL(queryError(QString, QString, int, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, int, QString)) ); //connect(logWindow, SIGNAL(clearError()), this, SLOT(slotClearNoMorErrorShown()) ); //qDebug() << "MainWindow::MainWindow: 00088" << endl; searchWidget = new SearchWidget (dataProxy, this); connect(searchWidget, SIGNAL(queryError(QString, QString, int, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, int, QString)) ); //connect(searchWidget, SIGNAL(clearError()), this, SLOT(slotClearNoMorErrorShown()) ); infoWidget = new InfoWidget(dataProxy, this); //qDebug() << "MainWindow::MainWindow: 0009" << endl; aboutDialog = new AboutDialog(softwareVersion); //qDebug() << "MainWindow::MainWindow: 0010" << endl; recalculateAwardsButton = new QPushButton(tr("Recalculate"), this); recalculateAwardsButton->setToolTip(tr("Click to recalculate the award status.")); scoreTextEdit = new QTextEdit; configFileName = util->getCfgFile(); ctyDatFile = util->getCTYFile(); downloadcty = new DownLoadCTY(klogDir, softwareVersion); connect( downloadcty, SIGNAL(done()), this, SLOT(slotWorldReload()) ); //qDebug() << "MainWindow::MainWindow: logbook: " << QString(util->getKLogDBFile()) << endl; //qDebug() << "MainWindow::MainWindow: Before existing Data" << endl; bool existingData = QFile::exists(util->getKLogDBFile()); //qDebug() << "MainWindow::MainWindow: After existing Data" << endl; if (existingData) { //qDebug() << "MainWindow::MainWindow: existing data" << endl; //configured= false; } else { //qDebug() << "MainWindow::MainWindow: NOT existing data" << endl; } statusBarMessage = tr("Starting KLog"); if (!QDir::setCurrent ( klogDir )){ QDir d1(klogDir); if (d1.mkdir(klogDir)) { QDir::setCurrent ( klogDir ); } } //qDebug() << "MainWindow::MainWindow: 3" << endl; DBinMemory = false; //db = new DataBase(softwareVersion, DBinMemory); //qDebug() << "MainWindow::MainWindow: 4" << endl; world = new World(dataProxy, klogDir, softwareVersion, Q_FUNC_INFO); connect(world, SIGNAL(queryError(QString, QString, int, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, int, QString)) ); //connect(world, SIGNAL(clearError()), this, SLOT(slotClearNoMorErrorShown()) ); if (!existingData) { //qDebug() << "MainWindow::MainWindow: !existingData" << endl; world->create(ctyDatFile); }else { //qDebug() << "MainWindow::MainWindow: existingData" << endl; } //qDebug() << "MainWindow::MainWindow: xx" << endl; connect(dataProxy, SIGNAL(queryError(QString, QString, int, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, int, QString)) ); //connect(dataProxy, SIGNAL(clearError()), this, SLOT(slotClearNoMorErrorShown()) ); connect(this, SIGNAL(queryError(QString, QString, int, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, int, QString)) ); //connect(this, SIGNAL(clearError()), this, SLOT(slotClearNoMorErrorShown()) ); //qDebug() << "MainWindow::MainWindow: setupDialog to be created" << endl; //setupDialog = new SetupDialog(!configured); setupDialog = new SetupDialog(dataProxy, configFileName, softwareVersion, 0, !configured); connect(setupDialog, SIGNAL(queryError(QString, QString, int, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, int, QString)) ); //connect(setupDialog, SIGNAL(clearError()), this, SLOT(slotClearNoMorErrorShown()) ); //qDebug() << "MainWindow::MainWindow: satTabWidget to be created" << endl; satTabWidget = new MainWindowSatTab(dataProxy); connect(satTabWidget, SIGNAL(newBandsToBeAdded(QStringList)), this, SLOT(slotDefineNewBands(QStringList)) ); connect(satTabWidget, SIGNAL(satRxFreqChanged(double)), this, SLOT(slotSatChangeRXFreq(double)) ); connect(satTabWidget, SIGNAL(satTxFreqChanged(double)), this, SLOT(slotSatChangeTXFreq(double)) ); connect(satTabWidget, SIGNAL(dxLocatorChanged(QString)), this, SLOT(slotUpdateLocator(QString)) ); connect(satTabWidget, SIGNAL(setPropModeSat(QString)), this, SLOT(slotSetPropMode(QString)) ) ; connect(satTabWidget, SIGNAL(satTXFreqNeeded(double)), this, SLOT(slotSatTXFreqNeeded(double))); connect(satTabWidget, SIGNAL(satRXFreqNeeded(double)), this, SLOT(slotSatRXFreqNeeded(double))); connect(hamlib, SIGNAL(freqChanged(double)), this, SLOT(slotHamlibTXFreqChanged(double)) ); connect(hamlib, SIGNAL(modeChanged(QString)), this, SLOT(slotHamlibModeChanged(QString)) ); myDataTabWidget = new MainWindowMyDataTab(); commentTabWidget = new MainWindowInputComment(); othersTabWidget = new MainWindowInputOthers(dataProxy); eQSLTabWidget = new MainWindowInputEQSL(dataProxy); QSLTabWidget = new MainWindowInputQSL(dataProxy); //qDebug() << "MainWindow::MainWindow: fileManager to be created" << endl; //filemanager = new FileManager(klogDir, softwareVersion, *db); //qDebug() << "MainWindow::MainWindow: locator to be created" << endl; locator = new Locator(); //qDebug() << "MainWindow::MainWindow: awards to be created" << endl; //qDebug() << "MainWindow::MainWindow: awards already created" << endl; mainWidget = new QWidget(this); setCentralWidget(mainWidget); //qDebug() << "MainWindow::MainWindow: 8" << endl; dateTime = new QDateTime(); selectedYear = (dateTime->currentDateTime()).date().year(); timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(slotUpdateTime()) ); timer->start(1000); timerInfoBars = new QTimer(this); connect(timerInfoBars, SIGNAL(timeout()), this, SLOT(slotTimeOutInfoBars()) ); previousQrz = ""; qrzLineEdit = new QLineEdit; nameLineEdit = new QLineEdit; qthLineEdit = new QLineEdit; locatorLineEdit = new QLineEdit; rstTXLineEdit = new QLineEdit; rstRXLineEdit = new QLineEdit; STXLineEdit = new QLineEdit; SRXLineEdit = new QLineEdit; bandComboBox = new QComboBox; modeComboBox = new QComboBox; dateEdit = new QDateEdit; dateEdit->setDisplayFormat("dd/MM/yyyy"); timeEdit = new QTimeEdit; OKButton = new QPushButton(tr("&Add"), this); //spotItButton = new QPushButton(tr("&Spot"), this); //spotItButton->setEnabled(false); clearButton = new QPushButton(tr("&Clear"), this); // UI DX infoLabel1 = new QLabel(tr("Status bar...")); infoLabel2 = new QLabel(tr("DX Entity")); loggWinAct = new QAction(tr("&Log Window"), this); scoreeWinAct = new QAction(tr("&Score Window"), this); scoreWindow = new QWidget; operatorLineEdit = new QLineEdit; stationCallSignLineEdit = new QLineEdit; myLocatorLineEdit = new QLineEdit; rxPowerSpinBox = new QDoubleSpinBox; rxPowerSpinBox->setDecimals(2); rxPowerSpinBox->setMaximum(9999); rxPowerSpinBox->setSuffix(" " + tr("Watts")); txFreqSpinBox = new QDoubleSpinBox; txFreqSpinBox->setDecimals(3); txFreqSpinBox->setMaximum(99999); txFreqSpinBox->setSuffix(" " + tr("MHz")); rxFreqSpinBox = new QDoubleSpinBox; rxFreqSpinBox->setDecimals(3); rxFreqSpinBox->setMaximum(99999); rxFreqSpinBox->setSuffix(" " + tr("MHz")); dxccConfirmedQLCDNumber = new QLCDNumber; dxccWorkedQLCDNumber = new QLCDNumber; wazConfirmedQLCDNumber = new QLCDNumber; wazWorkedQLCDNumber = new QLCDNumber; localConfirmedQLCDNumber = new QLCDNumber; localWorkedQLCDNumber = new QLCDNumber; qsoConfirmedQLCDNumber = new QLCDNumber; qsoWorkedQLCDNumber = new QLCDNumber; dxMarathonQSOLCDNumber = new QLCDNumber; dxMarathonTopScoreLabelN = new QLabel(); dxMarathonDXCCQLCDNumber = new QLCDNumber; dxMarathonCQQLCDNumber = new QLCDNumber; dxMarathonPointsQLCDNumber = new QLCDNumber; operatingYearsComboBox = new QComboBox; dxMarathonLabelN = new QLabel; //qsoWorkedQLCDNumber->setDigitCount(7); //qsoConfirmedQLCDNumber->setDigitCount(7); // Check date & time and set them in the UI at the begining dateTime->currentDateTime(); dateEdit->setDate((dateTime->currentDateTime()).date()); timeEdit->setTime((dateTime->currentDateTime()).time()); //Search tab //searchBoxLineEdit = new QLineEdit; // UI DX // CLUSTER //qDebug() << "MainWindow::MainWindow: dxclusterwidget to be created" << endl; dxClusterWidget = new DXClusterWidget(dataProxy, dxclusterServerToConnect , dxclusterServerPort, this); // palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); awards = new Awards(dataProxy, Q_FUNC_INFO); awards->setManageModes(manageMode); // //************************************************** //createDXClusterUI(); connect( setupDialog, SIGNAL(exitSignal(int)), this, SLOT(slotExitFromSlotDialog(int)) ); //qDebug() << "MainWindow::MainWindow: readconfigdata" << endl; readConfigData(); //qDebug() << "MainWindow::MainWindow: after readconfigdata" << endl; if (itIsANewversion) { slotSetup(); } //qDebug() << "MainWindow::MainWindow: after readconfigdata" << endl; if (needToEnd) { //QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); //db->compress(); //qDebug() << "MainWindow::MainWindow: 12.5" << endl; exit(0); } //qDebug() << "MainWindow::MainWindow: UI to be created" << endl; logWindow->createlogPanel(currentLog); createUI(); //createSearchResultsPanel(); loggWinAct->setShortcut(Qt::CTRL + Qt::Key_L); connect(loggWinAct, SIGNAL(triggered()), this, SLOT(slotLogWinShow())); //logPanel->addAction(loggWinAct); //logPanel->addAction(scoreeWinAct); scoreeWinAct->setShortcut(Qt::CTRL + Qt::Key_P); connect(scoreeWinAct, SIGNAL(triggered()), this, SLOT(slotScoreWinShow())); scoreWindow->addAction(scoreeWinAct); scoreWindow->addAction(loggWinAct); createScorePanel(); setWindowTitle(tr("KLog")); //qDebug() << "MainWindow::MainWindow: 16" << endl; if (dataProxy->getNumberOfManagedLogs()<1) { //qDebug() << "MainWindow::MainWindow: 16.1" << endl; slotSetup(6); //qDebug() << "MainWindow::MainWindow: 16.2" << endl; } //qDebug() << "MainWindow::MainWindow: 17" << endl; checkIfNewBandOrMode(); //qDebug() << "MainWindow::MainWindow: 18" << endl; if (contestMode == "DX") { //qDebug() << "MainWindow::MainWindow: DX! 18.3" << endl; if (dataProxy->getLastQSOid()<=1) { //qDebug() << "MainWindow::MainWindow: 18.4" << endl; operatingYearsComboBox->addItem(QString::number(selectedYear)); } else { //qDebug() << "MainWindow::MainWindow: 18.5 - currentLog: " << QString::number(currentLog) << endl; operatingYearsComboBox->addItems(dataProxy->getOperatingYears(currentLog)); //qDebug() << "MainWindow::MainWindow: 18.5.1 - currentLog: " << QString::number(currentLog) << endl; QStringList a; a.clear(); a << dataProxy->getOperatingYears(currentLog); //qDebug() << "MainWindow::MainWindow: 18.5.1.1 - currentLog: " << QString::number(currentLog) << endl; if (!a.isEmpty()) { //qDebug() << "MainWindow::MainWindow: 18.5.1.2 - currentLog: " << QString::number(currentLog) << endl; operatingYearsComboBox->setCurrentIndex(operatingYearsComboBox->findText(a.last(), Qt::MatchCaseSensitive)); //qDebug() << "MainWindow::MainWindow: 18.5.1.3 - currentLog: " << QString::number(currentLog) << endl; } //qDebug() << "MainWindow::MainWindow: 18.5.2" << endl; } //qDebug() << "MainWindow::MainWindow: 18.6." << endl; //awards->recalculateAwards(); //qDebug() << "MainWindow::MainWindow: 18.8" << endl; showAwards(); //qDebug() << "MainWindow::MainWindow: 18.9" << endl; dxClusterWidget->setCurrentLog(currentLog); //qDebug() << "MainWindow::MainWindow: 18.10" << endl; if (manageDxMarathon) { dxMarathonLabelN->setText(tr("DX-Marathon")); dxMarathonTopScoreLabelN->setEnabled(true); dxMarathonPointsQLCDNumber->setEnabled(true); } else { dxMarathonLabelN->setText(tr("Annual")); dxMarathonTopScoreLabelN->setEnabled(false); dxMarathonPointsQLCDNumber->setEnabled(false); } //qDebug() << "MainWindow::MainWindow: 18.11" << endl; } else if ((contestMode == "CQ-WW-SSB") || (contestMode == "CQ-WW-CW")) {} else { //TODO: Check how to do DX if nothing happens without duplicating code. //qDebug() << "MainWindow::MainWindow: DX! 18.3" << endl; if (dataProxy->getLastQSOid()<=1) { //qDebug() << "MainWindow::MainWindow: 18.4" << endl; operatingYearsComboBox->addItem(QString::number(selectedYear)); } else { //qDebug() << "MainWindow::MainWindow: 18.5 - currentLog: " << QString::number(currentLog) << endl; operatingYearsComboBox->addItems(dataProxy->getOperatingYears(currentLog)); //qDebug() << "MainWindow::MainWindow: 18.5.1 - currentLog: " << QString::number(currentLog) << endl; operatingYearsComboBox->setCurrentIndex(operatingYearsComboBox->findText((dataProxy->getOperatingYears(currentLog)).last(), Qt::MatchCaseSensitive)); //qDebug() << "MainWindow::MainWindow: 18.5.2" << endl; } //qDebug() << "MainWindow::MainWindow: 18.6." << endl; //qDebug() << "MainWindow::MainWindow: 18.7" << endl; awards->recalculateAwards(); //qDebug() << "MainWindow::MainWindow: 18.8" << endl; showAwards(); //qDebug() << "MainWindow::MainWindow: 18.9" << endl; dxClusterWidget->setCurrentLog(currentLog); //qDebug() << "MainWindow::MainWindow: 18.10" << endl; } //qDebug() << "MainWindow::MainWindow: 19" << endl; currentBandShown = dataProxy->getIdFromBandName(bandComboBox->currentText()); currentModeShown = dataProxy->getIdFromModeName(modeComboBox->currentText()); currentBand = currentBandShown; currentMode = currentModeShown; //qDebug << "MainWindow::MainWindow: 20 - currentMode: " << QString::number(currentMode) << endl; //qDebug() << "MainWindow::MainWindow: 21 - currentBand: " << QString::number(currentBand) << endl; //qDebug << "MainWindow::MainWindow: 21.1 - currentModeShown: " << QString::number(currentModeShown) << endl; //qDebug() << "MainWindow::MainWindow: 21.2 - currentBandShown: " << QString::number(currentBandShown) << endl; slotClearButtonClicked(); //qDebug << "MainWindow::MainWindow: 20b - currentMode: " << QString::number(currentMode) << endl; //qDebug << "MainWindow::MainWindow: 21.1b - currentModeShown: " << QString::number(currentModeShown) << endl; upAndRunning = true; //qDebug() << "MainWindow::MainWindow: "<< (QTime::currentTime()).toString("hhmmsszzz")<< endl; //qDebug() << "MainWindow::MainWindow: Software update to be created" << endl; softUpdate = new SoftwareUpdate(softwareVersion); //connect(softUpdate, SIGNAL(updateNeededSignal(bool)), this, SLOT(slotShowSoftUpdateResults(bool) ) ); callingUpdate = false; // to control whether the update is mannually launched or at the begining //qDebug() << "MainWindow::MainWindow: calling Software update..." << endl; if (checkNewVersions) {//reportInfo if (reportInfo) { softUpdate->addCall(stationQRZ); } softUpdate->needToUpdate(); } connect(awards, SIGNAL(queryError(QString, QString, int, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, int, QString)) ); //connect(awards, SIGNAL(clearError()), this, SLOT(slotClearNoMorErrorShown()) ); connect(awards, SIGNAL(awardDXCCUpdated()), this, SLOT(slotRefreshDXCCWidget()) ); filemanager = new FileManager(dataProxy, klogDir, softwareVersion); connect(filemanager, SIGNAL(queryError(QString, QString, int, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, int, QString)) ); //connect(filemanager, SIGNAL(clearError()), this, SLOT(slotClearNoMorErrorShown()) ); //qDebug() << "MainWindow::MainWindow: END" << endl; } MainWindow::~MainWindow() { /* doc->~QTextDocument(); recalculateAwardsButton->~QPushButton(); scoreTextEdit->~QTextEdit(); mainWidget->~QWidget(); dateTime->~QDateTime(); timer->~QTimer(); qrzLineEdit->~QLineEdit(); nameLineEdit->~QLineEdit(); qthLineEdit->~QLineEdit(); locatorLineEdit->~QLineEdit(); rstTXLineEdit->~QLineEdit(); rstRXLineEdit->~QLineEdit(); STXLineEdit->~QLineEdit(); SRXLineEdit->~QLineEdit(); bandComboBox->~QComboBox(); modeComboBox->~QComboBox(); dateEdit->~QDateEdit(); timeEdit->~QTimeEdit(); OKButton->~QPushButton(); clearButton->~QPushButton(); infoLabel1->~QLabel(); infoLabel2->~QLabel(); loggWinAct->~QAction(); scoreeWinAct->~QAction(); scoreWindow->~QWidget(); operatorLineEdit->~QLineEdit(); stationCallSignLineEdit->~QLineEdit(); myLocatorLineEdit->~QLineEdit(); rxPowerSpinBox->~QDoubleSpinBox(); txFreqSpinBox->~QDoubleSpinBox(); rxFreqSpinBox->~QDoubleSpinBox(); dxccConfirmedQLCDNumber->~QLCDNumber(); dxccWorkedQLCDNumber->~QLCDNumber(); wazConfirmedQLCDNumber->~QLCDNumber(); wazWorkedQLCDNumber->~QLCDNumber(); localConfirmedQLCDNumber->~QLCDNumber(); localWorkedQLCDNumber->~QLCDNumber(); qsoConfirmedQLCDNumber->~QLCDNumber(); qsoWorkedQLCDNumber->~QLCDNumber(); dxMarathonQSOLCDNumber->~QLCDNumber(); dxMarathonDXCCQLCDNumber->~QLCDNumber(); dxMarathonCQQLCDNumber->~QLCDNumber(); dxMarathonPointsQLCDNumber->~QLCDNumber(); operatingYearsComboBox->~QComboBox(); showErrorDialog->~ShowErrorDialog(); dataProxy->~DataProxy(); db->~DataBase(); util->~Utilities(); elogClublog->~eLogClubLog(); dxccStatusWidget->~DXCCStatusWidget(); logWindow->~LogWindow(); searchWidget->~SearchWidget(); aboutDialog->~AboutDialog(); infoWidget->~QWidget(); downloadcty->~DownLoadCTY(); world->~World(); setupDialog->~SetupDialog(); satTabWidget->~MainWindowSatTab(); myDataTabWidget->~MainWindowMyDataTab(); commentTabWidget->~MainWindowInputComment(); othersTabWidget->~MainWindowInputOthers(); eQSLTabWidget->~QWidget(); QSLTabWidget->~MainWindowInputQSL(); filemanager->~FileManager(); locator->~Locator(); awards->~Awards(); dxClusterWidget->~DXClusterWidget(); softUpdate->~SoftwareUpdate(); */ if (hamlibActive) { hamlib->stop(); } } void MainWindow::createStatusBar() { statusBar()->showMessage(tr("Ready")); } void MainWindow::createUI() { //qDebug() << "MainWindow::createUI" << endl; createStatusBar(); if (contestMode == "CQ-WW-SSB") { createUIDX(); createActionsCommon(); createActionsDX(); createMenusCommon(); } else if ( (contestMode == "CQ-WW-SSB") || (contestMode == "CQ-WW-CW") ) { createUICQWW(); createActionsCommon(); createActionsCQWW(); createMenusCommon(); createMenusCQWW(); } else { // This is DX. Depending on how KLog evolves I could remove the DX from the first place and leave this only. createUIDX(); createActionsCommon(); createActionsDX(); createMenusCommon(); } } void MainWindow::slotTimeOutInfoBars() { infoLabel1->setText(infoLabel1T); infoLabel2->setText(infoLabel2T); } void MainWindow::slotModeComboBoxChanged() { //qDebug() << "MainWindow::slotModeComboBoxChanged: " << QString::number(modeComboBox->currentIndex()) << endl; //qDebug() << "MainWindow::slotModeComboBoxChanged: " << modeComboBox->currentText() << endl; /* int i; i = dataProxy->getSubModeIdFromSubMode(modeComboBox->currentText()); if (i>=0) { //qDebug() << "MainWindow::MainWindow: 5 - currentMode: " << QString::number(currentMode) << endl; currentMode = i; //qDebug() << "MainWindow::MainWindow: 6 - currentMode: " << QString::number(currentMode) << endl; } //qDebug() << "MainWindow::slotModeComboBoxChanged: i: " << QString::number(i) << endl; */ //qDebug() << "MainWindow::slotModeComboBoxChanged: currentMode: " << QString::number(currentMode) << endl; //qDebug() << "MainWindow::slotModeComboBoxChanged: " << QString::number(modeComboBox->currentIndex()) << "/" << QString::number(currentMode) << endl; //qDebug() << "MainWindow::slotModeComboBoxChanged: currentBandShown: " << QString::number(currentBandShown) << endl; currentBandShown = dataProxy->getIdFromBandName(bandComboBox->currentText()); //qDebug() << "MainWindow::slotModeComboBoxChanged: currentBandShown2: " << QString::number(currentBandShown) << endl; currentModeShown = dataProxy->getIdFromModeName(modeComboBox->currentText()); //qDebug() << "MainWindow::slotModeComboBoxChanged: currentBand: " << QString::number(currentBand) << endl; currentBand = currentBandShown; //qDebug() << "MainWindow::slotModeComboBoxChanged: currentBand2: " << QString::number(currentBand) << endl; //qDebug() << "MainWindow::MainWindow: 7 - currentMode: " << QString::number(currentMode) << endl; currentMode = currentModeShown; //qDebug << "MainWindow::MainWindow: 8 - currentMode: " << QString::number(currentMode) << endl; //qDebug() << "MainWindow::MainWindow: 8.1 - currentBand: " << QString::number(currentBand) << endl; //qDebug() << "MainWindow::MainWindow: 8.2 - currentModeShown: " << QString::number(currentModeShown) << endl; //qDebug() << "MainWindow::MainWindow: 8.3 - currentBandShown: " << QString::number(currentBandShown) << endl; checkIfWorkedB4(currentQrz); QStringList _qs; //for the showStatusOfDXCC(const QStringList _qs) _qs.clear(); _qs << QString::number(currentEntity) << QString::number(currentBandShown) << QString::number(currentModeShown) << QString::number(currentLog); showStatusOfDXCC(_qs); setRSTToMode(modeComboBox->currentText()); if (hamlibActive) { QString _modeSeen = modeComboBox->currentText(); if (_modeSeen == "SSB") { if (txFreqSpinBox->value() >= dataProxy->getLowLimitBandFromBandName("20M")) { hamlib->setMode("USB"); } else { hamlib->setMode("LSB"); } } hamlib->setMode(modeComboBox->currentText()); } //qDebug() << "MainWindow::slotModeComboBoxChanged2: " << modeComboBox->currentText() << endl; } void MainWindow::slotBandComboBoxChanged(){ //qDebug() << "MainWindow::slotBandComboBoxChanged: " << QString::number(bandComboBox->currentIndex()) << "/" << bandComboBox->currentText()<< endl; /* int i; i = dataProxy->getIdFromBandName(bandComboBox->currentText()); if (i>=0) { currentBand = i; //txFreqSpinBox->setValue(dataProxy->getFreqFromBandId(i)); } */ if (txFreqBeingChanged || updatingBands) { //qDebug() << "MainWindow::slotBandComboBoxChanged: txFreqBeingChanged" << endl; return; } bool isFRinBand = dataProxy->isThisFreqInBand(bandComboBox->currentText(), QString::number(txFreqSpinBox->value())); if ((isFRinBand) && (txFreqSpinBox->value() >0 )) { //qDebug() << "MainWindow::slotBandComboBoxChanged: idFRinBand and Freq >0" << endl; return; } //qDebug() << "MainWindow::slotBandComboBoxChanged: " << QString::number(bandComboBox->currentIndex()) << "/" << QString::number(currentBand) << endl; //qDebug() << "MainWindow::slotBandComboBoxChanged: currentBandShown: " << QString::number(currentBandShown) << endl; currentBandShown = dataProxy->getIdFromBandName(bandComboBox->currentText()); //qDebug() << "MainWindow::slotBandComboBoxChanged: currentBandShown2: " << QString::number(currentBandShown) << endl; currentModeShown = dataProxy->getIdFromModeName(modeComboBox->currentText()); //qDebug() << "MainWindow::slotBandComboBoxChanged: currentBand: " << QString::number(currentBand) << endl; currentBand = currentBandShown; //qDebug() << "MainWindow::slotBandComboBoxChanged: currentBand2: " << QString::number(currentBand) << endl; //qDebug() << "MainWindow::MainWindow: 9 - currentMode: " << QString::number(currentMode) << endl; currentMode = currentModeShown; //qDebug << "MainWindow::MainWindow: 9 - currentMode: " << QString::number(currentMode) << endl; //qDebug() << "MainWindow::MainWindow: 9.1 - currentMode: " << QString::number(currentMode) << endl; //qDebug() << "MainWindow::MainWindow: 9.2 - currentBand: " << QString::number(currentBand) << endl; //qDebug() << "MainWindow::MainWindow: 9.3 - currentModeShown: " << QString::number(currentModeShown) << endl; //qDebug() << "MainWindow::MainWindow: 9.4 - currentBandShown: " << QString::number(currentBandShown) << endl; //qDebug() << "MainWindow::MainWindow: Going to update the UpLink with: " << bandComboBox->currentText() << endl; //satTabWidget->setUpLink(bandComboBox->currentText()); //qDebug() << "MainWindow::slotBandComboBoxChanged Freq in txFreqSpinBox" << QString::number(txFreqSpinBox->value()) << endl; //qDebug() << "MainWindow::slotBandComboBoxChanged: Band Shown: " << dataProxy->getNameFromBandId(currentBandShown) << endl; // bool isFRinBand = dataProxy->isThisFreqInBand((dataProxy->getNameFromBandId(currentBandShown)), QString::number(txFreqSpinBox->value())); //qDebug() << "MainWindow::MainWindow: Freq: " << QString::number(txFreqSpinBox->value()) << endl; if ((!isFRinBand) || (txFreqSpinBox->value()<=0)) { double txFr = (dataProxy->getFreqFromBandId(currentBandShown)).toDouble(); //satTabWidget->setUpLinkFreq(txFr); //qDebug() << "MainWindow::slotBandComboBoxChanged updating txFreqSpinBox" << QString::number(txFr) << endl; txFreqSpinBox->setValue(txFr); } //qDebug() << "MainWindow::MainWindow: Freq2: " << QString::number(txFreqSpinBox->value()) << endl; //currentModeShown = modeComboBox->currentIndex(); checkIfWorkedB4(currentQrz); QStringList _qs; //for the showStatusOfDXCC(const QStringList _qs) _qs.clear(); _qs << QString::number(currentEntity) << QString::number(currentBandShown) << QString::number(currentModeShown) << QString::number(currentLog); showStatusOfDXCC(_qs); //qDebug() << "MainWindow::slotBandComboBoxChanged: END" << endl; } void MainWindow::slotQRZReturnPressed() { //qDebug() << "MainWindow::slotQRZReturnPressed: " << qrzLineEdit->text() << " - " << QString::number(bandComboBox->currentIndex()) << "/" << QString::number(modeComboBox->currentIndex()) << endl; //int newId = -1; int errorCode = 0; QString aux; //int _x; //for clublog management //bool ret = false; QString tqrz = qrzLineEdit->text(); slotBandComboBoxChanged(); slotModeComboBoxChanged(); // Just to prepare or some tasks before reading DATA from UI /* if (contestMode == "CQ-WW-SSB") { if ((SRXLineEdit->text()).toInt() < 1 ){ return; } } else { } */ QSqlQuery query; QString queryString = readDataFromUI(); //qDebug() << "MainWindow::slotQRZReturnPressed: queryString: " << queryString << endl; if (queryString != "NULL") { if (!query.exec(queryString)) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); query.finish(); //qDebug() << "MainWindow::slotQRZReturnPressed: Query ERROR: (queryString): " << queryString << endl; errorCode = query.lastError().number(); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); aux = tr("An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: "); msgBox.setText(aux + "MW-1#" + QString::number(errorCode)); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } return; } else { query.finish(); //TODO: To move the following lines to this part to properly manage the query result!! //ret = true; //qDebug() << "MainWindow::slotQRZReturnPressed: QSO Added! " << endl; actionsJustAfterAddingOneQSO(); clearForNextQSO(); } } else // The QUERY string is NULL { return; //qDebug() << "MainWindow::slotQRZReturnPressed: queryString-NULL: " << queryString << endl; } modify = false; modifyingQSO = -1; OKButton->setText(tr("&Add")); } void MainWindow::actionsJustAfterAddingOneQSO() { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO" << endl; int lastId = -1; needToSave = true; if (modify) { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: Modifying! " << endl; needToSave = true; if(modifyingQSO>0) { awards->setAwards(modifyingQSO); if ((clublogActive) & (clublogRealTime)) { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: (Modifiying ClubLog) Lastid: "<< QString::number(lastId) << endl; // Delete QSO in CLubLog elogClublog->deleteQSO(clublogPrevQSO); // Add modified QSO in ClubLog elogClublog->sendQSO(dataProxy->getClubLogRealTimeFromId(modifyingQSO)); } else { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: (No ClubLog) Lastid: "<< QString::number(lastId) << endl; } } // CHECK WHAT WAS THE QSOID to add the awards, if needed awards->setAwards(modifyingQSO); //Update the DXCC award status } else { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: Not Modifying " << endl; lastId = dataProxy->getLastQSOid(); if (lastId>=0) { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: Lastid: "<< QString::number(lastId) << endl; awards->setAwards(lastId); //Update the DXCC award status // Send to CLUBLOG if enabled if ((clublogActive) & (clublogRealTime)) { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: (Sending ClubLog) Lastid: "<< QString::number(lastId) << endl; elogClublog->sendQSO(dataProxy->getClubLogRealTimeFromId(lastId)); } else { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: (No ClubLog) Lastid: "<< QString::number(lastId) << endl; } // } else { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: Lastid < 0 "<< QString::number(lastId) << endl; } //awards->setAwards(lastId); } logWindow->refresh(); dxccStatusWidget->refresh(); //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO - END" << endl; } QString MainWindow::readDataFromUI() { //qDebug() << "MainWindow::readDataFromUI: " << endl; QString tqrz = (qrzLineEdit->text()).toUpper(); if (!util->isValidCall(tqrz)) { return "NULL"; } if (modify) { return readDataFromUIDXModifying(); } else { return readDataFromUIDX(); } /* if (contestMode == "DX") { if (modify) { return readDataFromUIDXModifying(); } else { return readDataFromUIDX(); } } else if (contestMode == "CQ-WW-SSB") { } else { if (modify) { return readDataFromUIDXModifying(); } else { return readDataFromUIDX(); } } */ //qDebug() << "MainWindow::readDataFromUI: END" << endl; //return "NULL"; } QString MainWindow::readDataFromUIDX() { /* If you make any change here, please update also readDataFromUIDXModifying to keep data integrity! */ //qDebug() << "MainWindow::readDataFromUIDX:" << endl; QString tqrz = (qrzLineEdit->text()).toUpper(); if (!util->isValidCall(tqrz)) { return "NULL"; } QString stringQuery = "NULL"; QString aux1, aux2, stringFields, stringData; //QString aux, aux2; //qDebug << "MainWindow::readDataFromUIDX: Band: " << QString::number(currentBand) << endl; //qDebug << "MainWindow::readDataFromUIDX: Mode: " << QString::number(currentMode) << endl; int tband = currentBand; int tmode = currentMode; QString tdate = (dateEdit->date()).toString("yyyy/MM/dd"); QString ttime = (timeEdit->time()).toString("hh:mm:ss"); QString trsttx = rstTXLineEdit->text(); QString trstrx = rstRXLineEdit->text(); int dxcc = world->getQRZARRLId(tqrz); //int dxcc2 = getDXCCFromComboBox(); int dxcc2 = world->getQRZARRLId(othersTabWidget->getEntityPrefix()); //qDebug() << "MainWindow::readDataFromUIDX - DXCC: " << QString::number(dxcc) << endl; //qDebug() << "MainWindow::readDataFromUIDX - DXCC2: " << QString::number(dxcc2) << endl; dxcc = util->getNormalizedDXCCValue(dxcc); dxcc2 = util->getNormalizedDXCCValue(dxcc2); if (dxcc!=dxcc2) { QString dxccn1 = world->getEntityName(dxcc); dxccn1 = dxccn1 + " - " + world->getEntityMainPrefix(dxcc); QString dxccn2 = world->getEntityName(dxcc2); dxccn2 = dxccn2 + " - " + world->getEntityMainPrefix(dxcc2); QPushButton *button2 = new QPushButton(this); QPushButton *button1 = new QPushButton(this); button1->setText(world->getEntityMainPrefix(dxcc)); button2->setText(world->getEntityMainPrefix(dxcc2)); int ret; QMessageBox msgBox; msgBox.setText( tr("You have selected an entity:") + "\n\n"+"- "+dxccn2+"\n\n"+tr("that is different from the KLog proposed entity:") + "\n\n"+ "- "+dxccn1+"\n\n" +tr("Click on the prefix of the correct entity or Cancel to edit the QSO again.")); msgBox.addButton(button2, QMessageBox::AcceptRole); msgBox.addButton(button1, QMessageBox::ActionRole); msgBox.addButton(QMessageBox::Cancel); ret = msgBox.exec(); if (ret == QMessageBox::AcceptRole) { dxcc = dxcc2; } else if (ret == QMessageBox::Cancel) { return "NULL"; } else {} } aux1 = dataProxy->getContinentShortNameFromEntity(dxcc); if (dataProxy->isValidContinentShortName(aux1)) { stringFields = stringFields + ", cont"; stringData = stringData + ", '" + aux1 + "'"; } int cqz = world->getEntityCqz(dxcc); int ituz = world->getEntityItuz(dxcc); aux1 = nameLineEdit->text(); if (aux1.length()>1) { stringFields = stringFields + ", name"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = (locatorLineEdit->text()).toUpper(); if ( locator->isValidLocator(aux1) ) { stringFields = stringFields + ", gridsquare"; stringData = stringData + ", '" + aux1 + "'"; } //qDebug() << "MainWindow::readDataFromUIDX: Reading freq...: " << QString::number(txFreqSpinBox->value()) << endl; if ( (txFreqSpinBox->value()) > 0 ) { aux1 = QString::number(txFreqSpinBox->value()); //qDebug() << "MainWindow::readDataFromUIDX: Reading freq...: " << aux1 << "/" << tband << endl; if (dataProxy->isThisFreqInBand(dataProxy->getNameFromBandId(tband), aux1) ) { stringFields = stringFields + ", freq"; stringData = stringData + ", '" + aux1 + "'"; //qDebug() << "MainWindow::readDataFromUIDX: FREQ & BAND OK" << endl; } else { //qDebug() << "MainWindow::readDataFromUIDX: FREQ & BAND NOK" << endl; } } if ( (rxFreqSpinBox->value()) > 0 ) { aux1 = QString::number(rxFreqSpinBox->value()); stringFields = stringFields + ", freq_rx"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = qthLineEdit->text(); if (aux1.length()>2) { stringFields = stringFields + ", qth"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = myDataTabWidget->getOperator(); //aux1 = operatorLineEdit->text(); if (aux1.length()>2) { //lastOperatorQRZ = aux1.toUpper(); stringFields = stringFields + ", operator"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = myDataTabWidget->getStationQRZ(); //aux1 = (stationCallSignLineEdit->text()).toUpper(); if (aux1.length()>2) { //lastStationQRZ = aux1.toUpper(); stringFields = stringFields + ", station_callsign"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = myDataTabWidget->getMyLocator(); //aux1 = myLocatorLineEdit->text(); if (aux1.length()>2) { //lastMyLocator = aux1.toUpper(); stringFields = stringFields + ", my_gridsquare"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = commentTabWidget->getComment(); //aux1 = commentLineEdit->text(); if (aux1.length()>0) { stringFields = stringFields + ", comment"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QSLTabWidget->getQSLMsg(); //aux1 = qslmsgTextEdit->toPlainText(); if (aux1.length()>0) { stringFields = stringFields + ", qslmsg"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QString::number(dxcc); if (aux1.length()>0) { stringFields = stringFields + ", dxcc"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QString::number(cqz); if (aux1.length()>0) { stringFields = stringFields + ", cqz"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QString::number(ituz); if (aux1.length()>0) { stringFields = stringFields + ", ituz"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QSLTabWidget->getQSLVia(); //aux1 = qslViaLineEdit->text(); if (aux1.length()>3) { stringFields = stringFields + ", qsl_via"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QString::number(myDataTabWidget->getMyPower()); if ((aux1.toDouble())>0.0) { //lastPower = aux1.toDouble(); stringFields = stringFields + ", tx_pwr"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QString::number(rxPowerSpinBox->value()); if ((aux1.toDouble())>0.0) { stringFields = stringFields + ", rx_pwr"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = othersTabWidget->getIOTA(); //qDebug() << "MainWindow::readDataFromUIDX: IOTA: " << aux1 << endl; if (aux1.length() == 6) // EU-001 { //qDebug() << "MainWindow::readDataFromUIDX: IOTA to be saved" << endl; stringFields = stringFields + ", iota"; stringData = stringData + ", '" + aux1 + "'"; } else { //qDebug() << "MainWindow::readDataFromUIDX: IOTA NOT to be saved! Lenght="<getSatName(); //We are assuming that the SAT_NAME is always well provided. If it is blank, then no SAT QSO //qDebug() << "MainWindow::readDataFromUIDX: SAT1 " << aux1 << endl; //stringFields = stringFields + ", sat_name"; //stringData = stringData + ", '" + aux1 + "'"; if (aux1.length()>0) { stringFields = stringFields + ", sat_name"; stringData = stringData + ", '" + aux1 + "'"; } // aux1 = satTabWidget->getSatMode(); aux1 = satTabWidget->getSatMode(); // We are assuming that the SAT_MODE is always well provided. If it is blank, then no SAT QSO //stringFields = stringFields + ", sat_mode"; //stringData = stringData + ", '" + aux1 + "'"; if (aux1.length()>0) { stringFields = stringFields + ", sat_mode"; stringData = stringData + ", '" + aux1 + "'"; } keepSatPage = satTabWidget->getRepeatThis(); aux1 = othersTabWidget->getPropModeFromComboBox(); if ((aux1.length()>0) && (aux1 != "Not")) { stringFields = stringFields + ", prop_mode"; stringData = stringData + ", '" + aux1 + "'"; } //CLUBLOG aux1 = eQSLTabWidget->getClubLogStatus(); //Y, N, M if (aux1 == "Y") { stringFields = stringFields + ", clublog_qso_upload_status"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", clublog_qso_upload_date"; stringData = stringData + ", '" + (eQSLTabWidget->getClubLogDate()).toString("yyyy/MM/dd") + "'"; } else if (aux1 == "N") { stringFields = stringFields + ", clublog_qso_upload_status"; stringData = stringData + ", 'N'"; } else if (aux1 == "M") { stringFields = stringFields + ", clublog_qso_upload_status"; stringData = stringData + ", 'M'"; stringFields = stringFields + ", clublog_qso_upload_date"; stringData = stringData + ", '" + (eQSLTabWidget->getClubLogDate()).toString("yyyy/MM/dd") + "'"; } else //TODO: This should be equivalent to N? { stringFields = stringFields + ", clublog_qso_upload_status"; stringData = stringData + ", 'N'"; } //CLUBLOG aux1 = eQSLTabWidget->getEQSLSenStatus(); if (aux1 == "Y") { stringFields = stringFields + ", eqsl_qsl_sent"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", eqsl_qslsdate"; stringData = stringData + ", '" + (eQSLTabWidget->getEQSLSenDate()).toString("yyyy/MM/dd") + "'"; } else if (aux1 == "R") { stringFields = stringFields + ", eqsl_qsl_sent"; stringData = stringData + ", 'R'"; } else if (aux1 == "Q") { stringFields = stringFields + ", eqsl_qsl_sent"; stringData = stringData + ", 'Q'"; stringFields = stringFields + ", eqsl_qslsdate"; stringData = stringData + ", '" + (eQSLTabWidget->getEQSLSenDate()).toString("yyyy/MM/dd") + "'"; } else if (aux1 == "I") { stringFields = stringFields + ", eqsl_qsl_sent"; stringData = stringData + ", 'I'"; stringFields = stringFields + ", eqsl_qslsdate"; stringData = stringData + ", '" + (eQSLTabWidget->getEQSLSenDate()).toString("yyyy/MM/dd") + "'"; } else // N { stringFields = stringFields + ", eqsl_qsl_sent"; stringData = stringData + ", 'N'"; } aux1 = eQSLTabWidget->getEQSLRecStatus(); if (aux1 == "Y") { stringFields = stringFields + ", eqsl_qsl_rcvd"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", eqsl_qslrdate"; stringData = stringData + ", '" + (eQSLTabWidget->getEQSLRecDate()).toString("yyyy/MM/dd") + "'"; } else if (aux1 == "R") { stringFields = stringFields + ", eqsl_qsl_rcvd"; stringData = stringData + ", 'R'"; } else if (aux1 == "Q") { stringFields = stringFields + ", eqsl_qsl_rcvd"; stringData = stringData + ", 'Q'"; stringFields = stringFields + ", eqsl_qslrdate"; stringData = stringData + ", '" + (eQSLTabWidget->getEQSLRecDate()).toString("yyyy/MM/dd") + "'"; } else if (aux1 == "I") { stringFields = stringFields + ", eqsl_qsl_rcvd"; stringData = stringData + ", 'I'"; stringFields = stringFields + ", eqsl_qslrdate"; stringData = stringData + ", '" + (eQSLTabWidget->getEQSLRecDate()).toString("yyyy/MM/dd") + "'"; } else { stringFields = stringFields + ", eqsl_qsl_rcvd"; stringData = stringData + ", 'N'"; } // LOTW-SENT aux1 = eQSLTabWidget->getLOTWSenStatus(); if (aux1 == "Y") { stringFields = stringFields + ", lotw_qsl_sent"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", lotw_qslsdate"; stringData = stringData + ", '" + (eQSLTabWidget->getLOTWSenDate()).toString("yyyy/MM/dd") + "'"; } else if (aux1 == "R") { stringFields = stringFields + ", lotw_qsl_sent"; stringData = stringData + ", 'R'"; } else if (aux1 == "Q") { stringFields = stringFields + ", lotw_qsl_sent"; stringData = stringData + ", 'Q'"; stringFields = stringFields + ", lotw_qslsdate"; stringData = stringData + ", '" + (eQSLTabWidget->getLOTWSenDate()).toString("yyyy/MM/dd") + "'"; } else if (aux1 == "I") { stringFields = stringFields + ", lotw_qsl_sent"; stringData = stringData + ", 'I'"; stringFields = stringFields + ", lotw_qslsdate"; stringData = stringData + ", '" + (eQSLTabWidget->getLOTWSenDate()).toString("yyyy/MM/dd") + "'"; } else { stringFields = stringFields + ", lotw_qsl_sent"; stringData = stringData + ", 'N'"; } // LOTW-RECEPTION //LOTW_QSLRDATE: (only valid if LOTW_RCVD is Y, I, or V) aux1 = eQSLTabWidget->getLOTWRecStatus(); if (aux1 == "Y") { stringFields = stringFields + ", lotw_qsl_rcvd"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", lotw_qslrdate"; stringData = stringData + ", '" + (eQSLTabWidget->getLOTWRecDate()).toString("yyyy/MM/dd") + "'"; } else if (aux1 == "R") { stringFields = stringFields + ", lotw_qsl_rcvd"; stringData = stringData + ", 'R'"; } else if (aux1 == "V") { stringFields = stringFields + ", lotw_qsl_rcvd"; stringData = stringData + ", 'V'"; stringFields = stringFields + ", lotw_qslrdate"; stringData = stringData + ", '" + (eQSLTabWidget->getLOTWRecDate()).toString("yyyy/MM/dd") + "'"; } else if (aux1 == "I") { stringFields = stringFields + ", lotw_qsl_rcvd"; stringData = stringData + ", 'I'"; stringFields = stringFields + ", lotw_qslrdate"; stringData = stringData + ", '" + (eQSLTabWidget->getLOTWRecDate()).toString("yyyy/MM/dd") + "'"; } else { stringFields = stringFields + ", lotw_qsl_rcvd"; stringData = stringData + ", 'N'"; } //QSLTABWidget // QSL SENT: Y/N/R/Q/I // QSL_VIA: B/D/E/M aux1 = QSLTabWidget->getQSLSenStatus(); aux2 = QSLTabWidget->getSentVia(); //qDebug() << "MainWindow::readDataFromUIDX: aux1: " << aux1 << " / aux2: " << aux2 << endl; //TODO: the aux2 switch is repeated and could be improved if (aux1=="Y") { stringFields = stringFields + ", qsl_sent"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", qslsdate"; stringData = stringData + ", '" + (QSLTabWidget->getQSLSenDate()).toString("yyyy/MM/dd") + "'"; stringFields = stringFields + ", qsl_sent_via"; if (aux2 == "D") { stringData = stringData + ", 'D'"; } else if (aux2 == "E") { stringData = stringData + ", 'E'"; } else if (aux2 == "M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else if (aux1 == "R") { stringFields = stringFields + ", qsl_sent"; stringData = stringData + ", 'R'"; stringFields = stringFields + ", qsl_sent_via"; if (aux2 == "D") { stringData = stringData + ", 'D'"; } else if (aux2 == "E") { stringData = stringData + ", 'E'"; } else if (aux2 == "M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else if (aux1 == "Q") { stringFields = stringFields + ", qsl_sent"; stringData = stringData + ", 'Q'"; stringFields = stringFields + ", qslsdate"; stringData = stringData + ", '" + (QSLTabWidget->getQSLSenDate()).toString("yyyy/MM/dd") + "'"; stringFields = stringFields + ", qsl_sent_via"; if (aux2 == "D") { stringData = stringData + ", 'D'"; } else if (aux2 == "E") { stringData = stringData + ", 'E'"; } else if (aux2 == "M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else if (aux1 == "I") { stringFields = stringFields + ", qsl_sent"; stringData = stringData + ", 'I'"; stringFields = stringFields + ", qslsdate"; stringData = stringData + ", '" + (QSLTabWidget->getQSLSenDate()).toString("yyyy/MM/dd") + "'"; stringFields = stringFields + ", qsl_sent_via"; if (aux2 == "D") { stringData = stringData + ", 'D'"; } else if (aux2 == "E") { stringData = stringData + ", 'E'"; } else if (aux2 == "M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else { stringFields = stringFields + ", qsl_sent"; stringData = stringData + ", 'N'"; stringFields = stringFields + ", qsl_sent_via"; stringData = stringData + ", 'B'"; } // QSL RECEPTION //i = qslRecComboBox->currentIndex(); //ii = qslRecViaComboBox->currentIndex(); aux1 = QSLTabWidget->getQSLRecStatus(); // Y/N/R/I/V aux2 = QSLTabWidget->getRecVia(); // B/D/E/M if (aux1 == "Y") { stringFields = stringFields + ", qsl_rcvd"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", qslrdate"; stringData = stringData + ", '" + (QSLTabWidget->getQSLRecDate()).toString("yyyy/MM/dd") + "'"; //stringFields = stringFields + ", confirmed"; //stringData = stringData + ", '1'"; stringFields = stringFields + ", qsl_rcvd_via"; if (aux2 == "D") { stringData = stringData + ", 'D'"; } else if (aux2 == "E") { stringData = stringData + ", 'E'"; } else if (aux2 == "M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else if (aux1 =="R") { stringFields = stringFields + ", qsl_rcvd"; stringData = stringData + ", 'R'"; //stringFields = stringFields + ", confirmed"; //stringData = stringData + ", '0'"; stringFields = stringFields + ", qsl_rcvd_via"; if (aux2=="D") { stringData = stringData + ", 'D'"; } else if (aux2=="E") { stringData = stringData + ", 'E'"; } else if (aux2=="M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else if (aux1=="I") { stringFields = stringFields + ", qsl_rcvd"; stringData = stringData + ", 'I'"; stringFields = stringFields + ", qslrdate"; stringData = stringData + ", '" + (QSLTabWidget->getQSLRecDate()).toString("yyyy/MM/dd") + "'"; //stringFields = stringFields + ", confirmed"; //stringData = stringData + ", '0'"; stringFields = stringFields + ", qsl_rcvd_via"; if (aux2=="D") { stringData = stringData + ", 'D'"; } else if (aux2=="E") { stringData = stringData + ", 'E'"; } else if (aux2=="M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else if (aux1=="V") { stringFields = stringFields + ", qsl_rcvd"; stringData = stringData + ", 'V'"; stringFields = stringFields + ", qslrdate"; stringData = stringData + ", '" + (QSLTabWidget->getQSLRecDate()).toString("yyyy/MM/dd") + "'"; //TODO: Check if the QSL has been received or not as this "V" could mask a received QSL as a Worked (0) //stringFields = stringFields + ", confirmed"; //stringData = stringData + ", '0'"; stringFields = stringFields + ", qsl_rcvd_via"; if (aux2=="D") { stringData = stringData + ", 'D'"; } else if (aux2=="E") { stringData = stringData + ", 'E'"; } else if (aux2=="M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else { stringFields = stringFields + ", qsl_rcvd"; stringData = stringData + ", 'N'"; stringFields = stringFields + ", qsl_rcvd_via"; stringData = stringData + ", 'B'"; } // The data reading finish here. Now, we prepare the data to insert into the DB if (stringFields.startsWith(", ") ) { stringFields.remove(0,2); } stringFields += ", call, bandid, modeid, qso_date, time_on, lognumber, rst_sent, rst_rcvd"; if (stringFields.startsWith(", ") ) { stringFields.remove(0,2); } if (stringData.startsWith(", ") ) { stringData.remove(0,1); } stringData.remove(0,1); stringData += QString(", '%1', '%2', '%3', '%4', '%5', '%6', '%7', '%8'").arg(tqrz).arg(tband).arg(tmode).arg(tdate).arg(ttime).arg(QString::number(currentLog)).arg(trsttx).arg(trstrx); if (stringData.startsWith(", ") ) { stringData.remove(0,2); } stringQuery = "INSERT INTO log (" + stringFields + ") values (" + stringData +")" ; return stringQuery; } QString MainWindow::readDataFromUIDXModifying() { //qDebug() << "MainWindow::readDataFromUIDXModifying:" << endl; /* UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN WHERE [condition]; */ QString tqrz = (qrzLineEdit->text()).toUpper(); if (!util->isValidCall(tqrz)) { return "NULL"; } QString stringQuery = "NULL"; QString aux1, aux2; //QString aux, aux2; int tband = currentBand; int tmode = currentMode; QString tdate = (dateEdit->date()).toString("yyyy/MM/dd"); QString ttime = (timeEdit->time()).toString("hh:mm:ss"); QString trsttx = rstTXLineEdit->text(); QString trstrx = rstRXLineEdit->text(); int dxcc = world->getQRZARRLId(tqrz); int cqz = world->getEntityCqz(dxcc); int ituz = world->getEntityItuz(dxcc); /**/ //int dxcc2 = getDXCCFromComboBox(); int dxcc2 = world->getQRZARRLId(othersTabWidget->getEntityPrefix()); //qDebug() << "MainWindow::readDataFromUIDXModifying - DXCC: " << QString::number(dxcc) << endl; //qDebug() << "MainWindow::readDataFromUIDXModifying- DXCC2: " << QString::number(dxcc2) << endl; dxcc = util->getNormalizedDXCCValue(dxcc); dxcc2 = util->getNormalizedDXCCValue(dxcc2); if (dxcc!=dxcc2) { QString dxccn1 = world->getEntityName(dxcc); dxccn1 = dxccn1 + " - " + world->getEntityMainPrefix(dxcc); QString dxccn2 = world->getEntityName(dxcc2); dxccn2 = dxccn2 + " - " + world->getEntityMainPrefix(dxcc2); QPushButton *button2 = new QPushButton(this); QPushButton *button1 = new QPushButton(this); button1->setText(world->getEntityMainPrefix(dxcc)); button2->setText(world->getEntityMainPrefix(dxcc2)); int ret; QMessageBox msgBox; msgBox.setText( tr("You have selected an entity:") + "\n\n"+"- "+dxccn2+"\n\n"+tr("that is different from the KLog proposed entity:") + "\n\n- "+dxccn1+"\n\n" +tr("Click on the prefix of the right entity or Cancel to correct.")); msgBox.addButton(button2, QMessageBox::AcceptRole); msgBox.addButton(button1, QMessageBox::ActionRole); msgBox.addButton(QMessageBox::Cancel); ret = msgBox.exec(); if (ret == QMessageBox::AcceptRole) { dxcc = dxcc2; } else if (ret == QMessageBox::Cancel) { return "NULL"; } else {} } /**/ QString updateString = "UPDATE log SET call = '" + tqrz + "', bandid = '" + QString::number(tband) + "', modeid = '" + QString::number(tmode) + "', qso_date = '" + tdate + "', time_on = '" + ttime + "', rst_sent = '" + trsttx + "', rst_rcvd = '" + trstrx + "', lognumber = '" + QString::number(currentLog) + "', "; aux1 = dataProxy->getContinentShortNameFromEntity(dxcc); if (dataProxy->isValidContinentShortName(aux1)) { updateString = updateString + "cont = '"; updateString = updateString + aux1 + "', "; } aux1 = nameLineEdit->text(); if (aux1.length()>1) { updateString = updateString + "name = '"; updateString = updateString + aux1 + "', "; } aux1 = (locatorLineEdit->text()).toUpper(); if ( locator->isValidLocator(aux1) ) { updateString = updateString + "gridsquare = '"; updateString = updateString + aux1 + "', "; } if ( (txFreqSpinBox->value()) > 0 ) { aux1 = QString::number(txFreqSpinBox->value()); if (dataProxy->isThisFreqInBand(dataProxy->getNameFromBandId(tband), aux1) ) //if (db->isThisFreqInBand(db->getBandNameFromID2(tband), aux1) ) { updateString = updateString + "freq = '"; updateString = updateString + aux1 + "', "; } else { } } if ( (rxFreqSpinBox->value()) > 0 ) { aux1 = QString::number(rxFreqSpinBox->value()); updateString = updateString + "freq_rx = '"; updateString = updateString + aux1 + "', "; } aux1 = qthLineEdit->text(); if (aux1.length()>2) { updateString = updateString + "qth = '"; updateString = updateString + aux1 + "', "; } aux1 = myDataTabWidget->getOperator(); //aux1 = operatorLineEdit->text(); if (aux1.length()>2) { updateString = updateString + "operator = '"; updateString = updateString + aux1 + "', "; } aux1 = myDataTabWidget->getStationQRZ(); //aux1 = (stationCallSignLineEdit->text()).toUpper(); if (aux1.length()>2) { updateString = updateString + "station_callsign = '"; updateString = updateString + aux1 + "', "; } aux1 = myDataTabWidget->getMyLocator(); //aux1 = myLocatorLineEdit->text(); if (aux1.length()>2) { updateString = updateString + "my_gridsquare = '"; updateString = updateString + aux1 + "', "; } aux1 = commentTabWidget->getComment(); updateString = updateString + "comment = '"; updateString = updateString + aux1 + "', "; //aux1 = commentLineEdit->text(); /* if (aux1.length()>0) { updateString = updateString + "comment = '"; updateString = updateString + aux1 + "', "; } */ aux1 = QSLTabWidget->getQSLMsg(); //aux1 = qslmsgTextEdit->toPlainText(); if (aux1.length()>0) { updateString = updateString + "qslmsg = '"; updateString = updateString + aux1 + "', "; } aux1 = QString::number(dxcc); //qDebug() << "MainWindow::readDataFromUIDXModifying: DXCC=" << aux1 << endl; if (aux1.length()>0) { updateString = updateString + "dxcc = '"; updateString = updateString + aux1 + "', "; //qDebug() << "MainWindow::readDataFromUIDXModifying: Saving DXCC=" << aux1 << endl; } aux1 = QString::number(cqz); if (aux1.length()>0) { updateString = updateString + "cqz = '"; updateString = updateString + aux1 + "', "; } aux1 = QString::number(ituz); if (aux1.length()>0) { updateString = updateString + "ituz = '"; updateString = updateString + aux1 + "', "; } aux1 = QSLTabWidget->getQSLVia(); //aux1 = qslViaLineEdit->text(); if (aux1.length()>3) { updateString = updateString + "qsl_via = '"; updateString = updateString + aux1 + "', "; } //aux1 = QString::number(myPowerSpinBox->value()); aux1 = QString::number(myDataTabWidget->getMyPower()); if ((aux1.toDouble())>0.0) { updateString = updateString + "tx_pwr = '"; updateString = updateString + aux1 + "', "; } aux1 = QString::number(rxPowerSpinBox->value()); if ((aux1.toDouble())>0.0) { updateString = updateString + "rx_pwr = '"; updateString = updateString + aux1 + "', "; } aux1 = othersTabWidget->getIOTA(); //qDebug() << "MainWindow::readDataFromUIDX: Modifyng IOTA: " << aux1 << endl; if (aux1.length() == 6) // EU-001 { //qDebug() << "MainWindow::readDataFromUIDX: Modifyng IOTA to be saved! " << endl; updateString = updateString + "iota = '"; updateString = updateString + aux1 + "', "; } else { //qDebug() << "MainWindow::readDataFromUIDX: Modifyng IOTA NOT to be saved! Lenght="<getSatName(); //We are assuming that the SAT_NAME is always well provided. If it is blank, then no SAT QSO //qDebug() << "MainWindow::readDataFromUIDX: SAT2 modif " << aux1 << endl; //updateString = updateString + "sat_name = '"; //updateString = updateString + aux1 + "', "; if (aux1.length()>0) { updateString = updateString + "sat_name = '"; updateString = updateString + aux1 + "', "; } aux1 = satTabWidget->getSatMode(); // We are assuming that the SAT_MODE is always well provided. If it is blank, then no SAT QSO if (aux1.length()>0) { updateString = updateString + "sat_mode = '"; updateString = updateString + aux1 + "', "; } aux1 = othersTabWidget->getPropModeFromComboBox(); //aux1 = getPropModeFromComboBox(); //qDebug() << "MainWindow::readDataFromUIDX: PropMode: " << aux1 << endl; if ((aux1.length()>0) && (aux1 != "Not")) { //qDebug() << "MainWindow::readDataFromUIDX: PropMode(1): " << aux1 << endl; updateString = updateString + "prop_mode = '"; updateString = updateString + aux1 + "', "; } else if ((aux1.length()==0) || (aux1 == "Not")) { //qDebug() << "MainWindow::readDataFromUIDX: PropMode(2): " << aux1 << endl; updateString = updateString + "prop_mode = '',"; //updateString = updateString + aux1 + "', "; } else { //qDebug() << "MainWindow::readDataFromUIDX: PropMode(3): " << aux1 << endl; } //CLUBLOG aux1 = eQSLTabWidget->getClubLogStatus(); //Y, N, M if (aux1 == "Y") { updateString = updateString + "clublog_qso_upload_status = 'Y', "; updateString = updateString + "clublog_qso_upload_date = '" + (eQSLTabWidget->getClubLogDate()).toString("yyyy/MM/dd") + "', "; } else if (aux1 == "N") { updateString = updateString + "clublog_qso_upload_status = 'N', "; } else if (aux1 == "M") { updateString = updateString + "clublog_qso_upload_status = 'M', "; updateString = updateString + "clublog_qso_upload_date = '" + (eQSLTabWidget->getClubLogDate()).toString("yyyy/MM/dd") + "', "; } else //TODO: This should be equivalent to N? { updateString = updateString + "clublog_qso_upload_status = 'N', "; } //CLUBLOG // EQSL-SENT aux1 = eQSLTabWidget->getEQSLSenStatus(); if (aux1 == "Y") { updateString = updateString + "eqsl_qsl_sent = 'Y', "; updateString = updateString + "eqsl_qslsdate = '" + (eQSLTabWidget->getEQSLSenDate()).toString("yyyy/MM/dd") + "', "; } else if (aux1 == "R") { updateString = updateString + "eqsl_qsl_sent = 'R', "; } else if (aux1 == "Q") { updateString = updateString + "eqsl_qsl_sent = 'Q', "; updateString = updateString + "eqsl_qslsdate = '" + (eQSLTabWidget->getEQSLSenDate()).toString("yyyy/MM/dd") + "', "; } else if (aux1 == "I") { updateString = updateString + "eqsl_qsl_sent = 'I', "; updateString = updateString + "eqsl_qslsdate = '" + (eQSLTabWidget->getEQSLSenDate()).toString("yyyy/MM/dd") + "', "; } else // N { updateString = updateString + "eqsl_qsl_sent = 'N', "; } // EQSL-RECEPTION aux1 = eQSLTabWidget->getEQSLRecStatus(); if (aux1 == "Y") { updateString = updateString + "eqsl_qsl_rcvd = 'Y', "; updateString = updateString + "eqsl_qslrdate = '" + (eQSLTabWidget->getEQSLRecDate()).toString("yyyy/MM/dd") + "', "; } else if (aux1 == "R") { updateString = updateString + "eqsl_qsl_rcvd = 'R', "; } else if (aux1 == "I") { updateString = updateString + "eqsl_qsl_rcvd = 'I', "; } else if (aux1 == "V") { updateString = updateString + "eqsl_qsl_rcvd = 'V', "; updateString = updateString + "eqsl_qslrdate = '" + (eQSLTabWidget->getEQSLRecDate()).toString("yyyy/MM/dd") + "', "; } else { updateString = updateString + "eqsl_qsl_rcvd = 'N', "; } // LOTW-SENT aux1 = eQSLTabWidget->getLOTWSenStatus(); if (aux1 == "Y") { updateString = updateString + "lotw_qsl_sent = 'Y', "; updateString = updateString + "lotw_qslsdate = '" + (eQSLTabWidget->getLOTWSenDate()).toString("yyyy/MM/dd") + "', "; } else if (aux1 == "R") { updateString = updateString + "lotw_qsl_sent = 'R', "; } else if (aux1 == "Q") { updateString = updateString + "lotw_qsl_sent = 'Q', "; updateString = updateString + "lotw_qslsdate = '" + (eQSLTabWidget->getLOTWSenDate()).toString("yyyy/MM/dd") + "', "; } else if (aux1 == "I") { updateString = updateString + "lotw_qsl_sent = 'I', "; updateString = updateString + "lotw_qslsdate = '" + (eQSLTabWidget->getLOTWSenDate()).toString("yyyy/MM/dd") + "', "; } else { updateString = updateString + "lotw_qsl_sent = 'N', "; } // LOTW-RECEPTION //LOTW_QSLRDATE: (only valid if LOTW_RCVD is Y, I, or V) aux1 = eQSLTabWidget->getLOTWRecStatus(); if (aux1 == "Y") { updateString = updateString + "lotw_qsl_rcvd = 'Y', "; updateString = updateString + "lotw_qslrdate = '" + (eQSLTabWidget->getLOTWRecDate()).toString("yyyy/MM/dd") + "', "; } else if (aux1 == "R") { updateString = updateString + "lotw_qsl_rcvd = 'R', "; } else if (aux1 == "V") { updateString = updateString + "lotw_qsl_rcvd = 'V', "; updateString = updateString + "lotw_qslrdate = '" + (eQSLTabWidget->getLOTWRecDate()).toString("yyyy/MM/dd") + "', "; } else if (aux1 == "I") { updateString = updateString + "lotw_qsl_rcvd = 'I', "; updateString = updateString + "lotw_qslrdate = '" + (eQSLTabWidget->getLOTWRecDate()).toString("yyyy/MM/dd") + "', "; } else { updateString = updateString + "lotw_qsl_rcvd = 'N', "; } // QSL SENT //qsAux << tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("Q-Queued") << tr("I-Ignore"); //int i = qslSentComboBox->currentIndex(); //int ii = qslSentViaComboBox->currentIndex(); aux1 = QSLTabWidget->getQSLSenStatus(); aux2 = QSLTabWidget->getSentVia(); //qDebug() << "MainWindow::readDataFromUIDXModifying: aux1: " << aux1 << " / aux2: " << aux2 << endl; if (aux1 == "Y") { updateString = updateString + "qsl_sent = 'Y', "; updateString = updateString + "qslsdate = '" + (QSLTabWidget->getQSLSenDate()).toString("yyyy/MM/dd") + "', "; if (aux2 == "D") { updateString = updateString + "qsl_sent_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_sent_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_sent_via = 'M', "; } else { updateString = updateString + "qsl_sent_via = 'B', "; } } else if (aux1 == "R") { updateString = updateString + "qsl_sent = 'R', "; //updateString = updateString + "qslsdate = '" + (QSLTabWidget->getQSLSenDate()).toString("yyyy/MM/dd") + "', "; if (aux2 == "D") { updateString = updateString + "qsl_sent_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_sent_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_sent_via = 'M', "; } else { updateString = updateString + "qsl_sent_via = 'B', "; } } else if (aux1 == "Q") { updateString = updateString + "qsl_sent = 'Q', "; updateString = updateString + "qslsdate = '" + (QSLTabWidget->getQSLSenDate()).toString("yyyy/MM/dd") + "', "; if (aux2 == "D") { updateString = updateString + "qsl_sent_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_sent_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_sent_via = 'M', "; } else { updateString = updateString + "qsl_sent_via = 'B', "; } } else if (aux1 == "I") { updateString = updateString + "qsl_sent = 'I', "; updateString = updateString + "qslsdate = '" + (QSLTabWidget->getQSLSenDate()).toString("yyyy/MM/dd") + "', "; if (aux2 == "D") { updateString = updateString + "qsl_sent_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_sent_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_sent_via = 'M', "; } else { updateString = updateString + "qsl_sent_via = 'B', "; } } else { updateString = updateString + "qsl_sent = 'N', "; updateString = updateString + "qsl_sent_via = 'B', "; } // QSL RECEPTION //i = qslRecComboBox->currentIndex(); //ii = qslRecViaComboBox->currentIndex(); aux1 = QSLTabWidget->getQSLRecStatus(); aux2 = QSLTabWidget->getRecVia(); if (aux1 == "Y") { updateString = updateString + "qsl_rcvd = 'Y', "; updateString = updateString + "qslrdate = '" + (QSLTabWidget->getQSLRecDate()).toString("yyyy/MM/dd") + "', "; //updateString = updateString + "confirmed = '1', "; if (aux2 == "D") { updateString = updateString + "qsl_rcvd_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_rcvd_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_rcvd_via = 'M', "; } else { updateString = updateString + "qsl_rcvd_via = 'B', "; } } else if (aux1 == "R") { //QSL received date //(only valid if QSL_RCVD is Y, I, or V) updateString = updateString + "qsl_rcvd = 'R', "; //updateString = updateString + "confirmed = '0', "; if (aux2 == "D") { updateString = updateString + "qsl_rcvd_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_rcvd_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_rcvd_via = 'M', "; } else { updateString = updateString + "qsl_rcvd_via = 'B', "; } } else if (aux1 == "I") { //QSL received date //(only valid if QSL_RCVD is Y, I, or V) updateString = updateString + "qsl_rcvd = 'I', "; updateString = updateString + "qslrdate = '" + (QSLTabWidget->getQSLRecDate()).toString("yyyy/MM/dd") + "', "; //updateString = updateString + "confirmed = '0', "; if (aux2 == "D") { updateString = updateString + "qsl_rcvd_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_rcvd_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_rcvd_via = 'M', "; } else { updateString = updateString + "qsl_rcvd_via = 'B', "; } } else if (aux1 == "V") { //QSL received date //(only valid if QSL_RCVD is Y, I, or V) updateString = updateString + "qsl_rcvd = 'V', "; updateString = updateString + "qslrdate = '" + (QSLTabWidget->getQSLRecDate()).toString("yyyy/MM/dd") + "', "; //updateString = updateString + "confirmed = '1', "; if (aux2 == "D") { updateString = updateString + "qsl_rcvd_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_rcvd_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_rcvd_via = 'M', "; } else { updateString = updateString + "qsl_rcvd_via = 'B', "; } } else { updateString = updateString + "qsl_rcvd = 'N', "; updateString = updateString + "qsl_rcvd_via = 'B', "; } keepSatPage = satTabWidget->getRepeatThis(); // The data reading finish here. Now, we prepare the data to insert into the DB if ( updateString.endsWith(", ") ) { updateString.chop(2); } //stringQuery = "INSERT INTO log (" + stringFields + ") values (" + stringData +")" ; // updateString = "UPDATE log SET call = '" + tqrz + "', bandid = '" + QString::number(tband) + "', modeid = '" + QString::number(tmode) + "', qso_date = '" + tdate + "', time_on = '" + ttime + "', lognumber = '" + QString::number(currentLog) + "', " + updateString; stringQuery = updateString + " WHERE id = " + "'" + QString::number(modifyingQSO) + "'"; //qDebug() << "MainWindow::readDataFromUIDXModifying: queryCreated: " << stringQuery << endl; return stringQuery; } /* void MainWindow::createSearchResultsPanel() { searchBoxClearButton->setToolTip(tr("Clear the searches")); searchBoxExportButton->setToolTip(tr("Export the search result to an ADIF file")); searchBoxSelectAllButton->setToolTip(tr("Select/Unselect all the QSO of the box")); searchBoxReSearchButton->setToolTip(tr("Search in the log")); searchAllRadioButton->setToolTip(tr("Search in all logs")); searchBoxLineEdit->setToolTip(tr("Enter the QRZ to search")); searchResultsTreeWidget->setToolTip(tr("Search results")); QStringList labels; if (stationCallSignShownInSearch) { labels << tr("QRZ") << tr("Date/Time") << tr("Band") << tr("Mode") << tr("QSL Sent") << tr("QSL Rcvd") << tr("Station Callsign") << tr("Id") ; searchResultsTreeWidget->setColumnCount(8); } else { labels << tr("QRZ") << tr("Date/Time") << tr("Band") << tr("Mode") << tr("QSL Sent") << tr("QSL Rcvd") << tr("Id") ; searchResultsTreeWidget->setColumnCount(7); } searchResultsTreeWidget->setHeaderLabels(labels); //QTreeWidgetItem *item = new QTreeWidgetItem(searchResultsTreeWidget); (searchResultsTreeWidget->header())->resizeSections(QHeaderView::ResizeToContents); searchResultsTreeWidget->clear(); //searchResultsTreeWidget->collapseAll(); searchResultsTreeWidget->setSortingEnabled(true); //searchResultsTreeWidget->setItemsExpandable(false); switch (contestMode) { case CQ_WW_SSB: break; case CQ_WW_CW: break; default: break; } } */ void MainWindow::createScorePanel() { QVBoxLayout *scoreLayout = new QVBoxLayout; scoreLayout->addWidget(scoreTextEdit); scoreTextEdit->setPlainText("Test TEXT"); scoreWindow->setLayout(scoreLayout); } void MainWindow::createUICQWW() { //qDebug() << "MainWindow::createUICQWW" << endl; /* QSqlQuery query("SELECT name FROM band"); while (query.next()) { bands << query.value(0).toString(); } QSqlQuery query1("SELECT name FROM mode"); while (query1.next()) { modes << query1.value(0).toString(); } */ //bands << "10M" << "15M" << "20M" << "40M" << "80M" << "160M"; //modes << "SSB" << "CW" << "RTTY"; bandComboBox->addItems(bands); //qDebug() << "MainWindow::createUICQWW - 1-" << QString::number(modes.count()) << endl; modeComboBox->addItems(modes); qrzLineEdit->setToolTip(tr("QRZ of the QSO.")); rstTXLineEdit->setToolTip(tr("TX RST.")); rstRXLineEdit->setToolTip(tr("RX RST.")); STXLineEdit->setToolTip(tr("TX Exchange.")); SRXLineEdit->setToolTip(tr("RX Exchange.")); bandComboBox->setToolTip(tr("Band of the QSO.")); modeComboBox->setToolTip(tr("Mode of the QSO.")); dateEdit->setToolTip(tr("Date of the QSO.")); timeEdit->setToolTip(tr("Time of the QSO.")); //statusBar->setToolTip(tr("Misc information")); //qsoStatusBar->setToolTip(tr("QSO information")); OKButton->setToolTip(tr("Add the QSO to the log.")); //spotItButton->setToolTip(tr("Spots this QSO to the DX Cluster")); clearButton->setToolTip(tr("Clear the box.")); gridGroupBox = new QGroupBox(tr("Input")); QGridLayout *layout = new QGridLayout; //slotUpdateStatusBar(tr("Ready")); //updateQSOStatusBar(tr("Ready")); setRSTToMode(modeComboBox->currentText()); //rstTXLineEdit->setInputMask("#990"); //rstRXLineEdit->setInputMask("#990"); //rstTXLineEdit->setText("59"); //rstRXLineEdit->setText("59"); //rstTXLineEdit->setMaxLength(3); //rstRXLineEdit->setMaxLength(3); QGroupBox *RSTrxgroupBox = new QGroupBox(tr("RSTrx")); RSTrxgroupBox->setFlat(true); QVBoxLayout *RSTrxvbox = new QVBoxLayout; RSTrxvbox->addWidget(rstRXLineEdit); RSTrxvbox->addStretch(1); RSTrxgroupBox->setLayout(RSTrxvbox); QGroupBox *RSTtxgroupBox = new QGroupBox(tr("RSTtx")); RSTtxgroupBox->setFlat(true); QVBoxLayout *RSTtxvbox = new QVBoxLayout; RSTtxvbox->addWidget(rstTXLineEdit); RSTtxvbox->addStretch(1); RSTtxgroupBox->setLayout(RSTtxvbox); //QGroupBox *qrzgroupBox = new QGroupBox(tr("QRZ")); qrzgroupBox = new QGroupBox(tr("QRZ")); qrzgroupBox->setFlat(true); QVBoxLayout *qrzvbox = new QVBoxLayout; qrzvbox->addWidget(qrzLineEdit); qrzvbox->addStretch(1); qrzgroupBox->setLayout(qrzvbox); QGroupBox *stxgroupBox = new QGroupBox(tr("STX")); stxgroupBox->setFlat(true); QVBoxLayout *stxvbox = new QVBoxLayout; stxvbox->addWidget(STXLineEdit); stxvbox->addStretch(1); stxgroupBox->setLayout(stxvbox); QGroupBox *srxgroupBox = new QGroupBox(tr("SRX")); srxgroupBox->setFlat(true); QVBoxLayout *srxvbox = new QVBoxLayout; srxvbox->addWidget(SRXLineEdit); srxvbox->addStretch(1); srxgroupBox->setLayout(srxvbox); QHBoxLayout *RSTLayout = new QHBoxLayout; RSTLayout->addWidget(RSTtxgroupBox); RSTLayout->addWidget(RSTrxgroupBox); RSTLayout->addWidget(stxgroupBox); RSTLayout->addWidget(srxgroupBox); QHBoxLayout *TimeLayout = new QHBoxLayout; TimeLayout->addWidget(dateEdit); TimeLayout->addWidget(timeEdit); QHBoxLayout *BandModeLayout = new QHBoxLayout; BandModeLayout->addWidget(bandComboBox); BandModeLayout->addWidget(modeComboBox); //QHBoxLayout *statusBarLayout = new QHBoxLayout; //statusBarLayout->addWidget(statusBar); //statusBarLayout->addWidget(qsoStatusBar); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(OKButton); //buttonsLayout->addWidget(spotItButton); buttonsLayout->addWidget(clearButton); QDateTimeEdit *dateEdit = new QDateTimeEdit(QDate::currentDate()); dateEdit->setDisplayFormat("yyyy/MM/dd"); timeEdit->setDisplayFormat("HH:mm:ss"); layout->addWidget(qrzgroupBox, 1, 0); layout->addLayout(RSTLayout, 1, 1); layout->addLayout(TimeLayout, 2, 0); layout->addLayout(BandModeLayout, 2, 1); layout->addLayout(buttonsLayout,3, 1); //layout->addLayout(statusBarLayout, 4, 0, 2 , -1); gridGroupBox->setLayout(layout); gridGroupBox->resize(gridGroupBox->minimumSize()); mainWidget->setLayout(layout); } void MainWindow::slotOKButtonClicked(){ //qDebug() << "MainWindow::slotOKButtonClicked: " << endl; slotQRZReturnPressed(); } void MainWindow::createActionsCommon(){ // Functional widgets connections //TODO: Reimplement the possibility to enter a QSO with enter inthe following widgets: //connect(qslViaLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); // Return pressed = QSO ENTRY connect(qrzLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(SRXLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(STXLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(rstTXLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(rstRXLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(operatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(stationCallSignLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(myLocatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(locatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(qthLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(nameLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(locatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotLocatorTextChanged() ) ); connect(myLocatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotMyLocatorTextChanged() ) ); connect(txFreqSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotFreqTXChanged()) ) ; connect(rxFreqSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotFreqRXChanged()) ) ; //connect(bandComboBox, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); //connect(dateEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); //connect(timeEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); //Actions to pass the focus between QRZ / SRX connect(qrzLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotQRZTextChanged() ) ); connect(SRXLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSRXTextChanged() ) ); connect(STXLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSTXTextChanged() ) ); connect(rstTXLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotrstTXTextChanged() ) ); connect(rstRXLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotrstRXTextChanged() ) ); //connect(qslViaLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotQSLViaTextChanged() ) ); connect(bandComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotBandComboBoxChanged() ) ) ; connect(modeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotModeComboBoxChanged() ) ) ; //Buttons Actions connect(OKButton, SIGNAL(clicked()), this, SLOT(slotOKButtonClicked() ) ); //connect(spotItButton, SIGNAL(clicked()), this, SLOT(slotSpotItButtonClicked() ) ); connect(clearButton, SIGNAL(clicked()), this, SLOT(slotClearButtonClicked() ) ); // SEARCH BOX VIEW //connect(searchBoxLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSearchBoxTextChanged() ) ); //connect(searchAllRadioButton, SIGNAL(toggled(bool)), this, SLOT(slotSearchBoxSelectAllButtonClicked() ) ); //connect(searchResultsTreeWidget, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRighButtonSearch( const QPoint& ) ) ); //connect(searchResultsTreeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotDoubleClickSearch(QTreeWidgetItem *, int))); //connect(searchResultsTreeWidget, SIGNAL(itemSelectionChanged( ) ), this, SLOT(slotSearchBoxSelectionChanged( ) ) ); //connect(searchBoxExportButton, SIGNAL(clicked()), this, SLOT(slotSearchExportButtonClicked() ) ); //connect(searchBoxClearButton, SIGNAL(clicked()), this, SLOT(slotSearchClearButtonClicked() ) ); //connect(searchBoxSelectAllButton, SIGNAL(clicked()), this, SLOT(slotSearchBoxSelectAllButtonClicked() ) ); //connect(searchBoxReSearchButton, SIGNAL(clicked()), this, SLOT(slotSearchBoxReSearchButtonClicked() ) ); connect(operatingYearsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotOperatingYearComboBoxChanged() ) ) ; connect(recalculateAwardsButton, SIGNAL(clicked()), this, SLOT(slotRecalculateAwardsButtonClicked() ) ); // LOGVIEW connect(logWindow, SIGNAL(actionQSODoubleClicked ( int ) ), this, SLOT(slotDoubleClickLog( const int ) ) ); connect(logWindow, SIGNAL(updateAwards() ), this, SLOT(slotShowAwards() ) ); connect(logWindow, SIGNAL(updateSearchText()), this, SLOT(slotSearchBoxTextChanged() ) ); //When a QSO is deleted //CLUSTER //void clusterSpotToLog(const QStringList _qs); //SIGNAL dxspotclicked(const QStringList _qs) connect(dxClusterWidget, SIGNAL(dxspotclicked(QStringList)), this, SLOT(slotAnalyzeDxClusterSignal(QStringList) ) ); // CLUBLOG connect (elogClublog, SIGNAL (showMessage(QString)), this, SLOT (slotElogClubLogShowMessage(QString))); connect (elogClublog, SIGNAL (actionReturnDownload(int, int)), this, SLOT (slotElogClubLogProcessAnswer(int, int))); connect (elogClublog, SIGNAL (disableClubLogAction(bool)), this, SLOT (slotElogClubLogDisable(bool))); // SATELLITE TAB //connect (satTabWidget, SIGNAL (satBandTXChanged(QString)), this, SLOT (slotSatBandTXComboBoxChanged(QString))); // QSL TAB connect(QSLTabWidget, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed()) ); // SEARCH TAB connect(searchWidget, SIGNAL(actionQSODoubleClicked ( int ) ), this, SLOT(slotDoubleClickLog( const int ) ) ); connect(searchWidget, SIGNAL(updateAwards() ), this, SLOT(slotShowAwards() ) ); connect(searchWidget, SIGNAL(logRefresh() ), this, SLOT(slotLogRefresh() ) ); connect(searchWidget, SIGNAL(toStatusBar(QString) ), this, SLOT(slotUpdateStatusBar(QString) ) ); connect(searchWidget, SIGNAL(requestBeingShown() ), this, SLOT(slotShowSearchWidget() ) ); connect(searchWidget, SIGNAL(actionQSODelete( int ) ), this, SLOT(slotQSODelete(int) ) ); //DXCCWIDGET TAB connect(dxccStatusWidget, SIGNAL(showQso(int)), this, SLOT(slotShowQSOFromDXCCWidget(int) ) ); connect(dxccStatusWidget, SIGNAL(showQsos(QList)), this, SLOT(slotShowQSOsFromDXCCWidget(QList) ) ); //connect(dxccStatusWidget, SIGNAL(updateAwards()), this, SLOT(slotShowAwards() ) ); // UDPLogServer - WSJT-x connect(UDPLogServer, SIGNAL(status_update(int, QString, double, QString, QString, QString, QString, QString, QString)), this, SLOT(slotWSJXstatusFromUDPServer(int, QString, double, QString, QString, QString, QString, QString, QString) ) ); connect(UDPLogServer, SIGNAL( logged_qso(int,QString,double,QString,QString,QString,QString,QString,QString,QString,QString,QString,QString,QString)), this, SLOT(slotWSJTXloggedQSO(int,QString,double,QString,QString,QString,QString,QString,QString,QString,QString,QString,QString,QString) ) ); } void MainWindow::slotSearchBoxTextChanged() { searchWidget->slotSearchBoxTextChanged(); } void MainWindow::slotQSODelete(const int _id) { elogClublog->deleteQSO(dataProxy->getClubLogRealTimeFromId(_id)); //awards->recalculateAwards(); } void MainWindow::slotShowSearchWidget() { //dxUpRightTab->addTab(searchWidget, tr("Search")); //qDebug() << "MainWindow::slotShowSearchWidget: " << QString::number(dxUpRightTab->indexOf(searchWidget)) << endl; dxUpRightTab->setCurrentIndex(dxUpRightTab->indexOf(searchWidget)); } void MainWindow::slotLogRefresh() { logWindow->refresh(); } void MainWindow::slotElogClubLogDisable(const bool _b) { //qDebug() << "MainWindow::slotElogClubLogDisable: " << endl; if (_b) { clublogActive = false; setupDialog->setClubLogActive(false); } else { clublogActive = true; setupDialog->setClubLogActive(true); } //TODO: Disable clublog in the klogrc file //bool FileManager::modifySetupFile(const QString& _filename, const QString _field, const QString _value) filemanager->modifySetupFile(configFileName, "ClubLogActive", "False"); } void MainWindow::slotElogClubLogShowMessage(const QString _s) { //qDebug() << "MainWindow::slotElogClubLogShowMessage: " << _s << endl; slotUpdateStatusBar(_s); } void MainWindow::slotElogClubLogProcessAnswer(const int _i, const int _qID) { //qDebug() << "MainWindow::slotElogClubLogProcessAnswer: " <setClubLogSent(_qID, "Y", (eQSLTabWidget->getClubLogDate()).toString("yyyy/MM/dd")); } else { dataProxy->setClubLogSent(_qID, "M", (eQSLTabWidget->getClubLogDate()).toString("yyyy/MM/dd")); } } void MainWindow::slotRecalculateAwardsButtonClicked() { //qDebug() << "MainWindow::recalculateAwardsButtonClicked: " << endl; awards->recalculateAwards(); showAwards(); } void MainWindow::slotExitFromSlotDialog(const int exitID) { //qDebug() << "MainWindow::slotExitFromSlotDialog: " << QString::number(exitID) << endl; if (exitID == 2) { needToEnd = true; close(); } } void MainWindow::createActionsCQWW(){ // Functional widgets connections } void MainWindow::createActionsDX(){ // Functional widgets connections connect(nameLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(qthLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(locatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); //connect(iotaContinentComboBox, SIGNAL(activated ( int)), this, SLOT(slotIOTAComboBoxChanged() ) ) ; //QSL Actions //connect(qslSentComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotQSLSentComboBoxChanged() ) ) ; //connect(qslRecComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotQSLRecvComboBoxChanged() ) ) ; //TODO REMOVE EQSL //connect(eqslSentComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(sloteQSLSentComboBoxChanged() ) ) ; //connect(eqslRecComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(sloteQSLRecvComboBoxChanged() ) ) ; //connect(lotwSentComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotLotwSentComboBoxChanged() ) ) ; //connect(lotwRecComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotLotwRecvComboBoxChanged() ) ) ; } bool MainWindow::checkContest(){ //qDebug() << "MainWindow::checkContest: " << contestMode << endl; //contestNames << "No-Contest" <<"CQ-WW-DX-SSB" << "CQ-WW-DX-CW" << "CQ-WPX-SSB" << "CQ-WPX-CW"; QStringList qs; qs.clear(); QString qsoStatus, aux; int currentEntity = world->getQRZARRLId(currentQrz); int tband = 1 + bandComboBox->currentIndex(); //int tmode = 1 + modeComboBox->currentIndex(); if (contestMode == "DX") {} else if (contestMode == "CQ-WW-SSB") { //qDebug() << "MainWindow::checkContest: CQ-WW-SSB:" << QString::number(currentEntity) << "/" << SRXLineEdit->text() << "/" << QString::number(tband) << endl; if ( currentEntity < 1) { return false; } //Multiplier: qs << DX-Entity << DXCQz << DX-band; qs << QString::number(currentEntity) << SRXLineEdit->text() << QString::number(tband); if (contest->isMultiplier(qs)){ qrzgroupBox->setTitle(tr("NEW MULT")); //qsoStatus = tr("MULT"); aux = " + (M + "; qsoMultiplier = 1; }else{ //qsoStatus = tr("NO MULT"); aux.clear(); qsoMultiplier = 0; } // Points: //_qs << DX-Entity << DX-Continent qs.clear(); qs << QString::number(currentEntity) << QString::number(world->getContinentNumber(currentEntity)); qsoPoints = contest->getQSOPoints(qs); if (aux == " + (M + ") { qsoStatus = "Total: " + QString::number(contest->getTotalScore()) + aux + QString::number(qsoPoints) + " points)"; // qsoStatus + " / " + QString::number(qsoPoints) + tr(" points"); } else { qsoStatus = "Total: " + QString::number(contest->getTotalScore()) + " ( " + QString::number(qsoPoints) + " points)"; // qsoStatus + " / " + QString::number(qsoPoints) + tr(" points"); } //qDebug() << "MainWindow::checkContest Points: " << QString::number(contest->getQSOPoints(qs)) << endl; //qDebug() << "MainWindow::checkContest Continent: " << world->getQRZContinentNumber(qrzLineEdit->text()) << endl; } else {} slotUpdateStatusBar(qsoStatus); //statusBar()->showMessage(qsoStatus); //updateQSOStatusBar(qsoStatus); return false; } /* void MainWindow::slotQSLViaTextChanged() { //qDebug() << "MainWindow::slotQSLViaTextChanged: " << qslViaLineEdit->text() << " / Length: " << QString::number((qslViaLineEdit->text()).size()) << endl; qslViaLineEdit->setText((qslViaLineEdit->text()).toUpper()); } */ bool MainWindow::validCharactersInCall(const QString _qrz) { for (int i = 0; i<_qrz.size();i++) { if (!( ((_qrz.at(i)).isLetterOrNumber()) || (_qrz.at(i)=='\\') || (_qrz.at(i)=='/') )) { return false; } } return true; } void MainWindow::slotQRZTextChanged() { //qDebug()<< "MainWindow::slotQRZTextChanged: " << qrzLineEdit->text() << " / Length: " << QString::number((qrzLineEdit->text()).size()) << "###### START ######" << endl; if ((qrzLineEdit->text()).length()<1) { return; } int cursorP = qrzLineEdit->cursorPosition(); //qDebug()<< "MainWindow::slotQRZTextChanged: cursor position: " << QString::number(cursorP) << endl; qrzLineEdit->setText((qrzLineEdit->text()).toUpper()); if (cleaning) { //qDebug()<< "MainWindow::slotQRZTextChanged: Cleaning" << endl; return; } if (qrzAutoChanging) { //qDebug()<< "MainWindow::slotQRZTextChanged: qrzAutoChanging" << endl; qrzAutoChanging = false; return; } qrzAutoChanging = true; //qDebug()<< "MainWindow::slotQRZTextChanged: cursor position.1: " << QString::number(cursorP) << endl; if ( (qrzLineEdit->text()).endsWith(' ') ) {/*Remove the space and moves the focus to SRX to write the RX exchange*/ previousQrz = (qrzLineEdit->text()).simplified(); qrzLineEdit->setText(previousQrz); SRXLineEdit->setFocus(); //qDebug()<< "MainWindow::slotQRZTextChanged: Space detected" << endl; } //qDebug()<< "MainWindow::slotQRZTextChanged: Simplifiying & Capitalizing" << endl; qrzLineEdit->setText(((qrzLineEdit->text())).simplified()); qrzLineEdit->setText((qrzLineEdit->text()).remove(" ")); //qrzLineEdit->setText((qrzLineEdit->text()).toUpper()); //qDebug()<< "MainWindow::slotQRZTextChanged: checking for invalid chars" << endl; if (!validCharactersInCall(qrzLineEdit->text())) { infoLabel1->setText(tr("Invalid characters used in the QRZ")); InValidCharsInPrevCall = true; return; } //qDebug()<< "MainWindow::slotQRZTextChanged: checking for length" << endl; if (((qrzLineEdit->text()).length() < 1)) { // If QRZ box is blank, Information labels should be cleared. infoLabel1->clear(); infoLabel2->clear(); //slotClearButtonClicked(); clearForNextQSO(); return; } //qDebug()<< "MainWindow::slotQRZTextChanged: checking for modify or length<1" << endl; if (((qrzLineEdit->text()).length() < 1) || (qrzSmallModDontCalculate)) //if ((modify) || ((qrzLineEdit->text()).length() < 1) || (qrzSmallModDontCalculate)) { //qDebug() << "MainWindow::slotQRZTextChanged: MODIFY or Lenght < 1" << endl; qrzSmallModDontCalculate=false; return; } //qDebug()<< "MainWindow::slotQRZTextChanged: running..." << endl; qrzSmallModDontCalculate = true; // A kind of flag to prevent multiple calls to this method. //int i; int dx_CQz = -1; int dxE_CQz = -1; int dx_ITUz = -1; int dxE_ITUz = -1; currentQrz = qrzLineEdit->text(); if ((currentQrz).count('\\')){ // Replaces \ by / to ease operation. currentQrz.replace(QChar('\\'), QChar('/')); qrzLineEdit->setText(currentQrz); } currentQrz = qrzLineEdit->text(); //qDebug()<< "MainWindow::slotQRZTextChanged: cursor position.3: " << QString::number(cursorP) << endl; if (cursorP>currentQrz.length()) {// A Space that has been removed without updating the cursor //qDebug()<< "MainWindow::slotQRZTextChanged: cursorP > currentQRZ.length" << endl; } else { if (cursorP==0) { } else if ((currentQrz.at(cursorP-1)).isSpace()) { //qDebug()<< "MainWindow::slotQRZTextChanged: cursor position.5: " << QString::number(cursorP) << endl; previousQrz = currentQrz.remove(cursorP-1, 1); //qDebug()<< "MainWindow::slotQRZTextChanged: cursor position.6: " << QString::number(cursorP) << endl; cursorP--; //qDebug()<< "MainWindow::slotQRZTextChanged: cursor position.7: " << QString::number(cursorP) << endl; qrzLineEdit->setText(previousQrz); } } currentQrz = qrzLineEdit->text(); currentEntity = world->getQRZARRLId(currentQrz); //selectCorrectComboBoxEntity(currentEntity); //qDebug() << "MainWindow::slotQRZTextChanged: " << QString::number(currentEntity) << endl; othersTabWidget->setEntity(currentEntity); //qDebug() << "MainWindow::slotQRZTextChanged: DXCC/ISOname: " << QString::number(currentEntity) << "/" << dataProxy->getISOName(currentEntity) << endl; //qDebug() << "MainWindow::slotQRZTextChanged: Entity: " << QString::number(currentEntity) << endl; dxE_CQz = world->getEntityCqz(currentEntity); dx_CQz = world->getQRZCqz(currentQrz); dx_ITUz = world->getQRZItuz(currentQrz); dxE_ITUz = world->getEntityItuz(currentEntity); //qDebug()<< "MainWindow::slotQRZTextChanged: CQ: " << QString::number(dx_CQz) << endl; //qDebug()<< "MainWindow::slotQRZTextChanged: CQe: " << QString::number(dxE_CQz) << endl; //qDebug()<< "MainWindow::slotQRZTextChanged: ITU: " << QString::number(dx_ITUz) << endl; //qDebug()<< "MainWindow::slotQRZTextChanged: ITUe: " << QString::number(dxE_ITUz) << endl; if (dx_CQz == dxE_CQz) { dx_CQz = dxE_CQz; } if (dx_ITUz == dxE_ITUz) { dx_ITUz = dxE_ITUz; } QStringList _qs; //for the showStatusOfDXCC(const QStringList _qs) _qs.clear(); _qs << QString::number(currentEntity) << QString::number(currentBand) << QString::number(currentMode) << QString::number(currentLog); if ( locator->isValidLocator((locatorLineEdit->text()).toUpper()) ) { dxLocator = (locatorLineEdit->text()).toUpper(); } else { dxLocator = world->getLocator(currentEntity); } // NOW ONLY SPECIFIC ACTIONS DEPENDING ON THE RUNNING MODE if (contestMode == "DX") { //qDebug() << "MainWindow::slotQRZTextChanged: Default:" << endl; //qDebug() << "MainWindow::slotQRZTextChanged: - current/previous" << QString::number(currentEntity) << "/" << QString::number(previousEntity) << endl; if ( (currentEntity != previousEntity) || ((infoLabel2->text()).length() < 1) || (InValidCharsInPrevCall) || (dx_CQz != dxE_CQz) || (dx_ITUz != dxE_ITUz)) { //qDebug() << "MainWindow::slotQRZTextChanged: currentEntity=" << QString::number(currentEntity) << "/previousEntity=" << QString::number(previousEntity) << endl; previousEntity = currentEntity; InValidCharsInPrevCall = false; infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity, dx_CQz, dx_ITUz); infoWidget->showDistanceAndBearing(myLocator, dxLocator); showStatusOfDXCC(_qs); showDXMarathonNeeded(currentEntity, dx_CQz, dateEdit->date().year(), currentLog); othersTabWidget->setIOTAContinentFromEntity(currentEntity); } else if ((dx_CQz == dxE_CQz) || (dx_ITUz = dxE_ITUz)) { infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity, dx_CQz, dx_ITUz); } else { //qDebug() << "MainWindow::slotQRZTextChanged: Default: else" << endl; } } else if (contestMode == "CQ-WW-SSB") { //qDebug() << "MainWindow::slotQRZTextChanged: CQ-WW-SSB:" << endl; STXLineEdit->setText(QString::number(my_CQz)); // My Own CQZ if (dx_CQz > 0) { //if(QString::number(world->getQRZCqz(qrzLineEdit->text())) > 0 ){ SRXLineEdit->setText(QString::number(dx_CQz)); }else{ //qDebug() << "MainWindow::checkContest CQZ < 0"<< endl; } if (currentEntity>0){ slotUpdateStatusBar(world->getEntityName(currentEntity) + " - CQ: " + QString::number(dx_CQz) + " - ITU: " + QString::number(dx_ITUz)); } else { slotUpdateStatusBar(tr("Ready...")); } checkIfWorkedB4(currentQrz); // Has the QSO id if worked before checkContest(); } else { //qDebug() << "MainWindow::slotQRZTextChanged: Default:" << endl; //qDebug() << "MainWindow::slotQRZTextChanged: - current/previous" << QString::number(currentEntity) << "/" << QString::number(previousEntity) << endl; if ( (currentEntity != previousEntity) || ((infoLabel2->text()).length() < 1) || (InValidCharsInPrevCall) || (dx_CQz != dxE_CQz) || (dx_ITUz != dxE_ITUz)) { //qDebug() << "MainWindow::slotQRZTextChanged: currentEntity=" << QString::number(currentEntity) << "/previousEntity=" << QString::number(previousEntity) << endl; previousEntity = currentEntity; InValidCharsInPrevCall = false; infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity, dx_CQz, dx_ITUz); infoWidget->showDistanceAndBearing(myLocator, dxLocator); showStatusOfDXCC(_qs); showDXMarathonNeeded(currentEntity, dx_CQz, dateEdit->date().year(), currentLog); othersTabWidget->setIOTAContinentFromEntity(currentEntity); } else if ((dx_CQz == dxE_CQz) || (dx_ITUz = dxE_ITUz)) { infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity, dx_CQz, dx_ITUz); } else { //qDebug() << "MainWindow::slotQRZTextChanged: Default: else" << endl; } } qrzSmallModDontCalculate = false; // If the text has not been modified in this method //qDebug() << "MainWindow::slotQRZTextChanged: cursorP at the end : " << QString::number(cursorP) << endl; qrzLineEdit->setCursorPosition(cursorP); completeWithPreviousQSO(currentQrz); qrzAutoChanging = false; //qDebug() << "MainWindow::slotQRZTextChanged: END" << endl; } void MainWindow::slotQRZSpacePressed() { //qDebug() << "MainWindow::slotQRZSpacePressed: " << endl; } void MainWindow::slotSRXTextChanged() { //qDebug() << "MainWindow::slotSRXTextChanged: " << SRXLineEdit->text() << endl; srx = SRXLineEdit->text(); //int i = srx.size(); if ( srx.endsWith(' ') ) { /*Remove the space and moves the focus to QRZ*/ srx = srx.simplified(); SRXLineEdit->setText(srx); qrzLineEdit->setFocus(Qt::OtherFocusReason); } } void MainWindow::slotSTXTextChanged() { //qDebug() << "MainWindow::slotSTXTextChanged: " << STXLineEdit->text() << endl; stx = STXLineEdit->text(); //int i = stx.size(); if ( stx.endsWith(' ') ) { /*Remove the space and moves the focus to QRZ*/ stx = stx.simplified(); STXLineEdit->setText(stx); SRXLineEdit->setFocus(Qt::OtherFocusReason); } } void MainWindow::setRSTToMode(const QString _m) { //qDebug() << "MainWindow::setRSTToMode: " << _m << endl; if ((_m == "SSB") || (_m== "LSB") || (_m=="USB") ) { //qDebug() << "MainWindow::setRSTToMode: Detected SSB/LSB/USB" << endl; rstTXLineEdit->setInputMask("#DD"); rstRXLineEdit->setInputMask("#DD"); rstTXLineEdit->setText("59"); rstRXLineEdit->setText("59"); rstTXLineEdit->setMaxLength(2); rstRXLineEdit->setMaxLength(2); } else if ((_m == "CW") || (_m == "RTTY")) { rstTXLineEdit->setInputMask("DDD"); rstRXLineEdit->setInputMask("DDD"); rstTXLineEdit->setText("599"); rstRXLineEdit->setText("599"); rstTXLineEdit->setMaxLength(3); rstRXLineEdit->setMaxLength(3); } else if (_m == "PSK31") { rstTXLineEdit->setInputMask("#DD0"); rstRXLineEdit->setInputMask("#DD0"); rstTXLineEdit->setText("599"); rstRXLineEdit->setText("599"); rstTXLineEdit->setMaxLength(4); rstRXLineEdit->setMaxLength(4); } else { // By default SSB RST is configured but anything could be added rstTXLineEdit->setInputMask("#xxx"); rstRXLineEdit->setInputMask("#xxx"); rstTXLineEdit->setText("59"); rstRXLineEdit->setText("59"); rstTXLineEdit->setMaxLength(4); rstRXLineEdit->setMaxLength(4); } } void MainWindow::slotrstTXTextChanged() { } void MainWindow::slotrstRXTextChanged() { } void MainWindow::slotSpotItButtonClicked() { if (!dxClusterWidget->isConnected()) { return; } } void MainWindow::clearForNextQSO() { cleaning = true; modify = false; OKButton->setText(tr("&Add")); modifyingQSO = -1; qrzLineEdit->clear(); qrzLineEdit->setFocus(Qt::OtherFocusReason); setRSTToMode(modeComboBox->currentText()); //rstTXLineEdit->setText("59"); //rstRXLineEdit->setText("59"); qthLineEdit->clear(); //bandComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); //modeComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); //qDebug() << "MainWindow::clearForNextQSO: - currentBand: " << QString::number(currentBand) << endl; //qDebug() << "MainWindow::clearForNextQSO: - defaultBand: " << QString::number(defaultBand) << endl; //qDebug() << "MainWindow::clearForNextQSO: - mode: " << QString::number(currentMode) << endl; //qDebug() << "MainWindow::clearForNextQSO: - defaultMode: " << QString::number(defaultMode) << endl; //if (currentBand < 0) //{ // currentBand = defaultBand; //} //qDebug() << "MainWindow::MainWindow: - Changing from: " << bandComboBox->currentText() << endl; //bandComboBox->setCurrentIndex(bandComboBox->findText(dataProxy->getNameFromBandId(currentBand), Qt::MatchCaseSensitive)); //qDebug() << "MainWindow::MainWindow: - Changing to: " << bandComboBox->currentText() << endl; //qDebug() << "MainWindow::MainWindow: 12 - currentMode: " << QString::number(currentMode) << endl; //if (currentMode < 0) // { // currentMode = defaultMode; //} //modeComboBox->setCurrentIndex(modeComboBox->findText(dataProxy->getSubModeFromId(currentMode), Qt::MatchCaseSensitive)); qsoPoints = 0; qsoMultiplier = 0; clublogAnswer = -1; clublogPrevQSO.clear(); clearUIDX(); /* if (contestMode == "DX") { clearUIDX(); } else if (contestMode == "CQ-WW-SSB") { } else { clearUIDX(); } */ statusBar()->clearMessage(); cleaning = false; //qDebug() << "MainWindow::clearForNextQSO: " << modeComboBox->currentText() << endl; //qDebug() << "MainWindow::clearForNextQSO - currentMode = " << QString::number(currentMode) << endl; //qDebug() << "MainWindow::clearForNextQSO - END" << endl; } void MainWindow::slotClearButtonClicked() { //qDebug() << "MainWindow::slotClearButtonClicked - START" << endl; //qDebug() << "MainWindow::slotClearButtonClicked: " << modeComboBox->currentText() << endl; cleaning = true; modify = false; OKButton->setText(tr("&Add")); modifyingQSO = -1; qrzLineEdit->clear(); qrzLineEdit->setFocus(Qt::OtherFocusReason); setRSTToMode(modeComboBox->currentText()); //rstTXLineEdit->setText("59"); //rstRXLineEdit->setText("59"); qthLineEdit->clear(); //qDebug() << "MainWindow::slotClearButtonClicked: - currentBand: " << QString::number(currentBand) << endl; //qDebug() << "MainWindow::slotClearButtonClicked: - currentBand: " << bandComboBox->currentText() << endl; //qDebug() << "MainWindow::slotClearButtonClicked: - defaultBand: " << QString::number(defaultBand) << endl; //qDebug() << "MainWindow::slotClearButtonClicked: - mode: " << QString::number(currentMode) << endl; //qDebug() << "MainWindow::slotClearButtonClicked: - defaultMode: " << QString::number(defaultMode) << endl; if (currentBand < 0) { currentBand = defaultBand; } //qDebug() << "MainWindow::MainWindow: - Changing from: " << bandComboBox->currentText() << endl; bandComboBox->setCurrentIndex(bandComboBox->findText(dataProxy->getNameFromBandId(currentBand), Qt::MatchCaseSensitive)); //qDebug() << "MainWindow::slotClearButtonClicked: - 10" << endl; //qDebug() << "MainWindow::MainWindow: - Changing to: " << bandComboBox->currentText() << endl; //qDebug() << "MainWindow::MainWindow: 12 - currentMode: " << QString::number(currentMode) << endl; if (currentMode < 0) { currentMode = defaultMode; //qDebug << "MainWindow::MainWindow: 12b - currentMode: " << QString::number(currentMode) << endl; } /* int indexm = modeComboBox->findText(dataProxy->getSubModeFromId(currentMode), Qt::MatchCaseSensitive); if (indexm >=0) { modeComboBox->setCurrentIndex(indexm); } else { modeComboBox->setCurrentIndex(0); } */ //modeComboBox->setCurrentIndex(modeComboBox->findText(dataProxy->getNameFromSubModeId(currentMode))); qsoPoints = 0; qsoMultiplier = 0; clublogAnswer = -1; clublogPrevQSO.clear(); //qDebug() << "MainWindow::slotClearButtonClicked: - 11" << endl; if (contestMode == "DX") { //qDebug() << "MainWindow::slotClearButtonClicked: - 12" << endl; clearUIDX(true); //qDebug() << "MainWindow::slotClearButtonClicked: - 13" << endl; } else if (contestMode == "CQ-WW-SSB") { //qDebug() << "MainWindow::slotClearButtonClicked: - 20" << endl; SRXLineEdit->clear(); STXLineEdit->setText( QString::number( world->getQRZCqz(stationQRZ) ) ); qrzgroupBox->setTitle(tr("QRZ")); } else if (contestMode == "CQ-WW-CW") { //qDebug() << "MainWindow::slotClearButtonClicked: - 30" << endl; SRXLineEdit->clear(); STXLineEdit->setText( QString::number( world->getQRZCqz(stationQRZ) ) ); qrzgroupBox->setTitle(tr("QRZ")); } else { //qDebug() << "MainWindow::slotClearButtonClicked: - 40" << endl; clearUIDX(true); //qDebug() << "MainWindow::slotClearButtonClicked: - 41" << endl; } statusBar()->clearMessage(); cleaning = false; //qDebug() << "MainWindow::slotClearButtonClicked: " << modeComboBox->currentText() << endl; //qDebug() << "MainWindow::slotClearButtonClicked - currentMode = " << QString::number(currentMode) << endl; //qDebug() << "MainWindow::slotClearButtonClicked - END" << endl; } void MainWindow::clearUIDX(bool full) { //qDebug() << "MainWindow::clearUIDX" << endl; SRXLineEdit->setText("59"); STXLineEdit->setText("59"); nameLineEdit->clear(); locatorLineEdit->clear(); commentTabWidget->clear(); infoLabel1->clear(); infoLabel2->clear(); rxPowerSpinBox->setValue(0); eQSLTabWidget->clear(); QSLTabWidget->clear(); othersTabWidget->clear(); satTabWidget->clear(); myDataTabWidget->clear(keepMyData); if (full) { txFreqSpinBox->setValue((dataProxy->getFreqFromBandId(dataProxy->getIdFromBandName(bandComboBox->currentText()))).toDouble()); rxFreqSpinBox->setValue(0); } //qDebug() << "MainWindow::clearUIDX - END" << endl; } /* void MainWindow::clearBandLabels() { bandLabel1->setStyleSheet("* { background-color: " + defaultColor.name() + "; }"); bandLabel2->setStyleSheet("* { background-color: " + defaultColor.name() + "; }"); bandLabel3->setStyleSheet("* { background-color: " + defaultColor.name() + "; }"); bandLabel4->setStyleSheet("* { background-color: " + defaultColor.name() + "; }"); bandLabel5->setStyleSheet("* { background-color: " + defaultColor.name() + "; }"); bandLabel6->setStyleSheet("* { background-color: " + defaultColor.name() + "; }"); bandLabel7->setStyleSheet("* { background-color: " + defaultColor.name() + "; }"); bandLabel8->setStyleSheet("* { background-color: " + defaultColor.name() + "; }"); bandLabel9->setStyleSheet("* { background-color: " + defaultColor.name() + "; }"); bandLabel10->setStyleSheet("* { background-color: " + defaultColor.name() + "; }"); bandLabel11->setStyleSheet("* { background-color: " + defaultColor.name() + "; }"); bandLabel12->setStyleSheet("* { background-color: " + defaultColor.name() + "; }"); } */ void MainWindow::slotRefreshDXCCWidget() { dxccStatusWidget->slotRefreshButtonClicked(); } void MainWindow::slotUpdateTime() { // //qDebug() << "MainWindow::slotUpdateTime: " << (dateTime->currentDateTime()).toString("yyyy-MM-dd - hh:mm:ss") << endl; dateTime->currentDateTime(); if ( (!modify) && (realTime) ) { if (UTCTime) { timeEdit->setTime((dateTime->currentDateTime().toUTC()).time()); dateEdit->setDate((dateTime->currentDateTime().toUTC()).date()); } else { timeEdit->setTime((dateTime->currentDateTime()).time()); dateEdit->setDate((dateTime->currentDateTime()).date()); } } } void MainWindow::closeEvent(QCloseEvent *event) { //qDebug() << "MainWindow::closeEvent" << endl; if (maybeSave()) { dataProxy->unMarkAllQSO(); //slotFileClose(); dataProxy->compressDB(); //db->compress(); event->accept(); } else { event->ignore(); } } bool MainWindow::maybeSave() { //qDebug() << "MainWindow::maybeSave" << endl; QString str = tr("The logfile has been modified.") + "\n" + tr("Do you want to save your changes?"); if ((alwaysADIF) || (DBinMemory) ) { if (needToSave) { QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, "KLog", str, QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); if (ret == QMessageBox::Save) { if (useDefaultLogFileName) { return saveFile(defaultADIFLogFile); } else { return saveFileAs(); } } else if (ret == QMessageBox::Cancel) return false; } } return true; } void MainWindow::createMenusCommon() { //qDebug() << "MainWindow::createMenusCommon" << endl; fileMenu = menuBar()->addMenu(tr("&File")); openAct = new QAction(tr("&New..."), this); fileMenu->addAction(openAct); //openAct->setShortcut(Qt::CTRL + Qt::Key_N); connect(openAct, SIGNAL(triggered()), this, SLOT(newFile())); openAct = new QAction(tr("&Open..."), this); fileMenu->addAction(openAct); openAct->setShortcut(Qt::CTRL + Qt::Key_O); connect(openAct, SIGNAL(triggered()), this, SLOT(openFile())); ADIFImport = new QAction(tr("&Import from ADIF..."), this); fileMenu->addAction(ADIFImport); connect(ADIFImport, SIGNAL(triggered()), this, SLOT(slotADIFImport())); ADIFImport->setToolTip(tr("Import an ADIF file into the current log.")); //LoTWImport = new QAction(tr("&Import from LoTW..."), this); //fileMenu->addAction(LoTWImport); //connect(LoTWImport, SIGNAL(triggered()), this, SLOT(slotLoTWImport())); //LoTWImport->setToolTip(tr("Import an LoTW file into the current log")); fileMenu->addSeparator(); saveAct = new QAction(tr("&Save As..."), this); fileMenu->addAction(saveAct); saveAct->setShortcut(Qt::CTRL + Qt::Key_S); connect(saveAct, SIGNAL(triggered()), this, SLOT(saveFileAs())); fileMenu->addSeparator(); ADIFExport = new QAction(tr("Export to ADIF..."), this); fileMenu->addAction(ADIFExport); //ADIFExport->setMenuRole(QAction::ApplicationSpecificRole); connect(ADIFExport, SIGNAL(triggered()), this, SLOT(slotADIFExport())); ADIFExport->setToolTip(tr("Export the current log to an ADIF logfile.")); ADIFExportAll = new QAction(tr("Export all logs to ADIF..."), this); fileMenu->addAction(ADIFExportAll); //ADIFExport->setMenuRole(QAction::ApplicationSpecificRole); connect(ADIFExportAll, SIGNAL(triggered()), this, SLOT(slotADIFExportAll())); ADIFExportAll->setToolTip(tr("Export ALL the QSOs into one ADIF file, merging QSOs from all the logs.")); ReqQSLExport = new QAction(tr("Export Requested QSL to ADIF..."), this); fileMenu->addAction(ReqQSLExport); connect(ReqQSLExport, SIGNAL(triggered()), this, SLOT(slotRQSLExport())); ReqQSLExport->setToolTip(tr("Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a QSL tag printing program).")); LoTWExport = new QAction(tr("Export ADIF for LoTW..."), this); fileMenu->addAction(LoTWExport); connect(LoTWExport, SIGNAL(triggered()), this, SLOT(slotLoTWExport())); LoTWExport->setToolTip(tr("Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before uploading to LoTW!")); fileMenu->addSeparator(); printLogAct = new QAction(tr("&Print Log..."), this); fileMenu->addAction(printLogAct); printLogAct->setShortcut(Qt::CTRL + Qt::Key_P); printLogAct->setToolTip(tr("Print your log.")); connect(printLogAct, SIGNAL(triggered()), this, SLOT(slotFilePrint())); fileMenu->addSeparator(); klogFolderAct = new QAction(tr("KLog folder"), this); fileMenu->addAction(klogFolderAct); printLogAct->setToolTip(tr("Opens the data folder of KLog.")); connect(klogFolderAct, SIGNAL(triggered()), this, SLOT(slotOpenKLogFolder())); fileMenu->addSeparator(); exitAct = new QAction(tr("E&xit"), this); fileMenu->addAction(exitAct); exitAct->setMenuRole(QAction::QuitRole); exitAct->setShortcut(Qt::CTRL + Qt::Key_X); connect(exitAct, SIGNAL(triggered()), this, SLOT(close())); toolMenu = menuBar()->addMenu(tr("&Tools")); fillQsoAct = new QAction(tr("Fill in QSO data"), this); toolMenu->addAction(fillQsoAct); //fillQsoAct->setMenuRole(QAction::ApplicationSpecificRole); connect(fillQsoAct, SIGNAL(triggered()), this, SLOT(fillQSOData())); fillQsoAct->setToolTip(tr("Go through the log reusing previous QSOs to fill missing information in other QSOs.")); fillDXCCAct = new QAction(tr("Fill in DXCC data"), this); toolMenu->addAction(fillDXCCAct); connect(fillDXCCAct, SIGNAL(triggered()), this, SLOT(slotFillEmptyDXCCInTheLog())); fillDXCCAct->setToolTip(tr("Go through the log filling QSOs without a DXCC defined.")); toolMenu->addSeparator(); qslToolMenu = toolMenu->addMenu(tr("QSL tools...")); //findQSO2QSLAct = new QAction(tr("&Find QSO to QSL"), this); //toolMenu->addAction(findQSO2QSLAct); //connect(findQSO2QSLAct, SIGNAL(triggered()), this, SLOT(slotSearchToolNeededQSLToSend())); //findQSO2QSLAct->setToolTip(tr("Shows QSOs for which you should send your QSL and request the DX QSL")); findQSO2QSLAct = new QAction(tr("&Find QSO to QSL"), this); qslToolMenu->addAction(findQSO2QSLAct); connect(findQSO2QSLAct, SIGNAL(triggered()), this, SLOT(slotSearchToolNeededQSLToSend())); findQSO2QSLAct->setToolTip(tr("Shows QSOs for which you should send your QSL and request the DX QSL.")); findRequestedQSLAct = new QAction(tr("Find My-QSLs pending to send"), this); qslToolMenu->addAction(findRequestedQSLAct); //findQSO2QSLAct->setMenuRole(QAction::ApplicationSpecificRole); connect(findRequestedQSLAct, SIGNAL(triggered()), this, SLOT(slotToolSearchRequestedQSLToSend())); findRequestedQSLAct->setToolTip(tr("Shows the QSOs with pending requests to send QSLs. You should keep this queue empty!")); findQSLPendingToReceiveAct = new QAction(tr("&Find DX-QSLs pending to receive"), this); qslToolMenu->addAction(findQSLPendingToReceiveAct); connect(findQSLPendingToReceiveAct, SIGNAL(triggered()), this, SLOT(slotToolSearchNeededQSLPendingToReceive())); findQSLPendingToReceiveAct->setToolTip(tr("Shows the DX-QSL that has been requested or QSLs has been sent with no answer.")); findQSLDXRequestedAct = new QAction(tr("&Find requested pending to receive"), this); qslToolMenu->addAction(findQSLDXRequestedAct); connect(findQSLDXRequestedAct, SIGNAL(triggered()), this, SLOT(slotToolSearchNeededQSLRequested())); findQSLDXRequestedAct->setToolTip(tr("Shows the DX-QSL that has been requested.")); toolMenu->addSeparator(); lotwToolMenu = toolMenu->addMenu(tr("LoTW tools...")); lotwMarkSentQueuedThisLogAct = new QAction(tr("Queue all QSL to be sent of this log"), this); lotwToolMenu->addAction(lotwMarkSentQueuedThisLogAct); connect(lotwMarkSentQueuedThisLogAct, SIGNAL(triggered()), this, SLOT(slotToolLoTWMarkAllQueuedThisLog())); lotwMarkSentQueuedThisLogAct->setToolTip(tr("Mark all non sent QSOs in this log as queued to be uploaded.")); lotwMarkSentQueuedAct = new QAction(tr("Queue all QSL to be sent"), this); lotwToolMenu ->addAction(lotwMarkSentQueuedAct); connect(lotwMarkSentQueuedAct, SIGNAL(triggered()), this, SLOT(slotToolLoTWMarkAllQueued())); lotwMarkSentQueuedAct->setToolTip(tr("Mark all non sent QSOs as queued to be uploaded.")); lotwToolMenu->addSeparator(); lotwMarkSentYesThisLogAct = new QAction(tr("Mark as sent all queued QSO of this log"), this); lotwToolMenu->addAction(lotwMarkSentYesThisLogAct); connect(lotwMarkSentYesThisLogAct, SIGNAL(triggered()), this, SLOT(slotToolLoTWMarkAllYesThisLog())); lotwMarkSentYesThisLogAct->setToolTip(tr("Mark all queued QSOs in this log as sent to LoTW.")); lotwMarkSentYesAct = new QAction(tr("Mark all queued QSO as sent"), this); lotwToolMenu ->addAction(lotwMarkSentYesAct); connect(lotwMarkSentYesAct, SIGNAL(triggered()), this, SLOT(slotToolLoTWMarkAllYes())); lotwMarkSentYesAct->setToolTip(tr("Mark all queued QSOs as sent to LoTW.")); toolMenu->addSeparator(); downloadCTYAct = new QAction (tr("&Update cty.csv"), this); toolMenu->addAction(downloadCTYAct); //downloadCTYAct->setMenuRole(QAction::ApplicationSpecificRole); connect(downloadCTYAct, SIGNAL(triggered()), this, SLOT(slotUpdateCTYDAT())); downloadCTYAct->setToolTip(tr("For updated DX-Entity data, update cty.csv.")); downloadSATSAct = new QAction (tr("&Update Satellite Data"), this); toolMenu->addAction(downloadSATSAct); connect(downloadSATSAct, SIGNAL(triggered()), this, SLOT(slotUpdateSATSDAT())); downloadSATSAct->setToolTip(tr("For updated DX-Entity data, update cty.csv.")); toolMenu->addSeparator(); showStatsAct = new QAction (tr("Stats"), this); toolMenu->addAction(showStatsAct); connect(showStatsAct, SIGNAL(triggered()), this, SLOT(slotShowStats())); //connect(statsWidget, SIGNAL(visibilityChanged(bool)), this, SLOT(slotCloseStats(bool))); showStatsAct->setToolTip(tr("Show the statistics of your radio activity.")); toolMenu->addSeparator(); setupMenu = menuBar()->addMenu(tr("&Setup")); setupAct = new QAction(tr("&Setup..."), this); setupMenu->addAction(setupAct); setupAct->setMenuRole(QAction::PreferencesRole); connect(setupAct, SIGNAL(triggered()), this, SLOT(slotSetup())); //TODO: To be added once the help dialog has been implemented helpMenu = menuBar()->addMenu(tr("&Help")); updateAct = new QAction(tr("Check updates..."), this); helpMenu->addAction(updateAct); updateAct->setMenuRole(QAction::ApplicationSpecificRole); connect(updateAct, SIGNAL(triggered()), this, SLOT(slotHelpCheckUpdatesAction())); aboutAct = new QAction(tr("&About..."), this); helpMenu->addAction(aboutAct); aboutAct->setMenuRole(QAction::AboutRole); connect(aboutAct, SIGNAL(triggered()), this, SLOT(slotHelpAboutAction())); aboutQtAct = new QAction(tr("About Qt..."), this); helpMenu->addAction(aboutQtAct); aboutQtAct->setMenuRole(QAction::AboutQtRole); connect(aboutQtAct, SIGNAL(triggered()), this, SLOT(slotAboutQt())); } void MainWindow::slotCloseStats(bool _vis) { statsWidget->clear(); } void MainWindow::slotSearchToolNeededQSLToSend() { slotShowSearchWidget(); searchWidget->searchToolNeededQSLToSend(); } void MainWindow::slotToolSearchRequestedQSLToSend() { searchWidget->slotToolSearchRequestedQSLToSend(); } void MainWindow::slotToolSearchNeededQSLPendingToReceive() { searchWidget->slotToolSearchNeededQSLPendingToReceive(); } void MainWindow::slotToolSearchNeededQSLRequested() { searchWidget->slotToolSearchNeededQSLRequested(); } void MainWindow::slotToolLoTWMarkAllQueuedThisLog() { //qDebug() << "MainWindow::slotToolLoTWMarkAllQueuedThisLog" << endl; QString tdate = (dateEdit->date()).toString("yyyy/MM/dd"); if(dataProxy->lotwSentQueue(tdate, currentLog)) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog LoTW")); msgBox.setText(tr("All pending QSO of this log has been marked as queued for LoTW!") + "\n\n" + tr("Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW.")); msgBox.exec(); } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog LoTW")); msgBox.setText(tr("There was a problem to mark all pending QSO of this log as queued for LoTW!") ); msgBox.exec(); } } void MainWindow::slotToolLoTWMarkAllQueued() { //qDebug() << "MainWindow::slotToolLoTWMarkAllQueued" << endl; QString tdate = (dateEdit->date()).toString("yyyy/MM/dd"); if (dataProxy->lotwSentQueue(tdate, -1)) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog LoTW")); msgBox.setText(tr("All pending QSO has been marked as queued for LoTW!") + "\n\n" + tr("Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW.")); msgBox.exec(); } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog LoTW")); msgBox.setText(tr("There was a problem to mark all pending QSO of this log as queued for LoTW!") ); msgBox.exec(); } } QString MainWindow::selectStationCallsign() { QString stationCallToUse = QString(); QStringList stationCallSigns; stationCallSigns.clear(); stationCallSigns << "NONE"; stationCallSigns << dataProxy->getStationCallSignsFromLog(-1); //bool callsignTyped = false; if (stationCallSigns.length()>1) { QString msg = QString(tr("The log that you have selected contains more than just one station callsign.") + "\n\n" + tr("Please select the station callsign you want to mark as sent to LoTW:")); bool ok; stationCallToUse = QInputDialog::getItem(this, tr("Station Callsign:"), msg, stationCallSigns, 0, false, &ok); if (ok && !stationCallToUse.isEmpty()) { return stationCallToUse; } else { stationCallToUse = (QInputDialog::getText(this, tr("Define Station Callsign"), tr("You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the call you are entering here.") + "\n\n" + tr("Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined:"), QLineEdit::Normal, "", &ok)).toUpper(); if (ok) { //callsignTyped = true; return stationCallToUse; } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); QString aux = QString(tr("No station callsign has been selected and therefore no log will be marked") ); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: // Ok was clicked //return ; break; default: // should never be reached break; } } } } return QString(); } void MainWindow::slotToolLoTWMarkAllYesThisLog() { //qDebug() << "MainWindow::slotToolLoTWMarkAllYesThisLog" << endl; QString tdate = (dateEdit->date()).toString("yyyy/MM/dd"); if(dataProxy->lotwSentYes(tdate, currentLog, "ALL")) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog LoTW")); msgBox.setText(tr("All queued QSO of this log has been marked as sent for LoTW!") ); msgBox.exec(); } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog LoTW")); msgBox.setText(tr("There was a problem to mark all queued QSO of this log as sent for LoTW!") ); msgBox.exec(); } } void MainWindow::slotToolLoTWMarkAllYes() { //qDebug() << "MainWindow::slotToolLoTWMarkAllYes" << endl; QString stationCallToUse = selectStationCallsign(); QString tdate = (dateEdit->date()).toString("yyyy/MM/dd"); if (dataProxy->lotwSentYes(tdate, -1, stationCallToUse)) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog LoTW")); msgBox.setText(tr("All queued QSO has been marked as sent to LoTW!") ); msgBox.exec(); } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog LoTW")); msgBox.setText(tr("There was a problem to mark all queued QSO of this log as sent to LoTW!") ); msgBox.exec(); } } void MainWindow::slotAboutQt() { //qDebug() << "MainWindow::slotAboutQt" << endl; QMessageBox::aboutQt(this,tr("About...")); } /* void MainWindow::slotHelpHelpAction() { //qDebug() << "MainWindow::slotHelpHelpAction" << endl; //helpHelpDialog->exec(); //aboutDialog->exec(); } */ void MainWindow::slotHelpAboutAction() { //qDebug() << "MainWindow::slotHelpAboutAction " << endl; // QMessageBox::about(this, tr("About KLog"), // tr("KLog " // "Find the last release at https://jaime.robles.es/klog.")); aboutDialog->exec(); //helpAboutDialog->exec(); } void MainWindow::slotHelpCheckUpdatesAction() { //qDebug() << "MainWindow::slotHelpCheckUpdatesAction" << endl; callingUpdate = true; softUpdate->addCall(stationQRZ); softUpdate->needToUpdate(true); //callingUpdate = false; } void MainWindow::slotShowSoftUpdateResults(const bool _b) { //qDebug() << "MainWindow::slotShowSoftUpdateResults: " << endl; if (_b == true) { //qDebug() << "MainWindow::slotShowSoftUpdateResults _b = TRUE " << endl; } else { //qDebug() << "MainWindow::slotShowSoftUpdateResults _b = FALSE " << endl; } if (callingUpdate == true) { if (_b == false) { //qDebug() << "MainWindow::slotShowSoftUpdateResults: UPDATE NOT NEEDED" << endl; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog update checking result")); msgBox.setText(tr("Congratulations!") + "\n\n" + tr("You already have the latest version.")); msgBox.exec(); } else { //qDebug() << "MainWindow::slotShowSoftUpdateResults: UPDATE NEEDED" << endl; } } callingUpdate = false; } void MainWindow::createMenusCQWW() { //qDebug() << "MainWindow::createMenusCQWW" << endl; /* logWinAct = new QAction(tr("&Log Window"), this); logWinAct->setCheckable(true); logWinAct->setShortcut(Qt::CTRL + Qt::Key_L); viewMenu->addAction(logWinAct); connect(logWinAct, SIGNAL(triggered()), this, SLOT(slotLogWinShow())); scoreWinAct = new QAction(tr("&Points Window"), this); scoreWinAct->setCheckable(true); scoreWinAct->setShortcut(Qt::CTRL + Qt::Key_P); viewMenu->addAction(scoreWinAct); connect(scoreWinAct, SIGNAL(triggered()), this, SLOT(slotScoreWinShow())); CabrilloExport = new QAction(tr("&Export to Cabrillo..."), this); toolMenu->addAction(CabrilloExport); connect(CabrilloExport, SIGNAL(triggered()), this, SLOT(slotCabrilloExport())); */ } void MainWindow::slotLogWinShow() { //qDebug() << "MainWindow::slotLogWinShow: " << endl; if (!(logWindow->isVisible()) ) { logWinAct->setChecked ( true ); logWindow->show(); }else { logWinAct->setChecked ( false ); logWindow->hide(); } } void MainWindow::slotScoreWinShow() { //qDebug() << "MainWindow::slotScoreWinShow: " << endl; if (!(scoreWindow->isVisible()) ) { scoreWinAct->setChecked ( true ); scoreWindow->show(); }else { scoreWinAct->setChecked ( false ); scoreWindow->hide(); } } void MainWindow::slotSetup(const int _page) { //qDebug() << "MainWindow::slotSetup - 01" << endl; itIsANewversion = false; if (!needToEnd) { setupDialog->setData(configFileName, softwareVersion, _page, !configured); setupDialog->exec(); //qDebug() << "MainWindow::slotSetup - JUst after setupDialog->exec" << endl; if (needToEnd) { return; } else { //qDebug() << "MainWindow::slotSetup - Just before readConfigData" << endl; readConfigData(); if (contestMode == "DX") { reconfigureDXMarathonUI(manageDxMarathon); } //qDebug() << "MainWindow::slotSetup - Just after readConfigData" << endl; } //qDebug() << "MainWindow::MainWindow: logmodel to be created-2" << endl; logWindow->createlogPanel(currentLog); //qDebug() << "MainWindow::MainWindow: logmodel has been created-2" << endl; } defineStationCallsign(); //qDebug() << "MainWindow::MainWindow: before db->reConnect" << endl; dataProxy->reconnectDB(); //db->reConnect(); //qDebug() << "MainWindow::MainWindow: after db->reConnect" << endl; } void MainWindow::openFile() { int lastLog = currentLog; slotSetup(6); if (lastLog == currentLog) { // It seems that the user didn't really want a new log return; } logWindow->refresh(); } bool MainWindow::saveFile(const QString _fileName) { //qDebug() << "MainWindow::saveFile: " << _fileName << endl; QString fileName = _fileName; if (fileName.endsWith(".adi", Qt::CaseInsensitive)) { //qDebug() << "MainWindow::saveFile: 1" << endl; needToSave = !(filemanager->adifLogExport(fileName, currentLog)); } else if (fileName.endsWith(".log", Qt::CaseInsensitive)) { //qDebug() << "MainWindow::saveFile: 2" << endl; needToSave = !(filemanager->cabrilloLogExport(fileName, contestMode, currentLog)); //contest->saveFileToSend(fileName); } else { //qDebug() << "MainWindow::saveFile: 3" << endl; //TODO: Message "You must select a proper file format QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Nothing has been saved. You have to select a valid file type.")); msgBox.exec(); return false; } //qDebug() << "MainWindow::saveFile: 4" << endl; return needToSave; } bool MainWindow::saveFileAs() { //qDebug() << "MainWindow::saveFileAs" << endl; //QFileDialog dialog(this); QStringList filters; filters << "ADIF files (*.adi *.adif)" << "Cabrillo files (*.log)" << "Any files (*)"; // dialog.setNameFilters(filters); /* QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "/home/jana/untitled.png", tr("Images (*.png *.xpm *.jpg)")); */ // klogDir+"/"+defaultADIFLogFile, QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), util->getHomeDir(), tr("ADIF file") + "(*.adi *.adif);;" + tr("Cabrillo files") + "(*.log);;" + tr("Any file") + "(*.*)"); if ( (fileName.endsWith(".adi", Qt::CaseInsensitive)) || (fileName.endsWith(".log", Qt::CaseInsensitive)) ) { useDefaultLogFileName = true; defaultADIFLogFile = fileName; return saveFile(fileName); } else if (fileName.length()==0) { // The user clicked on cancel, no msg to be shown return false; } else { //TODO: Message "You must select a proper file format QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Nothing has been saved. You have to select a valid file type.")); msgBox.exec(); return false; } //return false; } void MainWindow::newFile() { //qDebug() << "MainWindow::newFile" << endl; //TODO: Ask for a confirmation to the user //TODO: Clean the DB & query.exec("VACUUM"); int lastLog = currentLog; slotSetup(6); if (lastLog == currentLog) { // It seems that the user didn't really want a new log return; } points = 0; multipliers = 0; qsoPoints = 0; qsoMultiplier = 0; logWindow->refresh(); slotClearButtonClicked(); searchWidget->clear(); //searchResultsTreeWidget->clear(); /* if (dataProxy->clearLog()) { } else { //TODO: An error to create a new file has ocurred. Manage it! } */ } bool MainWindow::slotOpenKLogFolder() { //qDebug() << "MainWindow::slotOpenKLogFolder: " << configFileName << endl; //configFileName = klogDir+"/klogrc.cfg"; QString _aux = "" ; QString _text = tr("You can find the KLog data folder here: ") + _aux; /* int ret = QMessageBox::information(this, tr("KLog"), _text, QMessageBox::Ok, QMessageBox::Ok); */ QMessageBox::information(this, tr("KLog"), _text, QMessageBox::Ok, QMessageBox::Ok); //qDebug() << "MainWindow::slotOpenKLogFolder: END" << endl; return true; } void MainWindow::slotUpdateStatusBar(const QString statusm) { //qDebug() << "MainWindow::slotUpdateStatusBar: " << statusm << endl; statusBar()->showMessage(statusm, 2000); } bool MainWindow::readCtyFile() { return false; } void MainWindow::slotDoubleClickLog(const int _qsoID) { //qDebug() << "MainWindow::slotDoubleClickLog: QSOid: " << QString::number(_qsoID) << endl; //int row = _qsoID.row(); //qsoToEdit((logModel->index(row, 0)).data(0).toInt()); qsoToEdit(_qsoID); //TODO: To be added to the logWindow and create an action that emist the QSO id to be edited } void MainWindow::keyPressEvent(QKeyEvent *event){ /* if (!isStarted || isPaused || curPiece.shape() == NoShape) { QFrame::keyPressEvent(event); return; } */ switch (event->key()) { case Qt::Key_Return: // ENTER PRESSED //slotQRZReturnPressed(); break; case Qt::Key_Enter: // ENTER PRESSED // slotQRZReturnPressed(); break; default: //QFrame::keyPressEvent(event); ; } } void MainWindow::checkIfWorkedB4(const QString _qrz) { //qDebug() << "MainWindow::checkIfWorkedB4: " << _qrz << endl; int i = dataProxy->isWorkedB4(_qrz, currentLog); // Gets the QSO id if worked before if (contestMode == "DX") {} else if (contestMode == "CQ-WW-SSB") { if (i>=0) { qrzgroupBox->setTitle(tr("DUPE")); } else { qrzgroupBox->setTitle(tr("QRZ")); } } else {} } void MainWindow::readConfigData() { //qDebug() << "MainWindow::readConfigData - 01" << endl; if (needToEnd) { return; } QFile file(configFileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){ //qDebug() << "MainWindow::readConfigData: File not found" << configFileName << endl; if (configured) { //qDebug() << "MainWindow::readConfigData: configured = true" << endl; } else { //qDebug() << "MainWindow::readConfigDataw: configured = false" << endl; } slotSetup(); return; } hamlibActive = false; //qDebug() << "MainWindow::readConfigData: Before processConfigLine " << endl; while (!file.atEnd()) { QByteArray line = file.readLine(); processConfigLine(line); } //qDebug() << "MainWindow::readConfigData: After processConfigLine " << endl; defineStationCallsign(); //qDebug() << "MainWindow::readConfigData: " << defaultADIFLogFile << endl; if ((useDefaultLogFileName) && (defaultADIFLogFile.length()>0)) { useDefaultLogFileName = true; } else { useDefaultLogFileName = false; } //qDebug() << "MainWindow::readConfigData-01" << endl; infoWidget->setImperialSystem(imperialSystem); infoLabel2->setText(world->getEntityName(currentEntity)); //qDebug() << "MainWindow::readConfigData-89" << endl; infoWidget->showEntityInfo(currentEntity); //qDebug() << "MainWindow::readConfigData-90" << endl; configured = true; awards->setColors (newOneColor.name(), neededColor.name(), workedColor.name(), confirmedColor.name(), defaultColor.name()); dxClusterWidget->setColors (newOneColor.name(), neededColor.name(), workedColor.name(), confirmedColor.name(), defaultColor.name()); dxClusterWidget->setDXClusterSpotConfig(dxClusterShowHF, dxClusterShowVHF, dxClusterShowWARC, dxClusterShowWorked, dxClusterShowConfirmed, dxClusterShowAnn, dxClusterShowWWV, dxClusterShowWCY ); dxClusterWidget->setMyQRZ(stationQRZ); //qDebug() << "MainWindow::readConfigData-97" << endl; checkIfNewBandOrMode(); //qDebug() << "MainWindow::readConfigData-98" << endl; initialContestModeConfiguration(); //qDebug() << "MainWindow::readConfigData: 99" << endl; if (upAndRunning) { // Next actions will not be executed in the first run //qDebug() << "MainWindow::readConfigData: 99.1" << endl; slotClearButtonClicked(); //qDebug() << "MainWindow::readConfigData: 99.2" << endl; //createSearchResultsPanel(); } // I need to init the CLUBLOG if (clublogActive) { elogClublog->setCredentials(clublogUser, clublogEmail, clublogPass, false); } else { } //qDebug() << "MainWindow::readConfigData: calling checkIfNewBandOrMode" << endl; //qDebug() << "MainWindow::readConfigData: 100" << endl; util->setVersion(softwareVersion); //qDebug() << "MainWindow::readConfigData: 101" << endl; searchWidget->setVersion(softwareVersion); //qDebug() << "MainWindow::readConfigData: 102" << endl; searchWidget->setCurrentLog(currentLog); //qDebug() << "MainWindow::readConfigData: 103" << endl; infoWidget->setCurrentLog(currentLog); //qDebug() << "MainWindow::readConfigData: 104" << endl; searchWidget->setColors (newOneColor.name(), neededColor.name(), workedColor.name(), confirmedColor.name(), defaultColor.name()); infoWidget->setColors(newOneColor.name(), neededColor.name(), workedColor.name(), confirmedColor.name(), defaultColor.name()); satTabWidget->refreshData(); QString aux; QString errorMSG; if (UDPServerStart) { //qDebug() << "MainWindow::readConfigData: 104: UDPServerStart TRUE" << endl; if (!UDPLogServer->isStarted()) { //qDebug() << "MainWindow::readConfigData: 104: Server off" << endl; if (!UDPLogServer->start()) { errorMSG = tr("start"); aux = tr("UDP Server error\nThe UDP server failed to %1.", "start or stop").arg(errorMSG); showErrorDialog->setText(aux); showErrorDialog->exec(); } else { //qDebug() << "MainWindow::readConfigData: UDP Log server started!" << endl; } } else { //qDebug() << "MainWindow::readConfigData: UDP Log server already started no need to restart!" << endl; } } else { //qDebug() << "MainWindow::readConfigData: 104: UDPServerStart FALSE" << endl; if (UDPLogServer->isStarted()) { if (!UDPLogServer->stop()) { errorMSG = tr("stop"); aux = tr("UDP Server error\nThe UDP server failed to %1.", "start or stop").arg(errorMSG); showErrorDialog->setText(aux); showErrorDialog->exec(); } else { //qDebug() << "MainWindow::readConfigData: UDP Log server stopped!" << endl; } } else { //qDebug() << "MainWindow::readConfigData: UDP Log server already stopped no need to restop!" << endl; } } //qDebug() << "MainWindow::readConfigData: hamlib" << endl; if (hamlibActive) { //qDebug() << "MainWindow::readConfigData: STARTING HAMLIB" << endl; hamlib->init(true); //qDebug() << "MainWindow::readConfigData: HAMLIB STARTED"; } else { //qDebug() << "MainWindow::readConfigData: STOPPING HAMLIB"; hamlib->stop(); //qDebug() << "MainWindow::readConfigData: NOT STARTING HAMLIB"; } //qDebug() << "MainWindow::readConfigData - END" << endl; } bool MainWindow::processConfigLine(const QString _line){ //qDebug() << "MainWindow::processConfigLine: " << _line << endl; int _logWithMoreQSOs = 0; // At the end, if the this variable is >0 the Selectedlog will have to be changed in the file. QString line = _line.simplified(); //line.simplified(); QString aux; QStringList values = line.split("=", QString::SkipEmptyParts); if (line.startsWith('#')){ //qDebug() << "MainWindow::processConfigLine: notes Line!" << endl; return true; } if (!( (line.contains('=')) && (line.contains(';')))){ //qDebug() << "MainWindow::processConfigLine: Wrong Line!" << endl; return false; } QString field = (values.at(0)).toUpper(); QString value = values.at(1); int endValue = value.indexOf(';'); if (endValue>-1){ value = value.left(value.length() - (value.length() - endValue)); } if (field == "CALLSIGN"){ mainQRZ = value; }else if (field=="CQZ"){ my_CQz = value.toInt(); }else if (field=="ITUZ"){ my_ITUz = value.toInt(); }else if (field=="CONTEST"){ //qDebug() << "MainWindow::processConfigLine: CONTEST: " << endl; contestMode = value; }else if (field=="MODES"){ readActiveModes(value.split(", ", QString::SkipEmptyParts)); }else if (field=="BANDS"){ //qDebug() << "MainWindow::processConfigLine: BANDS: " << value << endl; readActiveBands(value.split(", ", QString::SkipEmptyParts)); }else if (field=="REALTIME"){ //qDebug() << "MainWindow::processConfigLine: REALTIME: " << value.toUpper() << endl; realTime = util->trueOrFalse(value); } else if (field=="INMEMORY") { //qDebug() << "MainWindow::processConfigLine: INMEMORY: " << value.toUpper() << endl; DBinMemory = util->trueOrFalse(value); } else if (field =="DXCLUSTERSERVERTOUSE"){ aux = value; //dxfun.com:8000 if (aux.contains(':')) { dxclusterServerToConnect = (aux.split(':', QString::SkipEmptyParts)).at(0); dxclusterServerPort = ((aux.split(':', QString::SkipEmptyParts)).at(1)).toInt(); } if ((dxclusterServerToConnect.length()< 3) || (dxclusterServerPort <= 0)) { dxclusterServerToConnect = "dxfun.com"; dxclusterServerPort = 8000; } dxClusterWidget->setDXClusterServer(dxclusterServerToConnect, dxclusterServerPort); } else if(field=="POWER") { if (value.toDouble()>0.0) { myPower = value.toDouble(); } } else if (field=="USEDEFAULTNAME") { useDefaultLogFileName = util->trueOrFalse(value); } else if (field=="IMPERIALSYSTEM") { imperialSystem = util->trueOrFalse(value); } else if (field=="SENDQSLWHENREC") { sendQSLWhenRec = util->trueOrFalse(value); } else if (field=="MANAGEDXMARATHON") { //qDebug() << "MainWindow::processConfigLine: Marathon-1 - Value: " << value << endl; manageDxMarathon = util->trueOrFalse(value); //qDebug() << "MainWindow::processConfigLine: Marathon-2" << endl; if (manageDxMarathon) { dxMarathonLabelN->setText(tr("DX-Marathon")); //qDebug() << "MainWindow::processConfigLine: Marathon True" << endl; } else { //qDebug() << "MainWindow::processConfigLine: Marathon false-1" << endl; dxMarathonLabelN->setText(tr("Annual")); //qDebug() << "MainWindow::processConfigLine: Marathon false-2" << endl; } //qDebug() << "MainWindow::processConfigLine: Marathon - END" << endl; } else if (field=="SHOWCALLSIGNINSEARCH") { searchWidget->setShowCallInSearch(util->trueOrFalse(value)); //stationCallSignShownInSearch = util->trueOrFalse(value); } else if (field=="CHECKNEWVERSIONS"){ checkNewVersions = util->trueOrFalse(value); } else if (field=="PROVIDEINFO"){ reportInfo = util->trueOrFalse(value); } else if (field=="ALWAYSADIF") { alwaysADIF = util->trueOrFalse(value); } else if (field=="UTCTIME") { //qDebug() << "MainWindow::processConfigLine: UTCTIME: " << value.toUpper() <trueOrFalse(value); } else if (field=="KEEPMYDATA") { keepMyData = util->trueOrFalse(value); } else if (field=="COMPLETEWITHPREVIOUS") { completeWithPrevious = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWHF") { dxClusterShowHF = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWVHF") { dxClusterShowVHF = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWWARC") { dxClusterShowWARC = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWWORKED") { dxClusterShowWorked = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWCONFIRMED") { dxClusterShowConfirmed = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWANN") { dxClusterShowAnn = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWWWV") { dxClusterShowWWV = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWWCY") { dxClusterShowWCY = util->trueOrFalse(value); } else if (field=="DEFAULTADIFFILE") { defaultADIFLogFile = value.toLower(); //qDebug() << "MainWindow::processConfigLine: " << defaultADIFLogFile << endl; } else if (field=="STATIONLOCATOR") { if ( locator->isValidLocator(value) ) { myLocator = value.toUpper(); } } else if(field=="NEWONECOLOR") { newOneColor.setNamedColor(value); } else if(field=="NEEDEDCOLOR") { neededColor.setNamedColor(value); } else if(field=="WORKEDCOLOR") { workedColor.setNamedColor(value); } else if(field=="CONFIRMEDCOLOR") { confirmedColor.setNamedColor(value); } else if(field=="DEFAULTCOLOR") { defaultColor.setNamedColor(value); } else if (field=="UDPSERVER") { //qDebug() << "MainWindow::processConfigLine: UDPSERVER: " << value.toUpper() << endl; if (value.toUpper() == "TRUE") { UDPServerStart = true; } else { UDPServerStart = false; } } else if (field=="UDPSERVERPORT") { UDPLogServer->setPort(value.toInt()); } else if (field=="INFOTIMEOUT") { int a = value.toInt(); if ((a>0) && (a<=30000)) { infoTimeout = a; } } else if (field=="LOGFROMWSJTX") { if (value.toUpper() == "TRUE") { UDPLogServer->setLogging(true); } else { UDPLogServer->setLogging(false); } } else if (field=="LOGAUTOFROMWSJTX") { if (value.toUpper() == "TRUE") { wsjtxAutoLog = true; //UDPLogServer->setLogging(true); } else { wsjtxAutoLog = false; //UDPLogServer->setLogging(false); } } else if (field == "HAMLIBRIGTYPE" ) { //qDebug() << "MainWindow::processConfigLine: HAMLIBRIGTYPE: " << value << endl; hamlib->setModelId(value.toInt()); //qDebug() << "MainWindow::processConfigLine: HAMLIBRIGTYPE: " << value << endl; } else if(field == "HAMLIBSERIALPORT") { //qDebug() << "MainWindow::processConfigLine: HAMLIBSERIALPORT: " << value << endl; hamlib->setPort(value); //qDebug() << "MainWindow::processConfigLine: HAMLIBSERIALPORT: " << value << endl; } else if (field == "HAMLIBSERIALBAUDS") { //qDebug() << "MainWindow::processConfigLine: HAMLIBSERIALBAUDS: " << value << endl; hamlib->setSpeed(value); //qDebug() << "MainWindow::processConfigLine: HAMLIBSERIALBAUDS: " << value << endl; }else if(field =="HAMLIBSERIALDATABITS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALDATABITS: " << value << endl; hamlib->setData(value); //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALDATABITS: " << value << endl; }else if(field =="HAMLIBSERIALSTOPBITS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALSTOPBITS: " << value << endl; hamlib->setStop(value); //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALSTOPBITS: " << value << endl; }else if(field =="HAMLIBSERIALFLOWCONTROL"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALFLOWCONTROL: " << value << endl; hamlib->setFlow(value); //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALFLOWCONTROL: " << value << endl; }else if(field =="HAMLIBSERIALPARITY"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALPARITY: " << value << endl; hamlib->setParity(value); //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALPARITY: " << value << endl; }else if(field =="HAMLIBSERIALRTS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALRTS: " << value << endl; //hamlib->setRTS(value); //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALRTS: " << value << endl; }else if(field =="HAMLIBSERIALDTR"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALDTR: " << value << endl; //hamlib->setDTR(value); //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALDTR: " << value << endl; } else if (field == "HAMLIB") { //qDebug() << "MainWindow::processConfigLine: HAMLIB: " << value << endl; if (value.toUpper() == "TRUE") { hamlibActive = true; } else { hamlibActive = false; } //qDebug() << "MainWindow::processConfigLine: HAMLIB: " << value << endl; } else if (field=="REALTIMEFROMWSJTX") { //qDebug() << "MainWindow::processConfigLine: REALTIMEFROMWSJTX: " << value << endl; if (value.toUpper() == "TRUE") { UDPLogServer->setRealTimeUpdate(true); } else { UDPLogServer->setRealTimeUpdate(false); } } else if(field=="SELECTEDLOG") { currentLog = value.toInt(); //qDebug() << "MainWindow::processConfigLine: currentLog - SelectedLog: " << QString::number(currentLog) << endl; if ( ((dataProxy->doesThisLogExist(currentLog)) && (dataProxy->getHowManyQSOInLog(currentLog) > 0)) ) { //qDebug() << "MainWindow::processConfigLine: currentLog - Log with QSO - SelectedLog: " << QString::number(currentLog) << endl; } else { int _howManyQSOMax = -1; // NUmber of QSO of the log with more QSO int _howManyQSOMaxT = 0; // Number of QSO in ine specific log QStringList logs = QStringList(); logs << dataProxy->getListOfManagedLogs(); //qDebug() << "MainWindow::processConfigLine: logs: " << QString::number(logs.size()) << endl; for (int i = 0;igetHowManyQSOInLog(i); //qDebug() << "MainWindow::processConfigLine: SelectedLog-x: " << QString::number(i) << " - QSOs: " << QString::number(_howManyQSOMaxT) << endl; if (_howManyQSOMax < _howManyQSOMaxT) { //qDebug() << "MainWindow::processConfigLine: Found log with more QSO: " << logs.at(i) << endl; _howManyQSOMax = _howManyQSOMaxT; _logWithMoreQSOs = (logs.at(i)).toInt(); } } if (_logWithMoreQSOs>0) { currentLog = _logWithMoreQSOs; filemanager->modifySetupFile(configFileName, "SelectedLog", QString::number(currentLog)); } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Critical); QString aux = tr("It seems that there are no QSO in the database.") + "\n\n" + tr("If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } } /* //qDebug() << "MainWindow::processConfigLine: currentLog - Log without QSO - SelectedLog: " << QString::number(currentLog) << endl; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); QString aux = tr("The selected log is not existing or it is still empty.") + "\n\n" + tr("Click Yes and KLog will open an empty log.") + "\n" + tr("Click No and KLog will select another log with data.") + "\n\n" + tr("You can modify the config file accordingly, if needed."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: break; case QMessageBox::No: logs << dataProxy->getListOfManagedLogs(); //qDebug() << "MainWindow::processConfigLine: logs: " << QString::number(logs.size()) << endl; for (int i = 0;igetHowManyQSOInLog(i); //qDebug() << "MainWindow::processConfigLine: SelectedLog-x: " << QString::number(i) << " - QSOs: " << QString::number(_howManyQSOMaxT) << endl; if (_howManyQSOMax < _howManyQSOMaxT) { //qDebug() << "MainWindow::processConfigLine: Found log with more QSO: " << logs.at(i) << endl; _howManyQSOMax = _howManyQSOMaxT; _logWithMoreQSOs = (logs.at(i)).toInt(); } } if (_logWithMoreQSOs>0) { currentLog = _logWithMoreQSOs; filemanager->modifySetupFile(configFileName, "SelectedLog", QString::number(currentLog)); } else { msgBox.setIcon(QMessageBox::Critical); QString aux = tr("It seems that there are no QSO in the database.") + "\n\n" + tr("If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } } break; default: // should never be reached break; } */ } dxClusterWidget->setCurrentLog(currentLog); dxccStatusWidget->setCurrentLog(currentLog); //qDebug() << "MainWindow::processConfigLine: currentLog: " << value << endl; } else if(field=="CLUBLOGACTIVE") { //qDebug() << "MainWindow::processConfigLine: clublogActive: " << value << endl; clublogActive = util->trueOrFalse(value); } else if(field=="CLUBLOGREALTIME") { //qDebug() << "MainWindow::processConfigLine: clublogRealTime: " << value << endl; clublogRealTime = util->trueOrFalse(value); } else if(field=="CLUBLOGCALL") { clublogUser = value; } else if(field=="CLUBLOGPASS") { clublogPass = value; } else if(field=="CLUBLOGEMAIL") { clublogEmail = value; } else if(field=="VERSION") { if (softwareVersion!=value) { itIsANewversion = true; } } else { //qDebug() << "MainWindow::processConfigLine: NONE: " << endl; } // Lines are: Option = value; //qDebug() << "MainWindow::processConfigLine: END" << endl; return true; } void MainWindow::checkIfNewBandOrMode() {//Checks the log to see if there is a QSO with a band/mode //that is not currently selected as active //qDebug() << "MainWindow::checkIfNewBandOrMode - START" << endl; setupDialog->checkIfNewBandOrMode(); // Update the Setup dialog with new bands or modes //qDebug() << "MainWindow::checkIfNewBandOrMode - 1" << endl; QStringList bandsInLog = dataProxy->getBandsInLog(currentLog); //qDebug() << "MainWindow::checkIfNewBandOrMode - 2" << endl; QStringList modesInLog = dataProxy->getModesInLog(currentLog); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3" << endl; QStringList qsTemp; qsTemp.clear(); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3.1" << endl; bands << bandsInLog; //qDebug() << "MainWindow::checkIfNewBandOrMode - 3.2" << endl; qsTemp << dataProxy->sortBandNamesBottonUp(bands); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3.3" << endl; bands.clear(); bands << qsTemp; modes << modesInLog; modes.removeDuplicates(); //qDebug() << "MainWindow::checkIfNewBandOrMode - bands -" << QString::number(bands.length()) << endl; bandComboBox->clear(); bandComboBox->addItems(bands); satTabWidget->addBands(bands); //qDebug() << "MainWindow::checkIfNewBandOrMode - modes -" << QString::number(modes.length()) << endl; modeComboBox->clear(); modeComboBox->addItems(modes); //qDebug() << "MainWindow::checkIfNewBandOrMode - CurrentBand/CurrentBandShown: " << QString::number(currentBand) << "/" << QString::number(currentBandShown) << endl; dxccStatusWidget->setBands(bands); //qDebug() << "MainWindow::checkIfNewBandOrMode-98" << endl; selectDefaultBand(); //qDebug() << "MainWindow::checkIfNewBandOrMode-99" << endl; selectDefaultMode(); //qDebug() << "MainWindow::checkIfNewBandOrMode END" << endl; } void MainWindow::selectDefaultBand() { //qDebug() << "MainWindow::selectDefaultBand" << endl; QString aux; aux = QString(); defaultBand = dataProxy->getMostUsedBand(currentLog); if (defaultBand<1) { defaultBand = dataProxy->getIdFromBandName(bandComboBox->itemText(1)); } aux = dataProxy->getNameFromBandId(defaultBand); bandComboBox->setCurrentIndex(bandComboBox->findText(aux)); //qDebug() << "MainWindow::selectDefaultBand_END" << endl; } void MainWindow::selectDefaultMode() { //qDebug << "MainWindow::selectDefaultMode" << endl; //int aux = 1; defaultMode = dataProxy->getMostUsedMode(currentLog); //qDebug << "MainWindow::selectDefaultMode: " << QString::number(defaultMode) << endl; if (defaultMode < 1) { defaultMode = dataProxy->getSubModeIdFromSubMode((modeComboBox->itemText(0))); //qDebug << "MainWindow::selectDefaultMode2: " << QString::number(defaultMode) << endl; //qDebug << "MainWindow::selectDefaultMode2S: " << modeComboBox->itemText(0) << endl; } //aux = dataProxy->getNameFromSubModeId(defaultMode); modeComboBox->setCurrentIndex(modeComboBox->findText(dataProxy->getNameFromSubModeId(defaultMode))); //qDebug << "MainWindow::selectDefaultMode3: " << QString::number(defaultMode) << endl; //qDebug << "MainWindow::selectDefaultMode-END" << endl; } void MainWindow::readActiveBands (const QStringList actives) { // Checks a "10m, 12m" QString, checks if they are valid bands and import to the //qDebug() << "MainWindow::readActiveBands: " << actives << endl; for (int i=0;igetBandsInLog(currentLog); __bands.removeDuplicates(); bands << __bands; //QStringList values = actives.split(", ", QString::SkipEmptyParts); for (int i = 0; i < __bands.size() ; i++) { if (dataProxy->getIdFromBandName(__bands.at(i)) > 0) //if (db->isValidMode(actives.at(i), false)) { if (!atLeastOne) { atLeastOne = true; //bands.clear(); } aux = __bands.at(i); if (aux.length()>0) { bands << aux; } // bands << actives.at(i); } } bands.removeDuplicates(); for (int i=0;igetModesInLog(currentLog); __modes.removeDuplicates(); modes.clear(); //QStringList values = actives.split(", ", QString::SkipEmptyParts); for (int i = 0; i < __modes.size() ; i++) { //qDebug() << "MainWindow::readActiveModes: checking: " << __modes.at(i) << endl; if (dataProxy->getIdFromModeName(__modes.at(i)) > 0) { //qDebug() << "MainWindow::readActiveModes: checking-exist: " << __modes.at(i) << endl; //if (!atLeastOne) //{ // atLeastOne = true; //} aux = __modes.at(i); if (aux.length()>0) { //qDebug() << "MainWindow::readActiveModes: adding: " << aux << endl; modes << aux; } // modes << actives.at(i); } } modes.removeDuplicates(); modes.sort(); //qDebug() << "MainWindow::readActiveModes - END" << endl; } void MainWindow::createData() { //qDebug() << "MainWindow::createData " << endl; } void MainWindow::createUIDX() { //qDebug() << "MainWindow::createUIDX" << endl; //bands << "10M" << "15M" << "20M" << "40M" << "80M" << "160M"; //modes << "SSB" << "CW" << "RTTY"; bandComboBox->addItems(bands); //qDebug() << "MainWindow::createUIDX - 1-" << QString::number(modes.count()) << endl; modeComboBox->clear(); modeComboBox->addItems(modes); /* int mi = 0; for (int i = 0; i < modes.size(); ++i) { if (mi > (modes.at(i)).size()) { mi = (modes.at(i)).size(); } } //modeComboBox->setMinimumContentsLength(mi); modeComboBox->setMinimumWidth(mi); */ //modeComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); txFreqSpinBox->setToolTip(tr("TX Frequency in MHz.")); rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.")); //myPowerSpinBox->setToolTip(tr("Power used for the QSO in watts")); rxPowerSpinBox->setToolTip(tr("Power used by the DX.")); operatorLineEdit->setToolTip(tr("Logging operator's callsign.")); stationCallSignLineEdit->setToolTip(tr("Callsign used over the air.")); myLocatorLineEdit->setToolTip(tr("My QTH locator.")); nameLineEdit->setToolTip(tr("Name of the DX.")); qthLineEdit->setToolTip(tr("QTH of the DX.")); locatorLineEdit->setToolTip(tr("Locator of the DX.")); //freqQLCDNumber->setToolTip(tr("Frequency of the QSO")); qrzLineEdit->setToolTip(tr("QRZ of the QSO.")); rstTXLineEdit->setToolTip(tr("TX RST.")); rstRXLineEdit->setToolTip(tr("RX RST.")); STXLineEdit->setToolTip(tr("TX Exchange.")); SRXLineEdit->setToolTip(tr("RX Exchange.")); bandComboBox->setToolTip(tr("Band of the QSO.")); modeComboBox->setToolTip(tr("Mode of the QSO.")); dateEdit->setToolTip(tr("Date of the QSO.")); timeEdit->setToolTip(tr("Time of the QSO.")); //statusBar->setToolTip(tr("Misc information")); //qsoStatusBar->setToolTip(tr("QSO information")); OKButton->setToolTip(tr("Add the QSO to the log.")); //spotItButton->setToolTip(tr("Spots this QSO to the DX Cluster - This function is still not implemented")); clearButton->setToolTip(tr("Clears the QSO entry.")); dxccConfirmedQLCDNumber->setToolTip(tr("Number of confirmed DXCC entities.")); dxccWorkedQLCDNumber->setToolTip(tr("Number of worked DXCC entities.")); wazConfirmedQLCDNumber->setToolTip(tr("Number of confirmed WAZ zones.")); wazWorkedQLCDNumber->setToolTip(tr("Number of worked WAZ zones.")); localConfirmedQLCDNumber->setToolTip(tr("Number of confirmed local references.")); localWorkedQLCDNumber->setToolTip(tr("Number of worked local references.")); qsoConfirmedQLCDNumber->setToolTip(tr("Number of confirmed QSOs.")); qsoWorkedQLCDNumber->setToolTip(tr("Number of worked QSOs.")); dxMarathonQSOLCDNumber->setToolTip(tr("Number of QSOs worked on the selected year.")); dxMarathonDXCCQLCDNumber->setToolTip(tr("Number of DXCC worked on the selected year.")); dxMarathonCQQLCDNumber->setToolTip(tr("Number of CQ Zones worked on the selected year.")); dxMarathonPointsQLCDNumber->setToolTip(tr("Score for the DXMarathon on the selected year.")); operatingYearsComboBox->setToolTip(tr("Select the year you want to check.")); infoLabel1->setToolTip(tr("Status of the DX entity.")); infoLabel2->setToolTip(tr("Name of the DX entity.")); dxUpLeftInputFrame = new QFrame; //dxUpRightOutputFrame = new QFrame; //dxUpRightOutputFrame->setFrameShadow(QFrame::Raised); //dxUpRightOutputFrame->setFrameStyle(QFrame::StyledPanel); dxUpLeftTab = new QTabWidget; dxUpRightTab = new QTabWidget; dxBottonTab = new QTabWidget; dxUpLeftTab->setTabPosition(QTabWidget::North); dxUpRightTab->setTabPosition(QTabWidget::South); QWidget *qsoInputTabWidget = new QWidget; //QFormLayout *qsoInputTabWidgetLayout = new QFormLayout; QLabel *nameLabel = new QLabel(qsoInputTabWidget); nameLabel->setText(tr("Name")); nameLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *qthLabel = new QLabel(qsoInputTabWidget); qthLabel->setText(tr("QTH")); qthLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *locLabel = new QLabel(qsoInputTabWidget); locLabel->setText(tr("Locator")); locLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *rxPowerSpinBoxLabelN = new QLabel(tr("Power(rx)")); rxPowerSpinBoxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *rstTxLabelN = new QLabel(tr("RST(tx)")); rstTxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *rstRxLabelN = new QLabel(tr("RST(rx)")); rstRxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); setRSTToMode(modeComboBox->currentText()); //rstTXLineEdit->setInputMask("#990"); //rstRXLineEdit->setInputMask("#990"); //rstTXLineEdit->setText("59"); //rstRXLineEdit->setText("59"); //rstTXLineEdit->setMaxLength(3); //rstRXLineEdit->setMaxLength(3); //rstTXLineEdit->setFixedWidth(30); //rstRXLineEdit->setFixedWidth(30); QGridLayout *RSTLayout = new QGridLayout; RSTLayout->addWidget(rstTxLabelN, 0, 0); RSTLayout->addWidget(rstTXLineEdit, 1, 0); RSTLayout->addWidget(rstRxLabelN, 0, 1); RSTLayout->addWidget(rstRXLineEdit, 1, 1); //QLabel *spacerLabel = new QLabel(tr("SPACERQTH")); QHBoxLayout *qthHLayout = new QHBoxLayout; qthHLayout->addWidget(qthLabel); //qthHLayout->addSpacerItem(new QSpacerItem(50,1)); //qthHLayout->addWidget(spacerLabel); QVBoxLayout *qthLayout = new QVBoxLayout; qthLayout->addLayout(qthHLayout); qthLayout->addWidget(qthLineEdit); QVBoxLayout *rstQTHLayout = new QVBoxLayout; rstQTHLayout->addLayout(RSTLayout); rstQTHLayout->addLayout(qthLayout); QLabel *txfreqLabelN = new QLabel(tr("Freq TX")); txfreqLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *rxfreqLabelN = new QLabel(tr("Freq RX")); rxfreqLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QGridLayout *freqLayout = new QGridLayout; freqLayout->addWidget(txfreqLabelN, 0, 0); freqLayout->addWidget(rxfreqLabelN, 0, 1); freqLayout->addWidget(txFreqSpinBox, 1, 0); freqLayout->addWidget(rxFreqSpinBox, 1, 1); QVBoxLayout *locVLayout = new QVBoxLayout; locVLayout->addWidget(locLabel); locVLayout->addWidget(locatorLineEdit); //QLabel *spacerLocLabel = new QLabel(tr("SPACERLoc")); QHBoxLayout *locLayout = new QHBoxLayout; //locLayout->addSpacerItem(new QSpacerItem(50,1)); //locLayout->addWidget(spacerLocLabel); locLayout->addLayout(locVLayout); QVBoxLayout *freqLocLayout = new QVBoxLayout; freqLocLayout->addLayout(freqLayout); freqLocLayout->addLayout(locLayout); QHBoxLayout *rstfreqLayout = new QHBoxLayout; rstfreqLayout->addLayout(rstQTHLayout); rstfreqLayout->addLayout(freqLocLayout); QVBoxLayout *rxPowerLayout = new QVBoxLayout; rxPowerLayout->addWidget(rxPowerSpinBoxLabelN); rxPowerLayout->addWidget(rxPowerSpinBox); //QLabel *spacerNameLabel = new QLabel(tr("SPACERName")); QHBoxLayout *nameHLayout = new QHBoxLayout; nameHLayout->addWidget(nameLabel); //nameHLayout->addSpacerItem(new QSpacerItem(50,1)); //nameHLayout->addWidget(spacerNameLabel ); QVBoxLayout *nameLayout = new QVBoxLayout; nameLayout->addLayout(nameHLayout); nameLayout->addWidget(nameLineEdit); QVBoxLayout *rxPwrLayout = new QVBoxLayout; rxPwrLayout->addWidget(rxPowerSpinBoxLabelN); rxPwrLayout->addWidget(rxPowerSpinBox); //QLabel *spacerHBottomLabel = new QLabel(tr("SPACERHBottom")); QHBoxLayout *namePwrHLayout = new QHBoxLayout; namePwrHLayout->addLayout(nameLayout); //namePwrHLayout->addSpacerItem(new QSpacerItem(50,1)); //namePwrHLayout->addWidget(spacerHBottomLabel); namePwrHLayout->addLayout(rxPwrLayout); //QLabel *spacerBottomLabel = new QLabel(tr("SPACERBottom")); QVBoxLayout *namePwrLayout = new QVBoxLayout; //namePwrLayout->addSpacerItem(new QSpacerItem(1,50)); //namePwrLayout->addWidget(spacerBottomLabel); namePwrLayout->addLayout(namePwrHLayout); QVBoxLayout *qsoInputTabWidgetMainLayout = new QVBoxLayout; qsoInputTabWidgetMainLayout->addLayout(rstfreqLayout); qsoInputTabWidgetMainLayout->addLayout(namePwrLayout); qsoInputTabWidget->setLayout(qsoInputTabWidgetMainLayout); dxUpLeftTab->addTab(qsoInputTabWidget, tr("QSO")); /* // NOTES tab starts here QGridLayout *notesInputTabWidgetLayout = new QGridLayout; notesInputTabWidgetLayout->addWidget(notesTextEdit, 0, 0); notesInputTabWidget->setLayout(notesInputTabWidgetLayout); i = dxUpLeftTab->addTab(notesInputTabWidget, tr("Notes")); */ //dxUpLeftTab->addTab(qslInputTabWidget, tr("QSL")); dxUpLeftTab->addTab(QSLTabWidget, tr("QSL")); dxUpLeftTab->addTab(eQSLTabWidget, tr("eQSL")); dxUpLeftTab->addTab(commentTabWidget, tr("Comment")); othersTabWidget->setEntitiesList(world->getEntitiesNames()); dxUpLeftTab->addTab(othersTabWidget, tr("Others")); dxUpLeftTab->addTab(myDataTabWidget, tr("My Data")); dxUpLeftTab->addTab(satTabWidget, tr("Satellite")); QHBoxLayout *TimeLayout = new QHBoxLayout; TimeLayout->addWidget(dateEdit); TimeLayout->addWidget(timeEdit); QHBoxLayout *BandModeLayout = new QHBoxLayout; BandModeLayout->addWidget(bandComboBox); BandModeLayout->addWidget(modeComboBox); QHBoxLayout *QrzBandModeLayout = new QHBoxLayout; QrzBandModeLayout->addWidget(qrzLineEdit); QrzBandModeLayout->addLayout(BandModeLayout); qrzgroupBox = new QGroupBox(tr("QRZ")); qrzgroupBox->setFlat(true); QVBoxLayout *qrzvbox = new QVBoxLayout; qrzvbox->addLayout(QrzBandModeLayout); //qrzvbox->addStretch(1); qrzgroupBox->setLayout(qrzvbox); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(OKButton); buttonsLayout->addWidget(clearButton); QDateTimeEdit *dateEdit = new QDateTimeEdit(QDate::currentDate()); dateEdit->setDisplayFormat("yyyy/MM/dd"); timeEdit->setDisplayFormat("HH:mm:ss"); QGridLayout *dxUpLeftInputFrameLayout = new QGridLayout; dxUpLeftInputFrameLayout->addWidget(qrzgroupBox, 0, 0, 1, 0); dxUpLeftInputFrameLayout->addLayout(TimeLayout, 1, 0); dxUpLeftInputFrameLayout->addLayout(buttonsLayout,1, 1); dxUpLeftInputFrame->setLayout(dxUpLeftInputFrameLayout); QSplitter *upLeftSplitter = new QSplitter (this); upLeftSplitter->addWidget(dxUpLeftInputFrame); upLeftSplitter->addWidget(dxUpLeftTab); upLeftSplitter->setOrientation(Qt::Vertical); QVBoxLayout *dxUpRightFixLayout = new QVBoxLayout; dxUpRightFixLayout->addWidget(infoLabel1); dxUpRightFixLayout->addWidget(infoLabel2); infoLabel1->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); infoLabel2->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *dxMarathonTopQSOsLabelN = new QLabel(tr("QSOs")); QLabel *dxMarathonTopDXCCLabelN = new QLabel(tr("DXCC")); QLabel *dxMarathonTopCQLabelN = new QLabel(tr("CQ")); dxMarathonTopScoreLabelN->setText(tr("Score")); // dxMarathonLabelN = new QLabel; dxUpRightTab->addTab(infoWidget, tr("Info")); QWidget *awardsTabWidget = new QWidget; QLabel *awardLabelN = new QLabel(tr("Award")); awardLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *confirmedLabelN = new QLabel(tr("Confirmed")); confirmedLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *workedLabelN = new QLabel(tr("Worked")); workedLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *dxccLabelN = new QLabel(tr("DXCC")); dxccLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *wazLabelN = new QLabel(tr("WAZ")); wazLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *localLabelN = new QLabel(tr("Local")); localLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *qsoNLabelN = new QLabel(tr("QSOs")); qsoNLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); reconfigureDXMarathonUI(manageDxMarathon); dxMarathonTopQSOsLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); dxMarathonTopDXCCLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); dxMarathonTopCQLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); dxMarathonTopScoreLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); dxMarathonLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QGridLayout *dxMarathonDLayout = new QGridLayout; dxMarathonDLayout->addWidget(dxMarathonTopQSOsLabelN, 0, 0); dxMarathonDLayout->addWidget(dxMarathonTopDXCCLabelN, 0, 1); dxMarathonDLayout->addWidget(dxMarathonTopCQLabelN, 0, 2); dxMarathonDLayout->addWidget(dxMarathonTopScoreLabelN, 0, 3); dxMarathonDLayout->addWidget(dxMarathonQSOLCDNumber, 1, 0); dxMarathonDLayout->addWidget(dxMarathonDXCCQLCDNumber, 1, 1); dxMarathonDLayout->addWidget(dxMarathonCQQLCDNumber, 1, 2); dxMarathonDLayout->addWidget(dxMarathonPointsQLCDNumber, 1, 3); QVBoxLayout *dxMarathonTLayout = new QVBoxLayout; dxMarathonTLayout->addWidget(dxMarathonLabelN); dxMarathonTLayout->addWidget(operatingYearsComboBox); QGridLayout *dxUpRightAwardsTabLayout = new QGridLayout; dxUpRightAwardsTabLayout->addWidget(awardLabelN, 0, 0); dxUpRightAwardsTabLayout->addWidget(workedLabelN, 0, 1); dxUpRightAwardsTabLayout->addWidget(confirmedLabelN, 0, 2); dxUpRightAwardsTabLayout->addWidget(dxccLabelN, 1, 0); dxUpRightAwardsTabLayout->addWidget(dxccWorkedQLCDNumber, 1, 1); dxUpRightAwardsTabLayout->addWidget(dxccConfirmedQLCDNumber, 1, 2); dxUpRightAwardsTabLayout->addWidget(wazLabelN, 2, 0); dxUpRightAwardsTabLayout->addWidget(wazWorkedQLCDNumber, 2, 1); dxUpRightAwardsTabLayout->addWidget(wazConfirmedQLCDNumber, 2, 2); dxUpRightAwardsTabLayout->addWidget(localLabelN, 3, 0); dxUpRightAwardsTabLayout->addWidget(localWorkedQLCDNumber, 3, 1); dxUpRightAwardsTabLayout->addWidget(localConfirmedQLCDNumber, 3, 2); dxUpRightAwardsTabLayout->addWidget(qsoNLabelN, 4, 0); dxUpRightAwardsTabLayout->addWidget(qsoWorkedQLCDNumber, 4, 1); dxUpRightAwardsTabLayout->addWidget(qsoConfirmedQLCDNumber, 4, 2); dxUpRightAwardsTabLayout->addLayout(dxMarathonTLayout, 5, 0); dxUpRightAwardsTabLayout->addLayout(dxMarathonDLayout, 5, 1, 1, -1); dxUpRightAwardsTabLayout->addWidget(recalculateAwardsButton, 6, 1); awardsTabWidget->setLayout(dxUpRightAwardsTabLayout); dxUpRightTab->addTab(awardsTabWidget, tr("Awards")); dxUpRightTab->addTab(searchWidget, tr("Search")); dxBottonTab->addTab(logWindow, tr("Log")); dxBottonTab->addTab(dxClusterWidget, tr("DX-Cluster")); dxBottonTab->addTab(dxccStatusWidget, tr("DXCC")); QVBoxLayout *dxUpRightLayout = new QVBoxLayout; dxUpRightLayout->addLayout(dxUpRightFixLayout); dxUpRightLayout->addWidget(dxUpRightTab); QWidget *upRightWidget = new QWidget; upRightWidget->setLayout(dxUpRightLayout); QSplitter *upSplitter = new QSplitter (this); upSplitter->addWidget(upLeftSplitter); upSplitter->addWidget(upRightWidget); QSplitter *splitter = new QSplitter(this); splitter->addWidget(upSplitter); splitter->addWidget(dxBottonTab); splitter->setOrientation(Qt::Vertical); QHBoxLayout *mLayout = new QHBoxLayout; mLayout->addWidget(splitter); mainWidget->setLayout(mLayout); //qDebug() << "MainWindow::createUIDX - OS DETECTION" << endl; #ifdef Q_OS_WIN //qDebug() << "MainWindow::createUIDX - WINDOWS DETECTED!" << endl; dxUpLeftInputFrame->setFrameShadow(QFrame::Raised); dxUpLeftInputFrame->setFrameStyle(QFrame::StyledPanel); qsoNLabelN->setFrameShadow(QFrame::Raised); qsoNLabelN->setFrameStyle(QFrame::StyledPanel); wazLabelN->setFrameShadow(QFrame::Raised); wazLabelN->setFrameStyle(QFrame::StyledPanel); localLabelN->setFrameShadow(QFrame::Raised); localLabelN->setFrameStyle(QFrame::StyledPanel); dxccLabelN->setFrameShadow(QFrame::Raised); dxccLabelN->setFrameStyle(QFrame::StyledPanel); workedLabelN->setFrameShadow(QFrame::Raised); workedLabelN->setFrameStyle(QFrame::StyledPanel); confirmedLabelN->setFrameShadow(QFrame::Raised); confirmedLabelN->setFrameStyle(QFrame::StyledPanel); awardLabelN->setFrameShadow(QFrame::Raised); awardLabelN->setFrameStyle(QFrame::StyledPanel); dxMarathonTopQSOsLabelN->setFrameShadow(QFrame::Raised); dxMarathonTopDXCCLabelN->setFrameShadow(QFrame::Raised); dxMarathonTopCQLabelN->setFrameShadow(QFrame::Raised); dxMarathonTopScoreLabelN->setFrameShadow(QFrame::Raised); dxMarathonLabelN->setFrameShadow(QFrame::Raised); dxMarathonTopQSOsLabelN->setFrameStyle(QFrame::StyledPanel); dxMarathonTopDXCCLabelN->setFrameStyle(QFrame::StyledPanel); dxMarathonTopCQLabelN->setFrameStyle(QFrame::StyledPanel); dxMarathonTopScoreLabelN->setFrameStyle(QFrame::StyledPanel); dxMarathonLabelN->setFrameStyle(QFrame::StyledPanel); infoLabel1->setFrameShadow(QFrame::Raised); infoLabel1->setFrameStyle(QFrame::StyledPanel); infoLabel2->setFrameShadow(QFrame::Raised); infoLabel2->setFrameStyle(QFrame::StyledPanel); #else //qDebug() << "MainWindow::createUIDX - NO WINDOWS DETECTED!" << endl; dxUpLeftInputFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); localLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); qsoNLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); wazLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); dxccLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); workedLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); confirmedLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); awardLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); dxMarathonTopQSOsLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); dxMarathonTopDXCCLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); dxMarathonTopCQLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); dxMarathonTopScoreLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); dxMarathonLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); infoLabel1->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); infoLabel2->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); #endif } void MainWindow::slotADIFExport(){ //qDebug() << "MainWindow::slotADIFExport " << endl; QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); filemanager->adifLogExport(fileName, currentLog); } void MainWindow::slotLoTWExport(){ //qDebug() << "MainWindow::slotLoTWExport " << endl; QString aux; QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); int exportedQSO = filemanager->adifLoTWLogExport(fileName, currentLog) ; //qDebug() << "MainWindow::slotLoTWExport - exported: " << QString::number(exportedQSO) << endl; if (exportedQSO > 0) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); aux = tr("LoTW logfile has been properly exported!") + "\n\n" + tr("Remember to:") + "\n\n-" + tr("Before uploading: sign the LoTW log; and") + "\n-" + tr("After uploading: mark as sent all the queued QSO (LoTW Tools)."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } } else if (exportedQSO == 0) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); aux = tr("There was no QSO to be exported.") + "\n\n" + tr("If you think that some QSO should have been exported, please look for them and ensure that the eQSL LoTW QSL sent box is marked as:") + "\n\n " + tr("Q - Queued") + "." ; msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); aux = tr("There was an error while exporting the LoTW. The log has not been exported!"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } } } void MainWindow::slotADIFExportAll(){ //qDebug() << "MainWindow::slotADIFExportAll " << endl; QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); filemanager->adifLogExport(fileName, 0); } void MainWindow::slotRQSLExport() { QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); filemanager->adifReqQSLExport(fileName); } void MainWindow::slotCabrilloExport() { //qDebug() << "MainWindow::slotCabrilloExport " << endl; QString fileName = QFileDialog::getSaveFileName(this, tr("Save Cabrillo File"), util->getHomeDir(), "Cabrillo (*.log)"); contest->saveFileToSend(fileName); } void MainWindow::slotLoTWImport(){ //qDebug() << "MainWindow::slotLoTWImport " << endl; QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); if (fileName.isNull()) { } else { //qDebug() << "MainWindow::slotLoTWImport -1" << endl; filemanager->adifLoTWReadLog(fileName); //qDebug() << "MainWindow::slotLoTWImport -2" << endl; logWindow->refresh(); //qDebug() << "MainWindow::slotLoTWImport -3" << endl; //checkIfNewBandOrMode(); //qDebug() << "MainWindow::slotLoTWImport -4" << endl; } //qDebug() << "MainWindow::slotLoTWImport-END" << endl; } void MainWindow::slotADIFImport(){ //qDebug() << "MainWindow::slotADIFImport " << endl; QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); if (fileName.isNull()) { } else { //qDebug() << "MainWindow::slotADIFImport -1" << endl; filemanager->adifReadLog(fileName, currentLog); updateQSLRecAndSent(); //qDebug() << "MainWindow::slotADIFImport -2" << endl; logWindow->refresh(); //qDebug() << "MainWindow::slotADIFImport -3" << endl; checkIfNewBandOrMode(); //qDebug() << "MainWindow::slotADIFImport -4" << endl; if (contestMode == "DX") { //qDebug() << "MainWindow::slotADIFImport-DX" << endl; operatingYearsComboBox->addItems(dataProxy->getOperatingYears(currentLog)); //qDebug() << "MainWindow::slotADIFImport-DX-1" << endl; slotShowAwards(); //qDebug() << "MainWindow::slotADIFImport-DX-1-end" << endl; } else if (contestMode == "CQ-WW-SSB") {} else { operatingYearsComboBox->addItems(dataProxy->getOperatingYears(currentLog)); slotShowAwards(); } //qDebug() << "MainWindow::slotADIFImport-7" << endl; } //qDebug() << "MainWindow::slotADIFImport-END" << endl; } void MainWindow::initialContestModeConfiguration() { //QString aux = QString(); //qDebug() << "MainWindow::initialContestModeConfiguration: - 0" << endl; if (!configured){ //qDebug() << "MainWindow::initialContestModeConfiguration: - 01" << endl; slotSetup(); //qDebug() << "MainWindow::initialContestModeConfiguration: - 02" << endl; return; } //qDebug() << "MainWindow::initialContestModeConfiguration: - 03" << endl; QSqlQuery query; QStringList contestQS; //qDebug() << "MainWindow::initialContestModeConfiguration: - 04" << endl; if (contestMode == "DX") { selectDefaultBand(); selectDefaultMode(); //defaultMode = dataProxy->getMostUsedMode(currentLog); //defaultBand = dataProxy->getMostUsedBand(currentLog); //aux = dataProxy->getNameFromBandId(defaultBand); //bandComboBox->setCurrentIndex(bandComboBox->findText(aux)); //bandComboBox->setCurrentIndex(bandComboBox->findText(dataProxy->getNameFromBandId(defaultBand), Qt::MatchCaseSensitive)); //qDebug() << "MainWindow::initialContestModeConfiguration-1: " << QString::number(defaultBand) << endl; //qDebug() << "MainWindow::initialContestModeConfiguration-1-index: " << bandComboBox->currentText() << endl; } else if (contestMode == "CQ-WW-SSB") { //qDebug() << "MainWindow::initialContestModeConfiguration: - 05" << endl; defaultMode = dataProxy->getIdFromModeName("SSB"); SRXLineEdit->setInputMask("09"); STXLineEdit->setInputMask("09"); contestQS << QString::number(world->getQRZARRLId(stationQRZ)) << QString::number(world->getQRZCqz(stationQRZ)) << world->getQRZContinentNumber(stationQRZ) << world->getQRZContinentNumber("K"); contest = new ContestCQWWDXSSB(contestQS); } else if (contestMode == "CQ-WW-CW") { SRXLineEdit->setInputMask("09"); STXLineEdit->setInputMask("09"); contestQS << QString::number(world->getQRZARRLId(stationQRZ)) << QString::number(world->getQRZCqz(stationQRZ)) << world->getQRZContinentNumber(stationQRZ) << world->getQRZContinentNumber("K"); } else { selectDefaultBand(); selectDefaultMode(); //defaultMode = dataProxy->getMostUsedMode(currentLog); //defaultBand = dataProxy->getMostUsedBand(currentLog); //qDebug() << "MainWindow::initialContestModeConfiguration-2: " <getNameFromBandId(defaultBand) << endl; //bandComboBox->setCurrentIndex(bandComboBox->findText(dataProxy->getNameFromBandId(defaultBand), Qt::MatchCaseSensitive)); //qDebug() << "MainWindow::initialContestModeConfiguration-2: " << QString::number(defaultBand) << endl; //qDebug() << "MainWindow::initialContestModeConfiguration-2-index: " << bandComboBox->currentText() << endl; } //qDebug() << "MainWindow::initialContestModeConfiguration END: " << bandComboBox->currentText() << endl; } void MainWindow::qsoToEdit (const int _qso) { //qDebug() << "MainWindow::qsoToEdit: " << QString::number(_qso) << endl; int nameCol; QString aux1; double testValueDouble; // Variable just to test if the value is in the appropriate range modify = true; modifyingQSO = _qso; OKButton->setText(tr("&Modify")); //TODO: Optimize the following query. Maybe the * is not needed. QString stringQuery = QString("SELECT * FROM log WHERE id ='%1' AND lognumber='%2'").arg(_qso).arg(currentLog); //qDebug() << "MainWindow::qsoToEdit: " << stringQuery << endl; QSqlQuery query(stringQuery); bool sqlOK = query.exec(); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } query.next(); if (query.isValid()) { if ((clublogActive) && (clublogRealTime)) { clublogPrevQSO = dataProxy->getClubLogRealTimeFromId(_qso); } QSqlRecord rec = query.record(); // ADD THE DATA THAT IS PRESENT IN ALL THE MODES nameCol = rec.indexOf("call"); aux1 = (query.value(nameCol)).toString(); qrzLineEdit->setText(aux1); currentQrz = aux1; currentEntity = world->getQRZARRLId(currentQrz); //qDebug() << "MainWindow::qsoToEdit - currentEntity " << QString::number(currentEntity) << endl; nameCol = rec.indexOf("qso_date"); aux1 = (query.value(nameCol)).toString(); dateEdit->setDate(QDate::fromString(aux1, "yyyy/MM/dd")); nameCol = rec.indexOf("time_on"); aux1 = (query.value(nameCol)).toString(); timeEdit->setTime(QTime::fromString(aux1, "hh:mm:ss")); nameCol = rec.indexOf("bandid"); aux1 = (query.value(nameCol)).toString(); stringQuery = QString("SELECT name FROM band WHERE id ='%1'").arg(aux1); QSqlQuery queryAux(stringQuery); sqlOK = queryAux.exec(); if (!sqlOK) { emit queryError(Q_FUNC_INFO, queryAux.lastError().databaseText(), queryAux.lastError().number(), queryAux.lastQuery()); } queryAux.next(); if (queryAux.isValid()) { aux1 = (queryAux.value(0)).toString(); //qDebug() << "MainWindow::qsoToEdit - bandid-1 " << aux1 << endl; //qDebug() << "MainWindow::qsoToEdit: - Changing from: " << bandComboBox->currentText() << endl; bandComboBox->setCurrentIndex(bandComboBox->findText(aux1, Qt::MatchCaseSensitive)); //qDebug() << "MainWindow::qsoToEdit: - Changing to: " << bandComboBox->currentText() << endl; } else { //qDebug() << "MainWindow::qsoToEdit - bandid-NO " << endl; bandComboBox->setCurrentIndex(bandComboBox->findText(dataProxy->getNameFromBandId(defaultBand), Qt::MatchCaseSensitive)); //bandComboBox->setCurrentIndex(defaultBand); } //qDebug() << "MainWindow::qsoToEdit: Check mode " << endl; nameCol = rec.indexOf("modeid"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::qsoToEdit: (aux1)-1: " << aux1 << endl; stringQuery = QString("SELECT submode FROM mode WHERE id ='%1'").arg(aux1); sqlOK = queryAux.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, queryAux.lastError().databaseText(), queryAux.lastError().number(), queryAux.lastQuery()); } queryAux.next(); if (queryAux.isValid()) { aux1 = (queryAux.value(0)).toString(); //qDebug() << "MainWindow::qsoToEdit: Mode query valid: -" << aux1 << "-Length: " << QString::number(aux1.length()) << endl; if (modeComboBox->findText(aux1, Qt::MatchCaseSensitive)>=0) { //qDebug() << "MainWindow::qsoToEdit: Mode in the Combobox: " << aux1 << " - Result: " << QString::number(modeComboBox->findText(aux1)) << endl; modeComboBox->setCurrentIndex(modeComboBox->findText(aux1, Qt::MatchCaseSensitive)); } else { //TODO: Add this mode to the list modes in use //qDebug() << "MainWindow::qsoToEdit: Mode query valid but not in comboBox: " << aux1 << endl; /* for (int i = 0; i < (modeComboBox->count()); i++) { //qDebug() << "MainWindow::qsoToEdit: Mode: " << modeComboBox->itemText(i) << endl; } */ } //qDebug() << "MainWindow::qsoToEdit: After Mode IF" << endl; } else { //qDebug() << "MainWindow::qsoToEdit: Mode query not valid" << endl; modeComboBox->setCurrentIndex(modeComboBox->findText(dataProxy->getNameFromSubModeId(defaultMode), Qt::MatchCaseSensitive)); //modeComboBox->setCurrentIndex(defaultMode); } //qDebug() << "MainWindow::qsoToEdit: After ALL Mode actions" << endl; nameCol = rec.indexOf("rst_sent"); aux1 = (query.value(nameCol)).toString(); rstTXLineEdit->setText(aux1); //qDebug() << "MainWindow::qsoToEdit: - RST_SENT: " << aux1 << endl; nameCol = rec.indexOf("rst_rcvd"); aux1 = (query.value(nameCol)).toString(); rstRXLineEdit->setText(aux1); //qDebug() << "MainWindow::qsoToEdit: - before switch" << endl; if (contestMode == "DX") { //qDebug() << "MainWindow::qsoToEdit: - in default" << endl; nameCol = rec.indexOf("qsl_via"); aux1 = (query.value(nameCol)).toString(); QSLTabWidget->setQSLVia(aux1); nameCol = rec.indexOf("qslmsg"); aux1 = (query.value(nameCol)).toString(); QSLTabWidget->setQSLMsg(aux1); //qslmsgTextEdit->setText(aux1); nameCol = rec.indexOf("comment"); aux1 = (query.value(nameCol)).toString(); if (aux1.length()>0) { commentTabWidget->setData(aux1); //commentLineEdit->setText(aux1); } else { commentTabWidget->clear(); //commentLineEdit->clear(); } nameCol = rec.indexOf("name"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::qsoToEdit: - NAME: " << aux1 << endl; if (aux1.length()>0) { nameLineEdit->setText(aux1); } else { nameLineEdit->clear(); } nameCol = rec.indexOf("qth"); aux1 = (query.value(nameCol)).toString(); qthLineEdit->setText(aux1); nameCol = rec.indexOf("gridsquare"); aux1 = (query.value(nameCol)).toString(); locatorLineEdit->setText(aux1); satTabWidget->setLocator(aux1); nameCol = rec.indexOf("operator"); aux1 = (query.value(nameCol)).toString(); myDataTabWidget->setOperator(aux1); nameCol = rec.indexOf("station_callsign"); aux1 = (query.value(nameCol)).toString(); myDataTabWidget->setStationQRZ(aux1); nameCol = rec.indexOf("my_gridsquare"); aux1 = (query.value(nameCol)).toString(); myDataTabWidget->setMyLocator(aux1); nameCol = rec.indexOf("tx_pwr"); myDataTabWidget->setMyPower((query.value(nameCol)).toDouble()); nameCol = rec.indexOf("rx_pwr"); aux1 = (query.value(nameCol)).toString(); testValueDouble = aux1.toDouble(); if (testValueDouble >=0) { rxPowerSpinBox->setValue(testValueDouble); } else { rxPowerSpinBox->setValue(0.0); } nameCol = rec.indexOf("freq"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::qsoToEdit (freq STRING):" << aux1 << endl; testValueDouble = aux1.toDouble(); //qDebug() << "MainWindow::qsoToEdit (freq):" << QString::number(testValueDouble) << endl; if ((testValueDouble >0) && (testValueDouble <= txFreqSpinBox->maximum()) ) { txFreqSpinBox->setValue(testValueDouble); //qDebug() << "MainWindow::qsoToEdit: Freq - OverFlow " << endl; } else { //qDebug() << "MainWindow::qsoToEdit: Freq - OK " << endl; txFreqSpinBox->setValue(0); } nameCol = rec.indexOf("freq_rx"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::qsoToEdit (freq_rx STRING):" << aux1 << endl; testValueDouble = aux1.toDouble(); //qDebug() << "MainWindow::qsoToEdit (freq_rx):" << QString::number(testValueDouble) << endl; if ((testValueDouble >0) && (testValueDouble <= rxFreqSpinBox->maximum()) ) { rxFreqSpinBox->setValue(testValueDouble); //qDebug() << "MainWindow::qsoToEdit: Freq_RX - OverFlow " << endl; } else { //qDebug() << "MainWindow::qsoToEdit: Freq_RX - OK " << endl; rxFreqSpinBox->setValue(0); } //QSL SENT nameCol = rec.indexOf("qsl_sent"); aux1 = (query.value(nameCol)).toString(); QSLTabWidget->setQSLSenStatus(aux1); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("qslsdate"); aux1 = (query.value(nameCol)).toString(); if ( (QDate::fromString(aux1, "yyyy/MM/dd")).isValid() ) { QSLTabWidget->setQSLSenDate(QDate::fromString(aux1, "yyyy/MM/dd")); } nameCol = rec.indexOf("qsl_sent_via"); aux1 = (query.value(nameCol)).toString(); QSLTabWidget->setQSLSenVia(aux1); //QSL RECEPTION // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("I-Ignore") << tr("V-Verified"); // tr("B-Bureau") << tr("D-Direct") << tr("E-Electronic") << tr("M-Manager"); //QSLRDATE: (only valid if QSL_RCVD is Y, I, or V) nameCol = rec.indexOf("qsl_rcvd"); aux1 = (query.value(nameCol)).toString(); QSLTabWidget->setQSLRecStatus(aux1); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("qslrdate"); aux1 = (query.value(nameCol)).toString(); if ( (QDate::fromString(aux1, "yyyy/MM/dd")).isValid() ) { QSLTabWidget->setQSLRecDate(QDate::fromString(aux1, "yyyy/MM/dd")); } nameCol = rec.indexOf("qsl_rcvd_via"); aux1 = (query.value(nameCol)).toString(); QSLTabWidget->setQSLRecVia(aux1); //TODO: BUG: When something is selected while modifying the QSL is deleted??? //CLUBLOG nameCol = rec.indexOf("clublog_qso_upload_status"); aux1 = (query.value(nameCol)).toString(); eQSLTabWidget->setClubLogStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("clublog_qso_upload_date"); aux1 = (query.value(nameCol)).toString(); if ( (QDate::fromString(aux1, "yyyy/MM/dd")).isValid() ) { eQSLTabWidget->setClubLogDate((QDate::fromString(aux1, "yyyy/MM/dd"))); } //CLUBLOG //EQSL_QSL_SENT: {Y, N, R, Q, I} // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("Q-Queued") << tr("I-Ignore"); //EQSL_QSLSDATE (only valid if EQSL_SENT is Y, Q, or I) nameCol = rec.indexOf("eqsl_qsl_sent"); aux1 = (query.value(nameCol)).toString(); eQSLTabWidget->setEQSLSenStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("eqsl_qslsdate"); aux1 = (query.value(nameCol)).toString(); if ( (QDate::fromString(aux1, "yyyy/MM/dd")).isValid() ) { eQSLTabWidget->setEQSLSenDate(QDate::fromString(aux1, "yyyy/MM/dd")); } //E-QSL RECEPTION // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("I-Ignore") << tr("V-Verified"); // EQSL_QSL_RCVD: {Y, N, R, I, V} // EQSL_QSLRDATE: (only valid if EQSL_RCVD is Y, I, or V) nameCol = rec.indexOf("eqsl_qsl_rcvd"); aux1 = (query.value(nameCol)).toString(); eQSLTabWidget->setEQSLRecStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("eqsl_qslrdate"); aux1 = (query.value(nameCol)).toString(); if ( (QDate::fromString(aux1, "yyyy/MM/dd")).isValid() ) { eQSLTabWidget->setEQSLRecDate(QDate::fromString(aux1, "yyyy/MM/dd")); } //LOTW_QSL_SENT: {Y, N, R, Q, I} // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("Q-Queued") << tr("I-Ignore"); //LOTW_QSLSDATE (only valid if LOTW_SENT is Y, Q, or I) nameCol = rec.indexOf("lotw_qsl_sent"); aux1 = (query.value(nameCol)).toString(); eQSLTabWidget->setLOTWSenStatus(aux1.toUpper()); //qDebug() << "MainWindow::qsoToEdit: - LoTW Sent Status: " << aux1 << endl; //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("lotw_qslsdate"); aux1 = (query.value(nameCol)).toString(); if ( (QDate::fromString(aux1, "yyyy/MM/dd")).isValid() ) { eQSLTabWidget->setLOTWSenDate(QDate::fromString(aux1, "yyyy/MM/dd")); } //E-QSL RECEPTION // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("I-Ignore") << tr("V-Verified"); // lotw_QSL_RCVD: {Y, N, R, I, V} // lotw_QSLRDATE: (only valid if lotw_RCVD is Y, I, or V) nameCol = rec.indexOf("lotw_qsl_rcvd"); aux1 = (query.value(nameCol)).toString(); eQSLTabWidget->setLOTWRecStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("lotw_qslrdate"); aux1 = (query.value(nameCol)).toString(); if ( (QDate::fromString(aux1, "yyyy/MM/dd")).isValid() ) { eQSLTabWidget->setLOTWRecDate(QDate::fromString(aux1, "yyyy/MM/dd")); } //qDebug() << "MainWindow::qsoToEdit: - just before IOTA" << endl; nameCol = rec.indexOf("iota"); aux1 = (query.value(nameCol)).toString(); aux1 = awards->checkIfValidIOTA(aux1); othersTabWidget->setIOTA(aux1); nameCol = rec.indexOf("sat_name"); aux1 = (query.value(nameCol)).toString(); if (aux1.length()>0) { satTabWidget->setSatName(aux1); } else { satTabWidget->clear(); } nameCol = rec.indexOf("sat_mode"); aux1 = (query.value(nameCol)).toString(); if (aux1.length()>1) { satTabWidget->setSatMode(aux1); } else { satTabWidget->setSatMode("-CLEAR-"); } //qDebug() << "MainWindow::qsoToEdit: - in default - 100: " << QString::number(currentEntity) << endl; nameCol = rec.indexOf("dxcc"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::qsoToEdit: Checking DXCC: " << aux1 << " - " << world->getEntityName(aux1.toInt()) << endl; if (aux1.toInt()>=1) { if (aux1.toInt() == util->getNormalizedDXCCValue(currentEntity)) { } else { currentEntity = aux1.toInt(); } //qDebug() << "MainWindow::qsoToEdit: - in default - 101: " << QString::number(currentEntity) << endl; } else { currentEntity = world->getQRZARRLId(currentQrz); //qDebug() << "MainWindow::qsoToEdit: - in default - 103: " << QString::number(currentEntity) << endl; } //qDebug() << "MainWindow::qsoToEdit: - in default - 104: " << QString::number(currentEntity) << endl; nameCol = rec.indexOf("prop_mode"); aux1 = (query.value(nameCol)).toString(); othersTabWidget->setPropMode(aux1); infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity); //selectCorrectComboBoxEntity(currentEntity); //qDebug() << "MainWindow::qsoToEdit: " << QString::number(currentEntity) << endl; othersTabWidget->setEntity(currentEntity); //qDebug() << "MainWindow::qsoToEdit: - in default - 101" << endl; QStringList _qs; //for the showStatusOfDXCC(const QStringList _qs) _qs.clear(); //TODO: The band sometimes fails here. Check _qs << QString::number(currentEntity) << QString::number(dataProxy->getIdFromBandName(bandComboBox->currentText())) << QString::number(dataProxy->getIdFromBandName(modeComboBox->currentText())) << QString::number(currentLog); //qDebug() << "MainWindow::qsoToEdit: - in default - 104" << endl; showStatusOfDXCC(_qs); //qDebug() << "MainWindow::qsoToEdit: - in default - 105" << endl; //qDebug() << "MainWindow::qsoToEdit: - just after de IOTA" << endl; } else if (contestMode == "CQ-WW-SSB") { } else { //TODO: Manage the else... is it a DX or show a message? } //qDebug() << "MainWindow::qsoToEdit: - in default - 106" << endl; } //Closes the next.isValid //qDebug() << "MainWindow::qsoToEdit: - in default - END" << endl; } void MainWindow::slotLocatorTextChanged() {//TO BE REMOVED ONCE InfoWidget is FINISHED - At least modified //qDebug() << "MainWindow::slotLocatorTextChanged: " << locatorLineEdit->text() << endl; if ( locator->isValidLocator((locatorLineEdit->text()).toUpper()) ) { dxLocator = (locatorLineEdit->text()).toUpper(); infoWidget->showDistanceAndBearing(myLocator, dxLocator); satTabWidget->setLocator(dxLocator); //showInfoFromLocators(myLocator, dxLocator); } else { return; } } void MainWindow::slotMyLocatorTextChanged() { //qDebug() << "MainWindow::slotMyLocatorTextChanged: " << myLocatorLineEdit->text() << endl; if ( locator->isValidLocator((myLocatorLineEdit->text()).toUpper()) ) { myLocator = (myLocatorLineEdit->text()).toUpper(); dxccStatusWidget->setMyLocator(myLocator); //qDebug() << "MainWindow::slotMyLocatorTextChanged: My LOCATOR CHANGED TO: " << myLocator << endl; slotLocatorTextChanged(); } else { return; } } void MainWindow::showStatusOfDXCC(const QStringList _qs) { //qDebug() << "MainWindow::showStatusOfDXC: Entity: " << _qs.at(0) << "/ Bandid :" << _qs.at(1) << "/Modeid: " << _qs.at(2) << endl; // Receives: QStringList _qs; //_qs << Entity << BandId << ModeId << lognumber; // Check if new one, needed, worked, confirmed // Print the infoLabel1 // Print/Color the band boxes/labels /* 0 - New One 1 - Needed 2 - Worked 3 - Confirmed */ if ((_qs.length() != 4) || (_qs.at(1) == "-1")) // is the qs valid? { infoWidget->clear(); infoLabel1->setText("--"); return; } // Set the status bar with the appropriate message int status = awards->getDXStatus (_qs); QString message = QString(); //qDebug() << "MainWindow::showStatusOfDXC: " << QString::number(status) << endl; message = awards->getDXStatusString(status); infoLabel1->setText(message); //infoWidget->showInfo((_qs.at(0)).toInt(), (_qs.at(1)).toInt(), (_qs.at(2)).toInt(), (_qs.at(3)).toInt() ); infoWidget->showInfo((_qs.at(0)).toInt()); } void MainWindow::showDXMarathonNeeded(const int _dxcc, const int _cqz, const int _year, const int _log) { //qDebug() << "MainWindow::showDXMarathonNeeded" << endl; if ((_dxcc<=0) || (_cqz<=0) || (!manageDxMarathon)) { return; } if ( awards->isDXMarathonNeed(_dxcc, _cqz, _year, _log)) { infoLabel1->setText(infoLabel1->text()+ tr(" - Needed for DXMarathon")); } } void MainWindow::slotShowAwards() { //To be called from the logWindow & searchWidget //qDebug() << "MainWindow::slotShowAwards" << endl; awards->recalculateAwards(); //qDebug() << "MainWindow::slotShowAwards-1" << endl; logWindow->refresh(); //qDebug() << "MainWindow::slotShowAwards-2" << endl; showAwards(); //qDebug() << "MainWindow::slotShowAwards-3" << endl; dxccStatusWidget->refresh(); //qDebug() << "MainWindow::slotShowAwards-END" << endl; } void MainWindow::showAwards() { // Updates and show all the award status tab. //qDebug() << "MainWindow::showAwards" << endl; /* WAZ Local */ int _num = 0; QSqlQuery query; QString aux; /* aux = QString("SELECT count(id) FROM log WHERE lognumber='%1'").arg(currentLog); query.exec(aux); query.next(); if (query.isValid()) { _num = (query.value(0)).toInt(); } */ _num = dataProxy->getHowManyQSOInLog(currentLog); if (_num>99999) { qsoWorkedQLCDNumber->setDigitCount((QString::number(_num)).size()); } else { qsoWorkedQLCDNumber->setDigitCount(5); } qsoWorkedQLCDNumber->display(_num); _num = dataProxy->getHowManyConfirmedQSLInLog(currentLog); if (_num>99999) { qsoConfirmedQLCDNumber->setDigitCount((QString::number(_num)).size()); } else { qsoConfirmedQLCDNumber->setDigitCount(5); } qsoConfirmedQLCDNumber->display(_num); _num = 0; dxccWorkedQLCDNumber->display(awards->getDXCCWorked(currentLog)); _num = 0; dxccConfirmedQLCDNumber->display(awards->getDXCCConfirmed(currentLog)); _num = 0; wazWorkedQLCDNumber->display(awards->getWAZWorked(currentLog)); _num = 0; wazConfirmedQLCDNumber->display(awards->getWAZConfirmed(currentLog)); showDXMarathon(selectedYear); //qDebug() << "MainWindow::showAwards - END" << endl; } void MainWindow::showDXMarathon(const int _year) { //qDebug() << "MainWindow::MainWindow::showDXMarathon: Year: " << QString::number(_year) << endl; int i = 0; i = awards->getDXMarathonQSO(_year, currentLog); //qDebug() << "MainWindow::MainWindow::showDXMarathon: QSO: " << QString::number(i) << endl; dxMarathonQSOLCDNumber->display(i); i = awards->getDXMarathonDXCC(_year, currentLog); //qDebug() << "MainWindow::MainWindow::showDXMarathon: DXCC: " << QString::number(i) << endl; dxMarathonDXCCQLCDNumber->display(i); i = awards->getDXMarathonCQ(_year, currentLog); dxMarathonCQQLCDNumber->display(i); //qDebug() << "MainWindow::MainWindow::showDXMarathon: CQ: " << QString::number(i) << endl; if (manageDxMarathon) { i = awards->getDXMarathonScore(_year, currentLog); } else { i = 0; } dxMarathonPointsQLCDNumber->display(i); //qDebug() << "MainWindow::MainWindow::showDXMarathon: Score: " << QString::number(i) << endl; } void MainWindow::fillQSOData() { // Updates all QSO with the dxcc, CQZ, ... if empty. //qDebug() << "MainWindow::fillQSOData" << endl; //QString stringQuery = QString("SELECT call, bandid, modeid, qso_date, time_on, lognumber, confirmed, id, cqz, ituz, dxcc FROM log WHERE lognumber='%1'").arg(currentLog); QString stringQuery = QString("SELECT call, bandid, modeid, qso_date, time_on, lognumber, id, cqz, ituz, dxcc, cont FROM log WHERE lognumber='%1'").arg(currentLog); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } QSqlQuery query1; QSqlRecord rec = query.record(); int nameCol; QString aux, queryString; QString _call, _bandid, _modeid, _tdate, _ttime, _lognumber, _id, aux1, updateString;//, _confirmed; bool toModify = false; bool noMoreQso = false; int numberOfQsos = 0; int i = 0; int _dxcc = 0; numberOfQsos = dataProxy->getHowManyQSOInLog(currentLog); //int progressBarPosition = 0; QProgressDialog progress(tr("Filling QSOs..."), tr("Abort filling"), 0, numberOfQsos, this); progress.setWindowModality(Qt::WindowModal); while ( (query.next()) && (!noMoreQso) ) { if (query.isValid()) { i++; toModify = false; nameCol = rec.indexOf("call"); if ( (query.value(nameCol)).isValid() ) { _call = (query.value(nameCol)).toString(); } nameCol = rec.indexOf("bandid"); if ( (query.value(nameCol)).isValid() ) { _bandid = (query.value(nameCol)).toString(); } nameCol = rec.indexOf("modeid"); if ( (query.value(nameCol)).isValid() ) { _modeid = (query.value(nameCol)).toString(); } nameCol = rec.indexOf("qso_date"); if ( (query.value(nameCol)).isValid() ) { _tdate = (query.value(nameCol)).toString(); } nameCol = rec.indexOf("time_on"); if ( (query.value(nameCol)).isValid() ) { _ttime = (query.value(nameCol)).toString(); } nameCol = rec.indexOf("lognumber"); if ( (query.value(nameCol)).isValid() ) { _lognumber = (query.value(nameCol)).toString(); } //nameCol = rec.indexOf("confirmed"); //if ( (query.value(nameCol)).isValid() ) //{ // _confirmed = (query.value(nameCol)).toString(); //} nameCol = rec.indexOf("id"); if ( (query.value(nameCol)).isValid() ) { _id = (query.value(nameCol)).toString(); } //qDebug() << "MainWindow::fillQSOData: ID: " << _id << endl; //TODO: Prepare this query updateString = "UPDATE log SET call = '" + _call + "', bandid = '" + _bandid + "', modeid = '" + _modeid + "', qso_date = '" + _tdate + "', time_on = '" + _ttime + "', lognumber = '" + _lognumber + "'";// + "', confirmed = '" + _confirmed + "'"; nameCol = rec.indexOf("cqz"); if (( (query.value(nameCol)).toString()).length() < 1 ) { aux1 = QString::number(world->getQRZCqz(_call)); updateString = updateString + ", cqz='" + aux1 + "'"; toModify = true; } else { } nameCol = rec.indexOf("ituz"); if (( (query.value(nameCol)).toString()).length() < 1 ) { aux1 = QString::number( world->getQRZItuz(_call) ); updateString = updateString + ", ituz='" + aux1 + "'"; toModify = true; } else {} //qDebug() << "MainWindow::fillQSOData: DXCC" << endl; nameCol = rec.indexOf("dxcc"); _dxcc = (query.value(nameCol)).toInt(); //if (( (query.value(nameCol)).toString()).length() < 1 ) if (_dxcc < 1) { aux1 = QString::number(world->getQRZARRLId(_call) ); //qDebug() << "MainWindow::fillQSOData: DXCC proposed: " << aux1 << endl; if (aux1.toInt()>0) { updateString = updateString + ", dxcc='" + aux1 + "'"; toModify = true; //qDebug() << "MainWindow::fillQSOData: DXCC: " << aux1 << endl; _dxcc = aux1.toInt(); } else { //qDebug() << "MainWindow::fillQSOData: no DXCC identified" << endl; } } else { //qDebug() << "MainWindow::fillQSOData: DXCC already existed" << endl; } nameCol = rec.indexOf("cont"); if (( (query.value(nameCol)).toString()).length() < 2 ) { aux1 = world->getContinentShortName(_dxcc); //aux1 = QString::number( world->getQRZItuz(_call) ); updateString = updateString + ", ituz='" + aux1 + "'"; toModify = true; } else {} _dxcc = -1; //qDebug() << "MainWindow::fillQSOData1: " << updateString << endl; if (toModify) { updateString = updateString + " WHERE id = " + "'" + _id + "'"; //qDebug() << "MainWindow::fillQSOData2: " << updateString << endl; sqlOK = query1.exec(updateString); if (sqlOK) { //qDebug() << "MainWindow::fillQSOData: sqlOK=True" << endl; } else { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().number(), query1.lastQuery()); //qDebug() << "MainWindow::fillQSOData: sqlOK=False" << endl; } } else { updateString.clear(); } aux = tr("Filling DXCC in QSOs...\n QSO: ") + QString::number(i) + "/" + QString::number(numberOfQsos); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { //qDebug() << "MainWindow::fillQSOData3: " << endl; noMoreQso = true; } } // Closes the next.isValid } // Closes the While } void MainWindow::slotFillEmptyDXCCInTheLog() { dataProxy->fillEmptyDXCCInTheLog(); } void MainWindow::slotUpdateCTYDAT() { //qDebug() << "MainWindow::slotUpdateCTYDAT" << endl; downloadcty->download(); } void MainWindow::slotUpdateSATSDAT() { //qDebug() << "MainWindow::slotUpdateSATSDAT" << endl; updateSatsData->readSatDataFile(); satTabWidget->refreshData(); } void MainWindow::slotShowStats() { statsWidget->show(); } void MainWindow::slotWorldReload() { //qDebug() << "MainWindow::slotWorldReload" << endl; //TODO: world.recreate returns a boolean, so it is possible to manage the errors world->recreate(ctyDatFile); } void MainWindow::slotFilePrint() { //qDebug() << "MainWindow::slotFilePrint" << endl; QPrinter printer; QString aux; QSqlQuery query, query1; int row = 0; int _numberOfQsos = 0; bool cancelPrinting = false; bool sqlOK; _numberOfQsos = dataProxy->getHowManyQSOInLog(currentLog); int step = util->getProgresStepForDialog(_numberOfQsos); QTextCursor cursor(doc); QTextTable *textTable = cursor.insertTable(1, 9); QTextBlockFormat centerAlignment; centerAlignment.setAlignment(Qt::AlignCenter); QTextTableFormat tableFormat; tableFormat.setHeaderRowCount(1); tableFormat.setCellPadding(5); tableFormat.setAlignment(Qt::AlignCenter); textTable->setFormat(tableFormat); //The first row is the header cursor = textTable->cellAt(row, 0).firstCursorPosition(); cursor.setBlockFormat(centerAlignment); cursor.insertText(tr("Number")); cursor = textTable->cellAt(row, 1).firstCursorPosition(); cursor.insertText(tr("Date")); cursor = textTable->cellAt(row, 2).firstCursorPosition(); cursor.insertText(tr("Time")); cursor = textTable->cellAt(row, 3).firstCursorPosition(); cursor.insertText(tr("QRZ")); cursor = textTable->cellAt(row, 4).firstCursorPosition(); cursor.insertText(tr("RSTtx")); cursor = textTable->cellAt(row, 5).firstCursorPosition(); cursor.insertText(tr("RSTrx")); cursor = textTable->cellAt(row, 6).firstCursorPosition(); cursor.insertText(tr("Band")); cursor = textTable->cellAt(row, 7).firstCursorPosition(); cursor.insertText(tr("Mode")); cursor = textTable->cellAt(row, 8).firstCursorPosition(); cursor.insertText(tr("Comment")); int nameCol = 0; //int qsoPerPage = 25; //int maxPages = (int)(Klog::number / qsoPerPage)+1; // To print just 10 QSO per page //int printedSoFar = 0; //int page = 1; printer.setOrientation(QPrinter::Landscape); // For testing, the log will be printed landscape. printer.setDocName(stationQRZ+"-log"); QPrintDialog printDialog(&printer, this); printDialog.setWindowTitle(tr("Print Log")); if (printDialog.exec() == QDialog::Accepted) { int _qsos = 0; QProgressDialog progress(tr("Printing the log..."), tr("Abort printing"), 0, _numberOfQsos, this); progress.setMaximum(_numberOfQsos); progress.setWindowModality(Qt::WindowModal); QString stringQuery = QString("SELECT id, qso_date, time_on, call, rst_sent, rst_rcvd, bandid, modeid, comment FROM log WHERE lognumber='%1'").arg(currentLog); sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); return; //TODO: Print a message showing an error and exit. } QSqlRecord rec = query.record(); aux = tr("Printing the log...\n QSO: ") + QString::number(_qsos) + "/" + QString::number(_numberOfQsos); progress.setLabelText(aux); progress.setValue(_qsos); while ((query.next()) && (!cancelPrinting)) { if (query.isValid()) { textTable->appendRows(1); row++; _qsos++; //qDebug() << "MainWindow::slotFilePrint: QSO: " << QString::number(_qsos) << " - Step: " << QString::number(step) << " - Div: " << QString::number(_qsos % step)<< endl; if (( (_qsos % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = tr("Printing the log...\n QSO: ") + QString::number(_qsos) + "/" + QString::number(_numberOfQsos); progress.setLabelText(aux); progress.setValue(_qsos); } nameCol = rec.indexOf("id"); cursor = textTable->cellAt(row, 0).firstCursorPosition(); cursor.insertText((query.value(nameCol)).toString()); nameCol = rec.indexOf("qso_date"); cursor = textTable->cellAt(row, 1).firstCursorPosition(); cursor.insertText((query.value(nameCol)).toString()); nameCol = rec.indexOf("time_on"); cursor = textTable->cellAt(row, 2).firstCursorPosition(); cursor.insertText((query.value(nameCol)).toString()); nameCol = rec.indexOf("call"); cursor = textTable->cellAt(row, 3).firstCursorPosition(); cursor.insertText((query.value(nameCol)).toString()); nameCol = rec.indexOf("rst_sent"); cursor = textTable->cellAt(row, 4).firstCursorPosition(); cursor.insertText((query.value(nameCol)).toString()); nameCol = rec.indexOf("rst_rcvd"); cursor = textTable->cellAt(row, 5).firstCursorPosition(); cursor.insertText((query.value(nameCol)).toString()); nameCol = rec.indexOf("bandid"); aux = (query.value(nameCol)).toString(); stringQuery = QString("SELECT name FROM band WHERE id='%1'").arg(aux); sqlOK = query1.exec(stringQuery); if (sqlOK) { query1.next(); if (query1.isValid()) { cursor = textTable->cellAt(row, 6).firstCursorPosition(); cursor.insertText((query1.value(0)).toString()); } } else { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().number(), query1.lastQuery()); } //qDebug() << "MainWindow::slotFilePrint: Band: " << aux << endl; nameCol = rec.indexOf("modeid"); //qDebug() << "MainWindow::slotFilePrint: nameCol: " << QString::number(nameCol) << endl; aux = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::slotFilePrint: Mode1: " << aux << endl; aux = dataProxy->getNameFromSubModeId(aux.toInt()); //qDebug() << "MainWindow::slotFilePrint: Mode2: " << aux << endl; if (aux.length()>1) { cursor = textTable->cellAt(row, 7).firstCursorPosition(); cursor.insertText(aux); } else { //qDebug() << "MainWindow::slotFilePrint: ERROR: " << aux << endl; } nameCol = rec.indexOf("comment"); aux = (query.value(nameCol)).toString(); if ((aux.length())>0) { cursor = textTable->cellAt(row, 8).firstCursorPosition(); cursor.insertText(aux); } } if ( progress.wasCanceled() ) { cancelPrinting = true; } } progress.setValue(_numberOfQsos); if (!cancelPrinting) { doc->print(&printer); } } } //DX-CLUSTER - DXCLUSTER void MainWindow::slotAnalyzeDxClusterSignal(QStringList ql) { //qDebug() << "MainWindow::slotAnalyzeDxClusterSignal: 1: " << ql.at(0) <<"/1: " << ql.at(1) << "/2: " << ql.at(2) << endl; QStringList qls; int _entity = world->getQRZARRLId(ql.at(0)); qls.clear(); QString _mode = "-1"; if (!manageMode) { _mode = "-1"; } if (ql.length()==3) { if ((ql.at(2)) == "double") { clusterSpotToLog(ql.at(0), ql.at(1)); } else if ((ql.at(2)) == "selected") { infoLabel2->setText(world->getEntityName(_entity)); infoWidget->showEntityInfo( _entity ); // Becareful, he Frecuency arrives in KHz instead of bandid!! // db.getBandFromFreq expects a MHz! //(ql.at(1)).toDouble() qls << QString::number(_entity) << QString::number(dataProxy->getBandIdFromFreq((ql.at(1).toDouble()/1000))) << _mode << QString::number(currentLog); // We use a mode = -1 because we don't know the mode info from the DXCluster spot // TODO: Check if we can know the mode and replace the "-1" in previous sentence //qls << QRZ << BandId << ModeId << lognumber; showStatusOfDXCC(qls); } else { } } else { // Signal was not properly emited } } double MainWindow::checkFreqRanges(double _f) { if ( (_f > double(0)) && (_f <= txFreqSpinBox->maximum())) { return _f; } else { return 0; } } //void MainWindow::clusterSpotToLog(const QStringList _qs) void MainWindow::clusterSpotToLog(const QString _call, const QString _freq) { //qDebug() << "MainWindow::clusterSpotToLog: " << _call <<"/" << _freq << endl; QString _aux; double _freqN = (_freq.toDouble()) / 1000; qrzLineEdit->setText(_call); //qrzLineEdit->setText(_qs.at(0)); txFreqSpinBox->setValue(checkFreqRanges(_freqN)); //freqQLCDNumber->display(_freqN); _aux = QString::number(_freqN); //qDebug() << "MainWindow::clusterSpotToLog - Freq: " << _aux << endl; int _bandi = dataProxy->getBandIdFromFreq(_aux.toDouble()); //qDebug() << "MainWindow::clusterSpotToLog - Bandi: " << QString::number(_bandi) << endl; _aux = QString::number(_bandi); _aux = QString("SELECT name FROM band WHERE id ='%1'").arg(_aux); //qDebug() << "MainWindow::clusterSpotToLog - Band: " << _aux << endl; QSqlQuery query(_aux); query.next(); if (query.isValid()) { _aux = (query.value(0)).toString(); bandComboBox->setCurrentIndex(bandComboBox->findText(_aux, Qt::MatchCaseSensitive)); } else { bandComboBox->setCurrentIndex(bandComboBox->findText(dataProxy->getNameFromBandId(defaultBand), Qt::MatchCaseSensitive)); //bandComboBox->setCurrentIndex(defaultBand); } } //DX-CLUSTER - DXCLUSTER void MainWindow::updateQSLRecAndSent() { //qDebug() << "MainWindow::updateQSLRecAndSent " << endl; // Checks the log to fill all the qsl_rcvd and qsl_sent QSqlQuery query, query1; QString queryString, aux, idT; //int nameCol=0; //queryString = QString("SELECT id, qsl_rcvd, qsl_sent FROM log WHERE lognumber='%1'").arg(currentLog); //queryString = QString("SELECT id, qsl_rcvd, qsl_sent FROM log WHERE qsl_rcvd !='Y' AND qsl_rcvd !='N' AND qsl_rcvd !='R' AND qsl_rcvd !='I' AND qsl_rcvd !='V' AND lognumber='%1'").arg(currentLog); //queryString = QString("SELECT id, qsl_rcvd, qsl_sent FROM log WHERE qsl_rcvd ='' OR qsl_rcvd IS NULL OR qsl_sent ='' AND lognumber='%1'").arg(currentLog); queryString = QString("UPDATE log SET qsl_rcvd='N' WHERE qsl_rcvd ='' AND lognumber='%1'").arg(currentLog); bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } queryString = QString("UPDATE log SET qsl_sent='N' WHERE qsl_sent ='' AND lognumber='%1'").arg(currentLog); sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } /* QSqlRecord rec = query.record(); int numberOfQsos = 0; int i = 0; numberOfQsos = dataProxy->getHowManyQSOInLog(currentLog); int step = util->getProgresStepForDialog(numberOfQsos); QProgressDialog progress(tr("Updating QSL status..."), tr("Abort updating"), 0, numberOfQsos, this); progress.setWindowModality(Qt::WindowModal); while (query.next()) { if (query.isValid()) { i++; nameCol = rec.indexOf("id"); idT = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::updateQSLRecAndSent: " << idT << endl; // {Y, N, R, I, V} nameCol = rec.indexOf("qsl_rcvd"); aux = (query.value(nameCol)).toString(); if ( (aux != "Y") && (aux != "N") && (aux != "R") && (aux != "I") && (aux != "V") ) {//QSL_RCVD nameCol = rec.indexOf("qsl_sent"); aux = (query.value(nameCol)).toString(); //{Y, N, R, Q, I} if ( (aux != "Y") && (aux != "N") && (aux != "R") && (aux != "Q") && (aux != "I") ) {//QSL_SENT queryString = QString("UPDATE log SET qsl_rcvd='N', qsl_sent='N' WHERE id='%1'").arg(idT); if (!query1.exec(queryString)) { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().number(), query1.lastQuery()); } } else { queryString = QString("UPDATE log SET qsl_rcvd='N' WHERE id='%1'").arg(idT); if(!query1.exec(queryString)) { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().number(), query1.lastQuery()); } } } else {//QSL_SENT nameCol = rec.indexOf("qsl_sent"); aux = (query.value(nameCol)).toString(); //{Y, N, R, Q, I} if ( (aux != "Y") && (aux != "N") && (aux != "R") && (aux != "Q") && (aux != "I") ) {//QSL_SENT queryString = QString("UPDATE log SET qsl_sent='N' WHERE id='%1'").arg(idT); if(!query1.exec(queryString)) { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().number(), query1.lastQuery()); } } else { } } } if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = tr("Updating QSLs...\n QSO: ") + QString::number(i) + "/" + QString::number(numberOfQsos); progress.setLabelText(aux); progress.setValue(i); } if ( progress.wasCanceled() ) { return; } } */ //qDebug() << "MainWindow::updateQSLRecAndSent - END" << endl; } void MainWindow::slotOperatingYearComboBoxChanged() { //qDebug() << "MainWindow::slotOperatingYearComboBoxChanged: " << operatingYearsComboBox->currentText() << endl; selectedYear = (operatingYearsComboBox->currentText()).toInt(); showDXMarathon(selectedYear); } void MainWindow::defineStationCallsign() { //qDebug() << "MainWindow::defineStationCallsign (currentLog): " << QString::number(currentLog) << endl; QString logQRZ; logQRZ = dataProxy->getStationCallSignFromLog(currentLog); //qDebug() << "MainWindow::defineStationCallsign (logQrz): " << logQRZ << endl; if (world->checkQRZValidFormat(logQRZ)) { stationQRZ = logQRZ; } else { stationQRZ = mainQRZ; } myDataTabWidget->setData(myPower, stationQRZ, operatorQRZ, myLocator); dxccStatusWidget->setMyLocator(myLocator); //qDebug() << "MainWindow::defineStationCallsign: " << stationQRZ << " - END" << endl; } void MainWindow::slotSetPropMode(const QString _p) { //qDebug() << "MainWindow::slotSetPropMode: " << _p << endl; //if(modify) //{ // return; //} othersTabWidget->setPropMode(_p); //int indexC = propModeComboBox->findText(" - " + _p + " - ", Qt::MatchContains); //propModeComboBox->setCurrentIndex(indexC); } void MainWindow::completeWithPreviousQSO(const QString _call) { //qDebug() << "MainWindow::completeWithPreviousQSO" << endl; //This function completes: Name, QTH, Locator, Entity, Iota if ((!completeWithPrevious) || (_call.length()<=0) || (dataProxy->isWorkedB4(_call, -1)<=0)) //if ( (_call.length()<=0) || (dataProxy->isWorkedB4(_call, -1)<=0)) { if (completedWithPreviousName) { nameLineEdit->clear(); completedWithPreviousName = false; nameLineEdit->setPalette(palBlack); } if (completedWithPreviousQTH) { qthLineEdit->clear(); completedWithPreviousQTH = false; qthLineEdit->setPalette(palBlack); } if (completedWithPreviousLocator) { locatorLineEdit->clear(); completedWithPreviousLocator = false; locatorLineEdit->setPalette(palBlack); } if (completedWithPreviousIOTA) { othersTabWidget->clearIOTA(); //iotaContinentComboBox->setCurrentIndex(0); //iotaNumberLineEdit->setText("000"); completedWithPreviousIOTA = false; //iotaNumberLineEdit->setPalette(palBlack); } if (completedWithPreviousQSLVia) { QSLTabWidget->setQSLVia(""); //qslViaLineEdit->clear(); completedWithPreviousQSLVia = false; //qslViaLineEdit->setPalette(palBlack); } return; } QString aux = QString(); aux = dataProxy->getNameFromQRZ(_call); if ((aux.length()>=0) && ((nameLineEdit->text()).length()<=0) ) { nameLineEdit->setPalette(palRed); completedWithPreviousName = true; nameLineEdit->setText(aux); } else if (completedWithPreviousName) { nameLineEdit->clear(); completedWithPreviousName = false; nameLineEdit->setPalette(palBlack); } else { } aux = dataProxy->getQTHFromQRZ(_call); if ((aux.length()>=0) && ((qthLineEdit->text()).length()<=0) ) { qthLineEdit->setPalette(palRed); completedWithPreviousQTH = true; qthLineEdit->setText(aux); } else if (completedWithPreviousQTH) { qthLineEdit->clear(); completedWithPreviousQTH = false; qthLineEdit->setPalette(palBlack); } aux = dataProxy->getLocatorFromQRZ(_call); if ((aux.length()>=0) && ((locatorLineEdit->text()).length()<=0) ) { locatorLineEdit->setPalette(palRed); locatorLineEdit->setText(aux); completedWithPreviousLocator=true; } else if (completedWithPreviousLocator) { locatorLineEdit->clear(); completedWithPreviousLocator = false; locatorLineEdit->setPalette(palBlack); } aux = dataProxy->getIOTAFromQRZ(_call); //othersTabWidget->setIOTA(aux); if ((aux.length()>=0) && (othersTabWidget->isIOTAModified()) ) { aux = awards->checkIfValidIOTA(aux); if ((aux.length())==6) { othersTabWidget->setIOTA(aux, false); //TODO: Decide if it is better this way or like in : void MainWindowInputQSL::setQSLVia(const QString _qs, QColor qColor) //QStringList values = aux.split("-", QString::SkipEmptyParts); //iotaContinentComboBox->setCurrentIndex( iotaContinentComboBox->findText(values.at(0) ) ); //iotaNumberLineEdit->setPalette(palRed); //iotaNumberLineEdit->setText(values.at(1)); completedWithPreviousIOTA=true; } else if (completedWithPreviousIOTA) { othersTabWidget->clearIOTA(); completedWithPreviousName = false; } } else if (completedWithPreviousIOTA) { othersTabWidget->clearIOTA(); completedWithPreviousIOTA = false; } aux = dataProxy->getQSLViaFromQRZ(_call); if ((aux.length()>=0) && ((QSLTabWidget->getQSLVia()).length()<=0) ) { QSLTabWidget->setQSLVia(aux, Qt::red); completedWithPreviousQSLVia=true; } else if (completedWithPreviousQSLVia) { QSLTabWidget->setQSLVia(""); } } void MainWindow::updateBandComboBox(const QString _band) { //qDebug() << "MainWindow::updateBandComboBox: " << _band << endl; updatingBands = true; QString _currentBand = bandComboBox->currentText(); if (bandComboBox->findText(_band, Qt::MatchCaseSensitive) < 0) {// The selected frequency is of a band that is not currently selected //qDebug() << "MainWindow::updateBandComboBox - New band found: " << _band << endl; if (dataProxy->getIdFromBandName(_band) > 1) {// Not affected if 0 (light) is the frequency // In this case the user should select the band in the setup //qDebug() << "MainWindow::updateBandComboBox- Band is valid: " << _band << endl; QStringList qsTemp; qsTemp.clear(); qsTemp << bands; qsTemp << _band; bands.clear(); bands << dataProxy->sortBandNamesBottonUp(qsTemp); bandComboBox->clear(); bandComboBox->addItems(bands); dxccStatusWidget->setBands(bands); //qDebug() << "MainWindow::updateBandComboBox - Before adding bands!" << endl; satTabWidget->addBands(bands); //qDebug() << "MainWindow::updateBandComboBox - Band has been added!" << endl; } else { //qDebug() << "MainWindow::updateBandComboBox- (END) Band is NOT valid: " <<_band<< endl; updatingBands = false; return; } } bandComboBox->setCurrentIndex(bandComboBox->findText(_currentBand, Qt::MatchCaseSensitive)); updatingBands = false; //bandComboBox->setCurrentIndex(bandComboBox->findText(_band, Qt::MatchCaseSensitive)); //qDebug() << "MainWindow::updateBandComboBox- END" << endl; } void MainWindow::slotFreqTXChanged() { //qDebug() << "MainWindow::slotFreqTXChanged" << QString::number(txFreqSpinBox->value()) << endl; txFreqBeingChanged = true; int bandId = dataProxy->getBandIdFromFreq(txFreqSpinBox->value()); if (bandId > 1) { // If the freq belongs to one ham band txFreqSpinBox->setPalette(palBlack); txFreqSpinBox->setToolTip(tr("TX Frequency in MHz.")); if ((hamlibActive) && (!modify)) { hamlib->setFreq(txFreqSpinBox->value()); } bool freqInBand = dataProxy->isThisFreqInBand(bandComboBox->currentText(), QString::number(txFreqSpinBox->value())); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band //qDebug() << "MainWindow::slotFreqTXChanged Freq is not in the current band" << endl; QString _newBand = dataProxy->getBandNameFromFreq(txFreqSpinBox->value()); updateBandComboBox(_newBand); bandComboBox->setCurrentIndex(bandComboBox->findText(_newBand, Qt::MatchCaseSensitive)); } } else { txFreqSpinBox->setToolTip(tr("TX Frequency in MHz.\nFrequency is not in a hamradio band!")); txFreqSpinBox->setPalette(palRed); //qDebug() << "MainWindow::slotFreqTXChanged Freq is not in ANY ham band" << endl; } if (!txFreqBeingAutoChanged) { satTabWidget->setUpLinkFreq(txFreqSpinBox->value()); } txFreqBeingChanged = false; //slotBandComboBoxChanged(); /* QString _q; int v = dataProxy->getBandIdFromFreq(txFreqSpinBox->value()); //if ((v<0) || (modify)) if (v<0) { return; } satTabWidget->setUpLink(QString::number(txFreqSpinBox->value())); _q = dataProxy->getNameFromBandId (v); if (bandComboBox->findText(_q, Qt::MatchCaseSensitive) < 0) {// The selected frequency is of a band that is not currently selected //qDebug() << "MainWindow::slotFreqTXChanged - New band found: " << _q << endl; if (dataProxy->getIdFromBandName(_q) > 1) {// Not affected if 0 (light) is the frequency // In this case the user should select the band in the setup //qDebug() << "MainWindow::slotFreqTXChanged - Band is valid: " << _q << endl; QStringList qsTemp; qsTemp.clear(); qsTemp << bands; qsTemp << _q; bands.clear(); bands << dataProxy->sortBandNamesBottonUp(qsTemp); bandComboBox->clear(); bandComboBox->addItems(bands); dxccStatusWidget->setBands(bands); satTabWidget->addBands(bands); //qDebug() << "MainWindow::slotFreqTXChanged - Band has been added!" << endl; } else { //qDebug() << "MainWindow::slotFreqTXChanged - Band is NOT valid: " << _q << endl; return; } } //qDebug() << "MainWindow::slotFreqTXChanged - band1: " << bandComboBox->currentText() << endl; bandComboBox->setCurrentIndex(bandComboBox->findText(_q, Qt::MatchCaseSensitive)); //qDebug() << "MainWindow::slotFreqTXChanged - band2: " << bandComboBox->currentText() << endl; */ //qDebug() << "MainWindow::slotFreqTXChanged - END" << endl; } void MainWindow::slotFreqRXChanged() { //qDebug() << "MainWindow::slotFreqRXChanged: " << QString::number(rxFreqSpinBox->value()) << endl; rxFreqBeingChanged = true; int bandId = dataProxy->getBandIdFromFreq(rxFreqSpinBox->value()); if (bandId > 1) { // If the freq belongs to one ham band rxFreqSpinBox->setPalette(palBlack); rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.")); bool freqInBand = dataProxy->isThisFreqInBand(bandComboBox->currentText(), QString::number(rxFreqSpinBox->value())); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band //qDebug() << "MainWindow::slotFreqTXChanged Freq is not in the current band" << endl; QString _newBand = dataProxy->getBandNameFromFreq(rxFreqSpinBox->value()); updateBandComboBox(_newBand); //bandComboBox->setCurrentIndex(bandComboBox->findText(_newBand, Qt::MatchCaseSensitive)); } } else { rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.\nFrequency is not in a hamradio band!")); rxFreqSpinBox->setPalette(palRed); //qDebug() << "MainWindow::slotFreqRXChanged Freq is not in ANY ham band" << endl; } if (!rxFreqBeingAutoChanged) { satTabWidget->setDownLinkFreq(rxFreqSpinBox->value()); } rxFreqBeingChanged = false; //qDebug() << "MainWindow::slotFreqRXChanged: END" << endl; } void MainWindow::slotShowQSOFromDXCCWidget(const int _q) { //qDebug() << "MainWindow::slotShowQSOFromDXCCWidget: " << QString::number(_q)<< endl; } void MainWindow::slotShowQSOsFromDXCCWidget(QList _qsos) { //qDebug() << "MainWindow::slotShowQSOsFromDXCCWidget" << endl; slotShowSearchWidget(); searchWidget->showQSOs(_qsos); } void MainWindow::slotWSJTXloggedQSO(const int _type, const QString _dxcall, const double _freq, const QString _mode, const QString _dx_grid, const QString _time_off, const QString _report_sent, const QString _report_rec, const QString _tx_power, const QString _comments, const QString _name, const QString _time_on, const QString _de_call, const QString _de_grid) { //qDebug() << "MainWindow::slotWSJTX-loggedQSO type: " << QString::number(_type) << endl; bool logTheQso = false; //qDebug() << "MainWindow::slotWSJTX-loggedQSO type: " << QString::number(_type) << endl; //qDebug() << "MainWindow::slotWSJTX-loggedQSO dxcall: " << _dxcall << endl; //qDebug() << "MainWindow::slotWSJTX-loggedQSO freq: " << QString::number(_freq/1000000) << endl; //qDebug() << "MainWindow::slotWSJTX-loggedQSO mode: " << _mode << endl; //qDebug() << "MainWindow::slotWSJTX-loggedQSO dx_grid: " << _dx_grid << endl; //qDebug() << "MainWindow::slotWSJTX-loggedQSO time_on: " << _time_on << endl; //qDebug() << "MainWindow::slotWSJTX-loggedQSO time_off: " << _time_off << endl; //qDebug() << "MainWindow::slotWSJTX-loggedQSO report_sent: " << _report_sent << endl; //qDebug() << "MainWindow::slotWSJTX-loggedQSO report_rec: " << _report_rec << endl; //qDebug() << "MainWindow::slotWSJTX-loggedQSO tx_power: " << _tx_power << endl; //qDebug() << "MainWindow::slotWSJTX-loggedQSO comments: " << _comments << endl; //qDebug() << "MainWindow::slotWSJTX-loggedQSO name: " << _name << endl; if (_type == 5) { if (wsjtxAutoLog) { // Log automatically, without confirmation logTheQso = true; } else { // Ask for confirmation before logging QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog QSO received")); msgBox.setTextFormat(Qt::RichText); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); QString aux; aux = tr("The following QSO data has been received from WSJT-X to be logged:") + "\n\n" + "
    " + "
  • " + "" + tr("Call") + ": " + "" + _dxcall.toUpper() + "
  • " + "
  • " + "" + tr("Freq") + ": " + "" + QString::number(_freq) + "
  • " + "
  • " + "" + tr("Mode") + ": " + "" + _mode.toUpper() + "
  • " + "
  • " + "" + tr("Time On") + ": " + "" + (QDateTime::fromString(_time_on, "yyyyMMddhhmmss")).toString("yyyy/MM/dd - hh:mm:ss") + "
  • " + "
  • " + "" + tr("Time Off") + ": " + "" + (QDateTime::fromString(_time_off, "yyyyMMddhhmmss")).toString("yyyy/MM/dd - hh:mm:ss") + "
  • " + "
  • " + "" + tr("RST TX") + ": " + "" + _report_sent + " - " + tr("RST RX") + ": " + "" + _report_rec + "
  • " + "
  • " + "" + tr("DX-Grid") + ": " + "" + _dx_grid.toUpper() + "
  • " + "
  • " + "" + tr("Name") + ": " + "" + _name + "
  • " + "
  • " + "" + tr("Comments") + ": " + "" + _comments + "
  • " + "
  • " + "" + tr("TX Pwr") + ": " + "" + _tx_power + "
  • " + "
  • " + "" + tr("Operator") + ": " + "" + _de_call.toUpper() + "
  • " + "
  • " + "" + tr("Local-Grid") + ": " + "" + _de_grid + "
  • " + "
" ; msgBox.setText(aux); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: logTheQso = true; break; case QMessageBox::No: logTheQso = false; break; default: // should never be reached logTheQso = false; break; } } if (logTheQso) { //qDebug() << "MainWindow::slotWSJTX-loggedQSO: QSO must be logged" << endl; bool qsoLogged = false; int dxcc = world->getQRZARRLId(_dxcall); dxcc = util->getNormalizedDXCCValue(dxcc); QString _oper = _de_call; if (!(util->isValidCall(_oper))) { _oper = operatorQRZ; } QString _myLoc = _de_grid; if (!(locator->isValidLocator(_myLoc))) { _myLoc = myLocator; } qsoLogged = dataProxy->addQSOFromWSJTX(_dxcall.toUpper(), _freq, _mode, _dx_grid, _time_off, _report_sent, _report_rec, _tx_power, _comments, _name, _time_on, dxcc, _oper, stationQRZ, _myLoc, currentLog); if (qsoLogged) { //qDebug() << "MainWindow::slotWSJTX-loggedQSO: Logged QSO OK: " << _dxcall << endl; actionsJustAfterAddingOneQSO(); infoLabel1T = infoLabel1->text(); infoLabel2T = infoLabel2->text(); infoLabel1->setText(tr("QSO logged from WSJT-X:")); infoLabel2->setText(_dxcall + " - " + dataProxy->getBandNameFromFreq(_freq) + "/" + _mode); timerInfoBars->start(infoTimeout); } else { //qDebug() << "MainWindow::slotWSJTX-loggedQSO: Logged QSO NOK: " << _dxcall << endl; } } else { //qDebug() << "MainWindow::slotWSJTX-loggedQSO: QSO must NOT be logged ... ending" << endl; } } else { //qDebug() << "MainWindow::slotWSJTX-loggedQSO: type != 5, nothing to do or an error"<< endl; } //qDebug() << "MainWindow::slotWSJTX-loggedQSO: - END" << endl; } bool MainWindow::checkIfNewMode(const QString _mode) { //qDebug() << "MainWindow::checkIfNewMode: " << _mode << endl; if (dataProxy->getSubModeIdFromSubMode(_mode)<0) {// The mode is not existing; it is not an accepted mode for KLog // TODO: Show an error to the user //qDebug() << "MainWindow::checkIfNewMode: Mode not valid! - " << _mode << endl; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); QString aux = tr("A new mode not supported by KLog has been received from an external software or radio:") + "(" + _mode + ")\n\n" + tr("If the received mode is correct, please contact KLog development team and request support for that mode") + "\n\n" + tr("Do you want to keep receiving this alerts? (disabling this alerts will prevent that non-valid modes are detected)"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: return false; // The user wants to keepseeing errors //break; case QMessageBox::No: return true; //No more error shown // break; default: // should never be reached return false; // The user wants to keepseeing errors //break; } } else { //noMoreModeErrorShown = false; //TODO: Add the new mode to the list of active modes //qDebug() << "MainWindow::slotStatusFromUDPServer: VALID NEW MODE: Adding... - " << _mode << endl; addNewValidMode(_mode); } return false; } void MainWindow::slotWSJXstatusFromUDPServer(const int _type, const QString _dxcall, const double _freq, const QString _mode, const QString _report, const QString _de_call, const QString _de_grid, const QString _dx_grid, const QString _sub_mode) { if (modify) { return; } //qDebug() << "MainWindow::slotStatusFromUDPServer type: " << QString::number(_type) << endl; //qDebug() << "MainWindow::slotStatusFromUDPServer dxcall: " << _dxcall << endl; //qDebug() << "MainWindow::slotStatusFromUDPServer freq: " << QString::number(_freq/1000000) << endl; //qDebug() << "MainWindow::slotStatusFromUDPServer mode: " << _mode << endl; //qDebug() << "MainWindow::slotStatusFromUDPServer report: " << _report << endl; //qDebug() << "MainWindow::slotStatusFromUDPServer de_call: " << _de_call << endl; //qDebug() << "MainWindow::slotStatusFromUDPServer _de_grid: " << _de_grid << endl; //qDebug() << "MainWindow::slotStatusFromUDPServer dx_grid: " << _dx_grid << endl; //qDebug() << "MainWindow::slotStatusFromUDPServer sub_mode: " << _sub_mode << endl; if ((modeComboBox->findText(_mode, Qt::MatchCaseSensitive)<0) && (!noMoreModeErrorShown)) { //qDebug() << "MainWindow::slotStatusFromUDPServer New mode: " << _mode << endl; noMoreModeErrorShown = checkIfNewMode(_mode); /* if (dataProxy->getSubModeIdFromSubMode(_mode)<0) {// The mode is not existing; it is not an accepted mode for KLog // TODO: Show an error to the user //qDebug() << "MainWindow::slotStatusFromUDPServer: Mode not valid! - " << _mode << endl; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); QString aux = tr("A new mode not supported by KLog has been received from an external software:") + "(" + _mode + ")\n\n" + tr("If the received mode is correct, please contact KLog development team and request support for that mode") + "\n\n" + tr("Do you want to keep receiving this alerts? (disabling this alerts will prevent that non-valid modes are detected)"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: break; case QMessageBox::No: noMoreModeErrorShown = true; break; default: // should never be reached break; } } else { //noMoreModeErrorShown = false; //TODO: Add the new mode to the list of active modes //qDebug() << "MainWindow::slotStatusFromUDPServer: VALID NEW MODE: Adding... - " << _mode << endl; addNewValidMode(_mode); } */ } switch (_type) { case 0: //MainWindow::slotStatusFromUDPServer: - type = " << QString::number(_type) << " - OUT/IN - Heartbeat" << endl; break; case 1: //qDebug() << "MainWindow::slotStatusFromUDPServer: - type = " << QString::number(_type) << " - OUT - Status" << endl; qrzLineEdit->setText(_dxcall); if ((!noMoreModeErrorShown) && (dataProxy->getSubModeIdFromSubMode(_mode)>0) ) { modeComboBox->setCurrentIndex(modeComboBox->findText(_mode, Qt::MatchCaseSensitive)); } //qDebug() << "MainWindow::slotWSJXstatusFromUDPServer updating txFreqSpinBox" << QString::number(_freq) << endl; txFreqSpinBox->setValue(_freq); slotUpdateLocator(_dx_grid); rstTXLineEdit->setText(_report); myDataTabWidget->setMyLocator(_de_grid); myDataTabWidget->setStationQRZ(_de_call.toUpper()); //TODO: Check what to do with _de_call -> Check if _de_call == station callsign and update if needed. //TODO: Check what to do with _de_grid -> Check if _de_grid == My Grid and update if needed. //TODO: Check what to do with _submode. //bandComboBox->setCurrentIndex(bandComboBox->findText(, Qt::MatchCaseSensitive)); break; default: //NO //qDebug() << "MainWindow::slotStatusFromUDPServer: - type = " << QString::number(_type) << " - ERROR on Type" << endl; break; } } void MainWindow::addNewValidMode(const QString _mode) { //qDebug() << "MainWindow::addNewMode: " << _mode << endl; QStringList _newM; _newM.clear(); _newM << _mode; for (int i = 0;i < modeComboBox->count(); i++) { _newM << modeComboBox->itemText(i); } readActiveModes (_newM); modeComboBox->clear(); modeComboBox->addItems(modes); //qDebug() << "MainWindow::addNewValidMode: END" << endl; } void MainWindow::slotClearNoMorErrorShown() { noMoreErrorShown = false; } void MainWindow::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, int errorCodeN, QString queryFailed) { //qDebug() << "MainWindow::slotQueryErrorManagement: Function: " << functionFailed << endl; //qDebug() << "MainWindow::slotQueryErrorManagement: Error N#: " << QString::number(errorCodeN) << endl; //qDebug() << "MainWindow::slotQueryErrorManagement: Error: " << functionFailed << errorCodeS << endl; if (noMoreErrorShown) {return;} if ((functionFailed == "virtual bool DataProxy_SQLite::addSatellite(QString, QString, QString, QString, QString)") && (errorCodeN == 19)) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("A duplicated satellite has been detected in the file and will not be imported.")); msgBox.setInformativeText(tr("Please check the satellite information file and ensure it is properly populated.") + "\n" + tr("Now you will see a more detailed error that can be used for debugging...")); msgBox.exec(); } // TODO: An error on DB has been detected. // KLog should suggest to export ALL the data to an ADIF file to prevent any log lose QString aux = "
" + tr("An unexpected error ocurred!!") + "

" + tr("If the problem persists, please contact the developers") + "(klog-devel@nongnu.org)" + tr("for analysis:") + "
"; QString errorMSG = "
    " "
  • " + tr("Error in function") + ": " + functionFailed + "
  • " + "
  • " + tr("Error code") +": " + QString::number(errorCodeN) + "
  • " + "
  • " + tr("Error text") + ": " + errorCodeS + "
  • " + "
  • " + tr("Failed query") + ": " + queryFailed + "
  • " + "

" + "" + tr("Recomendation:") + "" + tr("Export, periodically, your data to ADIF to prevent a potential data loss.") + "
"; showErrorDialog->setText(aux + errorMSG); //showErrorDialog->setModal(true); showErrorDialog->exec(); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); aux = tr("Do you want to keep showing errors?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::No | QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; case QMessageBox::No: noMoreErrorShown = true; break; default: // should never be reached break; } } void MainWindow::slotDefineNewBands (const QStringList _bands) { //qDebug() << "MainWindow::defineNewBands: " << endl; QStringList qsTemp; qsTemp.clear(); //qsTemp << _bands; //qsTemp.removeDuplicates(); qsTemp << dataProxy->sortBandNamesBottonUp(_bands); bands.clear(); bands << qsTemp; bandComboBox->clear(); bandComboBox->addItems(bands); satTabWidget->addBands(bands); } void MainWindow::slotSatChangeRXFreq(const double _f) { rxFreqBeingAutoChanged = true; rxFreqSpinBox->setValue(_f); rxFreqBeingAutoChanged = false; } void MainWindow::slotSatChangeTXFreq(const double _f) { //qDebug() << "MainWindow::slotSatChangeTXFreq updating txFreqSpinBox" << QString::number(_f) << endl; txFreqBeingAutoChanged = true; txFreqSpinBox->setValue(_f); txFreqBeingAutoChanged = false; //qDebug() << "MainWindow::slotSatChangeTXFreq updating txFreqSpinBox - END" << endl; } void MainWindow::slotSatTXFreqNeeded(const double _f) { //qDebug() << "MainWindow::slotSatTXFreqNeeded: " << QString::number(_f) << endl; QString _band = dataProxy->getBandNameFromFreq(_f); if (bandComboBox->findText(_band, Qt::MatchCaseSensitive) < 0) { updateBandComboBox(_band); } slotSatChangeTXFreq(_f); satTabWidget->setUpLinkFreq(_f); //qDebug() << "MainWindow::slotSatTXFreqNeeded - END " << endl; } void MainWindow::slotSatRXFreqNeeded(const double _f) { //qDebug() << "MainWindow::slotSatRXFreqNeeded: " << QString::number(_f) << endl; QString _band = dataProxy->getBandNameFromFreq(_f); if (bandComboBox->findText(_band, Qt::MatchCaseSensitive) < 0) { updateBandComboBox(_band); } slotSatChangeRXFreq(_f); satTabWidget->setDownLinkFreq(_f); //qDebug() << "MainWindow::slotSatRXFreqNeeded - END " << endl; } void MainWindow::slotHamlibTXFreqChanged(const double _f) { txFreqSpinBox->setValue(_f); } void MainWindow::slotHamlibModeChanged(const QString _m) { if (_m.length()<2) { return; } if (checkIfNewMode(_m)) { return; } if (modeComboBox->findText(_m, Qt::MatchCaseSensitive)>=0) { //qDebug() << "slotHamlibModeChanged: Mode in the Combobox: " << _m << " - Result: " << QString::number(modeComboBox->findText(_m)) << endl; modeComboBox->setCurrentIndex(modeComboBox->findText(_m, Qt::MatchCaseSensitive)); } else { //qDebug() << "MainWindow::slotHamlibModeChanged: Mode not found in combobox" << _m << endl; } } void MainWindow::slotUpdateLocator(QString _loc) { locatorLineEdit->setText(_loc.toUpper()); } void MainWindow::reconfigureDXMarathonUI(const bool _dxM) { dxClusterWidget->setDXMarathon(_dxM); if (_dxM) { dxMarathonLabelN->setText(tr("DX-Marathon")); dxMarathonTopScoreLabelN->setEnabled(true); dxMarathonPointsQLCDNumber->setEnabled(true); dxMarathonPointsQLCDNumber->display(0); } else { dxMarathonLabelN->setText(tr("Annual")); dxMarathonTopScoreLabelN->setEnabled(false); dxMarathonPointsQLCDNumber->setEnabled(false); int i = awards->getDXMarathonScore(dateEdit->date().year(), currentLog); if (i>0) { dxMarathonPointsQLCDNumber->display(i); } else { dxMarathonPointsQLCDNumber->display(0); } } } klog-0.9.8.1/showerrordialog.cpp0000644000175000017500000000372313532572307015535 0ustar develdevel#include "showerrordialog.h" ShowErrorDialog::ShowErrorDialog() { //qDebug() << "ShowErrorDialog::ShowErrorDialog" << endl; text.clear(); setWindowTitle(tr("KLog Message")); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); QVBoxLayout *layout = new QVBoxLayout(this); layout->setSizeConstraint(QLayout::SetFixedSize); txtLabel = new QLabel(text); // QLabel *txtLabel = new QLabel(text); txtLabel->setWordWrap(true); txtLabel->setOpenExternalLinks(true); txtLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); QPushButton *closeButton = buttonBox->button(QDialogButtonBox::Close); buttonBox->addButton(closeButton, QDialogButtonBox::ButtonRole(QDialogButtonBox::RejectRole | QDialogButtonBox::AcceptRole)); connect(buttonBox , &QDialogButtonBox::rejected, this, &QDialog::reject); txtLabel->setFrameShadow(QFrame::Raised); txtLabel->setFrameStyle(QFrame::StyledPanel); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(closeButton); //QVBoxLayout *mainLayout = new QVBoxLayout; layout->addWidget(txtLabel); layout->addLayout(buttonsLayout); setLayout(layout); //qDebug() << "ShowErrorDialog::ShowErrorDialog - END" << endl; } void ShowErrorDialog::setText(const QString txt) { //qDebug() << "ShowErrorDialog::setVersion: " << txt << endl; text = txt; txtLabel->setText(txt); //textBrowser->setHtml(text); } ShowErrorDialog::~ShowErrorDialog() { //qDebug() << "ShowErrorDialog::~ShowErrorDialog" << endl; } void ShowErrorDialog::slotAcceptButtonClicked() { //qDebug() << "ShowErrorDialog::slotAcceptButtonClicked" << endl; accept(); } void ShowErrorDialog::keyPressEvent(QKeyEvent *event){ switch (event->key()) { break; default: //QFrame::keyPressEvent(event) slotAcceptButtonClicked(); } } klog-0.9.8.1/mainwindowinputcomment.h0000644000175000017500000000440313532572307016603 0ustar develdevel#ifndef MAINWINDOWINPUTCOMMENT_H #define MAINWINDOWINPUTCOMMENT_H /*************************************************************************** mainwindowminputcomment.h - description ------------------- begin : ago 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the Comment // #include #include class MainWindowInputComment : public QWidget { Q_OBJECT public: explicit MainWindowInputComment(QWidget *parent = 0); ~MainWindowInputComment(); void createUI(); void setData(const QString _comment); QString getComment(); void clear(); private: QString comment; QLineEdit *commentLineEdit; }; #endif // MAINWINDOWINPUTCOMMENT_H klog-0.9.8.1/mainwindowsattab.h0000644000175000017500000001056313532572307015343 0ustar develdevel#ifndef MAINWINDOWSATTAB_H #define MAINWINDOWSATTAB_H /*************************************************************************** mainwindowsattab.h - description ------------------- begin : jan 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports Satellites // #include #include #include "dataproxy.h" #include "locator.h" class MainWindowSatTab : public QWidget { Q_OBJECT public: explicit MainWindowSatTab(DataProxy *dp, QWidget *parent = 0); ~MainWindowSatTab(); QString getSatName(); void setSatName(const QString _t); void setOtherSatName(const QString _t); QString getOtherSatName(); QString getSatMode(); void setSatMode(const QString _t); bool getRepeatThis(); void setRepeatThis(const bool _t); void addBands(QStringList _bands); void setDefaultBands(); //Defines the default bands for SAT communications: 10m/2m/70cm/23CM only if they exist on the selected bands void setUpLinkFreq(const double _t); void setDownLinkFreq(const double _t); void setLocator(const QString _t); void refreshData(); void clear(); signals: void setPropModeSat(const QString _p); //void satBandTXChanged(const QString _p); //void satBandRXChanged(const QString _p); void newBandsToBeAdded(const QStringList _p); void satTxFreqChanged(const double _p); void satRxFreqChanged(const double _p); void satTXFreqNeeded(const double _p); void satRXFreqNeeded(const double _p); void dxLocatorChanged(const QString _p); private slots: void slotSatNameTextChanged(); void slotSatModeTextChanged(); void slotSatDXLocTextChanged(); void slotSatNameComboBoxChanged(); void slotSatBandRXComboBoxChanged(); void slotSatBandTXComboBoxChanged(); void slotSatFreqRXChanged(); void slotSatFreqTXChanged(); private: void createUI(); void populateSatComboBox(); void setSatelliteCombo(const QString _p); int getSatIndex(const QString _p); void setBandsOfSat(const QString _p); void addNewBand(const QString _p); void setUpLink(const QString _t); QLineEdit *satNameLineEdit; QLineEdit *satModeLineEdit; QLineEdit *satDXLocatorLineEdit; QLabel *satOtherLabel; QRadioButton *keepThisDataForNextQSORadiobutton; //QComboBox *satNameComboBox; //QPushButton *satNamePushButon; //QComboBox *satNameComboBox, *satModeComboBox; QComboBox *satNameComboBox; QComboBox *satBandTXComboBox, *satBandRXComboBox; QStringList satNames, satModes; QStringList satellitesList; bool txFreqBeingAutoChanged, rxFreqBeingAutoChanged, updatingBands; QPalette palRed, palBlack; // To paint Text in red or black(normal) QDoubleSpinBox *txFreqSpinBox, *rxFreqSpinBox; DataProxy *dataProxy; Locator *locator; }; #endif // MAINWINDOWSATTAB_H klog-0.9.8.1/mainwindowinputcomment.cpp0000644000175000017500000000523413532572307017141 0ustar develdevel/*************************************************************************** mainwindowinputcomment.cpp - description ------------------- begin : Ago 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mainwindowinputcomment.h" MainWindowInputComment::MainWindowInputComment(QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowInputComment::MainWindowInputComment" << endl; commentLineEdit = new QLineEdit(); comment.clear(); createUI(); //qDebug() << "MainWindowInputComment::MainWindowInputComment - END" << endl; } MainWindowInputComment::~MainWindowInputComment(){} void MainWindowInputComment::createUI() { commentLineEdit->setToolTip(tr("Add a comment for this QSO.")); QVBoxLayout *tabLayout = new QVBoxLayout; tabLayout->addWidget(commentLineEdit); setLayout(tabLayout); } void MainWindowInputComment::setData(const QString _comment) { comment = _comment; commentLineEdit->setText(comment); } QString MainWindowInputComment::getComment() { return commentLineEdit->text(); } void MainWindowInputComment::clear() { comment.clear(); commentLineEdit->clear(); } klog-0.9.8.1/udpserver.cpp0000644000175000017500000002226113532572307014340 0ustar develdevel#include "udpserver.h" #include UDPServer::UDPServer(QObject *parent) : QObject(parent) { //qDebug() << "UDPServer::UDPServer" << endl; //address = QString("127.0.0.1"); port = 2237; socketServer = new QUdpSocket(this); //socketServer->bind(QHostAddress::AnyIPv4, port); logging = false; realtime = false; connect(socketServer,SIGNAL(readyRead()),this,SLOT(slotReadPendingDatagrams())); } void UDPServer::slotReadPendingDatagrams() { //qDebug() << "UDPServer::slotReadPendingDatagrams" << endl; while (socketServer->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(socketServer->pendingDatagramSize()); QHostAddress sender; quint16 senderPort; //qDebug() << "UDPServer::slotReadPendingDatagrams: length = " << QString::number(socketServer->pendingDatagramSize()) << endl; socketServer->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort); parse (datagram); //qDebug() << "UDPServer::slotReadPendingDatagrams: = " << datagram << endl; } } bool UDPServer::start() { //qDebug() << "UDPServer::start "<< endl; socketServer->bind(QHostAddress::AnyIPv4, port, QUdpSocket::ShareAddress); groupAddress = QHostAddress("127.0.0.1"); socketServer->joinMulticastGroup(groupAddress); return socketServer->isValid(); // return true; //return socketServer->bind(QHostAddress::AnyIPv4, port); //return socketServer->bind(port, QUdpSocket::ShareAddress); } bool UDPServer::isStarted() { return socketServer->isValid(); } void UDPServer::parse(const QByteArray &msg) { //qDebug() << "UDPServer::parse"<< endl; quint32 magic; quint32 schema; quint32 type; QByteArray id; QDateTime time_off; QByteArray dx_call; QByteArray dx_grid; quint64 frequency = 0; // In Hz?? double frequencyDouble; QByteArray mode; QByteArray report_sent; QByteArray report_received; QByteArray tx_power; QByteArray comments; QByteArray name; QDateTime time_on; // Note: LOTW uses TIME_ON for their +/- 30-minute time QByteArray report; QByteArray tx_mode; bool tx_enabled = false; bool transmitting = false; bool decoding = false; qint32 rx_df = -1; qint32 tx_df = -1; QByteArray de_call; QByteArray de_grid; bool watchdog_timeout = false; QByteArray sub_mode; bool fast_mode = false; //QByteArray msgOut; QDataStream in(msg); //QDataStream out(msgOut, QIODevice::ReadWrite); in.setVersion(16); in.setByteOrder(QDataStream::BigEndian); { //qDebug() << "UDPServer::parse: - Magic GOOD FORMAT = " << QString::number(magic)<< endl; } //qDebug() << "UDPServer::parse Version = " << QString::number(in.version())<< endl; in >> magic >> schema >> type >> id; //QByteArray ba4(QByteArray::fromRawData(cart, 6)); //in.readRawData(type, size) //qDebug() << "UDPServer::parse: - Magic = " << QString::number(magic)<< endl; //qDebug() << "UDPServer::parse: - schema = " << QString::number(schema)<< endl; //qDebug() << "UDPServer::parse: - type = " << QString::number(type)<< endl; if (magic != 2914831322) { //qDebug() << "UDPServer::parse: - Magic BAD FORMAT = " << QString::number(magic)<< endl; return; } switch (type) { case 0: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT/IN - Heartbeat" << endl; break; case 1: //qDebug() << "UDPServer::parse: - type" << QString::number(type) << " - OUT - Status" << endl; // unpack message if (realtime) { in >> frequency >> mode >> dx_call >> report >> tx_mode >> tx_enabled >> transmitting >> decoding >> rx_df >> tx_df >> de_call >> de_grid >> dx_grid >> watchdog_timeout >> sub_mode >> fast_mode; frequencyDouble = (double)frequency; frequencyDouble = frequencyDouble/1000000; // Change to MHz //qDebug() << "UDPServer::parse: - Freq quint64 = " << QString::number(frequency) << endl; //qDebug() << "UDPServer::parse: - Freq double = " << QString::number(frequencyDouble) << endl; emit status_update (type, dx_call, frequencyDouble, mode, report, de_call, de_grid, dx_grid, sub_mode); } else { //qDebug() << "UDPServer::parse: realtime = FALSE" << endl; } //msgOut.append(QString::number(type)); //+ QString::number(frequency) + QString::fromUtf8 (mode) + QString::fromUtf8 (dx_call) // + QString::fromUtf8 (report) + QString::fromUtf8 (tx_mode) // + QString::fromUtf8 (de_call) + QString::fromUtf8 (de_grid) // + QString::fromUtf8 (dx_grid); break; case 2: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT - Decode" << endl; break; case 3: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT - Clear" << endl; break; case 4: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - IN - Replay " << endl; break; case 5: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT - QSO logged" << endl; if (logging) { in >> time_off >> dx_call >> dx_grid >> frequency >> mode >> report_sent >> report_received >> tx_power >> comments >> name >> time_on >> de_call >> de_grid; frequencyDouble = (double)frequency; frequencyDouble = frequencyDouble/1000000; // Change to MHz emit logged_qso (type, dx_call, frequencyDouble, mode, dx_grid, time_off.toString("yyyyMMddHHmmss"), report_sent, report_received, tx_power, comments, name, time_on.toString("yyyyMMddHHmmss"), de_call, de_grid); } else { //qDebug() << "UDPServer::parse: logging = FALSE" << endl; } //emit status_update (type, dx_call, frequency, mode, report, de_call, de_grid, dx_grid, sub_mode) //out << type; //emit status_update (out); //qDebug() << "UDPServer::parse: - DXCall = " << dx_call << endl; //qDebug() << "UDPServer::parse: - Grid = " << dx_grid << endl; //qDebug() << "UDPServer::parse: - Freq = " << QString::number(frequency) << endl; //qDebug() << "UDPServer::parse: - Mode = " << mode << endl; //qDebug() << "UDPServer::parse: - ReportSent = " << report_sent << endl; //qDebug() << "UDPServer::parse: - TX_PWR = " << tx_power << endl; //qDebug() << "UDPServer::parse: - Comments = " << comments << endl; //qDebug() << "UDPServer::parse: - Name = " << name << endl; //qDebug() << "UDPServer::parse: - Time = " << time_on.toString("HHMMSSzzz") << endl; break; case 6: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT - Close " << endl; break; case 7: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - IN - Replay" << endl; break; case 8: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - IN - Halt TX" << endl; break; case 9: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - IN - Free Text" << endl; break; case 10: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT - WSPR Decode" << endl; break; default: //NO //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - ERROR on Type" << endl; break; } //qDebug() << "UDPServer::parse: - Magic: = " << QString::number(magic)<< endl; } bool UDPServer::stop() { //qDebug() << "UDPServer::stop"<< endl; socketServer->close(); if (socketServer->isValid()) { return false; } else { return true; } return false; } void UDPServer::setPort(const int _port) { //qDebug() << "UDPServer::setPort: " << QString::number(_port) << endl; if ((_port >= 0) && (_port<=65535)) { port = _port; } } void UDPServer::setLogging(const bool _t) { //qDebug() << "UDPServer::setLogging: " << endl; if (_t) { //qDebug() << "UDPServer::setLogging: TRUE " << endl; } else { //qDebug() << "UDPServer::setLogging: FALSE" << endl; } logging = _t; } void UDPServer::setRealTimeUpdate(const bool _t) { //qDebug() << "UDPServer::setRealTimeUpdate: " << endl; if (_t) { //qDebug() << "UDPServer::setRealTimeUpdate: TRUE " << endl; } else { //qDebug() << "UDPServer::setRealTimeUpdate: FALSE" << endl; } realtime = _t; } klog-0.9.8.1/INSTALL-macOS.txt0000644000175000017500000000014613532572307014462 0ustar develdevelInstalling KLog on a macOS system is easy. Just click and drop the icon into the Applications folder klog-0.9.8.1/setuppageclublog.h0000644000175000017500000000553613532572307015341 0ustar develdevel#ifndef SETUPPAGECLUBLOG_H #define SETUPPAGECLUBLOG_H /*************************************************************************** setuppclublog.h - description ------------------- begin : apt 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include class SetupPageClubLog : public QWidget { Q_OBJECT public: SetupPageClubLog(QWidget *parent=0); ~SetupPageClubLog(); void setEmail(const QString c); void setPassword(const QString c); void setCallsign(const QString c); void setClubLog(const QString _s); void setClubLogRealTime(const QString _s); void setUseStationCall(const QString _s); QString getEmail(); QString getPassword(); QString getCallsign(); QString getClubLog(); QString getClubLogRealTime(); QString getUseQSOStationCallsign(); private slots: void slotClubLogActive(bool _s); void slotUseStationCall(bool _s); private: //QString defaultFileName; QCheckBox *sendInRealTimeCheckBox, *clubLogActiveCheckBox, *useQSOStationCallCheckBox; QLineEdit *passwordLineEdit, *emailLineEdit, *callLineEdit; QString call, email, pass; QLabel *callLabel, *passwordLabel, *emailLabel; bool clubLogActive; //QPushButton *fileNameButton; }; #endif // SETUPPAGECOLORS_H klog-0.9.8.1/searchwidget.cpp0000644000175000017500000014315313532572307014776 0ustar develdevel#include "searchwidget.h" SearchWidget::SearchWidget(DataProxy *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SearchWidget::SearchWidget" << endl; searchBoxLineEdit = new QLineEdit; dataProxy = dp; awards = new Awards(dataProxy, Q_FUNC_INFO); util = new Utilities; filemanager = new FileManager(dataProxy); world = new World(dataProxy, Q_FUNC_INFO); currentLog = -1; //qDebug() << "SearchWidget::SearchWidget: 00092" << endl; searchResultsTreeWidget = new QTreeWidget; searchResultsTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu); searchResultsTreeWidget->setSortingEnabled(true); //searchResultsTreeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); searchResultsTreeWidget->setSelectionMode(QAbstractItemView::MultiSelection); searchResultsTreeWidget->setMouseTracking(true); searchBoxClearButton = new QPushButton(tr("&Clear"), this); searchBoxExportButton = new QPushButton(tr("&Export Highlighted"), this); searchBoxSelectAllButton = new QPushButton(tr("&Select All"), this); searchBoxReSearchButton = new QPushButton(tr("&Search"), this); searchAllRadioButton = new QRadioButton (tr("All"), this); stationCallSignShownInSearch = true; clear(); createUI(); //qDebug() << "SearchWidget::SearchWidget - END" << endl; } SearchWidget::~SearchWidget() { } void SearchWidget::clear() { searchBoxLineEdit->clear(); searchResultsTreeWidget->clear(); qslingNeeded = false; searchSelectAllClicked = false; } void SearchWidget::setShowCallInSearch(const bool _sh) { stationCallSignShownInSearch = _sh; } void SearchWidget::setColors (const QString _newOne, const QString _needed, const QString _worked, const QString _confirmed, const QString _default) { awards->setColors (_newOne, _needed, _worked, _confirmed, _default); } void SearchWidget::setVersion (const QString _version) { filemanager->setVersion(_version); } void SearchWidget::createUI() { searchBoxClearButton->setToolTip(tr("Clear the searches.")); searchBoxExportButton->setToolTip(tr("Export the search result to an ADIF file.")); searchBoxSelectAllButton->setToolTip(tr("Select/Unselect all the QSOs shown.")); searchBoxReSearchButton->setToolTip(tr("Search in the log.")); searchAllRadioButton->setToolTip(tr("Search in all logs.")); searchBoxLineEdit->setToolTip(tr("Enter the QRZ to search for.")); searchResultsTreeWidget->setToolTip(tr("Search results.")); QStringList labels; if (stationCallSignShownInSearch) { labels << tr("QRZ") << tr("Date/Time") << tr("Band") << tr("Mode") << tr("QSL Sent") << tr("QSL Rcvd") << tr("Station Callsign") << tr("ID") ; searchResultsTreeWidget->setColumnCount(8); } else { labels << tr("QRZ") << tr("Date/Time") << tr("Band") << tr("Mode") << tr("QSL Sent") << tr("QSL Rcvd") << tr("ID") ; searchResultsTreeWidget->setColumnCount(7); } searchResultsTreeWidget->setHeaderLabels(labels); //QTreeWidgetItem *item = new QTreeWidgetItem(searchResultsTreeWidget); (searchResultsTreeWidget->header())->resizeSections(QHeaderView::ResizeToContents); searchResultsTreeWidget->clear(); //searchResultsTreeWidget->collapseAll(); searchResultsTreeWidget->setSortingEnabled(true); //searchResultsTreeWidget->setItemsExpandable(false); QHBoxLayout *dxUpRightSearchTopLayout = new QHBoxLayout; dxUpRightSearchTopLayout->addWidget(searchBoxLineEdit); dxUpRightSearchTopLayout->addWidget(searchAllRadioButton); QHBoxLayout *dxUpRightButtonsLayout = new QHBoxLayout; dxUpRightButtonsLayout->addWidget(searchBoxReSearchButton); dxUpRightButtonsLayout->addWidget(searchBoxClearButton); dxUpRightButtonsLayout->addWidget(searchBoxSelectAllButton); dxUpRightButtonsLayout->addWidget(searchBoxExportButton); QVBoxLayout *dxUpRightSearchTabLayout = new QVBoxLayout; dxUpRightSearchTabLayout->addLayout(dxUpRightSearchTopLayout); dxUpRightSearchTabLayout->addLayout(dxUpRightButtonsLayout); dxUpRightSearchTabLayout->addWidget(searchResultsTreeWidget); setLayout(dxUpRightSearchTabLayout); //connect(dataProxy, SIGNAL(qsoFound(QStringList)), this, SLOT(slotQsoFound(QStringList)) ); connect(searchBoxLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSearchBoxTextChanged() ) ); connect(searchBoxExportButton, SIGNAL(clicked()), this, SLOT(slotSearchExportButtonClicked() ) ); connect(searchBoxClearButton, SIGNAL(clicked()), this, SLOT(slotSearchClearButtonClicked() ) ); connect(searchBoxReSearchButton, SIGNAL(clicked()), this, SLOT(slotSearchBoxReSearchButtonClicked() ) ); connect(searchBoxSelectAllButton, SIGNAL(clicked()), this, SLOT(slotSearchBoxSelectAllButtonClicked() ) ); connect(searchResultsTreeWidget, SIGNAL(itemSelectionChanged( ) ), this, SLOT(slotSearchBoxSelectionChanged( ) ) ); connect(searchResultsTreeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotDoubleClickSearch(QTreeWidgetItem *, int))); connect(searchResultsTreeWidget, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRighButtonSearch( const QPoint& ) ) ); } void SearchWidget::slotDoubleClickSearch(QTreeWidgetItem * item, int) { //qDebug() << "SearchWidget::slotDoubleClickSearch" << endl; int number = -1; if (item){ if (stationCallSignShownInSearch) { number = (item->text(7)).toInt(); } else { number = (item->text(6)).toInt(); } actionQSODoubleClicked(number); } else {} } void SearchWidget::slotSearchBoxTextChanged() { //qDebug() << "SearchWidget::slotSearchBoxTextChanged: " << searchBoxLineEdit->text() << endl; //QString _id, _call, _dateTime, _band, _bandid, _mode, _qsltx, _qslrx, _stationcallsign, _dxcc; //QStringList q; //_stationcallsign = QString(); bool searchAll = searchAllRadioButton->isChecked(); //int i = -1; int cursorP = searchBoxLineEdit->cursorPosition(); searchBoxLineEdit->setText((searchBoxLineEdit->text()).toUpper()); if ((searchBoxLineEdit->text()).length() < 2) { searchResultsTreeWidget->clear(); return; } searchResultsTreeWidget->clear(); qslingNeeded = false; // If I am searching I am not longer looking for QSO to QSL QString theCall = searchBoxLineEdit->text(); //QSqlQuery query; QString queryString, aux; //QString aux; aux.clear(); if ((theCall.startsWith("1")) || (theCall.startsWith("2"))) { // Fix a bug (or my knowledge of SQLite) to search Strings begining with 1 or 2 // sqlite does not understand statements like SELECT call FROM log WHERE call LIKE '%1A%' aux = theCall + "%"; } else { aux = "%" + theCall + "%"; } if (searchAll) { queryString = QString("SELECT call, qso_date, time_on, bandid, modeid, dxcc, qsl_rcvd, qsl_sent, station_callsign, id FROM log WHERE call LIKE '%1'").arg(aux); } else { queryString = QString("SELECT call, qso_date, time_on, bandid, modeid, dxcc, qsl_rcvd, qsl_sent, station_callsign, id FROM log WHERE call LIKE '%1' AND lognumber='%2'").arg(aux).arg(currentLog); } //aux.clear(); //qDebug() << "SearchWidget::slotSearchBoxTextChanged: queryString" << queryString << endl; fillTheList(queryString); /* bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } QSqlRecord rec = query.record(); int nameCol = -1; //qDebug() << "SearchWidget::slotSearchBoxTextChanged: queryString EXECUTED!" << endl; QColor color; //QSqlRecord rec = query.record(); QFont font; font.setBold(true); while (query.next()) { if (query.isValid()) { nameCol = rec.indexOf("call"); _call= (query.value(nameCol)).toString(); //nameCol = rec.indexOf("call"); //_call= (query.value(0)).toString(); nameCol = rec.indexOf("qso_date"); _dateTime = (query.value(nameCol)).toString(); //_dateTime = (query.value(1)).toString(); nameCol = rec.indexOf("time_on"); _dateTime = _dateTime + "-" +(query.value(nameCol)).toString(); //_dateTime = _dateTime + "-" +(query.value(2)).toString(); nameCol = rec.indexOf("bandid"); _bandid = (query.value(nameCol)).toString(); //qDebug() << "SearchWidget::slotSearchBoxTextChanged: band: " << QString::number((query.value(3)).toInt()) << endl; _band = dataProxy->getNameFromBandId(_bandid.toInt()); //qDebug() << "SearchWidget::slotSearchBoxTextChanged: _band: " << _band << endl; nameCol = rec.indexOf("modeid"); //qDebug() << "SearchWidget::slotSearchBoxTextChanged: mode: " << QString::number((query.value(nameCol)).toInt()) << endl; //_mode = dataProxy->getNameFromModeId((query.value(4)).toInt()); _mode = dataProxy->getNameFromSubModeId((query.value(nameCol)).toInt()); nameCol = rec.indexOf("dxcc"); _dxcc= (query.value(nameCol)).toString(); nameCol = rec.indexOf("qsl_rcvd"); _qsltx = (query.value(nameCol)).toString(); if (_qsltx.length()<1) { _qsltx = "N"; } nameCol = rec.indexOf("qsl_sent"); _qslrx = (query.value(nameCol)).toString(); if (_qslrx.length()<1) { _qslrx = "N"; } if (stationCallSignShownInSearch) { nameCol = rec.indexOf("station_callsign"); _stationcallsign = (query.value(nameCol)).toString(); //if (_stationcallsign.length()<3) //{ // _stationcallsign = stationQRZ; //} nameCol = rec.indexOf("id"); _id = (query.value(nameCol)).toString(); } else { nameCol = rec.indexOf("id"); _id = (query.value(nameCol)).toString(); } q.clear(); q << _dxcc << _bandid << _mode << QString::number(currentLog); //QColor color = Qt::red; //color = Qt::red; //TODO: Optimize the awards->getQRZDXStatusColor because is TOO slow color = awards->getQRZDXStatusColor(q); //_mode = dataProxy->getSubModeFromId(_mode.toInt()); //_mode = db->getModeNameFromNumber(_mode.toInt()); addQSOToSearchList(_call, _dateTime, _band, _mode, _qslrx, _qsltx, _stationcallsign, _id, color); QTreeWidgetItem *item = new QTreeWidgetItem(searchResultsTreeWidget); i = world->getQRZARRLId(_call); aux = world->getEntityName(i) + " - CQ: " + QString::number(world->getEntityCqz(i)); item->setToolTip(0, aux); item->setToolTip(1, aux); item->setToolTip(2, aux); item->setToolTip(3, aux); item->setToolTip(4, aux); item->setToolTip(5, aux); item->setToolTip(6, aux); //item->setToolTip(0, world->getQRZEntityName(_call)); item->setText(0, _call); item->setFont(0, font); item->setText(1, _dateTime); item->setText(2, _band); //qDebug() << "SearchWidget::slotSearchBoxTextChanged: mode(c) : " << _mode << endl; item->setText(3, _mode); item->setText(4, _qslrx); item->setText(5, _qsltx); if (stationCallSignShownInSearch) { item->setText(6, _stationcallsign); item->setText(7, _id); item->setToolTip(7, aux); } else { item->setText(6, _id); } item->setForeground(0, QBrush(color)); } // Closes if next.isValid } // Closes While (searchResultsTreeWidget->header())->resizeSections(QHeaderView::ResizeToContents); if (((theCall.at(cursorP-1)).isSpace()) && (cursorP>1)) { ->setText(theCall.remove(cursorP-1, 1)); cursorP--; } */ searchBoxLineEdit->setCursorPosition(cursorP); /* // The following is a new implementation. It is still not used because it is toooo slow. int cursorP = searchBoxLineEdit->cursorPosition(); bool searchAll = searchAllRadioButton->isChecked(); int logToSearch = -1; if (searchAllRadioButton->isChecked()) { } else { logToSearch = currentLog; } searchBoxLineEdit->setText((searchBoxLineEdit->text()).toUpper()); if ((searchBoxLineEdit->text()).length() < 2) { searchResultsTreeWidget->clear(); return; } searchResultsTreeWidget->clear(); dataProxy->getFoundInLog(searchBoxLineEdit->text(), logToSearch ); searchBoxLineEdit->setCursorPosition(cursorP); */ } bool SearchWidget::fillTheList(const QString _query) { //qDebug() << "SearchWidget::fillTheList: " << _query << endl; if (_query.length()<=0) { return false; } QString _id, _call, _dateTime, _band, _bandid, _mode, _qsltx, _qslrx, _stationcallsign, _dxcc, aux; QStringList q; q.clear(); _stationcallsign = QString(); QSqlQuery query; bool sqlOK = query.exec(_query); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); return false; } QSqlRecord rec = query.record(); int nameCol = -1; QColor color; QFont font; font.setBold(true); searchResultsTreeWidget->clear(); while (query.next()) { if (query.isValid()) { nameCol = rec.indexOf("call"); _call= (query.value(nameCol)).toString(); nameCol = rec.indexOf("qso_date"); _dateTime = (query.value(nameCol)).toString(); nameCol = rec.indexOf("time_on"); _dateTime = _dateTime + "-" +(query.value(nameCol)).toString(); nameCol = rec.indexOf("bandid"); _bandid = (query.value(nameCol)).toString(); _band = dataProxy->getNameFromBandId(_bandid.toInt()); nameCol = rec.indexOf("modeid"); _mode = dataProxy->getNameFromSubModeId((query.value(nameCol)).toInt()); nameCol = rec.indexOf("dxcc"); _dxcc= (query.value(nameCol)).toString(); nameCol = rec.indexOf("qsl_rcvd"); _qsltx = (query.value(nameCol)).toString(); if (_qsltx.length()<1) { _qsltx = "N"; } nameCol = rec.indexOf("qsl_sent"); _qslrx = (query.value(nameCol)).toString(); if (_qslrx.length()<1) { _qslrx = "N"; } if (stationCallSignShownInSearch) { nameCol = rec.indexOf("station_callsign"); _stationcallsign = (query.value(nameCol)).toString(); nameCol = rec.indexOf("id"); _id = (query.value(nameCol)).toString(); } else { nameCol = rec.indexOf("id"); _id = (query.value(nameCol)).toString(); } q.clear(); q << _dxcc << _bandid << _mode << QString::number(currentLog); //TODO: Optimize the awards->getQRZDXStatusColor because is TOO slow color = awards->getQRZDXStatusColor(q); /* awards.getQRZDXStatusColor(const QStringList _qs); // Receives: QStringList _qs; //_qs << QRZ << BandId << lognumber; */ QTreeWidgetItem *item = new QTreeWidgetItem(searchResultsTreeWidget); nameCol = world->getQRZARRLId(_call); aux = world->getEntityName(nameCol) + " - CQ: " + QString::number(world->getEntityCqz(nameCol)); item->setToolTip(0, aux); item->setToolTip(1, aux); item->setToolTip(2, aux); item->setToolTip(3, aux); item->setToolTip(4, aux); item->setToolTip(5, aux); item->setToolTip(6, aux); item->setText(0, _call); item->setFont(0, font); item->setText(1, _dateTime); item->setText(2, _band); item->setText(3, _mode); item->setText(4, _qslrx); item->setText(5, _qsltx); if (stationCallSignShownInSearch) { item->setText(6, _stationcallsign); item->setText(7, _id); item->setToolTip(7, aux); } else { item->setText(6, _id); } item->setForeground(0, QBrush(color)); } // Closes if next.isValid } // Closes While (searchResultsTreeWidget->header())->resizeSections(QHeaderView::ResizeToContents); return true; } void SearchWidget::addQSOToSearchList(const QString _call, const QString _dateTime, const QString _band, const QString _mode, const QString _qslrx, const QString _qsltx, const QString _stationcallsign, const QString _id, const QColor _color) { //qDebug() << "SearchWidget::addQSOToSearchList: " << _call << endl; QFont font; font.setBold(true); QTreeWidgetItem *item = new QTreeWidgetItem(searchResultsTreeWidget); int i = world->getQRZARRLId(_call); QString aux = world->getEntityName(i) + " - CQ: " + QString::number(world->getEntityCqz(i)); item->setToolTip(0, aux); item->setToolTip(1, aux); item->setToolTip(2, aux); item->setToolTip(3, aux); item->setToolTip(4, aux); item->setToolTip(5, aux); item->setToolTip(6, aux); //item->setToolTip(0, world->getQRZEntityName(_call)); item->setText(0, _call); item->setFont(0, font); item->setText(1, _dateTime); item->setText(2, _band); //qDebug() << "SearchWidget::slotSearchBoxTextChanged: mode(c) : " << _mode << endl; item->setText(3, _mode); item->setText(4, _qslrx); item->setText(5, _qsltx); if (_stationcallsign.length()>0) { item->setText(6, _stationcallsign); item->setText(7, _id); item->setToolTip(7, aux); } else { item->setText(6, _id); } item->setForeground(0, QBrush(_color)); } void SearchWidget::setCurrentLog(const int _log) { currentLog = _log; } void SearchWidget::slotSearchClearButtonClicked() { //qDebug() << "SearchWidget::slotSearchClearButtonClicked: " << endl; searchResultsTreeWidget->clear(); searchBoxLineEdit->clear(); searchSelectAllClicked = false; qslingNeeded = false; } void SearchWidget::slotSearchBoxSelectAllButtonClicked() { //qDebug() << "SearchWidget::slotSearchBoxSelectAllButtonClicked: " << endl; if (searchSelectAllClicked) { //qDebug() << "SearchWidget::slotSearchBoxSelectAllButtonClicked: UN-SELECTING" << endl; searchSelectAllClicked = false; searchResultsTreeWidget->clearSelection(); searchBoxSelectAllButton->setText(tr("&Select All")); } else { //qDebug() << "SearchWidget::slotSearchBoxSelectAllButtonClicked: SELECTING" << endl; searchSelectAllClicked = true; searchResultsTreeWidget->selectAll(); searchBoxSelectAllButton->setText(tr("&Clear selection")); } } void SearchWidget::slotSearchBoxReSearchButtonClicked() { //qDebug() << "SearchWidget::slotSearchBoxReSearchButtonClicked: " << endl; slotSearchBoxTextChanged(); } void SearchWidget::slotSearchBoxSelectionChanged() {// Detects when a selection has been done in the search box and changes // The button to clear selection //qDebug() << "SearchWidget::slotSearchBoxSelectionChanged: " << endl; if ((searchResultsTreeWidget->selectedItems()).size() > 0 ) { searchBoxSelectAllButton->setText(tr("&Clear selection")); searchSelectAllClicked = true; } else { searchBoxSelectAllButton->setText(tr("&Select All")); searchSelectAllClicked = false; } } void SearchWidget::slotSearchExportButtonClicked() { //qDebug() << "SearchWidget::slotSearchExportButtonClicked: " << endl; // MARK QSOs // SAVE MARKED QSOs TO FILE // UNMARK QSOs bool itemsSelected = false; int _qsoId = 0; int i = 0; QString stringQuery; QSqlQuery query; QTreeWidgetItem *item = searchResultsTreeWidget->topLevelItem(i); bool sqlOK; while (i <= searchResultsTreeWidget->topLevelItemCount() ) { item = searchResultsTreeWidget->topLevelItem(i); if (item == 0) { i = searchResultsTreeWidget->topLevelItemCount() + 1; //qDebug() << "SearchWidget::slotSearchExportButtonClicked: ITEM = 0" << endl; } else { if (stationCallSignShownInSearch) { _qsoId = ((item)->text(7)).toInt(); } else { _qsoId = ((item)->text(6)).toInt(); } if ((item)->isSelected()) { stringQuery = QString("UPDATE log SET marked = 'X' WHERE id='%1'").arg(_qsoId); sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } itemsSelected = true; //TODO: Prepare this while/query execution i++; //qDebug() << "SearchWidget::slotSearchExportButtonClicked: ITEM MARKED: " << QString::number(_qsoId) << endl; } else { stringQuery = QString("UPDATE log SET marked = 'N' WHERE id='%1'").arg(_qsoId); sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } //TODO: Prepare this while/query execution i++; //qDebug() << "SearchWidget::slotSearchExportButtonClicked: ITEM NOT MARKED: " << QString::number(_qsoId) << endl; } } } if (itemsSelected) { //qDebug() << "SearchWidget::slotSearchExportButtonClicked: to Ask filename" << endl; QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); filemanager->adifLogExportMarked(fileName); //qDebug() << "SearchWidget::slotSearchExportButtonClicked: to call save file" << endl; dataProxy->unMarkAllQSO(); } else { //No items were selected } //qDebug() << "SearchWidget::slotSearchExportButtonClicked: unmarking..." << endl; } void SearchWidget::slotRighButtonSearch(const QPoint& pos) { //qDebug() << "SearchWidget::slotRighButtonSearch" << endl; QTreeWidgetItem *item = searchResultsTreeWidget->itemAt(pos); int _qsoID = 0; if (item) { //qDebug() << "SearchWidget::slotRighButtonSearch ITEM=true" << endl; // 6 is the column in the searchResultsTreeWidget where the id is saved if (stationCallSignShownInSearch) { //qDebug() << "SearchWidget::slotRighButtonSearch stationCallSignShownInSearch = true" << endl; _qsoID = ((item)->text(7)).toInt(); //qDebug() << "SearchWidget::slotRighButtonSearch QSO1: " << QString::number(_qsoID) << endl; } else { //qDebug() << "SearchWidget::slotRighButtonSearch stationCallSignShownInSearch = false" << endl; _qsoID = ((item)->text(6)).toInt(); //qDebug() << "SearchWidget::slotRighButtonSearch QSO2: " << QString::number(_qsoID) << endl; } //qDebug() << "SearchWidget::slotRighButtonSearch QSO: " << QString::number(_qsoID) << endl; showMenuRightButtonSearchCreateActions(); //qDebug() << "SearchWidget::slotRighButtonSearch -05" << endl; righButtonSearchMenu(_qsoID); //qDebug() << "SearchWidget::slotRighButtonSearch -06" << endl; }else { //qDebug() << "SearchWidget::slotRighButtonSearch ITEM=false" << endl; return; } //qDebug() << "SearchWidget::slotRighButtonSearch: " << QString::number(_qsoID) << endl; searchBoxLineEdit->setFocus(); } void SearchWidget::righButtonSearchMenu(const int trow) { //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: " << QString::number(trow) << endl; bool qslReceived = dataProxy->isQSLReceived(trow); bool qslSent = dataProxy->isQSLSent(trow); QMenu menu(this); menu.addAction(delQSOFromSearchAct); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -03" << endl; delQSOFromSearchAct->setData(trow); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -04" << endl; menu.addAction(qsoToEditFromSearchAct); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -05" << endl; qsoToEditFromSearchAct->setData(trow); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -06" << endl; menu.addSeparator(); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -07" << endl; if (qslSent) { //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSLSent" << endl; } else { //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSL Not Sent" << endl; QMenu *menuSentQsl = menu.addMenu(tr("QSL Send")); menuSentQsl->addAction(qslSentViaBureauFromSearchAct); menuSentQsl->addAction(qslSentViaDirectFromSearchAct); menuSentQsl->addAction(qslSentRequestedAct); if (!qslReceived) { menuSentQsl->addAction(qslSentViaBureauMarkRcvReqFromSearchAct); menuSentQsl->addAction(qslSentViaDirectMarkRcvReqFromSearchAct); qslSentViaBureauMarkRcvReqFromSearchAct->setData(trow); qslSentViaDirectMarkRcvReqFromSearchAct->setData(trow); } qslSentViaBureauFromSearchAct->setData(trow); qslSentViaDirectFromSearchAct->setData(trow); qslSentRequestedAct->setData(trow); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -end qsl not sent" << endl; } if (qslReceived) { //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSLRec" << endl; } else { //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSL Not Rec" << endl; QMenu *menuRecQsl = menu.addMenu(tr("QSL Rcvd")); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSL Not Rec - 01" << endl; menuRecQsl->addAction(qslRecViaBureauFromSearchAct); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSL Not Rec - 02" << endl; menuRecQsl->addAction(qslRecViaBureauMarkReqFromSearchAct); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSL Not Rec - 03" << endl; menuRecQsl->addAction(qslRecViaDirectFromSearchAct); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSL Not Rec - 04" << endl; menuRecQsl->addAction(qslRecViaDirectMarkReqFromSearchAct); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSL Not Rec - 05" << endl; menuRecQsl->addAction(qslRecRequestedAct); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSL Not Rec - 06" << endl; qslRecViaBureauFromSearchAct->setData(trow); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSL Not Rec - 07" << endl; qslRecViaBureauMarkReqFromSearchAct->setData(trow); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSL Not Rec - 08" << endl; qslRecViaDirectFromSearchAct->setData(trow); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSL Not Rec - 09" << endl; qslRecViaDirectMarkReqFromSearchAct->setData(trow); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -QSL Not Rec - 10" << endl; qslRecRequestedAct->setData(trow); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -end qsl not rec" << endl; } //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -end qsl" << endl; menu.exec(QCursor::pos()); //qDebug() << "SearchWidget::slotshowRighButtonSearchMenu: -END" << endl; } void SearchWidget::showMenuRightButtonSearchCreateActions() { //qDebug() << "SearchWidget::showMenuRightButtonSearchCreateActions" << endl; delQSOFromSearchAct = new QAction(tr("&Delete"), this); delQSOFromSearchAct->setShortcut(Qt::CTRL + Qt::Key_D); delQSOFromSearchAct->setStatusTip(tr("Delete a QSO")); connect(delQSOFromSearchAct, SIGNAL(triggered()), this, SLOT(slotQsoDeleteFromSearch())); qsoToEditFromSearchAct = new QAction(tr("&Edit QSO"), this); qsoToEditFromSearchAct->setShortcut(Qt::CTRL + Qt::Key_E); qsoToEditFromSearchAct->setStatusTip(tr("Edit this QSO")); connect(qsoToEditFromSearchAct, SIGNAL(triggered()), this, SLOT(slotQSOToEditFromSearch())); qslSentViaBureauFromSearchAct = new QAction(tr("Via &bureau"), this); qslSentViaBureauFromSearchAct->setShortcut(Qt::CTRL + Qt::Key_B); qslSentViaBureauFromSearchAct->setStatusTip(tr("Send this QSL via bureau")); connect(qslSentViaBureauFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaBureauFromSearch() )); qslSentViaDirectFromSearchAct = new QAction(tr("D&irect"), this); qslSentViaDirectFromSearchAct->setShortcut(Qt::CTRL + Qt::Key_I); qslSentViaDirectFromSearchAct->setStatusTip(tr("Send this QSL via direct")); connect(qslSentViaDirectFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaDirectFromSearch() )); qslSentRequestedAct = new QAction(tr("&Request my QSL"), this); qslSentRequestedAct->setShortcut(Qt::CTRL + Qt::Key_R); qslSentRequestedAct->setStatusTip(tr("Mark my QSL as requested")); connect(qslSentRequestedAct, SIGNAL(triggered()), this, SLOT( slotQSLSentMarkAsRequested() )); qslSentViaDirectMarkRcvReqFromSearchAct = new QAction(tr("Via Direct && mark DX QSL as requested"), this); qslSentViaDirectMarkRcvReqFromSearchAct->setStatusTip(tr("Send this QSL via direct & mark DX QSL as requested")); connect(qslSentViaDirectMarkRcvReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaDirectMarkDXReqFromSearch() )); qslSentViaBureauMarkRcvReqFromSearchAct = new QAction(tr("Via Bureau && mark DX QSL as requested"), this); qslSentViaBureauMarkRcvReqFromSearchAct->setStatusTip(tr("Send this QSL via bureau & mark DX QSL as requested")); connect(qslSentViaBureauMarkRcvReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaBureuMarkDXReqFromSearch() )); qslRecRequestedAct = new QAction(tr("&Request the QSL"), this); //qslSentRequestedAct->setShortcut(Qt::CTRL + Qt::Key_R); qslRecRequestedAct->setStatusTip(tr("Mark the QSL as requested")); connect(qslRecRequestedAct, SIGNAL(triggered()), this, SLOT( slotQSLRecMarkAsRequested() )); qslRecViaBureauMarkReqFromSearchAct = new QAction(tr("Via bureau && mark my QSL as requested"), this); qslRecViaBureauMarkReqFromSearchAct->setStatusTip(tr("QSL received via bureau & mark my QSL as requested")); connect(qslRecViaBureauMarkReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaBureauMarkReqFromSearch() )); qslRecViaBureauFromSearchAct = new QAction(tr("Via bureau"), this); qslRecViaBureauFromSearchAct->setStatusTip(tr("QSL received via bureau")); //qslRecViaBureauFromSearchAct->setShortcut(Qt::CTRL + Qt::Key_R); connect(qslRecViaBureauFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaBureauFromSearch() )); qslRecViaDirectMarkReqFromSearchAct = new QAction(tr("Direc&t && mark as my QSL requested"), this); qslRecViaDirectMarkReqFromSearchAct->setStatusTip(tr("QSL received via direct & mark my QSL as requested")); connect(qslRecViaDirectMarkReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaDirectMarkReqFromSearch() )); qslRecViaDirectFromSearchAct = new QAction(tr("Direc&t"), this); qslRecViaBureauFromSearchAct->setStatusTip(tr("QSL received via direct")); //qslRecViaDirectFromSearchAct->setShortcut(Qt::CTRL + Qt::Key_T); connect(qslRecViaDirectFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaDirectFromSearch() )); } void SearchWidget::slotQSLSentViaBureuMarkDXReqFromSearch() { //qDebug() << "slotQSLSentViaBureuMarkDXReqFromSearch" << endl; int _qsoId = (qslSentViaBureauMarkRcvReqFromSearchAct->data()).toInt(); dataProxy->qslSentViaBureau(_qsoId, (QDate::currentDate()).toString("yyyy/MM/dd")); dataProxy->qslRecAsRequested(_qsoId, (QDate::currentDate()).toString("yyyy/MM/dd")); if(qslingNeeded) { searchToolNeededQSLToSend(); } else { slotSearchBoxTextChanged(); } // Mark Sent, Bureau, date, update log. } void SearchWidget::slotQSLSentViaDirectMarkDXReqFromSearch() { //qDebug() << "slotQSLSentViaDirectMarkDXReqFromSearch: " << endl; int _qsoId = (qslSentViaDirectMarkRcvReqFromSearchAct->data()).toInt(); dataProxy->qslSentViaDirect(_qsoId, (QDate::currentDate()).toString("yyyy/MM/dd")); dataProxy->qslRecAsRequested(_qsoId, (QDate::currentDate()).toString("yyyy/MM/dd")); if(qslingNeeded) { searchToolNeededQSLToSend(); } else { slotSearchBoxTextChanged(); } // Mark Sent, Bureau, date, update log. } void SearchWidget::slotQSLSentViaBureauFromSearch() { // //qDebug() << "SearchWidget::slotQSLSentViaBureauFromSearch: " << (qslSentViaBureauFromSearchAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslSentViaBureauFromSearchAct->data()).toInt() ) , 0)).data(0).toInt()) ) << endl; int _qsoId = (qslSentViaBureauFromSearchAct->data()).toInt(); dataProxy->qslSentViaBureau(_qsoId, (QDate::currentDate()).toString("yyyy/MM/dd")); //logWindow->qslSentViaBureau(_qsoId); //qslSentViaBureau(_qsoId); if(qslingNeeded) { searchToolNeededQSLToSend(); } else { slotSearchBoxTextChanged(); } } void SearchWidget::slotQSLSentViaDirectFromSearch() { //qDebug() << "SearchWidget::slotQSLSentViaDirectFromSearch: " << endl; int _qsoId = ((qslSentViaDirectFromSearchAct->data()).toInt()); dataProxy->qslSentViaDirect(_qsoId, (QDate::currentDate()).toString("yyyy/MM/dd")); if(qslingNeeded) { searchToolNeededQSLToSend(); } else { slotSearchBoxTextChanged(); } //qslSentViaDirect(_qsoId); } void SearchWidget::slotQSLSentMarkAsRequested() { // bool qslSentAsRequested(const int _qsoId, const QString _updateDate); int _qsoId = (qslSentRequestedAct->data()).toInt(); dataProxy->qslSentAsRequested(_qsoId, (QDate::currentDate()).toString("yyyy/MM/dd")); if(qslingNeeded) { searchToolNeededQSLToSend(); } else { slotSearchBoxTextChanged(); } } void SearchWidget::slotQSLRecMarkAsRequested() { int _qsoId = (qslRecRequestedAct->data()).toInt(); dataProxy->qslRecAsRequested(_qsoId, (QDate::currentDate()).toString("yyyy/MM/dd")); if(qslingNeeded) { searchToolNeededQSLToSend(); } else { slotSearchBoxTextChanged(); } } void SearchWidget::slotQSLRecViaBureauFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaBureauFromLog: " << endl; int _qsoId = (qslRecViaBureauFromSearchAct->data()).toInt(); //logWindow->qslRecViaBureau(_qsoId); dataProxy->qslRecViaBureau(_qsoId, (QDate::currentDate()).toString("yyyy/MM/dd")); if(qslingNeeded) { searchToolNeededQSLToSend(); } else { slotSearchBoxTextChanged(); } } void SearchWidget::slotQSLRecViaBureauMarkReqFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog - Start" << endl; int _qsoId = (qslRecViaBureauMarkReqFromSearchAct->data()).toInt(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 01" << endl; qslRecViaBureauMarkReq(_qsoId); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 02: n: " << QString::number(_qsoId) << endl; if(qslingNeeded) { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 03" << endl; searchToolNeededQSLToSend(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 04" << endl; } else { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 05" << endl; slotSearchBoxTextChanged(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 06" << endl; } //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 07" << endl; } void SearchWidget::slotQSLRecViaDirectFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaDirectFromLog: " << endl; int _qsoId = (qslRecViaDirectFromSearchAct->data()).toInt(); //logWindow->qslRecViaDirect(_qsoId); dataProxy->qslRecViaDirect(_qsoId, (QDate::currentDate()).toString("yyyy/MM/dd")); if(qslingNeeded) { searchToolNeededQSLToSend(); } else { slotSearchBoxTextChanged(); } // Mark Sent, Bureau, date, update log. } void SearchWidget::slotQSLRecViaDirectMarkReqFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaDirectFromLog: " << endl; int _qsoId = (qslRecViaDirectMarkReqFromSearchAct->data()).toInt(); qslRecViaDirectMarkReq(_qsoId); if(qslingNeeded) { searchToolNeededQSLToSend(); } else { slotSearchBoxTextChanged(); } // Mark Sent, Bureau, date, update log. } void SearchWidget::qslRecViaBureauMarkReq(const int _qsoId) { //qDebug() << "SearchWidget::qslRecViaBureau: " << QString::number(_qsoId) << "/" << (QDate::currentDate()).toString("yyyy/MM/dd") << endl; //setAwards(const int _dxcc, const int _waz, const int _band, const int _mode, const int _workedOrConfirmed); dataProxy->qslRecViaBureau(_qsoId, (QDate::currentDate()).toString("yyyy/MM/dd"), true); //awards->setAwards(_qsoId); //Update the DXCC award status //emit logRefresh(); //emit updateAwards(); //qDebug() << "SearchWidget::qslRecViaBureau: END" << endl; } void SearchWidget::qslRecViaDirectMarkReq(const int _qsoId) { //qDebug() << "SearchWidget::qslRecViaDirect: " << QString::number(_qsoId) << endl; dataProxy->qslRecViaDirect(_qsoId, (QDate::currentDate()).toString("yyyy/MM/dd"), true); //awards->setAwards(_qsoId); //setAwards(const int _dxcc, const int _waz, const int _band, const int _mode, const int _workedOrConfirmed); //emit updateAwards(); } void SearchWidget::slotQSOToEditFromSearch() { //qDebug() << "slotQSOToEditFromSearch: " << (qsoToEditFromSearchAct->data()).toString() << endl; actionQSODoubleClicked((qsoToEditFromSearchAct->data()).toInt()); } void SearchWidget::slotQsoDeleteFromSearch() { //qDebug() << "SearchWidget::slotQsoDeleteFromSearch: " << (delQSOFromSearchAct->data()).toString() << endl; int QSOid = (delQSOFromSearchAct->data()).toInt(); //int x = -1; QString _qrz = dataProxy->getCallFromId(QSOid); if (_qrz.length()>=3) { QString message = QString(tr("You have requested to delete the QSO with: %1").arg(_qrz)); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setText(message); msgBox.setInformativeText(tr("Are you sure?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: if(dataProxy->deleteQSO(QSOid)) { emit actionQSODelete(QSOid); emit logRefresh(); if(qslingNeeded) { searchToolNeededQSLToSend(); } else { slotSearchBoxTextChanged(); } //dxccStatusWidget->refresh(); //awards->recalculateAwards(); emit updateAwards(); } else { //TODO: The QSO could not be removed... } break; case QMessageBox::No: // No was clicked break; default: // should never be reached break; } } else { // TODO: The QSO to be removed was not found in the log } } void SearchWidget::slotToolSearchQSL(const int actionQSL) { //qDebug() << "SearchWidget::slotToolSearchQSL: " << QString::number(actionQSL) << " - LogNumber: " << QString::number(currentLog) << endl; // 2 means QSL_RCVD = 'R' QString stringQuery = QString(); QString message = QString(); QString aux = QString(); //int i = -1; switch (actionQSL) { case 0://void searchToolNeededQSLToSend(); //aux = QString("SELECT count(id) FROM log WHERE lognumber='%1'").arg(currentLog); //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 0" << endl; stringQuery = QString("SELECT call, qso_date, time_on, bandid, modeid, qsl_sent, qsl_rcvd, station_callsign, log.id FROM log JOIN awarddxcc ON awarddxcc.qsoid=log.id WHERE awarddxcc.confirmed='0' AND log.qsl_sent!='Y' AND log.qsl_sent!='Q' AND log.qsl_sent!='R' AND log.lognumber='%1'").arg(currentLog); message = tr("Needed QSO to send the QSL"); qslingNeeded = true; requestBeingShown(); //dxUpRightTab->setCurrentIndex(2); break; case 1: //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 1" << endl; stringQuery = QString("SELECT call, qso_date, time_on, bandid, modeid, qsl_sent, qsl_rcvd, dxcc, station_callsign, id FROM log WHERE qsl_sent=='R' AND lognumber='%1'").arg(currentLog); message = tr("My QSL requested to be sent"); break; case 2://void slotToolSearchNeededQSLPendingToReceive(); //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 2" << endl; stringQuery = QString("SELECT call, qso_date, time_on, bandid, modeid, qsl_sent, qsl_rcvd, dxcc, station_callsign, log.id FROM log WHERE lognumber='%1' AND ( (qsl_sent='Y' AND qsl_rcvd!='Y' AND qsl_rcvd!='I') OR qsl_rcvd='R')").arg(currentLog); message = tr("DX QSL pending to be received"); break; case 3://void slotToolSearchNeededQSLRequested() //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 3" << endl; stringQuery = QString("SELECT call, qso_date, time_on, bandid, modeid, qsl_sent, qsl_rcvd, dxcc, station_callsign, log.id FROM log WHERE lognumber='%1' AND qsl_rcvd='R'").arg(currentLog); message = tr("DX QSL pending to be received"); break; default: //qDebug() << "SearchWidget::slotToolSearchQSL: CASE DEFAULT" << endl; // should never be reached return; break; } //int nameCol = -1; //QString _call, _dateTime, _band, _mode, _freq, _qsltx, _qslrx, _id, _stationcallsign, _dxcc; // QFont font; // font.setBold(true); // QColor color; // QStringList q; searchResultsTreeWidget->clear(); // QSqlQuery query(stringQuery); // QSqlRecord rec = query.record(); if (fillTheList(stringQuery)) { requestBeingShown(); } /* return; //qDebug() << "SearchWidget::slotToolSearchQSL: After the return" << endl; if (!query.exec()) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //qDebug() << "SearchWidget::slotToolSearchQSL: Query ERROR" << endl; //TODO: Control the error!! } else { emit toStatusBar(message); // updating the status bar while(query.next()) { if (query.isValid()) { QTreeWidgetItem *item = new QTreeWidgetItem(searchResultsTreeWidget); i = world->getQRZARRLId(_call); aux = world->getEntityName(i) + " - CQ: " + QString::number(world->getEntityCqz(i)); item->setToolTip(0, aux); item->setToolTip(1, aux); item->setToolTip(2, aux); item->setToolTip(3, aux); item->setToolTip(4, aux); item->setToolTip(5, aux); item->setToolTip(6, aux); nameCol = rec.indexOf("call"); _call= (query.value(nameCol)).toString(); nameCol = rec.indexOf("qso_date"); _dateTime = (query.value(nameCol)).toString(); nameCol = rec.indexOf("time_on"); _dateTime = _dateTime + "-" +(query.value(nameCol)).toString(); nameCol = rec.indexOf("bandid"); _freq = (query.value(nameCol)).toString(); _band = dataProxy->getNameFromBandId(_freq.toInt()); //_band = db->getBandNameFromNumber( _freq.toInt() ); nameCol = rec.indexOf("modeid"); _mode = dataProxy->getSubModeFromId((query.value(nameCol)).toInt()); nameCol = rec.indexOf("dxcc"); _dxcc= (query.value(nameCol)).toString(); //qDebug() << "SearchWidget::slotToolSearchQSL: Mode: " << _mode << endl; //qDebug() << "SearchWidget::slotToolSearchQSL: mode " << QString::number((query.value(nameCol)).toInt()) << endl; nameCol = rec.indexOf("qsl_sent"); _qsltx = (query.value(nameCol)).toString(); if (_qsltx.length()<1) { _qsltx = "N"; } nameCol = rec.indexOf("qsl_rcvd"); _qslrx = (query.value(nameCol)).toString(); if (_qslrx.length()<1) { _qslrx = "N"; } if (stationCallSignShownInSearch) { //qDebug() << "SearchWidget::slotToolSearchQSL: stationCallSign "<< endl; nameCol = rec.indexOf("station_callsign"); if (((query.value(nameCol)).toString()).length()>=3) { _stationcallsign = (query.value(nameCol)).toString(); } else { _stationcallsign.clear(); } } nameCol = rec.indexOf("id"); _id= (query.value(nameCol)).toString(); q.clear(); q << _dxcc << _freq << _mode << QString::number(currentLog); color = awards->getQRZDXStatusColor(q); item->setText(0, _call); item->setText(1, _dateTime); item->setText(2, _band); item->setText(3, _mode); item->setText(4, _qsltx); item->setText(5, _qslrx); if (stationCallSignShownInSearch) { item->setText(6, _stationcallsign); item->setText(7, _id); item->setToolTip(7, aux); } else { item->setText(6, _id); } item->setForeground(0, QBrush(color)); } else { //TODO: Check what is happening here! } } //qslingNeeded = true; requestBeingShown(); //dxUpRightTab->setCurrentIndex(2); } */ } void SearchWidget::showQSOs(QList qsoIdList) { //qDebug() << "SearchWidget::showQSOs received QSOs: " << QString::number(qsoIdList.length()) << endl; if (qsoIdList.length()<0) { return; } //QString _call, _dateTime, _band, _mode, _freq, _qsltx, _qslrx, _id, _stationcallsign, _dxcc; //qDebug() << "SearchWidget::showQSOs query: : 01" << endl; int i = 0; QSqlQuery query; QString queryString = QString("SELECT call, qso_date, time_on, bandid, modeid, dxcc, qsl_rcvd, qsl_sent, station_callsign, id FROM log WHERE "); while ( (qsoIdList.at(i)<= 0) && (i. * * * *****************************************************************************/ #include "mainwindowinputothers.h" MainWindowInputOthers::MainWindowInputOthers(DataProxy *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowInputOthers::MainWindowInputOthers" << endl; entitiesList.clear(); propModeList.clear(); dataProxy = dp; propModeList = dataProxy->getPropModeList(); //QLabel *entityPrimLabel, *entitySecLabel, *iotaAwardLabel, *entityNameLabel, *propModeLabel; iotaContinentComboBox = new QComboBox(); entityPrimDivComboBox = new QComboBox(); entitySecDivComboBox = new QComboBox(); entityNameComboBox = new QComboBox(); propModeComboBox = new QComboBox(); iotaNumberLineEdit = new QLineEdit(); // TODO: I should find the way to connect the SAT tabwidget's signal to set the propmode in this widget // Now it is done though the mainwindow but I should avoid depending on that class for that, if possible //connect(satTabWidget, SIGNAL(setPropModeSat(QString)), this, SLOT(slotSetPropMode(QString)) ) ; createUI(); //qDebug() << "MainWindowInputOthers::MainWindowInputOthers - END" << endl; } MainWindowInputOthers::~MainWindowInputOthers(){} void MainWindowInputOthers::createUI() { //qDebug() << "MainWindowInputOthers::createUI" << endl; palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); QLabel *entityPrimLabel = new QLabel(tr("Primary Div")); QLabel *entitySecLabel = new QLabel(tr("Secondary Div")); QLabel *iotaAwardLabel = new QLabel(tr("IOTA")); QLabel *entityNameLabel = new QLabel(tr("Entity")); QLabel *propModeLabel = new QLabel(tr("Propagation mode")); entityPrimLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); entitySecLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); iotaAwardLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); entityNameLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); propModeLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); entityPrimDivComboBox->setToolTip(tr("Select the primary division for this QSO.")); entitySecDivComboBox->setToolTip(tr("Select the secondary division for this QSO.")); entityNameComboBox->setToolTip(tr("Select the entity for this QSO.")); propModeComboBox->setToolTip(tr("Select the propagation mode for this QSO.")); iotaContinentComboBox->setToolTip(tr("Select the IOTA continent for this QSO.")); iotaNumberLineEdit->setToolTip(tr("Select the IOTA reference number for this QSO.")); entityPrimDivComboBox->setEnabled(false); entitySecDivComboBox->setEnabled(false); entityNameComboBox->setEnabled(true); propModeComboBox->setEnabled(true); QGridLayout *tabLayout = new QGridLayout; tabLayout->addWidget(entityNameLabel, 0, 0); tabLayout->addWidget(entityNameComboBox, 0, 1, 1, 2); tabLayout->addWidget(entityPrimLabel, 1, 0); tabLayout->addWidget(entityPrimDivComboBox, 1, 1, 1, 2); tabLayout->addWidget(entitySecLabel, 2, 0); tabLayout->addWidget(entitySecDivComboBox, 2, 1, 1, 2); tabLayout->addWidget(iotaAwardLabel, 3, 0); tabLayout->addWidget(iotaContinentComboBox, 3, 1); tabLayout->addWidget(iotaNumberLineEdit, 3, 2); tabLayout->addWidget(propModeLabel, 4, 0); tabLayout->addWidget(propModeComboBox, 4, 1, 1, 2); setLayout(tabLayout); if (entitiesList.size()>1) { entitiesList.prepend("00-" + tr("Not Identified") + " (000)"); entityNameComboBox->addItems(entitiesList); } if (propModeList.size()>1) { propModeList.prepend("00 - " + tr("Not - Not Identified")); propModeComboBox->addItems(propModeList); } /* QStringList continents; QSqlQuery query2("SELECT shortname FROM continent"); while (query2.next()) { if (query2.isValid()) { continents << query2.value(0).toString(); } } */ iotaContinentComboBox->addItems(dataProxy->getContinentShortNames()); iotaNumberLineEdit->setInputMask("000"); iotaNumberLineEdit->setText("000"); } void MainWindowInputOthers::clear() { //qDebug() << "MainWindowInputOthers::clear" << endl; entityNameComboBox->setCurrentIndex(0); propModeComboBox->setCurrentIndex(0); iotaContinentComboBox->setCurrentIndex(0); iotaNumberLineEdit->setText("000"); } void MainWindowInputOthers::setEntitiesList(const QStringList _qs) { //qDebug() << "MainWindowInputOthers::setEntitiesList: " << QString::number(_qs.length()) << endl; entitiesList.clear(); entitiesList << _qs; if (entitiesList.size()>1) { entitiesList.prepend("00-" + tr("Not Identified") + " (000)"); //entitiesList.prepend("00-Not Identified (000)"); entityNameComboBox->addItems(entitiesList); } } void MainWindowInputOthers::setEntity(const int _ent) {// Select the appropriate entity in the ComboBox //qDebug() << "MainWindowInputOthers::setEntity: " << QString::number(_ent) << endl; if (_ent<=0) { entityNameComboBox->setCurrentIndex(0); return; } QString aux = QString(); aux = QString::number(_ent); if (_ent > 1000) { aux = (QString::number(_ent)).right(3); } QString pref = QString(); //pref = world->getEntityMainPrefix(_ent); //pref = world->getEntityName(_ent); pref = dataProxy->getEntityNameFromId(_ent); //int indexC = entityNameComboBox->findText(pref, Qt::MatchContains); //qDebug() << "MainWindow::selectCorrectEntity: aux to the findText: " << aux << endl; //int indexC = entityNameComboBox->findText("(" + aux + ")", Qt::MatchContains); int indexC = entityNameComboBox->findText("(" + aux + ")", Qt::MatchEndsWith); //qDebug() << "MainWindow::selectCorrectEntity: " << pref << "/" << QString::number(indexC) << endl; entityNameComboBox->setCurrentIndex(indexC); setIOTAContinentFromEntity(_ent); } QString MainWindowInputOthers::getEntityPrefix() { //qDebug() << "MainWindowInputOthers::getEntityName" << endl; return (entityNameComboBox->currentText()).split('-').at(0); //return world->getQRZARRLId(pref); } void MainWindowInputOthers::setPropMode(const QString _qs) { //qDebug() << "MainWindowInputOthers::setPropMode: " << _qs << endl; if(( propModeComboBox->findText(_qs+" -", Qt::MatchContains))>0) { propModeComboBox->setCurrentIndex( propModeComboBox->findText(_qs+" -", Qt::MatchContains)); } else { propModeComboBox->setCurrentIndex(0); } } QString MainWindowInputOthers::getPropModeFromComboBox() { QString _pm = QString(); //qDebug() << "MainWindow::getPropModeFromComboBox:" << propModeComboBox->currentText() << endl; _pm = (((propModeComboBox->currentText()).split('-')).at(1)).simplified(); //qDebug() << "MainWindow::getPropModeFromComboBox: " << _pm << endl; if (_pm == "Not") { return QString(); } return _pm; } void MainWindowInputOthers::clearIOTA() { iotaContinentComboBox->setCurrentIndex(0); iotaNumberLineEdit->setText("000"); iotaNumberLineEdit->setPalette(palBlack); } bool MainWindowInputOthers::isIOTAModified() { if ((iotaContinentComboBox->currentIndex()>0) || (iotaNumberLineEdit->text()).toInt()>0) { return true; } else { return false; } return false; } void MainWindowInputOthers::setIOTA(const QString _qs, const bool _black) {//TODO: Seems to be better to send the color info like in: (it is much more flexible as I can send any color!) //void MainWindowInputQSL::setQSLVia(const QString _qs, QColor qColor) //qDebug() << "MainWindow::setIOTA: " << _qs << endl; if ( (checkIfValidIOTA(_qs)).length() !=6 ) { return; } else { QStringList values = _qs.split("-", QString::SkipEmptyParts); //qDebug() << "MainWindowInputOthers::setIOTA: IOTA " << _qs << endl; iotaContinentComboBox->setCurrentIndex( iotaContinentComboBox->findText(values.at(0) ) ); iotaNumberLineEdit->setText(values.at(1)); } if (_black) { iotaNumberLineEdit->setPalette(palBlack); } else { iotaNumberLineEdit->setPalette(palRed); } } QString MainWindowInputOthers::getIOTA() { return (checkIfValidIOTA(iotaContinentComboBox->currentText() + "-" + iotaNumberLineEdit->text())); } void MainWindowInputOthers::setIOTAContinentFromEntity(const int _n) { //qDebug() << "MainWindow::setIOTAContinentFromEntity:" << QString::number(_n) << endl; setIOTAContinent(dataProxy->getContinentShortNameFromEntity(_n)) ; } void MainWindowInputOthers::setIOTAContinent(const QString _qs) { //qDebug() << "MainWindowInputOthers::setIOTAContinent: " << _qs << endl; //qDebug() << "MainWindowInputOthers::setIOTAContinent: setting to index(a): " << QString::number(iotaContinentComboBox->findText(_qs, Qt::MatchContains)) << endl; if(( iotaContinentComboBox->findText(_qs, Qt::MatchContains))>0) { //qDebug() << "MainWindowInputOthers::setIOTAContinent: setting to index: " << QString::number(iotaContinentComboBox->findText(_qs, Qt::MatchContains)) << endl; iotaContinentComboBox->setCurrentIndex( iotaContinentComboBox->findText(_qs, Qt::MatchContains)); } else { //qDebug() << "MainWindowInputOthers::setIOTAContinent: setting to index: 00" << endl; iotaContinentComboBox->setCurrentIndex(0); } } QString MainWindowInputOthers::checkIfValidIOTA(const QString _tiota) { /********************************** IOTA should be always with this format: CC-NNN being: - CC the shortname of the continent - NNN Number of the reference. NNN has ALWAYS to include THREE(3) characters. ADIF Specs says: CC is the continent designator {NA, SA, EU , AF, OC, AS, AN} XXX is the island designator, where 0 <= XXX ,<= 999 [use leading zeroes] Returns a valid format IOTA if possible and "" in other cases. ************************************/ //qDebug() << "MainWindowInputOthers::checkIfValidIOTA: " << _tiota << endl; //bool _valid = false; QString _continent; QString _number; if (_tiota.count("-") == 1) { QStringList _values = _tiota.split("-", QString::SkipEmptyParts); _continent = _values.at(0); _number = _values.at(1); } else { return ""; } //qDebug() << "MainWindowInputOthers::checkIfValidIOTA (cont) " << _continent << endl; //qDebug() << "MainWindowInputOthers::checkIfValidIOTA (numb): " << _number << endl; // Check if continent is valid if (dataProxy->isValidContinentShortName(_continent)) { if ( (_number.toInt() >0 ) && ((_number.toInt()) < 1000 )) { if ((_number.length()) == 3) { return _continent + "-" + _number ; } else if ((_number.length()) == 2) { return _continent + "-0" + QString::number((_number).toInt()); } else if ((_number.length()) == 1) { return _continent + "-00" + QString::number((_number).toInt()); } else { return ""; } } else { return ""; } } else { return QString(); } return QString(); } klog-0.9.8.1/setuppagesats.cpp0000644000175000017500000006261113532572307015214 0ustar develdevel/*************************************************************************** setuppagesats.cpp - description ------------------- begin : dec 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppagesats.h" SetupPageSats::SetupPageSats(DataProxy *dp, QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageSats::SetupPageSats" << endl; dataProxy = dp; arrild = QString(); satname = QString(); uplink = QString(); downlink = QString(); modes = QString(); newSat = new SetupPageSatsNew(dataProxy, this); util = new Utilities; selectedSat = -1; //defaultStationCallSign.clear(); //setupD = new SetupDialog(); currentSats = new QComboBox(); satsAvailable.clear(); //newSat = new SetupPageSatsNew(dataProxy); satsModel = new QSqlRelationalTableModel(this); satsView = new QTableView; satsView->setContextMenuPolicy(Qt::CustomContextMenu); satsView->setSortingEnabled(true); createSatsModel(); createSatsPanel(); satsView->setCurrentIndex(satsModel->index(0, 0)); lastSat = 0; newSatPushButton = new QPushButton(tr("&New"), this); editPushButton = new QPushButton(tr("&Edit"), this); removePushButton = new QPushButton(tr("&Remove"), this); importPushButton = new QPushButton(tr("&Import"), this); exportPushButton = new QPushButton(tr("E&xport"), this); newSatPushButton->setToolTip(tr("Add a new satellite.")); editPushButton->setToolTip(tr("Edit the selected satellite.")); removePushButton->setToolTip(tr("Remove the selected satellite.")); importPushButton->setToolTip(tr("Import a satellites file. It will replace the satellites you have now configured.")); exportPushButton->setToolTip(tr("Export your current satellites to a file.")); currentSats->setToolTip(tr("Select the sat you want to open.")); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(importPushButton); buttonsLayout->addWidget(exportPushButton); buttonsLayout->addWidget(newSatPushButton); buttonsLayout->addWidget(editPushButton); buttonsLayout->addWidget(removePushButton); QVBoxLayout *widgetLayout = new QVBoxLayout; widgetLayout->addWidget(satsView); widgetLayout->addWidget(currentSats); widgetLayout->addLayout(buttonsLayout); //widgetLayout->addLayout(SatDataLayout); setLayout(widgetLayout); //connect(newSatPushButton, SIGNAL(clicked ( )), this, SLOT(slotNewButtonClicked() ) ); //QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(slotDownloadFinished(QNetworkReply*))); //connect(setupD, SIGNAL(newSatRequested(true)), this, slotNewButtonClicked() ) createActions(); updateSelectedSats(); //qDebug() << "SetupPageSats::SetupPageSats - END" << endl; } SetupPageSats::~SetupPageSats(){ //qDebug() << "SetupPageSats::~SetupPageSats" << endl; } void SetupPageSats::createNewSat() { //qDebug() << "SetupPageSats::createNewSat" << endl; selectedSat = -1; //newSat->clear(); newSat->setEditing(false); newSat->exec(); } void SetupPageSats::slotNewButtonClicked() { //qDebug() << "SetupPageSats::slotNewButtonClicked" << endl; createNewSat(); } void SetupPageSats::slotEditButtonClicked() { //qDebug) << "SetupPageSats::slotEditButtonClicked" << endl; //QSqlQuery query; //int nameCol = -1; selectedSat = getSelectedSat(); QString shortName = dataProxy->getSateliteArrlIdFromId(selectedSat); newSat->clear(); newSat->setEditing(true); newSat->setShortName(shortName); newSat->setName(dataProxy->getSatelliteName(shortName)); newSat->setUpLink(dataProxy->getSatelliteFullUplink(shortName)); newSat->setDownLink(dataProxy->getSatelliteFullDownlink(shortName)); newSat->setModes(dataProxy->getSatelliteFullMode(shortName)); newSat->exec(); //newSat->setStationCallSign(dataProxy->getStationCallSignFromSat(selectedSat)); //newSat->setOperators(dataProxy->getOperatorsFromSat(selectedSat)); //newSat->setComment(dataProxy->getCommentsFromSat(selectedSat)); //newSat->setDateString(dataProxy->getSatDateFromSat(selectedSat)); //newSat->setTypeN(dataProxy->getSatTypeNFromSat(selectedSat).toInt()); /* //qDebug() << "SetupPageSats::slotEditButtonClicked-1 (selectedlog: " << QString::number(selectedLog) << ")" << endl; QString stringQuery = QString("SELECT * FROM logs WHERE id='%1'").arg(selectedLog); //qDebug() << "SetupPageSats::slotEditButtonClicked -2" << endl; bool sqlOk = query.exec(stringQuery); QSqlRecord rec = query.record(); if (sqlOk) { //qDebug() << "SetupPageSats::slotEditButtonClicked Query OK" << endl; QSqlRecord rec = query.record(); if ( (query.next()) && (query.isValid()) ) {//id/ /stationcall/comment/logtype/logtypeid //qDebug() << "SetupPageSats::slotEditButtonClicked Query Valid" << endl; //nameCol = rec.indexOf("stationcall"); //newLog->setStationCallSign((query.value(nameCol)).toString()); //nameCol = rec.indexOf("operators"); //newLog->setOperators((query.value(nameCol)).toString()); //nameCol = rec.indexOf("comment"); //newLog->setComment((query.value(nameCol)).toString()); //nameCol = rec.indexOf("logdate"); //newLog->setDateString((query.value(nameCol)).toString()); //nameCol = rec.indexOf("logtypen"); //qDebug() << "SetupPageSats::slotEditButtonClicked -3" << endl; //newLog->setTypeN((query.value(nameCol)).toInt()); newLog->exec(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } */ } void SetupPageSats::slotSatsCancelled(const bool _q) { selectedSat = -1; } void SetupPageSats::slotRemoveButtonClicked() { //qDebug() << "SetupPageSats::slotRemoveButtonClicked" << endl; int selectedSat = getSelectedSat(); QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("KLog"), tr("Do you really want to remove this satellite?") + "\n" + tr("This satellite will not be longer available to be selected ..."), QMessageBox::Yes | QMessageBox::No); if (ret == QMessageBox::Yes) { //qDebug() << "SetupPageSats::slotRemoveButtonClicked (selected log to remove: " << QString::number(selectedLog) << ")" << endl; QString stringQuery = QString("DELETE FROM satellites WHERE id='%1'").arg(selectedSat); QSqlQuery query(stringQuery); bool sqlOk = query.exec(); if (sqlOk) { //qDebug() << "SetupPageSats::slotRemoveButtonClicked (REMOVED: " << QString::number(selectedLog) << ")" << endl; satsModel->select(); updateSelectedSats(); stringQuery = QString("DELETE FROM log WHERE lognumber='%1'").arg(selectedSat); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageSats::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() << endl; if (sqlOk) { //qDebug() << "SetupPageSats::slotRemoveButtonClicked (QSOS REMOVED: " << QString::number(selectedLog) << ")" << endl; stringQuery = QString("DELETE FROM awarddxcc WHERE lognumber='%2'").arg(selectedSat); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageSats::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() << endl; if (sqlOk) { //qDebug() << "SetupPageSats::slotRemoveButtonClicked (AWARDDXCC REMOVED: " << QString::number(selectedSat) << ")" << endl; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); showError(tr("Sat has not been removed. (#3)")); //qDebug() << "SetupPageSats::slotRemoveButtonClicked (AWARDDXCC NOT REMOVED: " << QString::number(selectedSat) << ")" << endl; } } else { showError(tr("Sat has not been removed. (#2)")); //qDebug() << "SetupPageSats::slotRemoveButtonClicked (QSOS NOT REMOVED: " << QString::number(selectedSat) << ")" << endl; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); showError(tr("Sat has not been removed. (#1)")); //qDebug() << "SetupPageSats::slotRemoveButtonClicked (NOT REMOVED: " << QString::number(selectedSat) << ")" << endl; } } //ASK FOR A CONFIRMATION //DELETE ALL THE QSO IN THE REMOVED Sat } void SetupPageSats::createSatsPanel() { //qDebug() << "SetupPageSats::createSatsPanel" << endl; satsView->setModel(satsModel); QString stringQuery = QString("SELECT * FROM satellites"); QSqlQuery query(stringQuery); QSqlRecord rec = query.record(); // Number of columns int columns = rec.count(); for (int i = 0; i < columns; i++ ){ satsView->setColumnHidden(i, true); } columns = rec.indexOf("id"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("satarrlid"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("satname"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("uplink"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("downlink"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("satmode"); satsView->setColumnHidden(columns, false); satsView->setItemDelegate(new QSqlRelationalDelegate(this)); satsView->setSelectionMode( QAbstractItemView::SingleSelection); satsView->setSelectionBehavior(QAbstractItemView::SelectRows); satsView->resizeColumnsToContents(); satsView->horizontalHeader()->setStretchLastSection(true); } void SetupPageSats::createSatsModel() { //qDebug) << "SetupPageSats::createsatsModel" << endl; QString stringQuery = QString("SELECT * FROM satellites"); QSqlQuery q(stringQuery); QSqlRecord rec = q.record(); int nameCol; //satsModel = new QSqlRelationalTableModel(this); satsModel->setTable("satellites"); nameCol = rec.indexOf("id"); satsModel->setSort(nameCol, Qt::AscendingOrder); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("ID")); nameCol = rec.indexOf("satarrild"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Short")); nameCol = rec.indexOf("satname"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Name")); nameCol = rec.indexOf("uplink"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Uplink")); nameCol = rec.indexOf("downlink"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Downlink")); nameCol = rec.indexOf("satmode"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Modes")); satsModel->select(); } void SetupPageSats::slotSatselected(const QModelIndex & index) { //qDebug) << "SetupPageSats::slotSatselected" << endl; int row = index.row(); setSelectedSat((satsModel->index(row, 0)).data(0).toInt()); } void SetupPageSats::slotSatDoubleClicked(const QModelIndex & index) { //qDebug() << "SetupPageSats::slotSatDoubleClicked" << endl; int row = index.row(); setSelectedSat((satsModel->index(row, 0)).data(0).toInt()); slotEditButtonClicked(); } void SetupPageSats::slotAnalyzeNewSatData(const QStringList _qs) { updateSelectedSats(); } void SetupPageSats::createActions() { //qDebug() << "SetupPageSats::createActions" << endl; connect(importPushButton, SIGNAL(clicked ( )), this, SLOT(slotImportButtonClicked() ) ); connect(exportPushButton, SIGNAL(clicked ( )), this, SLOT(slotExportButtonClicked() ) ); connect(newSatPushButton, SIGNAL(clicked ( )), this, SLOT(slotNewButtonClicked() ) ); connect(removePushButton, SIGNAL(clicked ( )), this, SLOT(slotRemoveButtonClicked() ) ); connect(editPushButton, SIGNAL(clicked ( )), this, SLOT(slotEditButtonClicked() ) ); connect(newSat, SIGNAL(newSatData(QStringList)), this, SLOT(slotAnalyzeNewSatData(QStringList) ) ); connect(satsView, SIGNAL(clicked(QModelIndex)), this, SLOT(slotSatselected(QModelIndex) ) ); connect(satsView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotSatDoubleClicked(QModelIndex) ) ); //connect(SatView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickSat( const QModelIndex& ) ) ); //loadAllPushButton->setToolTip(tr("Load all the Sats")); //loadSelectedPushButton->setToolTip(tr("Load only the selected Sat")); //clearPushButton->setToolTip(tr("Clear selection")); } /* bool SetupPageSats::addNewSat(const QStringList _qs) { //qDebug() << "SetupPageSats::addNewSat: " << _qs.at(2) << endl; QString aux = QString(); int nameCol = -1; QString _dateString = _qs.at(0); QString _stationCallsign = _qs.at(1); QString _typeContest = _qs.at(2); QString _comment = _qs.at(3); QString _typeContestN = _qs.at(4); QString queryString = QString("SELECT * FROM logs WHERE logdate='%1' AND stationcall='%2' AND logtype='%3' AND logtypen='%4'").arg(_dateString).arg(_stationCallsign).arg(_typeContest).arg(_typeContestN); //"logs" //"id, logdate, stationcall, comment, logtype" //qDebug() << "SetupPageSats::addNewLog query1: " << queryString << endl; QSqlQuery query; bool sqlOK = query.exec(queryString); QSqlRecord rec = query.record(); // Number of columns while ( (query.next()) && (query.isValid()) ) { nameCol = rec.indexOf("id"); aux = (query.value(nameCol)).toString(); //qDebug() << "SetupPageSats::addNewLog: id = " << aux << endl; return false; } queryString = QString("INSERT INTO logs (logdate, stationcall, comment, logtype, logtypen) values('%1','%2','%3','%4', '%5')").arg(_dateString).arg(_stationCallsign).arg(_comment).arg(_typeContest).arg(_typeContestN); //qDebug() << "SetupPageSats::addNewSat query1: " << queryString << endl; sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "SetupPageSats::addNewSat ADDED! id = " << endl; satsModel->select(); updateSelectedSats(); return true; } else { return false; } return false; } */ void SetupPageSats::updateSelectedSats() { //qDebug) << "SetupPageSats::updateSelectedSats" << endl; satsAvailable = readSats(); satsModel->select(); if (satsAvailable.length()>0) { currentSats->clear(); currentSats->addItems(satsAvailable); } else { //qDebug) << "SetupPageSats::updateSelectedSats Not selected (less than 1)" << endl; currentSats->clear(); } } QStringList SetupPageSats::readSats() { //qDebug() << "SetupPageSats::readSats" << endl; QString aux, aux2; QStringList _sats; QSqlQuery query; int nameCol = -1; bool sqlOk = false; //QDate date = QDate::currentDate(); aux2.clear(); aux.clear(); _sats.clear(); aux = "SELECT id, satarrlid, satname, uplink, downlink, satmode FROM satellites"; sqlOk = query.exec(aux); if (sqlOk) { QSqlRecord rec = query.record(); while ( (query.next()) && (query.isValid()) ) { aux2.clear(); nameCol = rec.indexOf("id"); aux2 = (query.value(nameCol)).toString(); nameCol = rec.indexOf("satarrlid"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("satname"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("uplink"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("downlink"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("satmode"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); _sats.append(aux2); } return _sats; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); return _sats; } _sats.clear(); //qDebug() << "SetupPageSats::readSats: " << QString::number(_sats.size())<< endl; return _sats; } int SetupPageSats::getSelectedSat() { //qDebug) << "SetupPageSats::getSelectedSat: " << currentSats->currentText() << endl; QString selectedSat = currentSats->currentText(); int i = 0; QStringList qs; qs.clear(); qs << selectedSat.split("-"); i = (qs.at(0)).toInt(); if (i>=1) { return i; } else { return 0; } return 0; } void SetupPageSats::setSelectedSat(const int _i) { //qDebug) << "SetupPageSats::SetupPageSats::setSelectedSat: " << QString::number(_i) << endl; QString n = QString::number(_i) + "-"; int selected = currentSats->findText(n, Qt::MatchStartsWith); if (selected >= 0) { //qDebug) << "SetupPageSats::SetupPageSats::setSelectedSat selected>0: " << QString::number(selected) << endl; currentSats->setCurrentIndex(selected); } else { //qDebug) << "SetupPageSats::SetupPageSats::setSelectedSat not selected" << endl; return; } } void SetupPageSats::readSelectedSat(const int _i) { /* stationCallsign = _qs.at(0); operators = _qs.at(1); comment = _qs.at(2); dateString = _qs.at(3); typeContest = _qs.at(4); contestCatMode = (_qs.at(5)).toInt(); contestCatOperators = (_qs.at(6)).toInt(); contestCatAssisted = (_qs.at(7)).toInt(); contestCatPower = (_qs.at(8)).toInt(); contestCatBands = (_qs.at(9)).toInt(); contestBands = (_qs.at(10)).toInt(); */ } void SetupPageSats::showError(const QString _errorC) { QString text = QString(tr("An error has occurred showing the following error code:") + "\n'%1'").arg(_errorC); QMessageBox::warning(this, tr("KLog - SetupPageSats"), text, QMessageBox::Ok); } void SetupPageSats::slotImportButtonClicked() { //qDebug) << "SetupPageSats::slotImportButtonClicked" << endl; QString fileName = QFileDialog::getOpenFileName(this, tr("Open Satellites File"), util->getHomeDir(), "SATS (*.dat)"); if (fileName.isNull()) { return; } UpdateSatsData *updateSat = new UpdateSatsData(dataProxy, this); if (updateSat->satDataFileRead(fileName)) { //qDebug) << "SetupPageSats::slotImportButtonClicked IMPORTED OK" << endl; } else { //qDebug) << "SetupPageSats::slotImportButtonClicked IMPORTED NOK" << endl; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog warning")); QString aux = QString(); aux = tr("An unexpected error ocurred while importing the satellite data.\n\nIt may be caused because the file you are trying to import does not have the right format."); //msgBox.setText(aux + "MW-1#" + QString::number(errorCode)); msgBox.setText(aux); msgBox.setDetailedText(tr("Please check the format or contact the developer for analysis with the error code: ") + "SetupPageSats error #1"); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } } satsModel->select(); updateSelectedSats(); } void SetupPageSats::slotExportButtonClicked() { //qDebug) << "SetupPageSats::slotExportButtonClicked" << endl; int nameCol = -1; QString queryString, aux; QSqlQuery query; QString satText = QString(); int satsN = -1; bool sqlOk = false; aux.clear(); queryString = "SELECT COUNT (*) from satellites"; sqlOk = query.exec(queryString); if (sqlOk) { if (query.next()) { if (query.isValid()) { satsN = (query.value(0)).toInt(); //qDebug) << "SetupPageSats::slotExportButtonClicked: Sats: " << QString::number(satsN) << endl; } else { return; } } else { return; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } QDateTime *dateTime = new QDateTime; dateTime->currentDateTime(); queryString = "SELECT id, satarrlid, satname, uplink, downlink, satmode FROM satellites"; sqlOk = query.exec(queryString); if (sqlOk) { QString fileName = QFileDialog::getSaveFileName(this, tr("Save Satellites File"), util->getHomeDir(), "SATS (*.dat)"); QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return ; QTextStream out(&file); out << "SATS" << endl; out << "" << QString::number(satsN) << endl; out << "" << (dateTime->date()).toString("yyyyMMdd"); out << "" << endl; QSqlRecord rec = query.record(); while ( (query.next()) && (query.isValid()) ) { nameCol = rec.indexOf("satarrlid"); aux = (query.value(nameCol)).toString(); satText = "" + aux + " "; nameCol = rec.indexOf("satname"); aux = (query.value(nameCol)).toString(); satText = satText + "" + aux + " "; nameCol = rec.indexOf("uplink"); aux = (query.value(nameCol)).toString(); satText = satText + "" + aux + " "; nameCol = rec.indexOf("downlink"); aux = (query.value(nameCol)).toString(); satText = satText + "" + aux + " "; nameCol = rec.indexOf("satmode"); aux = (query.value(nameCol)).toString(); satText = satText + "" + aux + " " + ""; out << satText << endl; satText.clear(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } //qDebug) << "SetupPageSats::slotExportButtonClicked END" << endl; } klog-0.9.8.1/mainwindowinputeqsl.cpp0000644000175000017500000004036713532572307016451 0ustar develdevel#include "mainwindowinputeqsl.h" MainWindowInputEQSL::MainWindowInputEQSL(DataProxy *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowInputEQSL::MainWindowInputEQSL" << endl; util = new Utilities; qslSentStatusList.clear(); qslRcvdStatusList.clear(); clubLogStatusList.clear(); dataProxy = dp; qslSentStatusList = dataProxy->getQSLSentList(); qslRcvdStatusList = dataProxy->getQSLRcvdList(); clubLogStatusList = dataProxy->getClubLogStatusList(); eqslSentComboBox = new QComboBox; eqslRecComboBox = new QComboBox; lotwSentComboBox = new QComboBox; lotwRecComboBox = new QComboBox; clublogComboBox = new QComboBox; eqslSentQDateEdit = new QDateEdit; eqslRecQDateEdit = new QDateEdit; lotwSentQDateEdit = new QDateEdit; lotwRecQDateEdit = new QDateEdit; clublogQDateEdit = new QDateEdit; eqslSentQDateEdit->setDisplayFormat("dd/MM/yyyy"); eqslRecQDateEdit->setDisplayFormat("dd/MM/yyyy"); lotwSentQDateEdit->setDisplayFormat("dd/MM/yyyy"); lotwRecQDateEdit->setDisplayFormat("dd/MM/yyyy"); clublogQDateEdit->setDisplayFormat("dd/MM/yyyy"); createUI(); setDefaultData(); clear(); //qDebug() << "MainWindowInputEQSL::MainWindowInputEQSL - END" << endl; } void MainWindowInputEQSL::createUI() { clublogQDateEdit->setToolTip(tr("Date of the ClubLog upload.")); eqslSentQDateEdit->setToolTip(tr("Date of the eQSL sending.")); eqslRecQDateEdit->setToolTip(tr("Date of the eQSL reception.")); lotwSentQDateEdit->setToolTip(tr("Date of the LoTW sending.")); lotwRecQDateEdit->setToolTip(tr("Date of the LoTW reception.")); clublogComboBox->setToolTip(tr("Status on ClubLog.")); eqslSentComboBox->setToolTip(tr("Status of the eQSL sending.")); eqslRecComboBox->setToolTip(tr("Status of the eQSL reception.")); lotwSentComboBox->setToolTip(tr("Status of the LoTW sending.")); lotwRecComboBox->setToolTip(tr("Status of the LoTW reception.")); // eQSL Tab definition starts here QLabel *clublogLabelN = new QLabel(tr("ClubLog")); clublogLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *eQSLSentLabelN = new QLabel(tr("eQSL Sent")); eQSLSentLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *eQSLRecLabelN = new QLabel(tr("eQSL Rec")); eQSLRecLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *lotWSentLabelN = new QLabel(tr("LoTW Sent")); lotWSentLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *lotWRecLabelN = new QLabel(tr("LoTW Rec")); lotWRecLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); /* QHBoxLayout *eqslSentLayout = new QHBoxLayout; eqslSentLayout->addWidget(eqslSentComboBox); eqslSentLayout->addWidget(eqslSentQDateEdit); QHBoxLayout *eqslRecLayout = new QHBoxLayout; eqslRecLayout->addWidget(eqslRecComboBox); eqslRecLayout->addWidget(eqslRecQDateEdit); QHBoxLayout *lotwSentLayout = new QHBoxLayout; lotwSentLayout->addWidget(lotwSentComboBox); lotwSentLayout->addWidget(lotwSentQDateEdit); QHBoxLayout *lotwRecLayout = new QHBoxLayout; lotwRecLayout->addWidget(lotwRecComboBox); lotwRecLayout->addWidget(lotwRecQDateEdit); QFormLayout *eqslInputTabWidgetLayout = new QFormLayout; eqslInputTabWidgetLayout->addRow(eQSLSentLabelN, eqslSentLayout); eqslInputTabWidgetLayout->addRow(eQSLRecLabelN, eqslRecLayout); eqslInputTabWidgetLayout->addRow(lotWSentLabelN, lotwSentLayout); eqslInputTabWidgetLayout->addRow(lotWRecLabelN, lotwRecLayout); */ QGridLayout *eqslInputTabWidgetLayout = new QGridLayout; eqslInputTabWidgetLayout->addWidget(clublogLabelN, 0, 0); eqslInputTabWidgetLayout->addWidget(eQSLSentLabelN, 1, 0); eqslInputTabWidgetLayout->addWidget(eQSLRecLabelN, 2, 0); eqslInputTabWidgetLayout->addWidget(lotWSentLabelN, 3, 0); eqslInputTabWidgetLayout->addWidget(lotWRecLabelN, 4, 0); eqslInputTabWidgetLayout->addWidget(clublogComboBox, 0, 1); eqslInputTabWidgetLayout->addWidget(eqslSentComboBox, 1, 1); eqslInputTabWidgetLayout->addWidget(eqslRecComboBox, 2, 1); eqslInputTabWidgetLayout->addWidget(lotwSentComboBox, 3, 1); eqslInputTabWidgetLayout->addWidget(lotwRecComboBox, 4, 1); eqslInputTabWidgetLayout->addWidget(clublogQDateEdit, 0, 2); eqslInputTabWidgetLayout->addWidget(eqslSentQDateEdit, 1, 2); eqslInputTabWidgetLayout->addWidget(eqslRecQDateEdit, 2, 2); eqslInputTabWidgetLayout->addWidget(lotwSentQDateEdit, 3, 2); eqslInputTabWidgetLayout->addWidget(lotwRecQDateEdit, 4, 2); setLayout(eqslInputTabWidgetLayout); connect(clublogComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotClubLogComboBoxChanged() ) ) ; connect(eqslSentComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(sloteQSLSentComboBoxChanged() ) ) ; connect(eqslRecComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(sloteQSLRecvComboBoxChanged() ) ) ; connect(lotwSentComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotLotwSentComboBoxChanged() ) ) ; connect(lotwRecComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotLotwRecvComboBoxChanged() ) ) ; //dxUpLeftTab->addTab(eqslInputTabWidget, tr("eQSL")); } void MainWindowInputEQSL::setDefaultData() { //qsAux << tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("I-Ignore") << tr("V-Validated"); //eqslRecComboBox->addItems(qsAux); //lotwRecComboBox->addItems(qsAux); eqslRecComboBox->addItems(qslRcvdStatusList); lotwRecComboBox->addItems(qslRcvdStatusList); //qsAux.clear(); //qsAux << tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("Q-Queued") << tr("I-Ignore"); //eqslSentComboBox->addItems(qsAux); //lotwSentComboBox->addItems(qsAux); eqslSentComboBox->addItems(qslSentStatusList); lotwSentComboBox->addItems(qslSentStatusList); //QStringList qsAux; //qsAux.clear(); //qsAux << tr("Y-Uploaded") << tr("N-Do not upload") << tr("M-Modified"); clublogComboBox->addItems(clubLogStatusList); } void MainWindowInputEQSL::clear() { //qDebug() << "MainWindowInputEQSL::clear" << endl; clublogComboBox->setCurrentIndex(1); // Do not upload eqslSentComboBox->setCurrentIndex(1); eqslRecComboBox->setCurrentIndex(1); lotwSentComboBox->setCurrentIndex(1); lotwRecComboBox->setCurrentIndex(1); //dateEdit->setDate(QDate::fromString(aux1, "yyyy/MM/dd")); //QString date; //date = "18000101"; //eqslSentQDateEdit->setDate(QDate::fromString(date, "yyyyMMdd")); //eqslRecQDateEdit->setDate(QDate::fromString(date, "yyyyMMdd")); //lotwSentQDateEdit->setDate(QDate::fromString(date, "yyyyMMdd")); //lotwRecQDateEdit->setDate(QDate::fromString(date, "yyyyMMdd")); //clublogQDateEdit->setDate(QDate::fromString(date, "yyyyMMdd")); eqslSentQDateEdit->setDate(util->getDefaultDate()); eqslRecQDateEdit->setDate(util->getDefaultDate()); lotwSentQDateEdit->setDate(util->getDefaultDate()); lotwRecQDateEdit->setDate(util->getDefaultDate()); clublogQDateEdit->setDate(util->getDefaultDate()); } QString MainWindowInputEQSL::getClubLogStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getClubLogStatus:" << clublogComboBox->currentText() << endl; _pm = (((clublogComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getClubLogStatus: " << _pm << endl; //if (_pm == "Not") //{ // return QString(); //} return _pm; } QString MainWindowInputEQSL::getEQSLRecStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getEQSLRecStatus:" << eqslRecComboBox->currentText() << endl; _pm = (((eqslRecComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getEQSLRecStatus: " << _pm << endl; //if (_pm == "Not") //{ // return QString(); //} return _pm; } QString MainWindowInputEQSL::getEQSLSenStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getEQSLSenStatus:" << eqslSentComboBox->currentText() << endl; _pm = (((eqslSentComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getEQSLSenStatus: " << _pm << endl; //if (_pm == "Not") //{ // return QString(); //} return _pm; } QString MainWindowInputEQSL::getLOTWRecStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getLOTWRecStatus:" << lotwRecComboBox->currentText() << endl; _pm = (((lotwRecComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getLOTWRecStatus: " << _pm << endl; //if (_pm == "Not") //{ // return QString(); //} return _pm; } QString MainWindowInputEQSL::getLOTWSenStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getLOTWSenStatus:" << lotwSentComboBox->currentText() << endl; _pm = (((lotwSentComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getLOTWSenStatus: " << _pm << endl; //if (_pm == "Not") //{ // return QString(); //} return _pm; } void MainWindowInputEQSL::setClubLogStatus(const QString _qs) { //qDebug() << "MainWindowInputEQSL::setClubLogStatus: " << _qs << endl; if(( clublogComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { clublogComboBox->setCurrentIndex( clublogComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { clublogComboBox->setCurrentIndex(1); } } void MainWindowInputEQSL::setEQSLRecStatus(const QString _qs) { //qDebug() << "MainWindowInputEQSL::setEQSLRecStatus: " << _qs << endl; if(( eqslRecComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { eqslRecComboBox->setCurrentIndex( eqslRecComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { eqslRecComboBox->setCurrentIndex(1); } } void MainWindowInputEQSL::setEQSLSenStatus(const QString _qs) { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: #" << _qs+" -" << endl; if(( eqslSentComboBox->findText(_qs, Qt::MatchStartsWith))>=0) { eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText(_qs, Qt::MatchStartsWith)); } else { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: NOT found" << endl; eqslSentComboBox->setCurrentIndex(1); } } void MainWindowInputEQSL::setLOTWRecStatus(const QString _qs) { //qDebug() << "MainWindowInputEQSL::setLOTWRecStatus: " << _qs << endl; if(( lotwRecComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { lotwRecComboBox->setCurrentIndex( lotwRecComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { lotwRecComboBox->setCurrentIndex(1); } } void MainWindowInputEQSL::setLOTWSenStatus(const QString _qs) { //qDebug() << "MainWindowInputEQSL::setLOTWSenStatus: " << _qs << endl; if(( lotwSentComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { lotwSentComboBox->setCurrentIndex( lotwSentComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { lotwSentComboBox->setCurrentIndex(1); } } void MainWindowInputEQSL::slotLotwRecvComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::slotLotwRecvComboBoxChanged" << endl; //QSLRDATE (only valid if QSL_RCVD is Y-0, I-3, or V-4) //Y-Yes-0 //N-No-1 //R-Requested-2 //I-Ignore-3 //V-Verified-4 int i = lotwRecComboBox->currentIndex(); switch (i) { case 0: lotwRecQDateEdit->setEnabled(true); lotwRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: break; case 3: lotwRecQDateEdit->setEnabled(true); break; case 4: lotwRecQDateEdit->setEnabled(true); break; default: //NO lotwRecQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::slotLotwSentComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::slotLotwSentComboBoxChanged" << endl; int i = lotwSentComboBox->currentIndex(); //{Y, N, R, I, V} //(QSLSDATE is only valid if QSL_SENT is Y-0, Q-3, or I-4) // Y-Yes = 0 // N-No = 1 // R-Requested = 2 // Q-Queued = 3 // I-Ignore = 4 switch (i) { case 0: lotwSentQDateEdit->setEnabled(true); lotwSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: break; case 3: lotwSentQDateEdit->setEnabled(true); break; case 4: lotwSentQDateEdit->setEnabled(true); break; default: //NO lotwSentQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::sloteQSLRecvComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::sloteQSLRecvComboBoxChanged" << endl; //QSLRDATE (only valid if QSL_RCVD is Y-0, I-3, or V-4) //Y-Yes-0 //N-No-1 //R-Requested-2 //I-Ignore-3 //V-Verified-4 int i = eqslRecComboBox->currentIndex(); switch (i) { case 0: eqslRecQDateEdit->setEnabled(true); eqslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: break; case 3: eqslRecQDateEdit->setEnabled(true); break; case 4: eqslRecQDateEdit->setEnabled(true); break; default: //NO eqslRecQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::sloteQSLSentComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::sloteQSLSentComboBoxChanged" << endl; int i = eqslSentComboBox->currentIndex(); //{Y, N, R, I, V} //(QSLSDATE is only valid if QSL_SENT is Y-0, Q-3, or I-4) // Y-Yes = 0 // N-No = 1 // R-Requested = 2 // Q-Queued = 3 // I-Ignore = 4 switch (i) { case 0: eqslSentQDateEdit->setEnabled(true); eqslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: break; case 3: eqslSentQDateEdit->setEnabled(true); break; case 4: eqslSentQDateEdit->setEnabled(true); break; default: //NO eqslSentQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::slotClubLogComboBoxChanged() { int i = clublogComboBox->currentIndex(); //{Y, N, M} // Y-Yes = 0 // N-No = 1 // M-Modified = 2 switch (i) { case 0: clublogQDateEdit->setEnabled(true); clublogQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: clublogQDateEdit->setEnabled(true); clublogQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO clublogQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::setClubLogDate(const QDate _qs) { if (_qs.isValid()) { clublogQDateEdit->setDate(_qs); } else { clublogQDateEdit->clear(); } } void MainWindowInputEQSL::setEQSLRecDate(const QDate _qs) { if (_qs.isValid()) { eqslRecQDateEdit->setDate(_qs); } else { eqslRecQDateEdit->clear(); } } void MainWindowInputEQSL::setEQSLSenDate(const QDate _qs) { if (_qs.isValid()) { eqslSentQDateEdit->setDate(_qs); } else { eqslSentQDateEdit->clear(); } } void MainWindowInputEQSL::setLOTWRecDate(const QDate _qs) { if (_qs.isValid()) { lotwRecQDateEdit->setDate(_qs); } else { lotwRecQDateEdit->clear(); } } void MainWindowInputEQSL::setLOTWSenDate(const QDate _qs) { if (_qs.isValid()) { lotwSentQDateEdit->setDate(_qs); } else { lotwSentQDateEdit->clear(); } } QDate MainWindowInputEQSL::getClubLogDate() { return clublogQDateEdit->date(); } QDate MainWindowInputEQSL::getEQSLRecDate() { return eqslRecQDateEdit->date(); } QDate MainWindowInputEQSL::getEQSLSenDate() { return eqslSentQDateEdit->date(); } QDate MainWindowInputEQSL::getLOTWRecDate() { return lotwRecQDateEdit->date(); } QDate MainWindowInputEQSL::getLOTWSenDate() { return lotwSentQDateEdit->date(); } klog-0.9.8.1/Changelog0000644000175000017500000011635113532572307013433 0ustar develdevelAugust - 0.9.8.1 - Added the Es'hail / QO-100 satellite. - UI: Satellite list, propagation modes and others are now shown sorted. (TNX Isabel) - UI: Added default values to the infoWidget (Continent, Prefix, CQ, ITU...). (TNX Isabel) - UI: RX/TX Freq in Satellite tab are also in red/black depending on the frequency being out/in of ham bands. - UI: Mode selected is now changing the RST format and default values for some modes. - Bugfix: Editing a QSO to remove a comment was not properly working. (TNX Isabel) - Bugfix: Worked & Confirmed QSO numbers are now aligned in the Awards tab. (TNX Isabel) - Bugfix: KLog.pro is now fixed to compile in Linux. (TNX KB2YSI) - Bugfix: Improved how the DXMarathon was managed when disabled. - Bugfix: Improved how DXCC Award was updated after one QSO was added. (TNX Isabel) - Fixed a bug in the SQL update database. August - 0.9.8 - New feature: Basic Hamlib support. - Fixed a bug in the SQL update database. - Fixed a bug in the DXCCWidget. - Fixed a bug in the QSO per hour stats. - Added the FT4 mode. - Updated translations: Catalan (TNX Txema), Danish (TNX Joe), Finnish (TNX Kristjan), French (F4HWL), German (TNX Burkhard), Spanish (EA4TV). March - 0.9.7.3 - TODO: Remove the band 0 / Light from the DB. - UI: KLog warns the user if the frequency used is out of the hamradio bands. - Reworked how freqs and bands are managed. March 2019 - 0.9.7.2 - Bugfix: Frequency boxes did not accepted frequencies higher than 99.999 MHz. (TNX KB2YSI) March 2019 - 0.9.7.1 - Bugfix: The frequency was not properly saved in the DB. (TNX KB2YSI) - Bugfix: The QSO_DATE was not exported into ADIF. (TNX KB2YSI) March 2019 - 0.9.7 - Bugfix: When clicking on Check updates, the dialog froze. - Bugfix: Printing log is not longer showing band in the mode column. - Updated the default date on date boxes to the current date. - Improved the Frequency syncronization between Satellite tab and the main tab. - Improved how default mode is calculated. - Added Satellites widget in Setup. - Updated translations: Catalan (TNX Txema), Danish (TNX Joe), Finnish (TNX Kristjan), French (F4HWL), German (TNX Burkhard), Spanish (EA4TV). December 2018 - 0.9.6 - Optimizing the Statistics widget. - Added some new Statistics widgets. - Fixed some messages with typos. - Bugfix: Fixed a bug preventing to modify a QSO. (TNX KB2YSI). October 2018 - 0.9.5 - Added a dot at the end of all the tooltips. - Updated the Satellite database (TNX KB2YSI). - Some queries optimized. - Bugfix: You can nor close the About KLog window from any tag (TNX F4HWL). - New feature: KLog shows some statistics of your log: Tools->Stats - New feature: It is now possible to update the satellite data reading a sats.dat file: Tools->Update Satellite Data. - Satellites file (sats.dat) updated to september 2018 (TNX KB2YSI). - New translations: French (TNX F4HWL) and German (TNX Burkhard). - Updated translations: Catalan (TNX Txema), Croatian (TNX M0NKC), Finnish (TNX Kristjan), Spanish (EA4TV). August 2018 - 0.9.4 - WSJT-X support to receive logged QSO and realtime data. - Check bool DataBase::updateTo012() / it was always returning true without any action. - Syncronize RX Freq with the satellite downlink combobox. - Focus is back to search line edit when right click on the list of found QSOs. - Update process has been improved. - Some warnings removed from compilation time. - Bugfix: Date was not properly calculated and UTC settings was not applied. That may create wrong date QSO when date changes due to UTC (TNX AC1DW). - Bugfix: When adding a QSO, if the QSL is marked as received, KLog showed a SQL error. - Bugfix: Table qsl_via needed to be renamed (TNX EA6ZS). - Bugfix: Some DXCC status were nor properly calculated. - Updated translations: Catalan (TNX Josep), Croatian (TNX M0NKC), Danish (TNX Joe), Spanish (EA4TV). April 2018 - 0.9.3 - Double clicking on DXCC Widget name of the Entity will show the QSO is providing that status on the Search widget. - Added DXCC support for Kosovo. - Bugfix: Default band & mode are now defined as the most used band and mode. - Bugfix: TX frequency was not saved. - Bugfix: In the dxcc status widget, some countries were showing the UN flag unappropriately. - Bugfix: When updating the CTY file, query errors were shown on world.readCTYCSV function. - Bugfix: When editing the QRZ, the cursor position was not properly maintained. - Bugfix: Fixed the flags of several DXCC entities that were not correctly shown. - Bugfix: DXCC Status widget was not listing all the DX entities. - Bugfix: Modes & Bands where not always properly updated from the Setup. - Bugfix: Adding new QSO that implies a DXCC or WAZ status already worked failed. - Bugfix: Updating the WAZ status was not always possible due to a incorrect DB query. - Updated translations: Danish (TNX Joe), Spanish (EA4TV). January 2018 - 0.9.2.9 - Bugfix: Adding new QSO that implies a DXCC or WAZ status already worked failed. - Bugfix: Modes where not properly added from the setup (TNX KB2YSI). - UI Change: Freq in the Satellite tab is now not deleted when a new QSO is added. - New translation: Catalan by Josep (Thank you!) - New translation: Finnish by Kristjan (Thank you!) January 2018 - 0.9.2.8 - Important Optimization on KLog speed on start and general use. - New satellites (AO-91 & AO-92) added. - Added ALL the ADIF 3.0.7 fields (except the _INTL ones). - New feature: New menus to export ADIF files for LoTW and manage LoTW status. - GUI: Implemented an error reporting for the users for main errors - GUI: When a satellite is selected the main bands are automatically proposed. - GUI: QSO band is now linked to the uplink & downlink bands in the satellite tab. - Bugfix: Some ADIF fields were not properly imported/exported. - Bugfix: When searching calls like 1A0XX, 2E0XX, ... no results were found but there are with 3D0XXX - Bugfix: If an empty log was selected on config file, on next KLog start KLog crashed. - Bugfix: Doubleclicking on the log to edit was sometimes causing the band/mode data to be shown as a number instead of the human readable name. - Bugfix: Windows version did not detected the DB movement correctly. - New translation: Polish by LA7RRA (Thank you!). - New translation: Danish by Joe (Thank you!). - Updated translations: Croatian (TNX M0NKC), Italian (TNX IU5HIU), Spanish (EA4TV) - Several internal updates. September 2017 - 0.9.2.7 - KLog offers the possibility to move the DB to another path (maybe a DropBox folder!) - New Operating systems recognized in runtime. - Updated the references to macOS from OSX. - Updated the list of valid modes up to ADIF 3.0.6. - Updated the list of valid propagation modes up to ADIF 3.0.6. - Update the 136KHz band limits to the new US licenses. - Optimized the speed of printing the log. - GUI: Added the QSO information done in a year on the DX-Marathon area. - GUI: Simplified the way active bands/modes are selected. - GUI: Satellite tab is redesigned. - GUI: Created a widget to manage all "eQSL" simplifying implementation of the main widget. - GUI: Created a widget to manage the Log, simplifying implementation of the main widget. - GUI: Created a widget to manage the Search, simplifying implementation of the main widget. - GUI: Added a SplashScreen on KLog start to show the user the starting process. - GUI: If the user adds a frequency in the TX Freq box that is not a currently used band, it is automatically added to the band seletion widget. - BugFix: Fixed how new logs were added to the DB. - BugFix: Identification is a band was HF or VHF was not always properly done. - BugFix: Higher bands where not shown to be selected in the preferences. - BugFix: DB updating function (009) blocked the execution of KLog the first time it was executed. - BugFix: Language message if English is the System language is no shown anymore. - New translation: Italian by IU5HIU (Thank you!). - Translations updated: Original English (TNX JustinBRye, from Debian-10n-english), Spanish (EA4TV), Japanese (TNX JL3OXR). May 2017 - 0.9.2.6 - Check updates feature added. On start or when user desires KLog checks if there is one updated version available. - Simplified the way new logs are added, importing the general StationCallsign & Operators as default for new logs. - Improved the way first start was managed when no entity information was loaded. - GUI: Application icon is now shown in the application windows. - GUI: Updated some messages & tips. - GUI: DXCluster offers the Station Callsign as default value to connect. - GUI: Some menu minor reorganization. - Console: Added a few commands to the console command. - Changed the World class to be able to import files from any folder. - Changed how some non ARRL valid entities are managed to show the common name (Sicily / Italy) - BugFix: When manually importing a new CTY.CSV, although data was updated, it was not shown until next KLog start. - BugFix: In the others tab, the DXCC was sometime not correctly identified. - BugFix: Update on the DXCC widget caused no data to be shown if some columns were selected. - BugFix: Identification is a band was HF or VHF was not always properly done. - BugFix: Some improvements in data quality when exporting an ADIF file. - BugFix: When importing an ADIF file, if the file was not correct it was not possible to cancel the whole importing process. - Some minor changes on source code to optimize and improve. - Translations updated: Croatian (TNX M0NKC), Japanese (TNX JL3OXR) & Spanish (EA4TV). November 2016 - 0.9.2.5 - BugFix: ADIF export function was not exporting the correct BAND & MODE data. September 2016 - 0.9.2.4 - GUI: Created a DXCC status where all the DXCC entities are listed showing the working/confirmed status. - GUI: Created a Satellite list including (up to now) only LOTW compatible satellites. - GUI: Created a widget to manage all "My Data" simplifying implementation of the main widget. - GUI: Bands in the combobox are always shown correctly ordered (botton-up). - GUI: Improved the LOTW date management (TNX JL3OXR). - BugFix: Preferences->Misc: It was not possible to edit the default filename. (TNX K6XT). - BugFix: Added the Power unit (W) to the power box. Debian bug #654332. - BugFix: When editing a QSO in some text boxes text was reused from previous QSO and data could be corrupted. - BugFix: Minor bug in WAZ management. - BugFix: When managing logs in the setup is was not possible to edit the log data as a new log was always created. - When starting KLog for the first time, the setup guidance has been improved. - When selecting an entity, different from the proposed on country file, KLog asks the user which one to use. - Operator from the selected log is used as default when entering QSO (as station callsign). - Japanese translation updated. (TNX JL3OXR). - Spanish translation updated. - Some cleaning in the code. January 2016 - 0.9.2.3 - Improved the way translations are managed (Specially in Linux). - Icon application is now shown in OSX & Windows. - New translation: Japanese by JL3OXR (Thank you!). - Bugfix: Some strings where not defined to be translated (TNX JL3OXR). - Bugfix: Some tips in the UI where not correctly placed (TNX JL3OXR). - Bugfix: QSOs in JT9 were not properly imported from ADIF (TNX EA3XQ). - Bugfix: Logfiles with the in the first line, following some test were not properly imported. November-2015 - 0.9.2.2 - Translations are now working properly in Windows & OSX. - New translation: Catalan by EA3NM (Thank you!). - Ported from Qt4 to Qt5. - BugFix: Aether ADIF files could not be properly imported. (TNX AA5VU). - BugFix: QSOs where not properly shown in the search box. - BugFix: When started for the first time, no modes were shown as default. - BugFix: CTY.CSV was not properly updated. - BugFix: When upgrading the mode information in database some modes where not properly updated. - GUI: Changed the year to show the full number to avoid problems with old QSO. - Import ADIF functionality is improved to support importing of logs with some missing data. - Removed the Spot button until its functionality is implemented. September-2015 - 0.9.2.1 -BugFix: Band & Mode information was not properly stored. August-2015 - 0.9.2 - Bugfix: An ADIF file with one blank line and one QSO used to froze KLog. - Bugfix: Minor bugfix in the definition of propagation modes. - BugFix: When editing a QSO the name was not shown. - BugFix: STX_String field was not always imported properly. - BugFix: Fixed a minor bug in log table regarding the prop_mode foreign key. - BugFix: Improved the color & status shown of a QSO on the DXCC. - BugFix: DXCluster: Fixed a bug that caused the colors to appear always as new one. - BugFix: DXCluster: The option to show only not confirmed was not working correcty. - BugFix: IOTA reference was not saved when entering a QSO. - BugFix: BIGCTY.DAT was not properly download in KLog first start. - GUI: Added some shortcuts in the preference widget. - GUI: DXCluster: Add a suggestion to hit enter if no password is expected for the cluster. (tnx AA5VI) - GUI: DXCluster: Warns you if the spot is needed for the current year DX-Marathon - GUI: Added a Propagation Mode Combobox. - GUI: Prop_Mode combobox automatically goes to SAT if sat name or sat mode are defined. - GUI: Added a Find DX-QSL requested option. - Added the 630M & 13CM bands. - Updated Mode & submode definition up to ADIF 3.0.4. - Special CQ & ITU zones in some calls are now identified. - KLog is able to import QSOs with no BAND field if FREQ field is present. - KLog offers the user a default value if RST_TX or RST_RX field is not present when importing. - Support of realtime upload, modification & removal of a single QSO to/from ClubLog.org. - Updated the DB with the PROP_MODE options. - Improved the way KLog manages & shows the bands & modes. - Removed the option to choose to run in memory or file in the start wizard. KLog will run always using a file for the DB. - Added an auto complete option to auto-complete info (QTH, Locator, Name, QSL Manager & IOTA) from previously worked QSO. - Cleared the world.cpp file. - Some minor performance improvements. April-2015 - 0.9.1.1 - Bugfix: Editing a QSO with satellite data was not properly done and caused some errors. April-2015 - 0.9.1 - Bugfix: Fixed DataBase::getBandIdFromFreq it was not ansswering properly. - Now checks if band & frequency are coherent before adding a QSO. Band wins. - All Satellite QSO include the PROP_MODE ADIF tag to make it compatible with LOTW. - Improved the DXMarathon code. - GUI: Added basic Satellite support. - GUI: It is possible to mark a QSL sent via bureau/direct & DX QSL as requested with one action from Search box. - GUI: KLog request a valid QRZ and at least one first logtype to start using it. - KLog supports the management of several logs, being possible to edit, remove and select the one to use. January-2015 - 0.9.0.3 - Bugfix: ADIF was not properly imported when Fields where using the Type of data optional field preventing logs from Logger32 being imported. (TNX EB1TR) - Bugfix: QSL Sent/Received status in the search box were switched. - Bugfix: CTY.CSV was not updated if the file was already existing. - Bugfix: Entity DB was not updated when CTY.CSV was updated. - Bugfix: Search results showed the default Station Callsign if non was in the QSO. This lead to errors if QRZ was not the default. - KLog recognizes now .ADIF files (instead of only .ADI). - KLog shows now the WAZ status. - Added a very basic support of DX Marathon (http://www.dxmarathon.com/). - DXCluster filters are now working. - The user can manually assign the DXCC entity for a DX. - Improved the function to update the DB from one release to the following. - DB file is compressed everytime KLog finishes. - It is possible to find QSL pending to receive. - It is possible to modify entities data in the World Editor in preferences. - It is possible to choose in preferences whether to keep my Data Tab from one QSO to the next or not. - GUI: A tooltip is shown in the search results showing the DXCC name / CQ zone. - GUI: Added a button to rescore awards. - GUI: Added a button to update the search Box without modifying the text. - GUI: Updates Bearing/distance/... when changing Locator. - GUI: When the QRZ lineedit is blank or the clear button is clicked, entity info is deleted (beam, distance, ...). - GUI: The IOTA continent is updated when the QRZ is modified. - GUI: DXCluster input is disabled when not connected. - GUI: Corrected the behaviour of the status bar. - GUI: Added primary & secondary subdivisions in the Others Tab. - Some other minor fixes. November-2014 - 0.9.0.2 - Bugfix: Right-click on search result sometimes caused KLog to crash. November-2014 - 0.9.0.1 - Bugfix: Selected DX-Cluster servers were not used to connect. (TNX DL6FBS) November-2014 - 0.9.0 - Ensures the ASCII requirement of ADIF. - Updated the Preferences dialog. - Added the About Qt help menu. - Bugfix: Selected DX-Cluster servers were not used to connect. - Bugfix: When selecting QSL received/sent with right click, date was not updated. - Bugfix: Fixed the FileManager::adifReadLog to be able to read logs with several lines per QSO. - Some other minor bugfixes. - New feature: It is possible to show Imperial System (Miles instead of Km) data. (TNX - KF5JNU) - New feature: It is possible to mark/look for & export requested QSL. - New feature: It is possible to automatically mark(or not) a QSL as requested by the DX when the DX's card is received. - New feature: It is possible to show (or not) the callsign used in the search box. - New feature: KLog uses bigcty.csv for normal DX & will use cty.csv for contesting. April-2014 - 0.7.1 - Backport to Qt 4.8. - Download the http://www.country-files.com/cty/cty.csv instead of cty.dat (with no ARRL id). - Capable to read cty.csv to get the info of the ARRL id. April-2014 - 0.7.0 - Full rewritten software based only in Qt. NO KDE dependency. - KLog can now run on Linux, OSX and Windows. November-2013 - 0.6.2 - Bug fixed: Under some conditions, KLog crashes when entering a new QRZ. (TNX LW1EQI). - Bug fixed: IOTA data was not properly cleared when clicking the Cancel button. - Bug fixed: QSL combobox content was not properly managed. (TNX DF4FH). - Bug (gui) fixed: IOTA continent is now "automagically" detected... again (a bug prevented this functionality). - GUI updated: You can click on RX or TX Frequency buttons to copy the frequency to the other one. - GUI updated: You can select eQSL in the QSL combobox as an option to mark the QSL information of a QSO. - GUI updated: Two new shortcuts: CTRL+W: deletes the current QSO. CTRL+Q: to (quick)edit the last QSO added. - GUI updated: Minor tab reorder. June-2013 - 0.6.1 - Bug fixed: Locator was not properly calculated due to a sign difference management from KLog and CTY.DAT. - GUI updated: The cursor position management of the QRZ box has been improved to ease the operation. January-2013 - 0.6.0 - Bug fixed: Typo "Frecuency" changed to "Frequency" in a tooltip. (Debian bug: #654328) (TNX Jonas Stein) - Bug fixed: Typo/wishlist "Numb" changed to "Number" in main table. (Debian bug: #654331) (TNX Jonas Stein) - Bug fixed: Typo/wishlist "UTC" changed to "Time" in main table. (Debian bug: #654331) (TNX Jonas Stein) - Removal of several not needed #includes. - Removed some warnings on compilation. - GUI improved: The information boxes are now independant from the top right tab widget to improve usability. - GUI updated: Disabled the Setup tab of Hamlib until hamlib is properly working. January-2012 - 0.5.9 - Bug fixed: When starting for the first time, the CTY.DAT file downloaded had a loop that was not properly managed. (Debian bug: #653697) (TNX Jonas Stein) - Fixed some typo: "Km" changed to "km". (Debian bug: #6536978) (TNX Jonas Stein) December-2011 - 0.5.8 - Bug fixed: Right button in the search result did not "sent" the QSL card. - Bug fixed: Closing the window did not ask to save data before exit. (TNX EA7HEG). - Bug fixed: Beam was not properly calculated. (TNX DL6FBS). - Bug fixed: Minor problem of APP_KLOG_NUMBER ADIF header fixed. - Bug fixed: When modifying, some fields did not accepted empty fields (deleting). (TNX VK4JAZ). - GUI updated: Remove the map tab in the main GUI as it is still not implemented. - GUI updated: Ordered the tab-switching to make it more usable. (TNX Cedric). - Added the support for QRP. Power has two decimals. (TNX VK4JAZ). November-2010 - 0.5.7 - New feature: Added the Export needed QSL that allows to create an ADIF file with all the QSO with new ones and new bands still not confirmed that has not been QSLed. The objective is to export it to a QSL or label printing software (until KLog implements that feature). - Updated translations: SV by SM4ABE. - GUI improved: Added sliders to be able to move panels. - GUI improved: Changing the band combobox changes the TX Freq box and viceversa. - Minor fix: The PROGRAMVERSION tag in log was not properly formated. July-2010 - 0.5.6 - Fixed the hamlib compilation scripts (CMakeLists.txt, FindHamlib.cmake). (TNX AB4BD). - Fixed one bug that causes some architectures not to compile. - Fixed some permisions and other warnings for Fedora packaging. (TNX N3LRX). - BUG fixed: Setting QSL from the log with right button was not working. May-2010 - 0.5.5 - New feature: If cty.dat file is not found, KLog offers to download from the web. - New feature: New tool to update the update the cty.dat file from the web. - New feature: QRZ font color changes to red if has been worked previously. (Proposed by KE7TDY) March-2010 - 0.5.4 - Small fix to initialize a variable before using it.(realTimeLog in klog.cpp) - Fixed a bug that caused KLog to crash of no cty.dat file was found (bug #016917)(TNX KA6MAL) February-2010 - 0.5.3 - Fixed a bug that caused modified QSO not being updated. - Fixed a bug in the way the band & mode combobox managed the data. February-2010 - 0.5.2 - Fixed a bug that causes a crash when connectiong to DXCluster. (bug #016653) - Added a very basic Satellite support. - Removed the Freq LCD and added two new editable widgets: Freq TX and Freq RX. (bug #016609) - Added again the entity count of /M stations. January-2010 - 0.5.1 - Fixed a bug with the display of the Date. December-2009 - 0.5.0 - Migrated to Qt4. - Updated translations: SV by SM4ABE, DE by DL5PD, ES by EA4TV. - ZL2ACG joined the KLog team. Welcome and thank you Andrew! April-2009 0.4.7 - New feature: Import cabrillo logs. - Improved the ADIF compatibility up to ADIF 2.2.2. - BUG fixed: Improved the confirmed QSO accounting. - BUG fixed: RST format were not changed when another mode was selected if the CALL was empty. (TNX Alvaro, EA4RCT). - BUG fixed: Calls like F0XXX/TU8 were not recognised if written as TU8/F0XXX. - BUG fixed: TX_PWR is only saved when bigger than 0w :-) - BUG fixed: Prefixes were not properly managed and some information, as the STATE from ADIF files were not always well imported. - BUG fixed: Related with the ADIF saving CQ & ITU zones for QSO. It was not properly saved but can be recovered from the CALL. 20-dic-2008 - 0.4.6 - BUG fixed: Printing was not properly working due to library actualization. - BUG fixed: Fields STX/SRX/STATION_CALLSIGN/CONTEST_ID were copied from one QSO to the following one. 23-nov-2008 - 0.4.5 - GUI fixed: Changed the order of the input fields tab switching. - GUI fixed: Corrected the layout to fix the screen as ITU was not properly shown. - GUI improved: Added a new one color to differ a completely new one spot in the DX-cluster from a needed in a band. This last improvement is specially usefull in the search QSO to QSL. Test it! - GUI improved: Added a tab in the botton box with the DXCC status (only main HF bands). - New feature: Added the possibility to choose to show or not DX Spots based on CW/SSB activity. (TNX EA7BJ) - New feature: Added the support of the 0.136KHz and GHz bands (not to the GUI but KLog can process them). - BUG fixed: Minor check on QSL sent date was not properly done (no data lost). - BUG fixed: Some Entities & zones where not properly recognized. - BUG fixed: The state (needed/worked/confirmed) was not always properly shown. - Improved the way is readed the cty.dat file and added support for its new format. - Improved the ADIF compatibility supported fields, band frecuencies, modes... - Improved the QSO merging with previous data. - Updated translations: English, Spanish, TNX: Swedish (SM4ABE), German (DL5PD). 1-may-2008 - 0.4.4 - BUG fixed: KLog now recognises a "/LH" LightHouse stations (TNX G3OAG) - BUG fixed: TLF import did not show the imported QSO in the log. QSO were not lost, just not shown. They were added to the logfile and saved when saving. No data was lost. This bug was introduced in release 0.4.2 after an optimization in the logfile reading. BUG: Frequency was not compliance with ADIF as was saved in KHz instead of MHz. - BUG fixed: If a logfile does not provide a MY_GRIDSQUARE, KLog does not add the predefined MY_GRIDSQUARE. - BUG fixed: Some GRIDSQUARES were not detected as wrong althought they were. - Minor fix: Corrected the URL to CTY.DAT file in the start message. - GUI improved: Added a progress dialog when saving. - GUI changes: Some widgets have been changed to prepare for the Qt4 migration. Specially the Led near the QRZ box that will reapear as usual when KLog is migrated to Qt4. - Added the 70Mhz band. - New feature: New tool added "Merge QSO data" that looks in all the log for the QSO that has been worked more than once and merges the data like Name, QSL info, QTH, Locator, ... The information comming from all the appearances of a call in the log is grouped in the first appearance of that call in the log. 18-jan-2008 - 0.4.3.1 - Package fix: Distributed with the language (po) files. 12-jan-2008 - 0.4.3 - BUG fixed: KLog copied the QSL sent date into the QSL rec date. Only QSL rec date was lost but not the QSL status. - BUG fixed: KLog now recognises a "/J" (Jamboree On The Air) Scout Station. - GUI improved: Added the cty.dat URL. 12-Sep-2007 - 0.4.2 - New feature: The user can now configure to require or not the mandatory data for each QSO (QRZ, date, time, band, mode, RST tx & RST rx. (if not all the mandatory fields are entered, KLog's behaviour may be unexpected). - New feature: Klog creates a temp file (~.klog/tempklog.adi) where it saves automatically all the QSOs entered until the log is manually saved. It prevents the log to be lost in case of unprevented KLog/computer failure. (TNX SM5OUU) - BUG fixed: If the field (maybe any other field too) COMMENT is more than one line long, the log is broken and cannot be read. (TNX SM5OUU) - BUG fixed: KLog does not ask for the file name if you have previously opened one file and the name has not changed. - BUG fixed: In the GUI, the "Preferences" is correctly shown and not as "&Preferences". - BUG fixed: When modifying a QSO, the number of QSOs was incremented when the user click over OK. - BUG fixed: If a QSO was deleted the awards/number of QSO where not decresed. - BUG fixed: When the date - GUI improved: Deleted the WAE box (the WAE calculations was not implemented). - New translation: KLog is now also in Swedish.(TNX SM4BE) - New translation: KLog is now also in Galician.(TNX Fuco Mera) - Updated German translation.(TNX DL5PD) - Updated Spanish translation. 16-Dic-2006 - 0.4.1 - Bug fixed: The distance and beam is also resetted when the call box is deleted. - Bug fixed: Calls /M and /MM do not count for DXCC.(TNX SM5CNQ) - Bug fixed: It is possible to filter only for needed entities spots. - Change: The hamlib signal meter has been removed from the GUI. - New feature: There is a new tool available to find QSO from which the QSL is needed that you have still not sent the QSL. Very useful to find which QSL you need to send first! - New feature: The MY_GRIDSQUARE is managed by default by all QSO (saves the default if none is entered) 10-Sep-2006 - 0.4.0 - New feature: It is possible to manage user-created local awards (TPEA, DOK, WAS, ...) KLog reads user defined awards in a special format. - New feature: KLog reads ".adif" files also.(TNX DL5PD) - New feature: It is possible to add/delete new DXServer clusters in the setup box.(TNX DL5PD) - GUI Improved: IOTA continent is now "automagically" detected. - Bug fixed: Not really a bug but now, the log is cleaner as it does not save the "STATE" for ALL the QSO, only does it if needed. - Bug fixed: After modifying a QSO the band and mode did not return to the last used (TNX DL5PD). - Bug fixed: If the band changed, without any call in the Call box, KLog showed "new one, work it" - Bug fixed: If the band changed, when modifying KLog fooled the entity color band boxes. - Bug fixed: KLog recognises /MM as maritime mobile station - Bug fixed: When opening a new log, the number of QSO did not start from zero. - New translation: KLog is now also in German.(TNX DL5PD) 18-Jan-2006 - 0.3.3 - New feature: It is now possible to sort the log by numbers from the main log. - New feature: The frequency box is now also used when no hamlib support is active (double clicking over a dx-cluster spot. - New feature: If file name does not end in .adi, add the .adi. - Bug fixed: Reporting a bug does not crash KLog although the widget has been temporally/drastically simplified. - Bug fixed: It is possible to select the radio from the setup. - Bug fixed: (introduced in 0.3.2) It was not possible to activate the progress dialog. - Bug fixed: When clicking over "New File", confirmed entities was not set to "zero". - Bug fixed: When reading from cty.dat file, the prefix was reading with some spaces at the begining. - GUI Improved: After pressing OK/clear button, the QRZ box is selected. (TNX P.H. Rankin Hansen) - GUI Improved: You can now reach to Name&QTH using the tab key (TNX P.H. Rankin Hansen) - GUI Improved: QTH/Locator is now on the main QSO tab (TNX P.H. Rankin Hansen) 25-Apr-2005 - 0.3.2 - New feature-(unstable): Hamlib support to control/read the rig from KLog. - New feature-(unstable): It is possible to click over a DX-Spot and set the radio to that frecuency & mode to work the spot (hamlib). - New feature-(unstable): KLog reads the frecuency, band, mode and signal from the radio in real time (hamlib). - New feature: After QSLing using the Right Button option from the search box, the search box is updated so the QSL status is shown updated. - New feature: Local operator callsign can now be also logged. - Bug fixed: A call ending in /B is now correctly recognised as a beacon. - Bug fixed: Now it recognise all the "special suffix" like /r Rotuma, /a Mount Athos,... - Bug fixed: WARC Bands were not correctly detected. - GUI improved: The QRZ box always shows the QRZ as uppercase. (TNX ea4eej) - Bug fixed: KLog can now read ADIF files where the QSO can be in several lines. - Bug fixed: Importing from tlf, the QSO count was not properly done because of the comment lines. 16-Jan-2005 - 0.3.1 - KLog has been optimized and now runs faster. - New feature: KLog saves the date/time of the last log file save. - New feature: KLog ask the user for a comment when Importing a TLF log (for example to note that those QSO are from an specific contest or whatever). - Bug fixed: When selecting a DX-Spot from the DX-Cluster it did not overwrote the name. - Bug fixed: When writting the log, there was an space missing before the . It is just a "cosmetic" fix, not a real bug. - Bug fixed: The same with the QSL card status. - Bug fixed: KLog now recognises all the prefix that appears in cty.dat file with special CQ/ITU zones. - Bug fixed: KLog recognises the special call "3XDQC/P" as "3X" although it does not follow the "prefix+number+suffix" pattern - Bug fixed: When starting it now looks the cty.dat file in: ~/.klog and in the current directory before starting without Entities' data. (TNX oh7jjt) - Bug fixed: If we are modifying a QSO, the search box is not updated. Avoids some crashes. 07-Nov-2004 - 0.3.0 - Fixed source code to allow compiling in more architectures. - New feature: It is possible to show a progress dialog when opening the log file. This is configurable. - New feature: It is now possible to hide/show WARC spots or announces from cluster. - New feature: Printing the is now possible. - New feature: Sorting the log file is now possible. - New feature: New option in right button to send&rec QSL at once. - New feature: If a CALL has been previously worked it shows data to the actual QSO. - Fixed bug: When modifying, the QTH was not modified. - Fixed bug: It did not make you save if you just modify a QSO. - Improved the gui: The "T" (from RST) does not disappears but is disabled when is not needed. (TNX Ferm�n H.). - Improved the gui: The QSL info text box is always active. - Improved the gui: When connecting to the DX-Cluster server, automatically sets the DXCluster window as active. 2-May-2004 - 0.2.9 - New feature: Selection of a DX-Spot shows the Entity data and state. - New feature: KLog checks and captures the output of a sh/dx command in cluster. - Fixed bug(caused in 0.2.8): QRZs as KA3AA, when the prefix is just one letter but the call uses two are now well recognised. - Fixed bug: Better recognision from /number calls from DX-Cluster. 21-Mar-2004 - 0.2.8 - Fixed bug: Now ignores comments in TLF's files. - Fixed bug: QRZs as VP2MCV, with complex prefixes are now well recognised. - Improved the gui: RST, Power size adjusted. (TNX ea1ddn) - Improved the gui: Name and QTH moved to QSO tab. - Improved the gui: QSL via bureau is now the default option. (TNX ea1ddn) - New feature: Calculate distance and beam if locator is entered. (TNX ea1ddn) - New feature: Auto-open logfile when starting is now possible. (TNX ke6sls & ea1ddn) - New feature: Now it is possible to double-click over a DXCluster spot to copy it to the QSO input box. (TNX ea1ddn) - New feature: In the search box, QSOs are colored indicating if worked, needed, ... 04-Jan-2004 - 0.2.7 - Fixed bug: When editing a QSO, the QSL date was not properly displayed. - Fixed bug: When entering a QSO, if the band is changed, KLog checks the state in this new band. - Fixed bug: RST (tx&rx) in ADIF was always length 3, now is calculated for every QSO (at writing). - Fixed bug: When modifying if QSL rec, the date was shown as 00/00/0000 - New feature: It is posible to select a default mode & band in the setup. - First Icon draft created. 02-Dec-2003 - 0.2.6 - Fixed bug: When Non real time logging was setting the time was "real time" when modifying. (TNX rz3dfs) - Fixed bug: When reading the log file if an entity was not recognised Klog used to crash. - Fixed bug: Now we recognise calls like 3XY1L when reading from a log file. - Fixed bug: Improved the way of checking the confirmed/worked entities. - Fixed bug: /P, /M and /QRZ are now better recognised when reading from logfile or clicked. - Fixed bug: Stats were not shown after importing a tlf log file. - Fixed bug: The zone & entity numbering fixed. - New feature: It is posible to setup a default power level. - New feature: When receiving a qsl with the mouse's right button the numbers are updated. - New feature: Also a default color is selectionable as non-info color. - Improved the gui: Band info leds removed to gain space in the info widget. 26-Aug-2003 - 0.2.5 - Fixed bug:�RST was changed so when entering SSB RST. Entering 590 -> showed 509. (TNX ke6sls) - Fixed bug: In cluster some frecs (432MHz and 2190m) were not properly recognized. - New feature: It is now possible to hide HF/VHF/ANN spots or announces from cluster. - New feature: It ask for the file name when saving first time instead of using "klog.adi" as default. (TNX ke6sls) - New feature: It is now possible to add QSO in non real time (to add previous QSOs). (TNX yu1is) - New feature: Power value is remembered from previous QSO. (TNX ke6sls) - New feature: Basic bug report system. (TNX ke6sls) - New feature: Mode selection affects to the RST configuration (TNX yu1is & ke6sls) - New feature: Colors for confirmed/worked/needed are configurable by the user. - New feature: Added tips to many widgets to explain their functions. 31-Jul-2003 - 0.2.4 - Fixed bug: Some calls were not recognized when checked (as 3da0sv). - Fixed bug: When opening a second log having a previous one KLog did not ask for saving if needed. - New feature: Basic Setup dialog and functions. - New feature: Now the band combo change checks automatically the entity state. - New feature: Smart cluster tells you if a dx spot is needed, worked and/or confirmed using colors. - New feature: Clock is now in UTC by default but can be changed in preferences. 24-Jul-2003 - 0.2.3 - Improved the gui: The "entity state" LED has been moved to a always seen zone. - Improved the gui: The way to edit QSO. - Fixed bug: When searching it showed a wrong name and a qth. - New feature: Basic DX-Cluster support. - New feature: It is possible to add a log file to the current log. - New feature: QSO deletion. - New feature: QSO selection's data is shown in the show box. - New feature: You can delete qso & manage qsl from the list with righ button quickly & easily. 30-Jun-2003 - 0.2.2 - Changed the behavior of the search box to look not only for complete calls but characters. - Fixed bug: Improved the GUI layout. - Fixed bug: When editing a previous QSO the date was not always properly saved. - New feature: Added real time clock. 20-Mar-2003 - 0.2.0 - New feature: Added search for QSO tab. - New feature: Added Name field. - New feature: Added QTH field. - New feature: Added operator (self call) field. - Fixed bug: When saving log to file comment is not saved if there is no comment. - Fixed bug: When selecting a "portable" (/P) (or /number) qso in the list it didn't recognize the entity. - Translation updated: pt_BR. 13-Mar-2003 - 0.1-beta02 - Added many modes and some more bands. - New feature: Asking for saving when finishing without save. - New feature: Asking if overwrite when saving as to an existing file. - New feature: The main led only shows info about the current band. - New feature: Band/Mode sticky between contacts. - New feature: Added the long path beam and distance. - New feature: You can track each entity state per band with leds. - New feature: Basic WAZ award support. - Fixed bug: If you had a log and started a new one, the DXCC kept the data. - Fixed bug: The IOTA number was limited to 99 (now 999). 28-Feb-2003 - 0.1-beta - New feature: Led is green (new one), yellow (worked but not confirmed), red (confirmed). - New feature: Support calls as EA4TV/EA8, EA8/EA4TV. - New feature: Import TLF logs. - New feature: Added beam and distance calculations. - New feature: Added Locator & IOTA fields. - New feature: Basic DXCC award support. - Improved the search the Entity algorithm (much quick). - Clear button shows "Cancel" when modifying. - Changed many classes from Qt classes to KDE classes. - Fixed bug: Some times the QSL was checked automaticaly. - Fixed bug: The Mode combobox showed SBB and it is SSB. - Fixed bug: some calls showed as worked before and they were not. 29-Jan-2003 - 0.1-alpha - Fixed bug: When modifying a QSO it was not shown in the log box. - Fixed bug: If you clicked over the log box but not over a qso, the program crashed - Fixed bug: When modifying a QSO the date was always set to "now". - Now you can select what log file you want to open. - Now you can select the file's name when saving the log. - Now you can create a new log always you want. - Logs are now stored in ~/.klog directory by default. - Logs are saved as klog.adi by default. - Some prefix were not found in previous version. - QSL date is activated when a QSO is selected - QSL via is working, manager field, and QSL info field 22-Jan-2003 - 0.1-pre-alpha - First "release" of the software. - You can add/edit QSOs and save/read your log to/from the disk with a fixed name in ADIF format. - Can manage QSL sent/rec. klog-0.9.8.1/logwindow.cpp0000644000175000017500000004047013532572307014334 0ustar develdevel/*************************************************************************** logwindow.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "logwindow.h" LogWindow::LogWindow(DataProxy *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "LogWindow::LogWindow: " << endl; dataProxy = dp; logModel = new LogModel(dataProxy, this); connect(logModel, SIGNAL(queryError(QString, QString, int, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, int, QString)) ); logView = new QTableView; //dxccStatusWidget = new DXCCStatusWidget(dataProxy); elogClublog = new eLogClubLog(); currentLog = -1; awards = new Awards(dataProxy, Q_FUNC_INFO); createUI(); createActions(); setDefaultData(); //qDebug() << "LogWindow::LogWindow: - END" << endl; } LogWindow::~LogWindow() { // emit clearError(); } void LogWindow::clear() { //qDebug() << "LogWindow::clear " << endl; } void LogWindow::createUI() { //qDebug() << "LogWindow::createUI" << endl; logView->setContextMenuPolicy(Qt::CustomContextMenu); logView->setSortingEnabled(true); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(logView); setLayout(layout); } void LogWindow::setDefaultData() { //qDebug() << "LogWindow::setDefaultData" << endl; } void LogWindow::createlogPanel(const int _currentLog) { //qDebug() << "LogWindow::createlogPanel: " << QString::number(_currentLog) << endl; currentLog = _currentLog; logModel->createlogModel(currentLog); logView->setModel(logModel); logView->setCurrentIndex(logModel->index(0, 0)); QString contestMode = dataProxy->getLogTypeOfUserLog(currentLog); if (contestMode == "DX") { //qDebug() << "LogWindow::createlogPanel: DX" << endl; setColumnsToDX(); } else if (contestMode == "CQ-WW-SSB") { //qDebug() << "LogWindow::createlogPanel: CQ-WW-SSB" << endl; } else { // THIS POINT SHOULD NOT BE REACHED. It means that there is a kind of contest not supported. // Maybe the way should be to move ALL the actions from DX here. //qDebug() << "LogWindow::createlogPanel: No log type found!" << endl; } logView->setItemDelegate(new QSqlRelationalDelegate(this)); logView->setSelectionMode( QAbstractItemView::SingleSelection); logView->setSelectionBehavior(QAbstractItemView::SelectRows); logView->resizeColumnsToContents(); logView->horizontalHeader()->setStretchLastSection(true); } void LogWindow::setColumnsToDX() { //qDebug() << "LogWindow::setColumnsToDX" << endl; QString stringQuery; stringQuery = QString("SELECT * FROM log LIMIT 1"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } QSqlRecord rec; rec = query.record(); // Number of columns int columns = rec.count(); for (int i=0; i < columns; i++) { logView->setColumnHidden(i, true); } columns = rec.indexOf("qso_date"); logView->setColumnHidden(columns, false); columns = rec.indexOf("time_on"); logView->setColumnHidden(columns, false); columns = rec.indexOf("call"); logView->setColumnHidden(columns, false); columns = rec.indexOf("rst_sent"); logView->setColumnHidden(columns, false); columns = rec.indexOf("rst_rcvd"); logView->setColumnHidden(columns, false); columns = rec.indexOf("bandid"); logView->setColumnHidden(columns, false); columns = rec.indexOf("modeid"); logView->setColumnHidden(columns, false); columns = rec.indexOf("comment"); logView->setColumnHidden(columns, false); } void LogWindow::refresh() { //qDebug() << "LogWindow::refresh" << endl; logModel->select(); } void LogWindow::createActions() { createActionsCommon(); } void LogWindow::createActionsCommon() { //LOG VIEW connect(logView, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRighButtonFromLog( const QPoint& ) ) ); connect(logView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickLog( const QModelIndex& ) ) ); } void LogWindow::slotRighButtonFromLog(const QPoint& pos) { //qDebug() << "LogWindow::slotshowRighButtonFromLog" << endl; int row = (logView->indexAt(pos)).row(); showMenuRightButtonFromLogCreateActions(); righButtonFromLogMenu(row); //TODO: To be added to the logWindow and create an action that emist the QSO id } void LogWindow::righButtonFromLogMenu(const int trow) { //qDebug() << "LogWindow::slotshowRighButtonFromLogMenu: " << QString::number(trow) << endl; int _qsoID = ((logModel->index(trow, 0)).data(0)).toInt(); //qDebug() << "LogWindow::slotshowRighButtonFromLogMenu: QSOid: " << QString::number(_qsoID) << endl; bool qslReceived = isQSLReceived(_qsoID); bool qslSent = isQSLSent(_qsoID); QMenu menu(this); menu.addAction(delQSOFromLogAct); delQSOFromLogAct->setData(trow); menu.addAction(qsoToEditFromLogAct); qsoToEditFromLogAct->setData(trow); QString contestMode = dataProxy->getLogTypeOfUserLog(currentLog); if (contestMode == "DX") { menu.addSeparator(); if (qslSent) { } else { QMenu *menuSentQsl = menu.addMenu(tr("QSL Send")); menuSentQsl->addAction(qslSentViaBureauFromLogAct); menuSentQsl->addAction(qslSentViaDirectFromLogAct); qslSentViaBureauFromLogAct->setData(trow); qslSentViaDirectFromLogAct->setData(trow); } if (qslReceived) { } else { QMenu *menuRecQsl = menu.addMenu(tr("QSL Rcvd")); menuRecQsl->addAction(qslRecViaBureauFromLogAct); menuRecQsl->addAction(qslRecViaDirectFromLogAct); qslRecViaBureauFromLogAct->setData(trow); qslRecViaDirectFromLogAct->setData(trow); } } else if (contestMode == "CQ-WW-SSB") { } else { // THIS POINT SHOULD NOT BE REACHED. It means that there is a kind of contest not supported. // Maybe the way should be to move ALL the actions from DX here. } menu.exec(QCursor::pos()); } void LogWindow::slotDoubleClickLog(const QModelIndex & index) { //qDebug() << "LogWindow::slotDoubleClickLog: Row: " << QString::number(index.row()) << "Column: " << QString::number(index.column()) << endl; int row = index.row(); //qsoToEdit((logModel->index(row, 0)).data(0).toInt()); int qsoID = ((logModel->index(row, Qt::DisplayRole)).data(0)).toInt(); //qDebug() << "LogWindow::slotDoubleClickLog: n: " << QString::number (logModel->data(index, Qt::DisplayRole).toInt()) << endl; //qDebug() << "LogWindow::slotDoubleClickLog: emitted: " << QString::number (((logModel->index(row, Qt::DisplayRole)).data(0)).toInt()) << endl; emit actionQSODoubleClicked(qsoID); //qsoToEdit((logModel->index(row, 0)).data(0).toInt()); //TODO: To be added to the logWindow and create an action that emist the QSO id to be edited logModel->select(); } bool LogWindow::isQSLReceived(const int _qsoId) { //qDebug() << "LogWindow::isQSLReceived: " << QString::number(_qsoId) << endl; return dataProxy->isQSLReceived(_qsoId); } bool LogWindow::isQSLSent(const int _qsoId) { //qDebug() << "LogWindow::isQSLSent: " << QString::number(_qsoId) << endl; return dataProxy->isQSLSent(_qsoId); } void LogWindow::showMenuRightButtonFromLogCreateActions() { //qDebug() << "LogWindow::showMenuRightButtonFromLogCreateActions" << endl; delQSOFromLogAct = new QAction(tr("&Delete"), this); delQSOFromLogAct->setShortcut(Qt::CTRL + Qt::Key_D); delQSOFromLogAct->setStatusTip(tr("Delete a QSO")); connect(delQSOFromLogAct, SIGNAL(triggered()), this, SLOT(slotQsoDeleteFromLog())); qsoToEditFromLogAct = new QAction(tr("&Edit QSO"), this); qsoToEditFromLogAct->setShortcut(Qt::CTRL + Qt::Key_E); qsoToEditFromLogAct->setStatusTip(tr("Edit this QSO")); connect(qsoToEditFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOToEditFromLog())); qslSentViaBureauFromLogAct = new QAction(tr("Via &bureau"), this); qslSentViaBureauFromLogAct->setShortcut(Qt::CTRL + Qt::Key_B); qslSentViaBureauFromLogAct->setStatusTip(tr("Send this QSL via bureau")); connect(qslSentViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaBureauFromLog() )); qslSentViaDirectFromLogAct = new QAction(tr("D&irect"), this); qslSentViaDirectFromLogAct->setShortcut(Qt::CTRL + Qt::Key_I); qslSentViaDirectFromLogAct->setStatusTip(tr("Send this QSL via direct")); connect(qslSentViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaDirectFromLog() )); qslRecViaBureauFromLogAct = new QAction(tr("Via bureau"), this); qslRecViaBureauFromLogAct->setShortcut(Qt::CTRL + Qt::Key_R); qslRecViaBureauFromLogAct->setStatusTip(tr("QSL &received via bureau")); connect(qslRecViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaBureauFromLog() )); qslRecViaDirectFromLogAct = new QAction(tr("Direct"), this); qslRecViaDirectFromLogAct->setShortcut(Qt::CTRL + Qt::Key_T); qslRecViaDirectFromLogAct->setStatusTip(tr("QSL received via direc&t")); connect(qslRecViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaDirectFromLog() )); } void LogWindow::slotQSLSentViaBureauFromLog() { //qDebug() << "LogWindow::slotQSLSentViaBureauFromLog: " << (qslSentViaBureauFromLogAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ) << endl; int _qsoId = ((logModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslSentViaBureau(_qsoId); } void LogWindow::slotQSLSentViaDirectFromLog() { //qDebug() << "LogWindow::slotQSLSentViaDirectFromLog: " << (qslSentViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslSentViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ) << endl; int _qsoId = ((logModel->index( ( (qslSentViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); dataProxy->qslSentViaDirect(_qsoId, (QDateTime::currentDateTime()).toString("yyyy/MM/dd")); } void LogWindow::slotQSLRecViaBureauFromLog() { //qDebug() << "LogWindow::slotQSLRecViaBureauFromLog: " << endl; int _qsoId = ((logModel->index( ( (qslRecViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslRecViaBureau(_qsoId); //TODO: To be added to the logWindow and create an action that emist the QSO id } void LogWindow::slotQSLRecViaDirectFromLog() { //qDebug() << "LogWindow::slotQSLRecViaDirectFromLog: " << (qslRecViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ) << endl; int _qsoId = ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslRecViaDirect(_qsoId); // Mark Sent, Bureau, date, update log. //TODO: To be added to the logWindow and create an action that emist the QSO id } void LogWindow::slotQSOToEditFromLog() { //qDebug() << "slotQSOToEditFromLog: " << (qsoToEditFromLogAct->data()).toString() << endl; //qsoToEdit((logModel->index((qsoToEditFromLogAct->data()).toInt(), 0)).data(0).toInt()); int QSOid = ((logModel->index((qsoToEditFromLogAct->data()).toInt(), 0)).data(0)).toInt(); //int row = index.row(); //qsoToEdit((logModel->index(row, 0)).data(0).toInt()); emit actionQSODoubleClicked(QSOid); //TODO: To be added to the logWindow and create an action that emist the QSO id } void LogWindow::deleteQSO(const int _qsoID) { //qDebug() << "LogWindow::deleteQSO: " << QString::number(_qsoID) << endl; elogClublog->deleteQSO(dataProxy->getClubLogRealTimeFromId(_qsoID)); dataProxy->deleteQSO(_qsoID); //logModel->removeRow((delQSOFromLogAct->data()).toInt()); //TODO: This has been replaced by the previous line awards->recalculateAwards(); refresh(); //dxccStatusWidget->refresh(); emit updateAwards(); emit updateSearchText(); } void LogWindow::slotQsoDeleteFromLog() { //qDebug() << "LogWindow::slotQsoDeleteFromLog: " << (delQSOFromLogAct->data()).toString() << endl; //TODO: To be added to the logWindow and create an action that emist the QSO id QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You have requested to delete this QSO.")); msgBox.setInformativeText(tr("Are you sure?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); int QSOid = ((logModel->index((delQSOFromLogAct->data()).toInt(), 0)).data(0)).toInt(); //qDebug() << "LogWindow::slotQsoDeleteFromLog (id): " << QString::number(QSOid) << endl; switch (ret) { case QMessageBox::Yes: //qDebug() << "LogWindow::slotQsoDeleteFromLog (id): -1" << endl; deleteQSO(QSOid); break; case QMessageBox::No: // No was clicked break; default: // should never be reached break; } } void LogWindow::qslSentViaBureau(const int _qsoId) { //qDebug() << "LogWindow::qslSentViaBureau: " << QString::number(_qsoId) << endl; dataProxy->qslSentViaBureau(_qsoId, (QDateTime::currentDateTime()).toString("yyyy/MM/dd")); } void LogWindow::qslRecViaBureau(const int _qsoId) { // //qDebug() << "LogWindow::qslRecViaBureau: " << QString::number(_qsoId) << "/" << (dateTime->currentDateTime()).toString("yyyy/MM/dd") << endl; dataProxy->qslRecViaBureau(_qsoId, (QDateTime::currentDateTime()).toString("yyyy/MM/dd"), false); awards->setAwards(_qsoId); //Update the Award status refresh(); emit updateAwards(); } void LogWindow::qslRecViaDirect(const int _qsoId) { //qDebug() << "LogWindow::qslRecViaDirect: " << QString::number(_qsoId) << endl; dataProxy->qslRecViaDirect(_qsoId, (QDateTime::currentDateTime()).toString("yyyy/MM/dd"), false); awards->setAwards(_qsoId); refresh(); emit updateAwards(); } void LogWindow::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery) { emit queryError(functionFailed, errorCodeS, errorCodeN, failedQuery); } klog-0.9.8.1/mainwindowinputothers.h0000644000175000017500000000632613532572307016453 0ustar develdevel#ifndef MAINWINDOWINPUTOTHERS_H #define MAINWINDOWINPUTOTHERS_H /*************************************************************************** mainwindowminputothers.h - description ------------------- begin : ago 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the Others tab // #include #include #include "dataproxy.h" class MainWindowInputOthers : public QWidget { Q_OBJECT public: MainWindowInputOthers(DataProxy *dp, QWidget *parent = 0); ~MainWindowInputOthers(); void setEntitiesList(const QStringList _qs); void setEntity(const int _n); QString getEntityPrefix(); void setPropMode(const QString _qs); QString getPropModeFromComboBox(); void setIOTA(const QString _qs, const bool _black=true); QString getIOTA(); void setIOTAContinentFromEntity(const int _n); void setIOTAContinent(const QString _qs); bool isIOTAModified(); void clearIOTA(); void createUI(); void clear(); private slots: //void slotSetPropMode(const QString _p); // To receive the signal from the SAT widget and set "SAT" propagation mode, of needed. private: QString checkIfValidIOTA(const QString _tiota); //TODO: There is an equivalent function in the Awards class. I should use only one! DataProxy *dataProxy; QStringList entitiesList, propModeList; //QLabel *entityPrimLabel, *entitySecLabel, *iotaAwardLabel, *entityNameLabel, *propModeLabel; QComboBox *iotaContinentComboBox, *entityPrimDivComboBox, *entitySecDivComboBox, *entityNameComboBox, *propModeComboBox; QLineEdit *iotaNumberLineEdit; QPalette palRed, palBlack; }; #endif // MAINWINDOWINPUTOTHERS_H klog-0.9.8.1/setuppagelogs.cpp0000644000175000017500000005467113532572307015215 0ustar develdevel/*************************************************************************** setuppagelogs.cpp - description ------------------- begin : feb 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppagelogs.h" SetupPageLogs::SetupPageLogs(DataProxy *dp, QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageLogs::SetupPageLogs" << endl; dataProxy = dp; stationCallsign = QString(); operators = QString(); comment = QString(); //dateString = QDate::currentDate().toString("yyyy/MM/dd"); dateString = QString(); typeContest = QString(); contestCatMode = -1; contestCatOperators = -1; contestCatAssisted = -1; contestCatPower = -1; contestCatBands = -1; contestBands = -1; typeContestN = -1; selectedLog = -1; defaultStationCallSign.clear(); //setupD = new SetupDialog(); currentLogs = new QComboBox(); logsAvailable.clear(); newLog = new SetupPageLogsNew(dataProxy); logsModel = new QSqlRelationalTableModel(this); logsView = new QTableView; logsView->setContextMenuPolicy(Qt::CustomContextMenu); logsView->setSortingEnabled(true); createLogsModel(); createLogsPanel(); logsView->setCurrentIndex(logsModel->index(0, 0)); lastLog = 0; newLogPushButton = new QPushButton(tr("&New"), this); editPushButton = new QPushButton(tr("&Edit"), this); removePushButton = new QPushButton(tr("&Remove"), this); newLogPushButton->setToolTip(tr("Add a new log.")); //loadAllPushButton->setToolTip(tr("Load all the logs")); //loadSelectedPushButton->setToolTip(tr("Load only the selected log")); //clearPushButton->setToolTip(tr("Clear selection")); editPushButton->setToolTip(tr("Edit the selected log.")); removePushButton->setToolTip(tr("Remove the selected log.")); currentLogs->setToolTip(tr("Select the log you want to open.")); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(newLogPushButton); buttonsLayout->addWidget(editPushButton); buttonsLayout->addWidget(removePushButton); QVBoxLayout *widgetLayout = new QVBoxLayout; widgetLayout->addWidget(logsView); widgetLayout->addWidget(currentLogs); widgetLayout->addLayout(buttonsLayout); //widgetLayout->addLayout(logDataLayout); setLayout(widgetLayout); //connect(newLogPushButton, SIGNAL(clicked ( )), this, SLOT(slotNewButtonClicked() ) ); //QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(slotDownloadFinished(QNetworkReply*))); //connect(setupD, SIGNAL(newLogRequested(true)), this, slotNewButtonClicked() ) createActions(); updateSelectedLogs(); //qDebug() << "SetupPageLogs::SetupPageLogs - END" << endl; } SetupPageLogs::~SetupPageLogs(){ //qDebug() << "SetupPageLogs::~SetupPageLogs" << endl; } void SetupPageLogs::createNewLog() { //qDebug() << "SetupPageLogs::createNewLog" << endl; selectedLog = -1; //newLog->clear(); newLog->setEditing(false); if (defaultStationCallSign.length()>2) { newLog->setStationCallSign(defaultStationCallSign); } if (defaultOperators.length()>2) { newLog->setOperators(defaultOperators); } newLog->setDateString(QDate::currentDate().toString("yyyy/MM/dd")); newLog->setComment(""); newLog->exec(); } void SetupPageLogs::slotNewButtonClicked() { //qDebug() << "SetupPageLogs::slotNewButtonClicked" << endl; createNewLog(); } void SetupPageLogs::slotEditButtonClicked() { //qDebug() << "SetupPageLogs::slotEditButtonClicked" << endl; //QSqlQuery query; //int nameCol = -1; selectedLog = getSelectedLog(); QString getStationCallSignFromLog(const int _log); newLog->setEditing(true); newLog->setStationCallSign(dataProxy->getStationCallSignFromLog(selectedLog)); newLog->setOperators(dataProxy->getOperatorsFromLog(selectedLog)); newLog->setComment(dataProxy->getCommentsFromLog(selectedLog)); newLog->setDateString(dataProxy->getLogDateFromLog(selectedLog)); newLog->setTypeN(dataProxy->getLogTypeNFromLog(selectedLog).toInt()); /* //qDebug() << "SetupPageLogs::slotEditButtonClicked-1 (selectedlog: " << QString::number(selectedLog) << ")" << endl; QString stringQuery = QString("SELECT * FROM logs WHERE id='%1'").arg(selectedLog); //qDebug() << "SetupPageLogs::slotEditButtonClicked -2" << endl; bool sqlOk = query.exec(stringQuery); QSqlRecord rec = query.record(); if (sqlOk) { //qDebug() << "SetupPageLogs::slotEditButtonClicked Query OK" << endl; QSqlRecord rec = query.record(); if ( (query.next()) && (query.isValid()) ) {//id/logdate/stationcall/comment/logtype/logtypeid //qDebug() << "SetupPageLogs::slotEditButtonClicked Query Valid" << endl; //nameCol = rec.indexOf("stationcall"); //newLog->setStationCallSign((query.value(nameCol)).toString()); //nameCol = rec.indexOf("operators"); //newLog->setOperators((query.value(nameCol)).toString()); //nameCol = rec.indexOf("comment"); //newLog->setComment((query.value(nameCol)).toString()); //nameCol = rec.indexOf("logdate"); //newLog->setDateString((query.value(nameCol)).toString()); //nameCol = rec.indexOf("logtypen"); //qDebug() << "SetupPageLogs::slotEditButtonClicked -3" << endl; //newLog->setTypeN((query.value(nameCol)).toInt()); newLog->exec(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } */ } void SetupPageLogs::slotLogsCancelled(const bool _q) { selectedLog = -1; } void SetupPageLogs::slotRemoveButtonClicked() { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked" << endl; int selectedLog = getSelectedLog(); QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("KLog"), tr("Do you really want to remove this log?") + "\n" + tr("All the QSOs from this log will be also deleted..."), QMessageBox::Yes | QMessageBox::No); if (ret == QMessageBox::Yes) { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (selected log to remove: " << QString::number(selectedLog) << ")" << endl; QString stringQuery = QString("DELETE FROM logs WHERE id='%1'").arg(selectedLog); QSqlQuery query(stringQuery); bool sqlOk = query.exec(); if (sqlOk) { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (REMOVED: " << QString::number(selectedLog) << ")" << endl; logsModel->select(); updateSelectedLogs(); stringQuery = QString("DELETE FROM log WHERE lognumber='%1'").arg(selectedLog); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() << endl; if (sqlOk) { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (QSOS REMOVED: " << QString::number(selectedLog) << ")" << endl; stringQuery = QString("DELETE FROM awarddxcc WHERE lognumber='%2'").arg(selectedLog); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() << endl; if (sqlOk) { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (AWARDDXCC REMOVED: " << QString::number(selectedLog) << ")" << endl; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); showError(tr("Log has not been removed. (#3)")); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (AWARDDXCC NOT REMOVED: " << QString::number(selectedLog) << ")" << endl; } } else { showError(tr("Log has not been removed. (#2)")); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (QSOS NOT REMOVED: " << QString::number(selectedLog) << ")" << endl; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); showError(tr("Log has not been removed. (#1)")); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (NOT REMOVED: " << QString::number(selectedLog) << ")" << endl; } } //ASK FOR A CONFIRMATION //DELETE ALL THE QSO IN THE REMOVED LOG } void SetupPageLogs::createLogsPanel() { //qDebug() << "SetupPageLogs::createLogsPanel" << endl; logsView->setModel(logsModel); QString stringQuery = QString("SELECT * FROM logs"); QSqlQuery query(stringQuery); QSqlRecord rec = query.record(); // Number of columns int columns = rec.count(); for (int i = 0; i < columns; i++ ){ logsView->setColumnHidden(i, true); } columns = rec.indexOf("id"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("logdate"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("stationcall"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("operators"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("comment"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("logtype"); logsView->setColumnHidden(columns, false); logsView->setItemDelegate(new QSqlRelationalDelegate(this)); logsView->setSelectionMode( QAbstractItemView::SingleSelection); logsView->setSelectionBehavior(QAbstractItemView::SelectRows); logsView->resizeColumnsToContents(); logsView->horizontalHeader()->setStretchLastSection(true); } void SetupPageLogs::createLogsModel() { //qDebug() << "SetupPageLogs::createLogsModel" << endl; QString stringQuery = QString("SELECT * FROM logs"); QSqlQuery q(stringQuery); QSqlRecord rec = q.record(); int nameCol; //logsModel = new QSqlRelationalTableModel(this); logsModel->setTable("logs"); nameCol = rec.indexOf("id"); logsModel->setSort(nameCol, Qt::AscendingOrder); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("ID")); nameCol = rec.indexOf("logdate"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Date")); nameCol = rec.indexOf("stationcall"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Station Callsign")); nameCol = rec.indexOf("operators"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Operators")); nameCol = rec.indexOf("comment"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Comments")); nameCol = rec.indexOf("logtype"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Type")); logsModel->select(); } void SetupPageLogs::slotLogSelected(const QModelIndex & index) { //qDebug() << "SetupPageLogs::slotLogSelected" << endl; int row = index.row(); setSelectedLog((logsModel->index(row, 0)).data(0).toInt()); } void SetupPageLogs::slotLogDoubleClicked(const QModelIndex & index) { //qDebug() << "SetupPageLogs::slotLogDoubleClicked" << endl; int row = index.row(); setSelectedLog((logsModel->index(row, 0)).data(0).toInt()); slotEditButtonClicked(); } void SetupPageLogs::createActions() { //qDebug() << "SetupPageLogs::createActions" << endl; connect(newLogPushButton, SIGNAL(clicked ( )), this, SLOT(slotNewButtonClicked() ) ); connect(removePushButton, SIGNAL(clicked ( )), this, SLOT(slotRemoveButtonClicked() ) ); connect(editPushButton, SIGNAL(clicked ( )), this, SLOT(slotEditButtonClicked() ) ); connect(newLog, SIGNAL(newLogData(QStringList)), this, SLOT(slotAnalyzeNewLogData(QStringList) ) ); connect(logsView, SIGNAL(clicked(QModelIndex)), this, SLOT(slotLogSelected(QModelIndex) ) ); connect(logsView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotLogDoubleClicked(QModelIndex) ) ); //connect(logView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickLog( const QModelIndex& ) ) ); //loadAllPushButton->setToolTip(tr("Load all the logs")); //loadSelectedPushButton->setToolTip(tr("Load only the selected log")); //clearPushButton->setToolTip(tr("Clear selection")); } QStringList SetupPageLogs::readLogs() { //qDebug() << "SetupPageLogs::readLogs" << endl; QString aux, aux2; QStringList _logs; QSqlQuery query; int nameCol = -1; bool sqlOk = false; //QDate date = QDate::currentDate(); aux2.clear(); aux.clear(); _logs.clear(); aux = "SELECT id, logdate, stationcall, logtype FROM logs"; sqlOk = query.exec(aux); if (sqlOk) { QSqlRecord rec = query.record(); while ( (query.next()) && (query.isValid()) ) { aux2.clear(); nameCol = rec.indexOf("id"); aux2 = (query.value(nameCol)).toString(); nameCol = rec.indexOf("stationcall"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("logtype"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("logdate"); aux2 = aux2.append(" ("); aux2.append((query.value(nameCol)).toString()); aux2 = aux2.append(")"); _logs.append(aux2); } return _logs; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); return _logs; } _logs.clear(); //qDebug() << "SetupPageLogs::readLogs: " << QString::number(_logs.size())<< endl; return _logs; } void SetupPageLogs::slotAnalyzeNewLogData(const QStringList _qs) { //qDebug() << "SetupPageLogs::slotAnalyzeNewLogData (length=" << QString::number(_qs.length()) << ")" << endl; if (_qs.length()!=14) { return; } /* From SetupPageLogsNew::gatherAndSend() logData.clear(); logData << stationCallsign << operators << comment << dateString << typeConteststr << QString::number(contestCatMode) << QString::number(contestCatOperators) << QString::number(contestCatAssisted) << QString::number(contestCatPower) << QString::number(contestCatBands) << QString::number(contestBands) << QString::number(contestCatOverlay) << QString::number(typeContest); << editing (1/0) */ stationCallsign = _qs.at(0); operators = _qs.at(1); comment = _qs.at(2); dateString = _qs.at(3); typeContest = _qs.at(4); /* contestCatMode = (_qs.at(5)).toInt(); contestCatOperators = (_qs.at(6)).toInt(); contestCatAssisted = (_qs.at(7)).toInt(); contestCatPower = (_qs.at(8)).toInt(); contestCatBands = (_qs.at(9)).toInt(); contestBands = (_qs.at(10)).toInt(); typeContestN = (_qs.at(12)).toInt(); */ /* bool editing; if ( (_qs.at(13)).toInt() == 1) { editing = true; } else { editing = false; } */ //OVERLAY = 11 /* QString _dateString = _qs.at(0); QString _stationCallsign = _qs.at(1); QString _operators = _qs.at(2); QString _typeContest = _qs.at(3); QString _comment = _qs.at(4); QString _typeContestN = _qs.at(5); QString id = _qs.at(6); QString editing = _qs.at(7); */ QStringList newLogq; newLogq.clear(); //If qs.at(12) == 1 then we are editing, any other value is a new log //Date/Call/Operators/"DX"/comment/"1" newLogq << dateString << stationCallsign << operators << typeContest << comment << "1" << QString::number(selectedLog) << _qs.at(13) ; if (dataProxy->addNewLog(newLogq)) { logsModel->select(); updateSelectedLogs(); } // We send the data to the main tab QStringList logData; logData.clear(); logData << stationCallsign << operators ; emit newLogData(logData); } /* bool SetupPageLogs::addNewLog(const QStringList _qs) { //qDebug() << "SetupPageLogs::addNewLog: " << _qs.at(2) << endl; QString aux = QString(); int nameCol = -1; QString _dateString = _qs.at(0); QString _stationCallsign = _qs.at(1); QString _typeContest = _qs.at(2); QString _comment = _qs.at(3); QString _typeContestN = _qs.at(4); QString queryString = QString("SELECT * FROM logs WHERE logdate='%1' AND stationcall='%2' AND logtype='%3' AND logtypen='%4'").arg(_dateString).arg(_stationCallsign).arg(_typeContest).arg(_typeContestN); //"logs" //"id, logdate, stationcall, comment, logtype" //qDebug() << "SetupPageLogs::addNewLog query1: " << queryString << endl; QSqlQuery query; bool sqlOK = query.exec(queryString); QSqlRecord rec = query.record(); // Number of columns while ( (query.next()) && (query.isValid()) ) { nameCol = rec.indexOf("id"); aux = (query.value(nameCol)).toString(); //qDebug() << "SetupPageLogs::addNewLog: id = " << aux << endl; return false; } queryString = QString("INSERT INTO logs (logdate, stationcall, comment, logtype, logtypen) values('%1','%2','%3','%4', '%5')").arg(_dateString).arg(_stationCallsign).arg(_comment).arg(_typeContest).arg(_typeContestN); //qDebug() << "SetupPageLogs::addNewLog query1: " << queryString << endl; sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "SetupPageLogs::addNewLog ADDED! id = " << endl; logsModel->select(); updateSelectedLogs(); return true; } else { return false; } return false; } */ void SetupPageLogs::updateSelectedLogs() { //qDebug() << "SetupPageLogs::updateSelectedLogs" << endl; logsAvailable = readLogs(); if (logsAvailable.length()>0) { currentLogs->clear(); currentLogs->addItems(logsAvailable); } else { //qDebug() << "SetupPageLogs::updateSelectedLogs Not selected (less than 1)" << endl; currentLogs->clear(); } } int SetupPageLogs::getSelectedLog() { //qDebug() << "SetupPageLogs::getSelectedLog: " << currentLogs->currentText() << endl; QString selectedLog = currentLogs->currentText(); int i = 0; QStringList qs; qs.clear(); qs << selectedLog.split("-"); i = (qs.at(0)).toInt(); if (i>=1) { return i; } else { return 0; } return 0; } void SetupPageLogs::setSelectedLog(const int _i) { //qDebug() << "SetupPageLogs::SetupPageLogs::setSelectedLog: " << QString::number(_i) << endl; QString n = QString::number(_i) + "--"; int selected = currentLogs->findText(n, Qt::MatchStartsWith); if (selected >= 0) { //qDebug() << "SetupPageLogs::SetupPageLogs::setSelectedLog selected>0: " << QString::number(selected) << endl; currentLogs->setCurrentIndex(selected); } else { //qDebug() << "SetupPageLogs::SetupPageLogs::setSelectedLog not selcted" << endl; return; } } void SetupPageLogs::readSelectedLog(const int _i) { /* stationCallsign = _qs.at(0); operators = _qs.at(1); comment = _qs.at(2); dateString = _qs.at(3); typeContest = _qs.at(4); contestCatMode = (_qs.at(5)).toInt(); contestCatOperators = (_qs.at(6)).toInt(); contestCatAssisted = (_qs.at(7)).toInt(); contestCatPower = (_qs.at(8)).toInt(); contestCatBands = (_qs.at(9)).toInt(); contestBands = (_qs.at(10)).toInt(); */ } void SetupPageLogs::showError(const QString _errorC) { QString text = QString(tr("An error has occurred showing the following error code:") + "\n'%1'").arg(_errorC); QMessageBox::warning(this, tr("KLog - SetupPageLogs"), text, QMessageBox::Ok); } void SetupPageLogs::setDefaultStationCallsign(const QString _p) { //qDebug() << "SetupPageLogs::setDefaultStationCallsign: " << _p << endl; defaultStationCallSign = _p; } void SetupPageLogs::setDefaultOperators(const QString _p) { //qDebug() << "SetupPageLogs::setDefaultOperators: " << _p << endl; defaultOperators = _p; } klog-0.9.8.1/utilities.cpp0000644000175000017500000004224613532572307014341 0ustar develdevel#include "utilities.h" Utilities::Utilities() { //qDebug() << "Utilities::Utilities" << endl; //dbPath = getKLogDBFile(); softwareVersion = "0.0"; //qDebug() << "Utilities::Utilities - END" << endl; } Utilities::~Utilities() { } void Utilities::setVersion(const QString _v) { //qDebug() << "Utilities::setVersion: " << _v << endl; softwareVersion = _v; } QString Utilities::getVersion() { return softwareVersion; } double Utilities::getVersionDouble() { //qDebug() << "Utilities::getVersionDouble: " << softwareVersion << endl; if (softwareVersion.count('.')>1) { QString first = softwareVersion.section('.', 0, 0); int pos = softwareVersion.indexOf('.'); QString decimals = softwareVersion.section('.', pos, -1); decimals.remove('.'); first = first + "." + decimals; //qDebug() << "Utilities::getVersionDouble - returning: " << first << endl; return first.toDouble(); } //qDebug() << "Utilities::getVersionDouble: no points detected" << endl; return softwareVersion.toDouble(); } int Utilities::getProgresStepForDialog(int totalSteps) { //qDebug() << "Utilities::getProgresStepForDialog"; if (totalSteps <=100) return 1; else if (totalSteps <=1000) return 5; else if (totalSteps <=4000) return 10; else if (totalSteps <=5000) return 15; else if (totalSteps <=7000) return 20; else if (totalSteps <=9999) return 25; else return 50; } bool Utilities::trueOrFalse(const QString _s) {// reads a String and return true if s.upper()== TRUE :-) //qDebug() << "Utilities::trueOrFalse: " << _s << endl; if ( (_s.toUpper()) == "TRUE") { return true; } else { return false; } //return false; } QString Utilities::checkAndFixASCIIinADIF(const QString _data) { //qDebug() << "SetupDialog::checkAndFixASCIIinADIF " << _data << endl; // This function is not really working with ASCII but with Unicode //TODO: this function is also in the FileManager class. Maybe I should call that one and keep just one copy ushort unicodeVal; QString st = _data; QString newString; newString.clear(); for(int i=0; i < st.length(); i++) { // Get unicode VALUE into unicodeVal unicodeVal = (st.at(i)).unicode(); if ((20 <= unicodeVal ) && (unicodeVal <= 126)) { newString.append(st.at(i)); } //qDebug() << "SetupDialog::checkAndFixunicodeinADIF: " << st.at(i) <<" = " << QString::number(unicodeVal) << endl; } // Show into another lineEdit return newString; } void Utilities::printQString(const QStringList _qs) { //qDebug() << "Utilities::printQString: COMMENT THIS CALL BEFORE RELEASING" << endl; if (_qs.length()<1) { //qDebug() << "Utilities::printQString: EMPTY QStringList received!!" << endl; return; } for (int i=0; i<_qs.length()-1;i++) { //qDebug() << _qs.at(i) << "/" ; } //qDebug() << _qs.at(_qs.length()-1) << endl; } QString Utilities::getAgent(const QString _klogversion) { QString version; version = _klogversion; #if defined(Q_OS_WIN32) return "KLog-Win32-" + version; #elif defined(Q_OS_WIN64) return "KLog-Win64-" + version; #elif defined(Q_OS_LINUX) return "KLog-Linux-" + version; #elif defined(Q_OS_WIN) return "KLog-Win-"+ version; #elif defined(Q_OS_MACOS) return "KLog-macOS-" + version; #elif defined(Q_OS_OSX) return "KLog-OSX-" + version; #elif defined(Q_OS_MAC) return "KLog-MAC-" + version; #elif defined(Q_OS_AIX) return "KLog-aix-" + version; #elif defined(Q_OS_ANDROID) return "KLog-android-" + version; //#elif defined(Q_OS_BSD4) // return "KLog-bsd4-" + version; #elif defined(Q_OS_BSDI) return "KLog-bsdi-" + version; #elif defined(Q_OS_CYGWIN) return "KLog-cygwin-" + version; #elif defined(Q_OS_DARWIN) return "KLog-darwin-" + version; #elif defined(Q_OS_DGUX) return "KLog-dgux-" + version; #elif defined(Q_OS_DYNIX) return "KLog-dynix-" + version; #elif defined(Q_OS_FREEBSD) return "KLog-freebsd-" + version; #elif defined(Q_OS_HPUX) return "KLog-hpux-" + version; #elif defined(Q_OS_IOS) return "KLog-ios-" + version; #elif defined(Q_OS_IRIX) return "KLog-irix-" + version; #elif defined(Q_OS_LYNX) return "KLog-lynx-" + version; #elif defined(Q_OS_NETBSD) return "KLog-netbsd-" + version; #elif defined(Q_OS_OPENBSD) return "KLog-openbsd-" + version; #elif defined(Q_OS_OSF) return "KLog-osf-" + version; #elif defined(Q_OS_QNX) return "KLog-qnx-" + version; #elif defined(Q_OS_SCO) return "KLog-sco-" + version; #elif defined(Q_OS_SOLARIS) return "KLog-solaris-" + version; #elif defined(Q_OS_TVOS) return "KLog-tvos-" + version; #elif defined(Q_OS_UNIX) return "KLog-unix-" + version; #elif defined(Q_OS_UNIXWARE) return "KLog-unixware-" + version; #elif defined(Q_OS_WHATCHOS) return "KLog-whatchos-" + version; #elif defined(Q_OS_WINRT) return "KLog-winrt-" + version; #else return "KLog-Other-" + version; #endif //return "KLog-Unknown-" + version; } QString Utilities::getHomeDir() { //TODO: To be removed when the defaultDir is saved in the config file #ifdef Q_OS_WIN //qDebug() << "WINDOWS DETECTED!: " << QDir::homePath() + "/klog" << endl; return QDir::homePath()+"/klog"; // We create the \klog for the logs and data #else //qDebug() << "NO WINDOWS DETECTED!" << endl; return QDir::homePath()+"/.klog"; // We create the ~/.klog for the logs and data #endif } QString Utilities::getKLogDefaultDatabaseFile() { //TODO: To be removed when the defaultDir is saved in the config file return getHomeDir() ; } QString Utilities::getKLogDBFile() { //qDebug() << "Utilities::getKLogDBFile: start " << endl; dbPath = getKLogDefaultDatabaseFile(); QFile file(getCfgFile()); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){ //return dbPath; //return getKLogDatabaseFile(dbPath); } else { while (!file.atEnd()) { QByteArray line = file.readLine(); processConfigLine(line); } if (dbPath.length()<1) { dbPath = getKLogDefaultDatabaseFile(); } } //qDebug() << "Utilities::getKLogDBFile: path to use: " << dbPath << endl; return dbPath + "/logbook.dat"; } bool Utilities::processConfigLine(const QString _line) { //qDebug() << "Utilities::processConfigLine: " << _line << endl; QString line = _line.simplified(); //line.simplified(); //QString aux; QStringList values = line.split("=", QString::SkipEmptyParts); if (line.startsWith('#')){ //qDebug() << "Utilities::processConfigLine: notes Line!" << endl; return true; } if (!( (line.contains('=')) && (line.contains(';')))){ //qDebug() << "Utilities::processConfigLine: Wrong Line!" << endl; return false; } QString field = (values.at(0)).toUpper(); QString value = values.at(1); int endValue = value.indexOf(';'); if (endValue>-1){ value = value.left(value.length() - (value.length() - endValue)); } if (field == "DBPATH") { //qDebug() << "Utilities::processConfigLine: dbPATH found: " << value << endl; dbPath = value; } return true; } /* QString Utilities::getKLogDatabaseFile(const QString _file) { //qDebug() << "Utilities::getKLogDatabaseFile:" << _file << endl; if ( QFile::exists(_file + "/logbook.dat") ) { //qDebug() << "Utilities::getKLogDatabaseFile:returning: " << _file + "/logbook.dat" << endl; return _file + "/logbook.dat"; } else {} //qDebug() << "Utilities::getKLogDatabaseFile: Does not exist so default: " << getKLogDefaultDatabaseFile() << endl; return getKLogDefaultDatabaseFile(); } */ QString Utilities::getCfgFile() { //TODO: To be removed when the defaultDir is saved in the config file #ifdef Q_OS_WIN //qDebug() << "WINDOWS DETECTED!: " << getHomeDir() + "/klogrc.cfg" << endl; return getHomeDir() + "/klogrc.cfg"; #else //qDebug() << "NO WINDOWS DETECTED!: " << getHomeDir() + "/klogrc.cfg" << endl; return getHomeDir() + "/klogrc"; #endif } QString Utilities::getCTYFile() { return getHomeDir() + "/cty.csv"; } int Utilities::getNormalizedDXCCValue(const int _dxcc) { if (_dxcc >1000) { return ((QString::number(_dxcc)).right(3)).toInt(); } else { return _dxcc; } } QDate Utilities::getDefaultDate() { //return QDate::fromString("18000101", "yyyyMMdd"); return QDate::currentDate(); } bool Utilities::isValidDate(const QDate _d) { //qDebug() << "Utilities::isValidDate: " << _d.toString("yyyyMMdd") << endl; if (_d.isValid()) { if ( _d > QDate::fromString("18000101", "yyyyMMdd") ) { //qDebug() << "Utilities::isValidDate: OK" << endl; return true; } } //qDebug() << "Utilities::isValidDate: Error" << endl; return false; } bool Utilities::isValidDateTime(const QString _d) { //qDebug() << "Utilities::isValidDateTime: " << _d << endl; QDateTime _dateTime = QDateTime::fromString(_d, "yyyyMMddhhmmss"); if ( _dateTime.isValid() ) { //qDebug() << "Utilities::isValidDateTime: 1" << endl; return isValidDate(_dateTime.date()); } //qDebug() << "Utilities::isValidDateTime: Error" << endl; return false; } bool Utilities::isValidCall(const QString _c) { if (_c.length()<3) { return false; } return true; } bool Utilities::isValidTime(const QString _t) { QTime time = QTime::fromString(_t, "hhmmss"); if (time.isValid()) { return true; } time = QTime::fromString(_t, "hhmm"); if (time.isValid()) { return true; } time = QTime::fromString(_t, "hhmm"); if (time.isValid()) { return true; } return false; } bool Utilities::isValidBandId(const int _b) { if (_b>0) { return true; } else { return false; } //return false; } bool Utilities::isValidModeId(const int _m) { if (_m>0) { return true; } else { return false; } //return false; } bool Utilities::isValidFreq(const QString _b) { if (_b.toDouble()>0) { return true; } else { return false; } //return false; } bool Utilities::isValidGrid(const QString _b) { Locator locator; return locator.isValidLocator(_b); } bool Utilities::isValidRST(const QString _b) { if (_b.length()>0) { return true; } return false; } bool Utilities::isValidPower(const QString _b) { if (_b.toDouble()>0) { return true; } return false; } bool Utilities::isValidComment(const QString _b) { if (_b.length()>0) { return true; } return false; } bool Utilities::isValidName(const QString _b) { if (_b.length()>0) { return true; } return false; } bool Utilities::isDBFileExisting() { //qDebug() << "Utilities::isDBFileExisting: " << getKLogDBFile() << endl; if (QFile::exists(getKLogDBFile())) { //qDebug() << "Utilities::isDBFileExisting - true" << endl; return true; } else { //qDebug() << "Utilities::isDBFileExisting - false" << endl; return false; } //return false; } bool Utilities::isDBFileExisting(const QString _file) { //qDebug() << "Utilities::isDBFileExisting2: " << _file << endl; if (QFile::exists(_file)) { //qDebug() << "Utilities::isDBFileExisting2 - true" << endl; return true; } else { //qDebug() << "Utilities::isDBFileExisting2 - false" << endl; return false; } //return false; } bool Utilities::isValidADIFField(const QString _b) { //qDebug() << "Utilities::isValidADIFField: " << _b << endl; /* This functions checks if the ADIF field has the proper format. Data */ if (!((_b.startsWith('<')) && (_b.count('>')) == 1 )) { //qDebug() << "Utilities::isValidADIFField: BAD FORMAT: No < or > delimiters: " << _b << endl; return false; } if (_b.simplified() == "") { return true; } QStringList validDataTypes = {"B", "N", "D", "T", "S", "I", "M", "G", "E", "L"}; QStringList qs; qs.clear(); qs.append(_b.split('>')); if (qs.size()!= 2) { //qDebug() << "Utilities::isValidADIFField-0 (not two): " << QString::number(qs.size()) << endl; return false; } QString field = (qs.at(0)).right((qs.at(0)).length() - 1); QString data = (qs.at(1)).simplified(); //data = data.simplified(); QString dataType = QString(); //qDebug() << "Utilities::isValidADIFField-Field: " << field << endl; //qDebug() << "Utilities::isValidADIFField_Data: " << data << endl; int length = data.length(); int separatorPosition = 0; int i = (field).count(":"); //Check how many ":" do we have, to see if we have a data type or not if (i == 2) // We have data type { // DATE:8:D / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); dataType = field.section(':', 2, 2); if (!validDataTypes.contains(dataType.toUpper())) { //qDebug() << "Utilities::isValidADIFField - FORMAT ERROR: Wrong data type: " << dataType << endl; return false; } } else if (i == 1) { // DATE:8 / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); } else { //qDebug() << "Utilities::isValidADIFField - FORMAT ERROR, more than 2 \":\" - " << field << endl; return false; } if ( length != separatorPosition) { //qDebug() << "Utilities::isValidADIFField: Data Length problem: " << (field) << "/" << data << " - " << QString::number(length) << "/" << QString::number(separatorPosition) << endl; return false; } if (separatorPosition <= 0) { //qDebug() << "Utilities::isValidADIFField: Length problem <= 0" << endl; return false; } //qDebug() << "FileManager::checkADIFValidFormat: Return true" << endl; return true; } QStringList Utilities::getValidADIFFieldAndData(const QString _b) { //qDebug() << "Utilities::getValidADIFFieldAndData: " << _b << endl; /* This functions checks if the ADIF field has the proper format. Data */ QStringList result; result.clear(); if (!((_b.startsWith('<')) && (_b.count('>')) == 1 )) { //qDebug() << "Utilities::getValidADIFFieldAndData: BAD FORMAT: No < or > delimiters: " << _b << endl; return QStringList(); } if (_b.simplified() == "") { result << "EOR" << "EOR"; return result; } QStringList validDataTypes = {"B", "N", "D", "T", "S", "I", "M", "G", "E", "L"}; QStringList qs; qs.clear(); qs.append(_b.split('>')); if (qs.size()!= 2) { //qDebug() << "Utilities::getValidADIFFieldAndData-0 (not two): " << QString::number(qs.size()) << endl; return result; } //QString field = (qs.at(0)).right((qs.at(0)).length() - 1); QString field = (qs.at(0)).right((qs.at(0)).length() - 1); QString data = (qs.at(1)).simplified(); //data = data.simplified(); QString dataType = QString(); //qDebug() << "Utilities::getValidADIFFieldAndData-Field: " << field << endl; //qDebug() << "Utilities::getValidADIFFieldAndData_Data: " << data << endl; int length = data.length(); int separatorPosition = 0; int i = (field).count(":"); //Check how many ":" do we have, to see if we have a data type or not if (i == 2) // We have data type { // DATE:8:D / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); dataType = field.section(':', 2, 2); if (!validDataTypes.contains(dataType.toUpper())) { //qDebug() << "Utilities::getValidADIFFieldAndData - FORMAT ERROR: Wrong data type: " << dataType << endl; return result; } } else if (i == 1) { // DATE:8 / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); } else { //qDebug() << "Utilities::getValidADIFFieldAndData - FORMAT ERROR, more than 2 \":\" - " << field << endl; return result; } if ( length != separatorPosition) { //qDebug() << "Utilities::getValidADIFFieldAndData: Data Length problem: " << (field) << "/" << data << " - " << QString::number(length) << "/" << QString::number(separatorPosition) << endl; return result; } if (separatorPosition <= 0) { //qDebug() << "Utilities::getValidADIFFieldAndData: Length problem <= 0" << endl; return result; } //qDebug() << "FileManager::checkADIFValidFormat: Return true" << endl; field = field.section(':', 0, 0); result << field << data; return result; } klog-0.9.8.1/setuppageudp.h0000644000175000017500000000573113532572307014477 0ustar develdevel#ifndef SETUPPAGEUDP_H #define SETUPPAGEUDP_H /*************************************************************************** setuppageudp.h - description ------------------- begin : sept 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include class SetupPageUDP : public QWidget { Q_OBJECT public: SetupPageUDP(QWidget *parent = 0); ~SetupPageUDP(); void setLogFromWSJTx(const QString t); void setAutoLogFromWSJTx(const QString t); void setReaDataFromWSJTx(const QString t); void setUDPServer(const QString t); void setUDPServerPort(const QString t); void setTimeout(const QString t); QString getLogFromWSJTx(); QString getAutoLogFromWSJTx(); QString getReaDataFromWSJTx(); QString getUDPServerPort(); QString getUDPServer(); QString getTimeout(); private: void createUI(); void createActions(); QCheckBox *logFromWSJTXCheckbox, *logAutomaticallyWSJTXCheckbox, *realDataFromWSJTXCheckbox, *UDPServerCheckBox; //QLineEdit *wsjtxIPAddress, *wsjtxPortNumber; QSpinBox *UDPServerPortSpinBox; QSpinBox *miliSecsSpinBox; int defaultport, defaultTimer; //bool logFromWSJTx, autoLogFromWSJTx, realDataFromWSJTx; signals: public slots: void slotLogFromWSJTCheckBoxClicked(); //void slotAutoLogFromWSJTCheckBoxClicked(); //void slotRealFromWSJTCheckBoxClicked(); void slotUDPServerCheckBoxClicked(); }; #endif // SETUPPAGEUDP_H klog-0.9.8.1/README0000644000175000017500000000214613532572307012475 0ustar develdevelKLog is an updated version of KLog The objective of KLog is to provide a free software that runs in Linux, macOS and Windows. KLog will provide hamradio contest and DX logging support. Check https://www.klog.xyz for news & updates. Check https://jaime.robles.es for the author homepage. Please join the mailing list at: - Users: https://lists.nongnu.org/mailman/listinfo/klog-users - Developers: https://lists.nongnu.org/mailman/listinfo/klog-devel You can also join the Telegram chat group: - https://t.me/klogchat The Telegram chat group in Spanish: - https://t.me/KLogES If you are a native in a language different than English or Spanish, please consider helping us translating KLog into your native language. Please contact me at jaimeNOMORESPAMrobles.es (change "NOMORESPAM" by @). Read the INSTALL.txt for installation purposes. Read the changelog (windows users, rename to changelog.txt) to see the changes from one version to another. Read README-DEVEL.txt if you want to help with KLog development. Please send all your suggestions & bug reports. I hope you enjoy KLog! 73 de Jaime, EA4TV klog-0.9.8.1/setuppagebandmode.h0000644000175000017500000000140713532572307015454 0ustar develdevel#ifndef SETUPPAGEBANDMODE_H #define SETUPPAGEBANDMODE_H #include #include #include #include #include "dataproxy.h" class SetupPageBandMode : public QWidget { Q_OBJECT public: SetupPageBandMode(DataProxy *dp, QWidget *parent=0); ~SetupPageBandMode(); QString getBands(); // 10m, 12m, 15m QString getModes(); //ssb, CW void setActiveBands(QStringList q); void setActiveModes(QStringList q); signals: public slots: private: void addBands(QStringList _b); // read the available bands from the DB void addModes(QStringList _b); // read the available modes from the DB QListWidget *bandsListWidget, *modesListWidget; DataProxy *dataProxy; }; #endif // SETUPPAGEBANDMODE_H klog-0.9.8.1/aboutdialog.cpp0000644000175000017500000002244213532572307014614 0ustar develdevel#include "aboutdialog.h" //#include //#include "coreicons.h" //#include //#include //#include //#include //#include //#include //#include #include #include #include #include #include #include AboutDialog::AboutDialog(const QString tversion, QWidget *parent) : QDialog(parent) { //qDebug() << "AboutDialog::AboutDialog" << endl; QPixmap pixmap(":/img/klog_256x256.png"); setWindowTitle(tr("About KLog")); setWindowFlags(windowFlags() & Qt::WindowContextHelpButtonHint); QGridLayout *layout = new QGridLayout(this); layout->setSizeConstraint(QLayout::SetFixedSize); const QString br = QLatin1String("
"); const QString description = "

KLog " + tversion + "

" +tr("By") + " EA4TV - 2002-2019


" + tr("KLog is a free logbook for hamradio operators.") +"

" + tr("Please know that this is an BETA release and it may contain many bugs.
Backup your data before using this software!") + "


" + tr("KLog has been fully rewritten from the 0.6.2 to be able to provide a cross-platform application that runs in the main operating systems (Linux, macOS & Windows) and provide new functionalities that KLog was not providing.") + "

" + tr("Please provide your review in KLog's eHam review page:") + "
" + "http://www.eham.net/reviews/detail/3118

" + tr("Find more information and the latest release at") + "
https://www.klog.xyz

" + tr("Author") + ": Jaime Robles, EA4TV
jaime@robles.es"; QLabel *copyRightLabel = new QLabel(description); copyRightLabel->setWordWrap(true); copyRightLabel->setOpenExternalLinks(true); copyRightLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); QPushButton *closeButton = buttonBox->button(QDialogButtonBox::Close); buttonBox->addButton(closeButton, QDialogButtonBox::ButtonRole(QDialogButtonBox::RejectRole | QDialogButtonBox::AcceptRole)); connect(buttonBox , &QDialogButtonBox::rejected, this, &QDialog::reject); QLabel *logoLabel = new QLabel; logoLabel->setPixmap(pixmap); QLabel *logoLabel2 = new QLabel; logoLabel2->setPixmap(pixmap); QLabel *logoLabel3 = new QLabel; logoLabel3->setPixmap(pixmap); QLabel *logoLabel4 = new QLabel; logoLabel4->setPixmap(pixmap); QString author1 = QString("Jaime Robles") + QString("EA4TV") + "(2002-" + tr("today") +")" +tr("Main developer") + ""; QString author2 = QString("Akihiro Koda") + QString("JL3OXR") + "(2016-2017)"; QString author3 = QString("Andrew Goldie") + QString("ZL2ACG") + "(2009-2010)"; QString authorText = tr("KLog is developed by a very small team and you are invited to join!") + "

" + tr("If you want to provide support you are welcome to join the KLog development mailing list!") + "

" + tr("You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog."); QString authors = "

" + tr("Authors") + "


" + authorText + "
" + author1 + author2 + author3 + "
"; QString translator1 = QString("Catalan") + QString("Josep Ma. Ferrer") + QString("KDE Catalan translation team"); QString translator2 = QString("Croatian") + QString("Kristijan Conkas") + QString("M0NKC"); QString translator3 = QString("Finnish") + QString("Kristjan Lorents") + QString("Finnish Debian translation team"); QString translator4 = QString("French") + QString("Christophe Lefebvre") + QString("F4HWL"); QString translator5 = QString("Danish") + QString("Joe Hansen") + QString("Danish Debian translation team"); QString translator6 = QString("German") + QString("Burhard Lück") + QString("KDE German translation team"); QString translator7 = QString("Italian") + QString("Simona Pisano") + QString("IU5HIU"); QString translator8 = QString("Japanese") + QString("Akihiro Koda") + QString("JL3OXR"); QString translator9 = QString("Polish") + QString("Piotr Ludwig") + QString("LA7RRA"); QString translator10 = QString("Spanish") + QString("Jaime Robles") + QString("EA4TV"); QString translatorsText = tr("Translators bring KLog into your language. They are really an important part of the KLog development team.") + "

" + tr("If KLog is still not in your language and you want to help us, you are welcome to contact us through the KLog development mailing list!"); QString translators = "

" + tr("Translators") + "


" + translatorsText + "
" + translator1 + translator2 + translator3 + translator4 + translator5 + translator6 + translator7 + translator8 + translator9 + translator10 + "
"; QLabel *authorsLabel = new QLabel(authors); authorsLabel->setWordWrap(true); authorsLabel->setOpenExternalLinks(true); authorsLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QLabel *translatorsLabel = new QLabel(translators); translatorsLabel->setWordWrap(true); translatorsLabel->setOpenExternalLinks(true); translatorsLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QString privacy = "

" + tr("Privacy advisory") + "


" + tr("KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account user's needs") + "

" + tr("At present, the data that is provided is the following:") + "
  • " + tr("Callsign") + "
  • " + tr("KLog version") + "
  • " + tr("Operating system") + "


" + tr("Be aware that you can enable/disable this feature from the Misc tab in the Setup page") + "."; QLabel *privacyLabel = new QLabel(privacy); privacyLabel->setAlignment(Qt::AlignJustify); privacyLabel->setWordWrap(true); privacyLabel->setOpenExternalLinks(true); privacyLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); tab1 = new QWidget; tab2 = new QWidget; tab3 = new QWidget; tab4 = new QWidget; QGridLayout *layout1 = new QGridLayout; layout1->addWidget(logoLabel , 0, 0, 1, 1); layout1->addWidget(copyRightLabel, 0, 1, 4, 4); tab1->setLayout(layout1); QGridLayout *layout2 = new QGridLayout; layout2->addWidget(logoLabel2 , 0, 0, 1, 1); layout2->addWidget(authorsLabel, 0, 1, 4, 4); tab2->setLayout(layout2); QGridLayout *layout3 = new QGridLayout; layout3->addWidget(logoLabel3 , 0, 0, 1, 1); layout3->addWidget(translatorsLabel, 0, 1, 4, 4); tab3->setLayout(layout3); QGridLayout *layout4 = new QGridLayout; layout4->addWidget(logoLabel4 , 0, 0, 1, 1); layout4->addWidget(privacyLabel, 0, 1, 4, 4); tab4->setLayout(layout4); tabw = new QTabWidget; tabw->addTab(tab1, tr("KLog")); tabw->addTab(tab2, tr("Authors")); tabw->addTab(tab3, tr("Translators")); tabw->addTab(tab4, tr("Privacy")); layout->addWidget(tabw); layout->addWidget(buttonBox, 1, 0, Qt::AlignRight); setLayout(layout); //qDebug() << "AboutDialog::AboutDialog - END" << endl; } AboutDialog::~AboutDialog() { } bool AboutDialog::event(QEvent *event) { if (event->type() == QEvent::ShortcutOverride) { QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_Escape && !ke->modifiers()) { ke->accept(); return true; } } return QDialog::event(event); } klog-0.9.8.1/setuppageworldeditor.cpp0000644000175000017500000002530013532572307016572 0ustar develdevel#include "setuppageworldeditor.h" SetupPageWorldEditor::SetupPageWorldEditor(DataProxy *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageWorldEditor::SetupPageWorldEditor" << endl; //worldPanel = new QWidget; dataProxy = dp; world = new World(dataProxy, Q_FUNC_INFO); util = new Utilities(); setupEntityDialog = new SetupEntityDialog(); worldModel = new QSqlRelationalTableModel(this); worldView = new QTableView; worldView->setContextMenuPolicy(Qt::CustomContextMenu); worldView->setSortingEnabled(true); createWorldModel(); createWorldPanel(); worldView->setCurrentIndex(worldModel->index(0, 0)); addEntityPushButton = new QPushButton; delEntityPushButton = new QPushButton; editEntityPushButton = new QPushButton; exportWorldPushButton = new QPushButton; loadWorldPushButton = new QPushButton; addEntityPushButton->setText(tr("Add")); delEntityPushButton->setText(tr("Delete")); editEntityPushButton->setText(tr("Edit")); exportWorldPushButton->setText(tr("Export World")); loadWorldPushButton->setText(tr("Import World")); addEntityPushButton->setEnabled(false); delEntityPushButton->setEnabled(false); editEntityPushButton->setEnabled(false); addEntityPushButton->setToolTip(tr("Still not implemented.")); delEntityPushButton->setToolTip(tr("Still not implemented.")); editEntityPushButton->setToolTip(tr("Still not implemented.")); exportWorldPushButton->setEnabled(false); loadWorldPushButton->setEnabled(true); exportWorldPushButton->setToolTip(tr("Still not implemented.")); loadWorldPushButton->setToolTip(tr("Import a new cty.csv file")); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(exportWorldPushButton); buttonsLayout->addWidget(loadWorldPushButton); buttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); buttonsLayout->addWidget(addEntityPushButton); buttonsLayout->addWidget(editEntityPushButton); buttonsLayout->addWidget(delEntityPushButton); /* QHBoxLayout *wbuttonsLayout = new QHBoxLayout; wbuttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); wbuttonsLayout->addWidget(exportWorldPushButton); wbuttonsLayout->addWidget(loadWorldPushButton); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addLayout(wbuttonsLayout); buttonsLayout->addLayout(ebuttonsLayout); */ QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(worldView); layout->addLayout(buttonsLayout); setLayout(layout); createActions(); if (isWorldEmpty()) { QString ctyfile = util->getCTYFile(); QMessageBox msgBox; if (QFile::exists(ctyfile)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("An entities information file (cty.csv) has been detected in your KLog folder and will be loaded.")); msgBox.exec(); world->recreate(ctyfile); worldModel->select(); //slotImportWorldButtonClicked(); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("No entities information file (cty.csv) has been detected in your KLog folder.")); msgBox.setInformativeText(tr("KLog will not be able to show entities information.")); msgBox.exec(); } } //qDebug() << "SetupPageWorldEditor::SetupPageWorldEditor - END" << endl; } SetupPageWorldEditor::~SetupPageWorldEditor() { //qDebug() << "SetupPageWorldEditor::~SetupPageWorldEditor" << endl; } void SetupPageWorldEditor::createWorldPanel() { worldView->setModel(worldModel); QString stringQuery = QString("SELECT * FROM entity"); QSqlQuery query(stringQuery); QSqlRecord rec = query.record(); // Number of columns int columns = rec.count(); for (int i = 0; i < columns; i++ ){ worldView->setColumnHidden(i, true); } columns = rec.indexOf("mainprefix"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("name"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("dxcc"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("continent"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("cqz"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("ituz"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("utc"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("latitude"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("longitude"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("deleted"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("sincedate"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("todate"); worldView->setColumnHidden(columns, false); worldView->setItemDelegate(new QSqlRelationalDelegate(this)); worldView->setSelectionMode( QAbstractItemView::SingleSelection); worldView->setSelectionBehavior(QAbstractItemView::SelectRows); worldView->resizeColumnsToContents(); worldView->horizontalHeader()->setStretchLastSection(true); } void SetupPageWorldEditor::createWorldModel() { /* WORLD_DXCCid = 0, WORLD_Nameid = 1, WORLD_MainPrefix = 2, WORLD_CQZ = 3, WORLD_ITUZ = 4, WORLD_Cont = 5 */ QString stringQuery = QString("SELECT * FROM entity"); QSqlQuery q(stringQuery); QSqlRecord rec = q.record(); int nameCol; //worldModel = new QSqlRelationalTableModel(this); worldModel->setTable("entity"); worldModel->setEditStrategy(QSqlTableModel::OnFieldChange); nameCol = rec.indexOf("mainprefix"); worldModel->setSort(nameCol, Qt::AscendingOrder); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Prefix")); nameCol = rec.indexOf("name"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Entity")); nameCol = rec.indexOf("dxcc"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("ARRL ID")); nameCol = rec.indexOf("continent"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Continent")); nameCol = rec.indexOf("cqz"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("CQ Zone")); nameCol = rec.indexOf("ituz"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("ITU Zone")); nameCol = rec.indexOf("utc"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("UTC")); nameCol = rec.indexOf("latitude"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Latitude")); nameCol = rec.indexOf("longitude"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Longitude")); nameCol = rec.indexOf("deleted"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Deleted")); nameCol = rec.indexOf("sincedate"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Since Date")); nameCol = rec.indexOf("todate"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("To Date")); worldModel->select(); } void SetupPageWorldEditor::createActions() { //qDebug() << "SetupPageWorldEditor::createActions" << endl; connect(addEntityPushButton, SIGNAL(clicked()), this, SLOT(slotAddButtonClicked()) ); connect(delEntityPushButton, SIGNAL(clicked()), this, SLOT(slotDelButtonClicked()) ); connect(editEntityPushButton, SIGNAL(clicked()), this, SLOT(slotEditButtonClicked()) ); connect(loadWorldPushButton, SIGNAL(clicked()), this, SLOT(slotImportWorldButtonClicked()) ); connect(worldView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickEntity( const QModelIndex& ) ) ); //SIGNAL received from the setupEntityDialog // void entityAdded(const QStringList _qs); // entity connect(setupEntityDialog, SIGNAL(entityAdded(QStringList)), this, SLOT(slotAnalyzeEntityAddedSignal(QStringList) ) ); } void SetupPageWorldEditor::slotAnalyzeEntityAddedSignal(const QStringList _qs) { /* //qDebug() << "SetupPageWorldEditor::slotAnalyzeEntityAddedSignal\n" << _qs.at(0) << "\n" << _qs.at(1) << "\n" << _qs.at(2) << "\n" << _qs.at(3) << "\n" << _qs.at(4) << "\n" << _qs.at(5) << "\n" << _qs.at(6) << "\n" << _qs.at(7) << "\n" << _qs.at(8) << "\n" << _qs.at(9) << "\n" << _qs.at(10) << "\n" << endl; */ } bool SetupPageWorldEditor::isWorldEmpty() { // I need to check if the world is empty and I have the CTY.CSV file if (world->getHowManyEntities()<1) { return true; } else { return false; } return true; } void SetupPageWorldEditor::slotAddButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotAddButtonClicked" << endl; setupEntityDialog->exec(); //TODO } void SetupPageWorldEditor::slotDelButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotDelButtonClicked" << endl; //TODO } void SetupPageWorldEditor::slotEditButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotEditButtonClicked" << endl; //TODO } void SetupPageWorldEditor::slotDoubleClickEntity( const QModelIndex & index) { //qDebug() << "SetupPageWorldEditor::slotDoubleClickEntity" << endl; //TODO //QSqlQuery query; //QString queryString; //int row = index.row(); } void SetupPageWorldEditor::slotImportWorldButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked" << endl; QString klogDir; klogDir = util->getHomeDir(); QString worldFile; worldFile.clear(); worldFile = QFileDialog::getOpenFileName(this, tr("Open File"), klogDir, tr("BigCTY (*.csv)")); QMessageBox msgBox; //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked: " << worldFile << endl; if (world->recreate(worldFile) ) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Entities information has been updated.")); worldModel->select(); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Entities information has not been updated.")); } msgBox.exec(); //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked - END" << endl; } klog-0.9.8.1/database.h0000644000175000017500000002232713532572307013535 0ustar develdevel#ifndef DATABASE_H #define DATABASE_H /*************************************************************************** database.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include "utilities.h" class QSqlRelationalTableModel; // Previous db update 0.011 const float DBVersionf = 0.016; // This is the latest version of the DB. struct AwarddxccEntry { // Information to update the awarddxcc table; For other Award tables, the DXCC is just the ID of the award element QString dxcc; QString band; QString mode; QString status; QString logNumber; QString qsoID; }; struct AwarddxccEntryCheck { // Information to update the awarddxcc table; For other Award tables, the DXCC is just the ID of the award element QString dxcc; QString band; QString mode; QString status; QString logNumber; }; class DataBase { public: DataBase(const QString _parentClass, const QString _DBName); //DataBase(const QString _softVersion, bool inmemoryonly = false); DataBase(const QString _parentClass, const QString _softVersion, const QString _DBName); ~DataBase(); QString getSoftVersion(); QString getDBVersion(); QString getDBName(); bool createConnection(bool newDB=false); // If true that means that we are creating the DB, // not just connecting to an existing one. // That will be done in the default path bool reConnect(const QString _DBName); //bool setDir(const QString _dir); QStringList getColumnNamesFromTable(const QString _tableName); bool isValidBand (const QString b); bool isValidMode (const QString b, const bool _tmp=false); bool isValidBandNumber (const int b); bool isValidModeNumber (const int b); QString getBandNameFromNumber(const int _n); QString getModeNameFromNumber(const int _n, bool _tmp=false); QString getSubModeNameFromNumber(const int _n, bool _tmp=false); int getBandIdFromName(const QString b); int getModeIdFromName(const QString b); int getModeIdFromSubMode(const QString b); bool createBandModeMaps(); int getBandIDFromName2(const QString b); int getModeIDFromName2(const QString b); int getSubModeIDFromName2(const QString b); QString getBandNameFromID2(const int _i); QString getModeNameFromID2(const int _i); QString getSubModeNameFromID2(const int _i); int getBandIdFromFreq(const QString fr); //Freq should be in MHz bool isThisFreqInBand(const QString b, const QString fr); //Freq should be in MHz QString getFreqFromBandId(const int _i); int getLogTypeNumber(const QString _logType); QString getLogTypeName(const int _logType); bool unMarkAllQSO(); bool updateIfNeeded(); void compress(); bool updateTheEntityTableISONames(); bool updateTableLogs(); bool queryAddField(const QString _field, const QString value); //bool queryPrepare(); //bool queryExec(); bool queryPrepare(const QString _query); bool queryBind(const QString _field, const QString value); bool updateAwardDXCCTable(); bool updateAwardWAZTable(); int getNumberOfQsos(const int _logNumber); private: bool beginTransaction(); bool commitTransaction(); bool execQuery(const QString function, const QString stringQuery); bool createDataBase(); bool isTheDBCreated(); bool isTheTableExisting(const QString _tableName); bool hasTheTableData(const QString _tableName); bool updateToLatest(); bool updateTo003(); // Updates the DB to 0.0.3 bool updateTo004(); bool updateTo005(); bool updateTo006(); bool updateTo007(); bool updateTo008(); bool updateTo009(); // Updates DB and add the Satellite tables bool updateTo010(); // Updates DB and recreates the supportedcontest table bool updateTo011(); // Updates DB and recreates Satellite data bool updateTo012(); // Updates the flags and so on. bool updateTo013(); // Update the qsl_via_enumeration bug caused for calling the table just qsl_via bool updateTo014(); // Update the Satellite DB bool updateTo015(); //Adds the FT4 mode bool updateTo016(); // Recreates the satellite table to add the QO-100 bool updateTableLog(const int _v); bool updateDBVersion(QString _softV, QString _dbV); bool createTheBandQuickReference(); bool createTheModeQuickReference(); //bool updateLog(); // Updates the log table bool recreateTableLog(); bool createTableLog(bool temp = false); // false creates the production DB. True a temporal one. bool createTableLogs(const bool real=true); // real = true creates the production DB. False a temporal one. bool createTableEntity(const bool NoTmp); bool updateTableEntity(); bool createTableClubLogStatus(); bool populateTableClubLogStatus(); bool createTableMode(const bool NoTmp); bool populateTableMode(const bool NoTmp); bool updateTheModeTableAndSyncLog(); bool createTableBand(const bool NoTmp); bool populateTableBand(const bool NoTmp); bool recreateTableBand(); bool recreateTableDXCC(); bool createTableAwardDXCC(); bool recreateTableWAZ(); bool createTableAwardWAZ(); bool recreateSatelliteData(); bool createTableSatellites(const bool NoTmp); bool populateTableSatellites(const bool NoTmp); bool recreatePropModes(); bool createTablePropModes(); bool populatePropagationModes(); bool recreateContestData(); bool recreateSupportedContest(); bool createTableContest(); bool createTableSupportedContest(); bool populateContestData(); bool populateTableSupportedContest(); bool createTableQSL_Via_enumeration(); bool populateTableQSL_Via_enumeration(); bool howManyQSOsInLog(const int i); //void showError(); //bool moveFromModeIdToSubmodeId(); bool updateModeIdFromSubModeId(); bool updateBandIdTableLogToNewOnes(); bool updateBandIdTableAward(const int _db); bool updateModeIdTableAward(const int _db); void queryErrorManagement(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); bool created; float dbVersion; // The current version of the DB. May differ from latestReaded if we are updating the DB! QString dbConnectionName; QString softVersion; float latestReaded; // The latest version of DB readed in the DB itself //bool inMemoryOnly; // The DB is to be created in memory, no file support... Faster but less safe! //QDateTime date; QHash bandIDHash; QHash modeIDHash; QHash subModeIDHash; QHash IDBandHash; QHash IDModeHash; QHash IDSubModeHash; QHash freqBandIdHash; QMap bandQMap; QMap modeQMap; Utilities *util; QSqlDatabase db; QString dbDir, dbName; QStringList insertPreparedQueries, insertQueryFields; QSqlQuery preparedQuery; int constrid; // Just an id for the constructor to check who is being executed at one specific time signals: void queryError(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); // To alert about any failed query execution }; #endif // DATABASE_H klog-0.9.8.1/downloadcty.h0000644000175000017500000000606313532572307014317 0ustar develdevel#ifndef DOWNLOADCTY_H #define DOWNLOADCTY_H /*************************************************************************** downloadcty.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include "utilities.h" class QSslError; class DownLoadCTY : public QObject { Q_OBJECT public: explicit DownLoadCTY(const QString _klogDir, const QString _klogVersion); ~DownLoadCTY(); int download(); private: Utilities *util; //void setTarget(const QString& t); bool saveToDisk(const QString &filename, QIODevice *data); QString saveFileName(const QUrl &url); QNetworkAccessManager *manager; QNetworkRequest *request; //QString target; int result; // enum QNetworkReply::NetworkError QString klogDir; QString urld; QUrl *url; private slots: void slotDownloadFinished(QNetworkReply* reply); void slotDownloadProgress(qint64 received, qint64 total); void slotErrorManagement(QNetworkReply::NetworkError networkError); signals: void actionReturnDownload(const int _i); void done(); void actionShowProgres(qint64 received, qint64 total); void actionError(const int _i); }; #endif // DOWNLOADCTY_H klog-0.9.8.1/setuppagedxcluster.cpp0000644000175000017500000003376213532572307016264 0ustar develdevel/*************************************************************************** setuppagedxcluster.cpp - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppagedxcluster.h" SetupPageDxCluster::SetupPageDxCluster(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageDxCluster::SetupPageDxCluster" << endl; //xClusterServers = new QStringList; //dxClusterServers << "dxfun.com:8000"; dxclusterServersComboBox = new QComboBox; dxclusterServersComboBox->addItem("dxfun.com:8000"); addClusterButton = new QPushButton; deleteClusterButton = new QPushButton; showHFRadiobutton = new QRadioButton; showVHFRadiobutton = new QRadioButton; showWARCRadiobutton = new QRadioButton; showWorkedRadiobutton = new QRadioButton; showConfirmedRadiobutton = new QRadioButton; showANNRadiobutton = new QRadioButton; showWWVRadiobutton = new QRadioButton; showWCYRadiobutton = new QRadioButton; saveAllDXClusterDataRadiobutton = new QRadioButton; showHFRadiobutton->setAutoExclusive(false); showVHFRadiobutton->setAutoExclusive(false); showWARCRadiobutton->setAutoExclusive(false); showWorkedRadiobutton->setAutoExclusive(false); showConfirmedRadiobutton->setAutoExclusive(false); showANNRadiobutton->setAutoExclusive(false); showWWVRadiobutton->setAutoExclusive(false); showWCYRadiobutton->setAutoExclusive(false); showHFRadiobutton->setChecked(true); showVHFRadiobutton->setChecked(true); showWARCRadiobutton->setChecked(true); showWorkedRadiobutton->setChecked(true); showConfirmedRadiobutton->setChecked(true); showANNRadiobutton->setChecked(true); showWWVRadiobutton->setChecked(true); showWCYRadiobutton->setChecked(true); addClusterButton->setText(tr("Add")); deleteClusterButton->setText(tr("Delete")); showHFRadiobutton->setText(tr("Show &HF spots")); showVHFRadiobutton->setText(tr("Show V/&UHF spots")); showWARCRadiobutton->setText(tr("Show W&ARC spots")); showWorkedRadiobutton->setText(tr("Show &worked spots")); showConfirmedRadiobutton->setText(tr("Show &confirmed spots")); showANNRadiobutton->setText(tr("Show ANN/&FULL messages")); showWWVRadiobutton->setText(tr("Show WW&V messages")); showWCYRadiobutton->setText(tr("Show WC&Y messages")); QGroupBox *spotsGroupBox = new QGroupBox(tr("DX Spots")); QVBoxLayout *spotsVBoxLayout = new QVBoxLayout; spotsVBoxLayout->addWidget(showHFRadiobutton); spotsVBoxLayout->addWidget(showVHFRadiobutton); spotsVBoxLayout->addWidget(showWARCRadiobutton); spotsVBoxLayout->addWidget(showWorkedRadiobutton); spotsVBoxLayout->addWidget(showConfirmedRadiobutton); spotsVBoxLayout->addStretch(1); spotsGroupBox->setLayout(spotsVBoxLayout); QGroupBox *messagesGroupBox = new QGroupBox(tr("Messages")); QVBoxLayout *messagesVBoxLayout = new QVBoxLayout; messagesVBoxLayout->addWidget(showANNRadiobutton); messagesVBoxLayout->addWidget(showWWVRadiobutton); messagesVBoxLayout->addWidget(showWCYRadiobutton); messagesVBoxLayout->addStretch(1); messagesGroupBox->setLayout(messagesVBoxLayout); // ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, //int columnSpan, Qt::Alignment alignment = 0 ) QHBoxLayout *serversButtonsLayout = new QHBoxLayout; serversButtonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); serversButtonsLayout->addWidget(addClusterButton); serversButtonsLayout->addWidget(deleteClusterButton); QVBoxLayout *serversLayout = new QVBoxLayout; serversLayout->addWidget(dxclusterServersComboBox); serversLayout->addLayout(serversButtonsLayout); QGridLayout *mainLayout = new QGridLayout; mainLayout->addLayout(serversLayout, 0, 0); mainLayout->addWidget(spotsGroupBox, 1, 0); mainLayout->addWidget(messagesGroupBox, 1, 1); setLayout(mainLayout); createActions(); //qDebug() << "SetupPageDxCluster::SetupPageDxCluster - END" << endl; } SetupPageDxCluster::~SetupPageDxCluster() { //qDebug() << "SetupPageDxCluster::~SetupPageDxCluster" << endl; } void SetupPageDxCluster::createActions() { //qDebug() << "SetupPageDxCluster::createActions" << endl; connect(addClusterButton, SIGNAL(clicked()), this, SLOT(slotAddButtonClicked()) ); connect(deleteClusterButton, SIGNAL(clicked()), this, SLOT(slotDeleteButtonClicked()) ); } void SetupPageDxCluster::slotAddButtonClicked() { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked" << endl; bool ok; ok = false; while (!ok) { QString text = QInputDialog::getText (this, tr("KLog: Add a DXCluster server"), tr("Add the address followed by the :port\nExample: dxfun.com:8000\nIf no port is specified, 41112 will be used by default:"), QLineEdit::Normal, QString::null, &ok); if (ok && !text.isEmpty ()) { if (checkIfValidDXCluster (text)) { if (checkIfNewDXCluster (text)) { ok = true; if ((text.contains (":")) == 0) { text = text + ":41112"; } dxclusterServersComboBox->insertItem (0, text); } else { ok = false; } } else { ok = false; } } else { // user entered nothing or pressed Cancel ok = true; } } } void SetupPageDxCluster::slotDeleteButtonClicked() { //qDebug() << "SetupPageDxCluster::slotDeleteButtonClicked" << endl; dxclusterServersComboBox->removeItem (dxclusterServersComboBox->currentIndex ()); } bool SetupPageDxCluster::checkIfValidDXCluster (const QString & tdxcluster) { QUrl url ("http://" + tdxcluster); if ((!url.host ().isEmpty ()) || (url.port () != -1)) { return true; } else { return false; } } bool SetupPageDxCluster::checkIfNewDXCluster (const QString & tdxcluster) { //qDebug() << "checkIfNewDXCluster: -" << tdxcluster << "-"<< endl; int numberOfDXClusterServers = dxclusterServersComboBox->count (); for (int i = 0; i <= numberOfDXClusterServers - 1; i++) { if ((dxclusterServersComboBox->currentText ()) == (tdxcluster)) { return false; } else { return true; } dxclusterServersComboBox->setCurrentIndex(i); } return true; } QStringList SetupPageDxCluster::getDxclusterServersComboBox() { //qDebug() << "SetupPageDxCluster::getDxclusterServersComboBox" << endl; QStringList servers; int numberOfDXClusterServers = dxclusterServersComboBox->count (); servers.clear(); if(numberOfDXClusterServers>=1) { //stream << "DXClusterServerToUse=" << dxclusterServersComboBox->currentText () << endl; //servers << dxclusterServersComboBox->currentText (); for (int i = 0; i <= numberOfDXClusterServers - 1; i++) { dxclusterServersComboBox->setCurrentIndex (i); servers << dxclusterServersComboBox->currentText (); //stream << "DXClusterServerPort=" << dxclusterServersComboBox->currentText () << endl; } } return servers; } void SetupPageDxCluster::setDxclusterServersComboBox(const QStringList t) { //qDebug() << "SetupPageDxCluster::setDxclusterServersComboBox" << endl; if (t.count()>0) { QString text; for (int i=0; i < t.count(); i++) { text.clear(); text = t.at(i); if (checkIfValidDXCluster (text)) { if (checkIfNewDXCluster (text)) { if ((text.contains (":")) == 0) { text = text + ":41112"; } dxclusterServersComboBox->insertItem (0, text); } else { // Not added } } } } } QString SetupPageDxCluster::getShowHFRadiobutton() { if (showHFRadiobutton->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowVHFRadiobutton() { if (showVHFRadiobutton->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowWARCRadiobutton() { if (showWARCRadiobutton->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowWorkedRadiobutton() { if (showWorkedRadiobutton->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowConfirmedRadiobutton() { if (showConfirmedRadiobutton->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowANNRadiobutton() { if (showANNRadiobutton->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowWWVRadiobutton() { if (showWWVRadiobutton->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowWCYRadiobutton() { if (showWCYRadiobutton->isChecked()) { return "True"; } else { return "False"; } } void SetupPageDxCluster::setShowHFRadiobutton(const QString t) { if ( (t.toUpper()) == "FALSE") { showHFRadiobutton->setChecked(false); } else { showHFRadiobutton->setChecked(true); } } void SetupPageDxCluster::setShowVHFRadiobutton(const QString t) { if ( (t.toUpper()) == "FALSE") { showVHFRadiobutton->setChecked(false); } else { showVHFRadiobutton->setChecked(true); } } void SetupPageDxCluster::setShowWARCRadiobutton(const QString t) { if ( (t.toUpper()) == "FALSE") { showWARCRadiobutton->setChecked(false); } else { showWARCRadiobutton->setChecked(true); } } void SetupPageDxCluster::setShowWorkedRadiobutton(const QString t) { if ( (t.toUpper()) == "FALSE") { showWorkedRadiobutton->setChecked(false); } else { showWorkedRadiobutton->setChecked(true); } } void SetupPageDxCluster::setShowConfirmedRadiobutton(const QString t) { if ( (t.toUpper()) == "FALSE") { showConfirmedRadiobutton->setChecked(false); } else { showConfirmedRadiobutton->setChecked(true); } } void SetupPageDxCluster::setShowANNRadiobutton(const QString t) { if ( (t.toUpper()) == "FALSE") { showANNRadiobutton->setChecked(false); } else { showANNRadiobutton->setChecked(true); } } void SetupPageDxCluster::setShowWWVRadiobutton(const QString t) { if ( (t.toUpper()) == "FALSE") { showWWVRadiobutton->setChecked(false); } else { showWWVRadiobutton->setChecked(true); } } void SetupPageDxCluster::setShowWCYRadiobutton(const QString t) { if ( (t.toUpper()) == "FALSE") { showWCYRadiobutton->setChecked(false); } else { showWCYRadiobutton->setChecked(true); } } QString SetupPageDxCluster::getSelectedDxClusterServer() { //return dxclusterServersComboBox->currentText(); int dxclusterServerListItems = dxclusterServersComboBox->count (); if (dxclusterServerListItems >= 1) { return dxclusterServersComboBox->currentText (); } else { return QString::null; } return QString::null; } void SetupPageDxCluster::setSelectedDxClusterServer(const QString t) { dxclusterServersComboBox->setCurrentIndex(dxclusterServersComboBox->findText(t)); } klog-0.9.8.1/searchwidget.h0000644000175000017500000001325713532572307014444 0ustar develdevel#ifndef SEARCHWIDGET_H #define SEARCHWIDGET_H /*************************************************************************** searchwidget.h - description ------------------- begin : jul 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the search widget // #include #include #include "dataproxy.h" #include "awards.h" #include "world.h" #include "utilities.h" #include "filemanager.h" class SearchWidget : public QWidget { Q_OBJECT public: explicit SearchWidget(DataProxy *dp, QWidget *parent = 0); ~SearchWidget(); void setCurrentLog(const int _log); void setColors (const QString _newOne, const QString _needed, const QString _worked, const QString _confirmed, const QString _default); void setVersion (const QString _version); // Defines the KLog version to be written in the exported logs void setShowCallInSearch(const bool _sh); void clear(); void showQSO(const int _q); void showQSOs(QList qsoIdList); void searchToolNeededQSLToSend(); public slots: //void slotQsoFound(QStringList _qso); void slotSearchBoxTextChanged(); void slotToolSearchQSL(const int actionQSL); void slotToolSearchRequestedQSLToSend(); void slotToolSearchNeededQSLPendingToReceive(); void slotToolSearchNeededQSLRequested(); private slots: void slotDoubleClickSearch( QTreeWidgetItem* item, int); // Double click on a QSO in the search box void slotSearchExportButtonClicked(); void slotSearchBoxSelectAllButtonClicked(); void slotSearchClearButtonClicked(); void slotSearchBoxSelectionChanged(); void slotSearchBoxReSearchButtonClicked(); void slotRighButtonSearch(const QPoint& pos); void showMenuRightButtonSearchCreateActions(); void righButtonSearchMenu(const int trow); void slotQsoDeleteFromSearch(); void slotQSLSentViaBureauFromSearch(); void slotQSLSentViaDirectFromSearch(); void slotQSLSentViaDirectMarkDXReqFromSearch(); void slotQSLSentViaBureuMarkDXReqFromSearch(); void slotQSLRecViaDirectFromSearch(); void slotQSLRecViaBureauFromSearch(); void slotQSLRecViaDirectMarkReqFromSearch(); void slotQSLRecViaBureauMarkReqFromSearch(); void slotQSLSentMarkAsRequested(); void slotQSLRecMarkAsRequested(); void slotQSOToEditFromSearch(); void qslRecViaBureauMarkReq(const int _qsoId); void qslRecViaDirectMarkReq(const int _qsoId); signals: void actionQSODoubleClicked(const int _qsoid); void updateAwards(); void logRefresh(); void toStatusBar(const QString statusm); void requestBeingShown(); void actionQSODelete(const int _qsoid); void queryError(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); // To alert about any failed query execution private: void createUI(); // The following function is adding a line to the search list void addQSOToSearchList(const QString _call, const QString _dateTime, const QString _band, const QString _mode, const QString _qslrx, const QString _qsltx, const QString _stationcallsign, const QString _id, const QColor _color); bool fillTheList(const QString _query); // void addQSOToTheList(const int _id); QLineEdit *searchBoxLineEdit; QPushButton *searchBoxClearButton, *searchBoxExportButton, *searchBoxSelectAllButton, *searchBoxReSearchButton; QRadioButton *searchAllRadioButton; QTreeWidget *searchResultsTreeWidget; bool qslingNeeded; bool searchSelectAllClicked, stationCallSignShownInSearch; int currentLog; DataProxy *dataProxy; Awards *awards; World *world; Utilities *util; FileManager *filemanager; QAction *delQSOFromSearchAct; QAction *qsoToEditFromSearchAct; QAction *qslSentViaBureauFromSearchAct; QAction *qslSentViaDirectFromSearchAct; QAction *qslSentViaDirectMarkRcvReqFromSearchAct; QAction *qslSentViaBureauMarkRcvReqFromSearchAct; QAction *qslRecViaBureauFromSearchAct; QAction *qslRecViaDirectFromSearchAct; QAction *qslRecViaBureauMarkReqFromSearchAct; QAction *qslRecViaDirectMarkReqFromSearchAct; QAction *qslSentRequestedAct; QAction *qslRecRequestedAct; }; #endif // SEARCHWIDGET_H klog-0.9.8.1/dataproxy.h0000644000175000017500000003156413532572307014007 0ustar develdevel#ifndef DATAPROXY_H #define DATAPROXY_H /*************************************************************************** dataproxy.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include class DataProxy : public QObject { Q_OBJECT public: DataProxy(); // DataProxy(const QStringList _qs); ~DataProxy(); virtual QString getSoftVersion(); virtual QString getDBVersion(); virtual bool reconnectDB(); virtual void createLogModel(); virtual void createLogPanel(); virtual bool haveAtLeastOneLog(); virtual QStringList getColumnNamesFromTableLog(); //UI functions virtual int getIdFromModeName(const QString& _modeName); virtual int getIdFromBandName(const QString& _bandName); virtual int getSubModeIdFromSubMode(const QString _subModeName); virtual int getModeIdFromSubModeId(const int _sm); virtual QString getNameFromBandId (const int _id); virtual QString getNameFromModeId (const int _id); virtual QString getNameFromSubModeId (const int _id); virtual QString getSubModeFromId (const int _id); virtual QString getNameFromSubMode (const QString _sm); // Checks if a submode is deprecated //TODO: Check if really needed //virtual QString getModeFromSubMode (const QString _sm); virtual bool isModeDeprecated (const QString _sm); virtual QString getFreqFromBandId(const int _id); virtual int getBandIdFromFreq(const double _n); virtual QString getBandNameFromFreq(const double _n); virtual double getLowLimitBandFromBandName(const QString _sm); virtual double getLowLimitBandFromBandId(const QString _sm); virtual bool isThisFreqInBand(const QString b, const QString fr); virtual bool isHF(const int _band); virtual bool isWARC(const int _band); virtual bool isVHF(const int _band); virtual bool isUHF(const int _band); virtual QStringList getBands(); virtual QStringList getModes(); virtual QStringList sortBandNamesBottonUp(const QStringList _qs); virtual QStringList getBandIDs(); virtual QStringList getModesIDs(); virtual QStringList getBandsInLog(const int _log); virtual QStringList getModesInLog(const int _log); virtual int getMostUsedBand(const int _log); virtual int getMostUsedMode(const int _log); virtual int getQSOsInBand(const QString _band, const int _log); virtual int getQSOsInMode(const QString _mode, const int _log); virtual int getLastQSOid(); virtual bool clearLog(); virtual bool addQSOFromWSJTX(const QString _dxcall, const double _freq, const QString _mode, const QString _dx_grid, const QString _time_off, const QString _report_sent, const QString _report_rec, const QString _tx_power, const QString _comments, const QString _name, const QString _time_on, const int _dxcc, const QString _opQrz, const QString _stQrz, const QString _myLoc, const int _logN); virtual bool deleteQSO(const int _qsoId); virtual int isWorkedB4(const QString _qrz, const int _currentLog); virtual bool isThisQSODuplicated(const QString _qrz, const QString _date, const QString _time, const int _band, const int _mode); virtual int getDuplicatedQSOId(const QString _qrz, const QString _date, const QString _time, const int _band, const int _mode); virtual bool isDXCCConfirmed(const int _dxcc, const int _currentLog); virtual bool isQSLReceived(const int _qsoId); virtual bool isQSLSent(const int _qsoId); virtual bool qslSentViaDirect(const int _qsoId, const QString _updateDate); virtual bool qslSentViaBureau(const int _qsoId, const QString _updateDate); virtual bool qslSentAsRequested(const int _qsoId, const QString _updateDate); virtual bool qslRecAsRequested(const int _qsoId, const QString _updateDate); virtual bool qslRecViaBureau(const int _qsoId, const QString _updateDate); virtual bool qslRecViaBureau(const int _qsoId, const QString _updateDate, const bool _queueSentQSL); virtual bool qslRecViaDirect(const int _qsoId, const QString _updateDate); virtual bool qslRecViaDirect(const int _qsoId, const QString _updateDate, const bool _queueSentQSL); virtual bool setClubLogSent(const int _qsoId, const QString _st, const QString _updateDate); virtual int getBandFromId(const int _qsoId); virtual int getModeFromId(const int _qsoId); virtual int getDXCCFromId(const int _qsoId); virtual int getCQZFromId(const int _qsoId); virtual QString getCallFromId(const int _qsoId); virtual QStringList getClubLogRealTimeFromId(const int _qsoId); // Complete with previous virtual QString getNameFromQRZ(const QString _call); virtual QString getQTHFromQRZ(const QString _call); virtual QString getLocatorFromQRZ(const QString _call); virtual QString getIOTAFromQRZ(const QString _call); virtual QString getQSLViaFromQRZ(const QString _call); // /Complete with previous virtual bool updateAwardDXCC(); virtual bool updateAwardWAZ(); virtual int getContinentIdFromContinentShortName(const QString _n); virtual QString getContinentShortNameFromEntity(const int _n); virtual int getContinentIdFromEntity(const int _n); virtual QStringList getContinentShortNames(); virtual bool isValidContinentShortName(const QString _n); virtual int getCQzFromPrefix(const QString _p); virtual int getCQzFromEntity(const int _n); virtual int getITUzFromEntity(const int _n); virtual int getITUzFromPrefix(const QString _p); virtual QString getEntityNameFromId(const int _n); virtual int getEntityIdFromName(const QString _e); virtual QString getEntityMainPrefix(const int _entityN); virtual bool isNewCQz(int _c); virtual bool isNewEntity(int _e); virtual double getLongitudeFromEntity(const int _e); virtual double getLatitudeFromEntity(const int _e); virtual int getDXCCFromPrefix(const QString _p); virtual QString getEntityPrefixes(const int _enti); virtual QStringList getEntitiesNames(); virtual QStringList getEntitiesIds(); virtual int getHowManyEntities(); virtual int getMaxEntityID(bool limit); // limit = true implies that it will only shouw ARRL valid DXCC (i.e. will not count Sicily) virtual QStringList getOperatingYears(const int _currentLog); virtual void compressDB(); virtual bool unMarkAllQSO(); // Unmarks all the marked QSO virtual bool lotwSentQueue(const QString _updateDate, const int _currentLog); // Mark LOTW QSL SENT as Q (Queued) virtual bool lotwSentYes(const QString _updateDate, const int _currentLog, const QString _station); // Updat LOTW QSL SENT marked as Q as Y (Queued) virtual int getQSOonYear(const int _year, const int _logNumber); virtual int getDXCConYear(const int _year, const int _logNumber); virtual int getCQzonYear(const int _year, const int _logNumber); virtual int getQSOsWithDXCC(const int _dxcc, const int _logNumber); virtual int getQSOsAtHour(const int _hour, const int _log); virtual int getQSOsAtHourOnBand(const int _hour, const int _band ,const int _log); virtual int getQSOsOnMonth(const int _month, const int _log); virtual bool newDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber); virtual QStringList getContestNames(); virtual QStringList getContestCat(const int _catn); virtual QStringList getContestOverlays(); virtual int getContestTypeN(const int _co, const int _catop, const int _catas, const int _catpo, const int _catba, const int _catov, const int _catmo); virtual QStringList getDataFromContestType(const int _n); virtual int getLogTypeNumber(const QString _logType); // Returns the number of the type of log name virtual QString getLogTypeName(const int _logType); // Returns the name of the type of log number virtual QString getLogTypeOfUserLog(const int _logN); // Returns the type of log of a specific log virtual int getLogNumberFromQSOId(const int _qsoId); // Returns the log where the QSO id was added virtual QStringList getBandNames(); virtual QStringList getPropModeList(); virtual bool clearSatList(); virtual bool addSatellite(const QString _arrlId, const QString _name, const QString _downLink, const QString _upLink, const QString _mode, int id = -1); virtual int getDBSatId(const QString _arrlId); virtual QStringList getSatellitesList(); virtual QString getSatelliteUplink(const QString _sat); virtual QString getSatelliteDownlink(const QString _sat); virtual QString getSatelliteMode(const QString _sat); virtual QString getSatelliteFullUplink(const QString _sat); virtual QString getSatelliteFullDownlink(const QString _sat); virtual QString getSatelliteFullMode(const QString _sat); virtual QString getSatelliteName(const QString _sat); virtual QString getSateliteArrlIdFromId(const int _id); virtual QStringList getQSLRcvdList(); virtual QStringList getQSLSentList(); virtual QStringList getClubLogStatusList(); virtual QStringList getQSLViaList(); virtual QStringList getValidCatOptions(const int _currentCat, const int _lowerCa); virtual bool fillEmptyDXCCInTheLog(); virtual int getHowManyQSOInLog(const int _log); virtual int getHowManyConfirmedQSLInLog(const int _log); virtual int getHowManyQSLSentInLog(const int _log); virtual int getQSOsWithContinent(const QString _cont, const int _logNumber); virtual int getNumberOfManagedLogs(); virtual int getMaxLogNumber(); virtual QStringList getListOfManagedLogs(); virtual QString getStationCallSignFromLog(const int _log); virtual QStringList getStationCallSignsFromLog(const int _log); virtual QString getOperatorsFromLog(const int _log); virtual QString getCommentsFromLog(const int _log); virtual QString getLogDateFromLog(const int _log); virtual QString getLogTypeNFromLog(const int _log); virtual bool addNewLog (const QStringList _qs); virtual bool doesThisLogExist(const int _log); virtual bool updateISONames(); // Update the entities ISO 3166 names for the flags virtual QString getISOName(const int _n); virtual void getFoundInLog(const QString _txt, const int _log=-1); virtual bool setDXCCAwardStatus(const int _qsoId); virtual bool setWAZAwardStatus(const int _qsoId); //virtual bool queryPrepare(const QString _query); //virtual bool queryBind(const QString _field, const QString value); //virtual bool queryExec(); /* virtual bool isMultiplier(const QStringList _qs); virtual int getQSOPoints(const QStringList _qs); virtual bool saveFileToSend(const QString& _fileName); virtual int getTotalScore(); virtual int getMultipliers(); virtual int getPoints(); */ private: virtual QStringList sortBandIdBottonUp(const QStringList _qs); //virtual QStringList getColumnNamesFromTable(const QString _tableName); // int points; // int multipliers; signals: void qsoFound(const QStringList _qs); // Each: QString with format: Fieldname:value }; #endif // DATAPROXY_H klog-0.9.8.1/setupentitydialog.h0000644000175000017500000000671213532572307015546 0ustar develdevel#ifndef SETUPENTITYDIALOG_H #define SETUPENTITYDIALOG_H /*************************************************************************** SetupEntityDialog.h - description ------------------- begin : sept 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include class SetupEntityDialog : public QDialog { Q_OBJECT public: SetupEntityDialog(); ~SetupEntityDialog(); public slots: private slots: void slotOkButtonClicked(); void slotCancelButtonClicked(); void slotCheckEntity(); void slotCheckMainprefix(); void slotCheckCQz(); void slotCheckITUz(); void slotCheckContinent(); void slotCheckLatitude(); void slotCheckLongitude(); void slotCheckUTC(); void slotCheckARRLid(); void slotCheckDeleted(); void slotCheckDeletedDate(); void slotCheckPrefixes(); signals: void entityAdded(const QStringList _qs); // entity private: QString checkEntity(); QString checkMainprefix(); QString checkCQz(); QString checkITUz(); QString checkContinent(); QString checkLatitude(); QString checkLongitude(); QString checkUTC(); QString checkARRLid(); QString checkDeleted(); QString checkDeletedDate(); QString checkPrefixes(); bool entityBool, mainPrefixBool, cqBool, ituBool, contBool; bool latBool, lonBool, utcBool, arrlidBool, delBool, delDateBool, prefBool; QLineEdit *entityLineEdit, *cqLineEdit, *ituLineEdit; QLineEdit *contLineEdit, *latLineEdit, *lonLineEdit; QLineEdit *utcLineEdit, *mprefLineEdit, *arrlidLineEdit; QLineEdit *deletedLineEdit, *prefLineEdit; QDateEdit *delQDateEdit; QRadioButton *delRbutton; QStringList entityData; //QPalette *paletteOrig, *paletteWrong; //QColor color; QPalette pal, palw; }; #endif // SetupEntityDialog_H klog-0.9.8.1/contest_cqwwdxssb.cpp0000644000175000017500000004113413532572307016105 0ustar develdevel/*************************************************************************** contestcqwwdxssb.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "contest_cqwwdxssb.h" #include #include /* V. MULTIPLIER: Two types of multiplier will be used. A multiplier of one (1) for each different zone contacted on each band. A multiplier of one (1) for each different country contacted on each band. Stations are permitted to contact their own country and zone for multiplier credit. The CQ Zone Map, DXCC country list, WAE country list, and WAC boundaries are standards. Maritime mobile stations count only for a zone multiplier. VI. POINTS: Contacts between stations on different continents are worth three (3) points. Contacts between stations on the same continent but different countries, one (1) point. Exception: For North American stations only, contacts between stations within the North American boundaries count two (2) points. Contacts between stations in the same country are permitted for zone or country multiplier credit but have zero (0) point value. VII. SCORING: All stations: the final score is the result of the total QSO points multiplied by the sum of your zone and country multipliers. Example: 1000 QSO points 100 multiplier (30 Zones + 70 Countries) = 100,000 (final score). */ ContestCQWWDXSSB::ContestCQWWDXSSB() { //qDebug() << "ContestCQWWDXSSB::ContestCQWWDXSSB2" << endl; constrid = 1; myEntity = ""; myCQz = ""; myContinent = ""; NA = -1; mycategory = ""; arrlSection = ""; stationQrz = ""; claimedScore = ""; name = ""; address = ""; operators = ""; soapbox = ""; thiscontest = ""; club = ""; createdby = ""; //qDebug() << "ContestCQWWDXSSB::ContestCQWWDXSSB1" << endl; } ContestCQWWDXSSB::ContestCQWWDXSSB(const QStringList _qs) { // Receives: QStringList _qs; //_qs << myEntity << myCQz << myContinent << NA-id; //qDebug() << "ContestCQWWDXSSB::ContestCQWWDXSSB- 2:" << endl; constrid = 2; myEntity = _qs.at(0); myCQz = _qs.at(1); myContinent = _qs.at(2); NA = _qs.at(3); // NA is North America for scoring purposes thiscontest = "CQ-WW-SSB"; mycategory = "SINGLE-OP ALL HIGH"; club = "NoClub"; createdby ="KLog-Alpha"; /* OFFICIAL CATEGORIES CATEGORY: SINGLE-OP ALL HIGH CATEGORY: SINGLE-OP 160M HIGH CATEGORY: SINGLE-OP 80M HIGH CATEGORY: SINGLE-OP 40M HIGH CATEGORY: SINGLE-OP 20M HIGH CATEGORY: SINGLE-OP 15M HIGH CATEGORY: SINGLE-OP 10M HIGH CATEGORY: SINGLE-OP ALL LOW CATEGORY: SINGLE-OP 160M LOW CATEGORY: SINGLE-OP 80M LOW CATEGORY: SINGLE-OP 40M LOW CATEGORY: SINGLE-OP 20M LOW CATEGORY: SINGLE-OP 15M LOW CATEGORY: SINGLE-OP 10M LOW CATEGORY: SINGLE-OP ALL QRP CATEGORY: SINGLE-OP 160M QRP CATEGORY: SINGLE-OP 80M QRP CATEGORY: SINGLE-OP 40M QRP CATEGORY: SINGLE-OP 20M QRP CATEGORY: SINGLE-OP 15M QRP CATEGORY: SINGLE-OP 10M QRP CATEGORY: SINGLE-OP-ASSISTED ALL CATEGORY: SINGLE-OP-ASSISTED 160M CATEGORY: SINGLE-OP-ASSISTED 80M CATEGORY: SINGLE-OP-ASSISTED 40M CATEGORY: SINGLE-OP-ASSISTED 20M CATEGORY: SINGLE-OP-ASSISTED 15M CATEGORY: SINGLE-OP-ASSISTED 10M CATEGORY: MULTI-ONE CATEGORY: MULTI-TWO CATEGORY: MULTI-MULTI CATEGORY: CHECKLOG */ arrlSection = "DX"; stationQrz = ""; claimedScore = "000"; name = "No-Name"; address = "MyPoBox\nADDRESS: SecondLineOfAddress"; operators = "EA4TV, EA4GCA"; soapbox = "MySoapbox\nSOAPBOX: Another line\nSOAPBOX: and even one more"; //qDebug() << "ContestCQWWDXSSB::ContestCQWWDXSSB: " << myEntity << "/" << myCQz << "/" << myContinent << "/" << NA << endl; //qDebug() << "ContestCQWWDXSSB::ContestCQWWDXSSB- 2: - END" << endl; } ContestCQWWDXSSB::~ContestCQWWDXSSB(){ } bool ContestCQWWDXSSB::isMultiplier(const QStringList _qs){ //qDebug() << "ContestCQWWDXSSB::isMultiplier" << endl; for (int i = 0; i<_qs.length(); i++){ ////qDebug() << _qs.at(i) <<", "; } // Receives: QStringList _qs; //_qs << DX-Entity << DXCQz << DX-band; // V. MULTIPLIER: Two types of multiplier will be used. // // A multiplier of one (1) for each different zone contacted on each band. // A multiplier of one (1) for each different country contacted on each band. // Stations are permitted to contact their own country and zone for multiplier credit. // The CQ Zone Map, DXCC country list, WAE country list, and WAC boundaries are standards. // Maritime mobile stations count only for a zone multiplier. if (_qs.length() != 3){ //qDebug() << "ContestCQWWDXSSB::isMultiplier: diferent THAN 3" << endl; return false; } QString dxEntity = _qs.at(0); QString dxCQz = _qs.at(1); if (!( (isValidCQz(dxCQz) ) && (isValidEntity(dxEntity) ) ) ){ return false; } //TODO: Check if the band is a valid string QString dxBand = _qs.at(2); // A multiplier of one (1) for each different zone contacted on each band. QString queryString; QSqlQuery query; queryString = QString("SELECT id FROM log WHERE bandid='%1' AND stx='%2'").arg(dxBand).arg(dxCQz); //qDebug() << "ContestCQWWDXSSB::isMultiplier-1: " << queryString << endl; bool sqlOK = query.exec(queryString); if (!sqlOK) { //emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number()); } query.next(); if (!(query.isValid())){ //qDebug() << "ContestCQWWDXSSB::isMultiplier: Not Worked Zone" << endl; return true; } // A multiplier of one (1) for each different country contacted on each band. queryString = QString("SELECT id FROM log WHERE bandid='%1' AND dxcc='%2'").arg(dxBand).arg(dxEntity); //qDebug() << "ContestCQWWDXSSB::isMultiplier-2: " << queryString << endl; sqlOK = query.exec(queryString); if (!sqlOK) { //emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number()); } query.next(); if (!(query.isValid())){ //qDebug() << "ContestCQWWDXSSB::isMultiplier: MULT2 - Not worked DXCC" << endl; return true; } return false; } int ContestCQWWDXSSB::getQSOPoints(const QStringList _qs){ //qDebug() << "ContestCQWWDXSSB::getQSOPoints" << endl; // Receives: QStringList _qs; //_qs << DX-Entity << DX-Continent // VI. POINTS: // // Contacts between stations on different continents are worth three (3) points. // Contacts between stations on the same continent but different countries, one (1) point. // Exception: For North American stations only, contacts between stations within the North American // boundaries count two (2) points. // // Contacts between stations in the same country are permitted for zone or country multiplier // credit but have zero (0) point value. if (_qs.length() != 2){ return false; } QString dxEntity =_qs.at(0); QString dxContinent = _qs.at(1); if (myContinent != dxContinent){ return 3; }else if (myContinent == NA) { return 2; } else if (myEntity != dxEntity){ return 1; }else{ return 0; } return 0; } bool ContestCQWWDXSSB::isValidCQz(const QString _cqz){ //qDebug() << "ContestCQWWDXSSB::isValidCQz: " << _cqz << endl; if ( (_cqz.toInt()>0) && (_cqz.toInt()<41) ){ return true; }else{ return false; } return false; } bool ContestCQWWDXSSB::isValidEntity(const QString _ent){ //qDebug() << "ContestCQWWDXSSB::isValidEntity: " << _ent << endl; if ( (_ent.toInt()>0) ) { return true; }else{ return false; } return false; } bool ContestCQWWDXSSB::saveFileToSend(const QString& _fileName) { //qDebug() << "Contest::saveFileToSend" << _fileName << endl; QFile file(_fileName); QSqlQuery query1; if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return false; QTextStream out(&file); //_qs << myEntity << myCQz << myContinent << NA-id; //myARRLSect << StationQRZ << myCategory << myClub << //myAddress << operators(comma separated EA4TV, EA4GCA, ...) //SoapBox out << "START-OF-LOG: 3" << endl; out << "ARRL-SECTION: " << arrlSection << endl; out << "CALLSIGN: " << stationQrz << endl; out << "CATEGORY: " + mycategory << endl; out << "CLAIMED-SCORE: " << claimedScore << endl; out << "CLUB: " << club << endl; out << "CONTEST: " << thiscontest << endl; out << "NAME: " << name << endl; out << "ADDRESS: " << address << endl; out << "CREATED-BY: " << createdby << endl; out << "OPERATORS: " << operators << endl;// [required for multi-op stations] out << "SOAPBOX: " << soapbox << endl; //[add lines if needed] QSqlQuery query("SELECT * FROM log"); QSqlRecord rec = query.record(); int nameCol; QString aux1, aux2, queryString; /* START-OF-LOG: 3.0 CONTEST: CQ-WW-RTTY CONTEST: CQ-WW-SSB CONTEST: CQ-WW-CW CALLSIGN: LU6ETB CATEGORY-OPERATOR: SINGLE-OP CATEGORY-BAND: 10M CATEGORY-POWER: HIGH CATEGORY-ASSISTED: NON-ASSISTED CLAIMED-SCORE: 1410 OPERATORS: N5KO CLUB: Radio Club Quilmes NAME: Trey Garlough ADDRESS: 7375 Oak Ridge Road ADDRESS-CITY: Aptos ADDRESS-STATE: CA ADDRESS-POSTALCODE: 95003 ADDRESS-COUNTRY: USA QSO: 3799 PH 2000-11-26 0711 N6TW 59 03 K9QZO 59 04 0 END-OF-LOG: */ while (query.next()) { if ( query.isValid()) { out << "QSO: "; nameCol = rec.indexOf("freq"); aux1 = (query.value(nameCol)).toString(); if (aux1.length()<1) { nameCol = rec.indexOf("bandid"); aux1 = (query.value(nameCol)).toString(); queryString = QString("SELECT cabrillo FROM band WHERE id='%1'").arg(aux1); bool sqlOK = query1.exec(queryString); if (!sqlOK) { //emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().number()); } query1.next(); if (query1.isValid()) { aux1 = query1.value(0).toString(); //qDebug() << "ContestCQWWDXSSB::saveFileToSend: band: " << queryString << "/" << aux1 << endl; if (!(aux1.length()>1)) { aux1 = " NULL"; } } } aux1.remove(QChar('.'), Qt::CaseInsensitive); out << aux1.rightJustified(5, ' ', true) << " "; nameCol = rec.indexOf("modeid"); aux1 = (query.value(nameCol)).toString(); queryString = QString("SELECT name FROM mode WHERE id='%1'").arg(aux1); bool sqlOK = query1.exec(queryString); if (!sqlOK) { //emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().number()); } query1.next(); if (query1.isValid()) { aux1 = (query1.value(0)).toString(); if (aux1=="RTTY") { out << "RY "; } else if (aux1=="CW") { out << "CW "; } else { out << "PH "; } } nameCol = rec.indexOf("qso_date"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "ContestCQWWDXSSB::saveFileToSend date: " << aux1 << endl; aux1.replace(QString("/"), QString("-")); if ((aux1.length()) == 10) { out << aux1 << " "; } nameCol = rec.indexOf("time_on"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "ContestCQWWDXSSB::saveFileToSend time1: " << aux1 << endl; aux1.remove(QChar(':'), Qt::CaseInsensitive); aux1.truncate(4); aux1 = aux1.leftJustified(4, '0', true); out << aux1 << " "; //qDebug() << "ContestCQWWDXSSB::saveFileToSend time2: " << aux1 << endl; nameCol = rec.indexOf("station_callsign"); aux1 = (query.value(nameCol)).toString(); if (aux1.length()<3) { nameCol = rec.indexOf("operator"); aux1 = (query.value(nameCol)).toString(); } out << aux1.leftJustified(13, ' ', true) << " "; nameCol = rec.indexOf("rst_sent"); aux1 = (query.value(nameCol)).toString(); aux1.truncate(3); out << aux1.leftJustified(3, ' ', true) << " "; //qDebug() << "ContestCQWWDXSSB::saveFileToSend: rsttx" << aux1 << endl; nameCol = rec.indexOf("stx"); aux1 = (query.value(nameCol)).toString(); aux1.truncate(6); out << aux1.leftJustified(6, ' ', true) << " "; nameCol = rec.indexOf("call"); aux1 = (query.value(nameCol)).toString(); aux1.truncate(13); out << aux1.leftJustified(13, ' ') << " "; nameCol = rec.indexOf("rst_rcvd"); aux1 = (query.value(nameCol)).toString(); out << aux1.leftJustified(3, ' ', true) << " "; nameCol = rec.indexOf("srx"); aux1 = (query.value(nameCol)).toString(); aux1.truncate(6); out << aux1.leftJustified(6, ' ', true) << " "; nameCol = rec.indexOf("transmiterid"); aux1 = (query.value(nameCol)).toString(); aux1.truncate(1); out << aux1 ; // out << "0"; // This is the RIG used to log the QSO. 1 is used as out << endl; } } out << "END-OF-LOG:" << endl; return true; } int ContestCQWWDXSSB::getTotalScore() { return (getMultipliers()) * (getPoints()); } int ContestCQWWDXSSB::getMultipliers() { int multipliers = 0; QSqlQuery query("SELECT * FROM log"); QSqlRecord rec = query.record(); int nameCol = rec.indexOf("multiplier"); while (query.next()) { if (query.isValid()) { multipliers += (query.value(nameCol)).toInt(); } } return multipliers; } int ContestCQWWDXSSB::getPoints() { int points = 0; QSqlQuery query("SELECT * FROM log"); QSqlRecord rec = query.record(); int nameCol = rec.indexOf("points"); while (query.next()) { if (query.isValid()) { points += (query.value(nameCol)).toInt(); } } return points; } klog-0.9.8.1/mainwindowinputeqsl.h0000644000175000017500000000711513532572307016110 0ustar develdevel#ifndef MAINWINDOWINPUTEQSL_H #define MAINWINDOWINPUTEQSL_H /*************************************************************************** mainwindowinputeqsl.h - description ------------------- begin : jun 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the eQSL options // #include #include #include #include "dataproxy.h" #include "utilities.h" class MainWindowInputEQSL : public QWidget { Q_OBJECT public: explicit MainWindowInputEQSL(DataProxy *dp, QWidget *parent = 0); //~MainWindowInputEQSL(); //void setData(const QString _comment); //QString getComment(); void clear(); QString getClubLogStatus(); QString getEQSLRecStatus(); QString getEQSLSenStatus(); QString getLOTWRecStatus(); QString getLOTWSenStatus(); void setClubLogStatus(const QString _qs); void setEQSLRecStatus(const QString _qs); void setEQSLSenStatus(const QString _qs); void setLOTWRecStatus(const QString _qs); void setLOTWSenStatus(const QString _qs); QDate getClubLogDate(); QDate getEQSLRecDate(); QDate getEQSLSenDate(); QDate getLOTWRecDate(); QDate getLOTWSenDate(); void setClubLogDate(const QDate _qs); void setEQSLRecDate(const QDate _qs); void setEQSLSenDate(const QDate _qs); void setLOTWRecDate(const QDate _qs); void setLOTWSenDate(const QDate _qs); signals: private slots: void slotClubLogComboBoxChanged(); void sloteQSLRecvComboBoxChanged(); void sloteQSLSentComboBoxChanged(); void slotLotwRecvComboBoxChanged(); void slotLotwSentComboBoxChanged(); private: void createUI(); void setDefaultData(); QComboBox *eqslSentComboBox, *eqslRecComboBox, *lotwSentComboBox, *lotwRecComboBox, *clublogComboBox; QDateEdit *eqslSentQDateEdit, *eqslRecQDateEdit, *lotwSentQDateEdit, *lotwRecQDateEdit, *clublogQDateEdit; DataProxy *dataProxy; Utilities *util; QStringList qslSentStatusList, qslRcvdStatusList, clubLogStatusList; }; #endif // MAINWINDOWINPUTEQSL_H klog-0.9.8.1/mainwindowinputqsl.cpp0000644000175000017500000002562213532572307016301 0ustar develdevel/*************************************************************************** mainwindowinputqsl.cpp - description ------------------- begin : jun 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the QSL options // #include "mainwindowinputqsl.h" MainWindowInputQSL::MainWindowInputQSL(DataProxy *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowInputQSL::MainWindowInputQSL" << endl; util = new Utilities; qslSentComboBox = new QComboBox; qslRecComboBox = new QComboBox; qslSentViaComboBox = new QComboBox; qslRecViaComboBox = new QComboBox; qslSentQDateEdit = new QDateEdit; qslRecQDateEdit = new QDateEdit; qslViaLineEdit = new QLineEdit; qslmsgTextEdit = new QTextEdit; dataProxy = dp; createUI(); setDefaultData(); clear(); //qDebug() << "MainWindowInputQSL::MainWindowInputQSL - END" << endl; } MainWindowInputQSL::~MainWindowInputQSL(){} void MainWindowInputQSL::createUI() { // QSL Tab definition starts here qslSentQDateEdit->setDisplayFormat("dd/MM/yyyy"); qslRecQDateEdit->setDisplayFormat("dd/MM/yyyy"); QLabel *QSLSentLabelN = new QLabel(tr("QSL Sent")); QSLSentLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *QSLRecLabelN = new QLabel(tr("QSL Rec")); QSLRecLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *QSLViaLabelN = new QLabel(tr("QSL Via")); QSLViaLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *QSLMsgLabelN = new QLabel(tr("QSL Msg")); QSLMsgLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); qslSentComboBox->setToolTip(tr("Status of the QSL sending.")); qslRecComboBox->setToolTip(tr("Status of the QSL reception.")); qslSentViaComboBox->setToolTip(tr("QSL sending information.")); qslRecViaComboBox->setToolTip(tr("QSL reception information.")); qslSentQDateEdit->setToolTip(tr("Date of the QSL sending.")); qslRecQDateEdit->setToolTip(tr("Date of the QSL reception.")); qslmsgTextEdit->setToolTip(tr("Message of the QSL.")); qslViaLineEdit->setToolTip(tr("QSL via information.")); QGridLayout *QSLLayout = new QGridLayout; QSLLayout->addWidget(QSLSentLabelN, 0, 0); QSLLayout->addWidget(QSLRecLabelN, 1, 0); QSLLayout->addWidget(QSLViaLabelN, 2, 0); QSLLayout->addWidget(QSLMsgLabelN, 3, 0); QSLLayout->addWidget(qslSentComboBox, 0, 1); QSLLayout->addWidget(qslRecComboBox, 1, 1); QSLLayout->addWidget(qslViaLineEdit, 2, 1, 1, -1); QSLLayout->addWidget(qslmsgTextEdit, 3, 1, 1, -1); QSLLayout->addWidget(qslSentQDateEdit, 0, 2); QSLLayout->addWidget(qslRecQDateEdit, 1, 2); QSLLayout->addWidget(qslSentViaComboBox, 0, 3); QSLLayout->addWidget(qslRecViaComboBox, 1, 3); setLayout(QSLLayout); connect(qslViaLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotQSLViaTextChanged() ) ) ; connect(qslRecComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotQSLRecvComboBoxChanged() ) ) ; connect(qslSentComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotQSLSentComboBoxChanged() ) ) ; connect(qslViaLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQSLViaLineEditReturnPressed() ) ); } void MainWindowInputQSL::setDefaultData() { qslSentStatusList.clear(); qslRcvdStatusList.clear(); qslViaList.clear(); qslSentStatusList = dataProxy->getQSLSentList(); qslRcvdStatusList = dataProxy->getQSLRcvdList(); qslViaList = dataProxy->getQSLViaList(); qslSentComboBox->addItems(qslSentStatusList); qslRecComboBox->addItems(qslRcvdStatusList); qslRecViaComboBox->addItems(qslViaList); qslSentViaComboBox->addItems(qslViaList); qslSentQDateEdit->setDate(util->getDefaultDate()); qslRecQDateEdit->setDate(util->getDefaultDate()); } void MainWindowInputQSL::clear() { qslSentComboBox->setCurrentIndex(1); qslRecComboBox->setCurrentIndex(1); qslRecViaComboBox->setCurrentIndex(0); qslSentViaComboBox->setCurrentIndex(0); qslSentQDateEdit->setDate(util->getDefaultDate()); qslRecQDateEdit->setDate(util->getDefaultDate()); qslmsgTextEdit->clear(); qslViaLineEdit->clear(); } void MainWindowInputQSL::qslViaClear() { qslViaLineEdit->clear(); } QString MainWindowInputQSL::getQSLRecStatus() { QString _pm = QString(); _pm = (((qslRecComboBox->currentText()).split('-')).at(0)).simplified(); return _pm; } QString MainWindowInputQSL::getQSLSenStatus() { QString _pm = QString(); _pm = (((qslSentComboBox->currentText()).split('-')).at(0)).simplified(); return _pm; } QString MainWindowInputQSL::getSentVia() { QString _pm = QString(); _pm = (((qslSentViaComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindow::getSentVia: " << _pm << endl; return _pm; } QString MainWindowInputQSL::getRecVia() { QString _pm = QString(); _pm = (((qslRecViaComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputQSL::getRecVia: " << _pm << endl; return _pm; } QString MainWindowInputQSL::getQSLVia() { return qslViaLineEdit->text(); } QString MainWindowInputQSL::getQSLMsg() { return qslmsgTextEdit->toPlainText(); } void MainWindowInputQSL::setQSLRecStatus(const QString _qs) { if(( qslRecComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { qslRecComboBox->setCurrentIndex( qslRecComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qslRecComboBox->setCurrentIndex(1); } } void MainWindowInputQSL::setQSLSenStatus(const QString _qs) { if(( qslSentComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { qslSentComboBox->setCurrentIndex( qslSentComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qslSentComboBox->setCurrentIndex(1); } } void MainWindowInputQSL::setQSLRecVia(const QString _qs) { if(( qslRecViaComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { qslRecViaComboBox->setCurrentIndex( qslRecViaComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qslRecViaComboBox->setCurrentIndex(0); // bureau by default } } void MainWindowInputQSL::setQSLSenVia(const QString _qs) { //qDebug() << "MainWindowInputQSL::setQSLSenVia: " << _qs << endl; if(( qslSentViaComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { qslSentViaComboBox->setCurrentIndex( qslSentViaComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qslSentViaComboBox->setCurrentIndex(0); // bureau by default } } void MainWindowInputQSL::setQSLVia(const QString _qs, QColor qColor) { palette.setColor(QPalette::Text, qColor); qslViaLineEdit->setPalette(palette); if (_qs.length()>0) { qslViaLineEdit->setText(_qs); } else { qslViaLineEdit->clear(); } } void MainWindowInputQSL::setQSLMsg(const QString _qs) { if (_qs.length()>0) { qslmsgTextEdit->setText(_qs); } else { qslmsgTextEdit->clear(); } } QDate MainWindowInputQSL::getQSLRecDate() { return qslRecQDateEdit->date(); } QDate MainWindowInputQSL::getQSLSenDate() { return qslSentQDateEdit->date(); } void MainWindowInputQSL::setQSLRecDate(const QDate _qs) { if (_qs.isValid()) { qslRecQDateEdit->setDate(_qs); } else { qslRecQDateEdit->clear(); } } void MainWindowInputQSL::setQSLSenDate(const QDate _qs) { if (_qs.isValid()) { qslSentQDateEdit->setDate(_qs); } else { qslSentQDateEdit->clear(); } } void MainWindowInputQSL::slotQSLViaTextChanged() { //qDebug() << "MainWindow::slotQSLViaTextChanged: " << qslViaLineEdit->text() << " / Length: " << QString::number((qslViaLineEdit->text()).size()) << endl; qslViaLineEdit->setText((qslViaLineEdit->text()).toUpper()); } void MainWindowInputQSL::slotQSLSentComboBoxChanged(){ int i = qslSentComboBox->currentIndex(); //{Y, N, R, I, V} //(QSLSDATE is only valid if QSL_SENT is Y-0, Q-3, or I-4) // Y-Yes = 0 // N-No = 1 // R-Requested = 2 // Q-Queued = 3 // I-Ignore = 4 switch (i) { case 0: qslSentQDateEdit->setEnabled(true); qslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: break; case 3: qslSentQDateEdit->setEnabled(true); break; case 4: qslSentQDateEdit->setEnabled(true); break; default: //NO qslSentQDateEdit->setEnabled(false); break; } } void MainWindowInputQSL::slotQSLRecvComboBoxChanged(){ int i = qslRecComboBox->currentIndex(); //{Y, N, R, I, V} //(QSLSDATE is only valid if QSL_SENT is Y-0, Q-3, or I-4) // Y-Yes = 0 // N-No = 1 // R-Requested = 2 // Q-Queued = 3 // I-Ignore = 4 switch (i) { case 0: qslRecQDateEdit->setEnabled(true); qslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: break; case 3: qslRecQDateEdit->setEnabled(true); break; case 4: qslRecQDateEdit->setEnabled(true); break; default: //NO qslRecQDateEdit->setEnabled(false); break; } } void MainWindowInputQSL::slotQSLViaLineEditReturnPressed() { emit returnPressed(); } klog-0.9.8.1/mainwindow.h0000644000175000017500000005237113532572307014147 0ustar develdevel#ifndef MAINWINDOW_H #define MAINWINDOW_H /*************************************************************************** mainwindow.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include "database.h" #include "setupdialog.h" //#include "helpaboutdialog.h" #include "aboutdialog.h" #include "world.h" #include "filemanager.h" #include "contest.h" #include "contest_cqwwdxssb.h" #include "dataproxy.h" #include "dataproxy_sqlite.h" #include "locator.h" #include "dxcluster.h" #include "awards.h" #include "mainwindowsattab.h" #include "mainwindowmydatatab.h" #include "mainwindowinputcomment.h" #include "mainwindowinputothers.h" #include "mainwindowinputeqsl.h" #include "mainwindowinputqsl.h" #include "elogclublog.h" #include "utilities.h" #include "downloadcty.h" #include "dxccstatuswidget.h" #include "softwareupdate.h" #include "logmodel.h" #include "logwindow.h" #include "searchwidget.h" #include "infowidget.h" #include "showerrordialog.h" #include "udpserver.h" #include "statisticswidget.h" #include "updatesatsdata.h" #include "hamlibclass.h" class QTimer; class QDateTime; class QPushButton; class QLineEdit; class QComboBox; class QTimeEdit; class QDateEdit; //class QStatusBar; class QMenuBar; class QMenu; class QMessageBox; class QTextEdit; class QProgressDialog; class QPoint; class QGroupBox; class QTabWidget; class QFrame; class QTableView; class QLabel; enum { Log_Id = 0, Log_Name = 1, Log_BandId = 2, Log_ModeId = 3, Log_DateId = 4, Log_TimeId = 5 }; enum { DX = 0, NoContest = 0, CQ_WW_SSB = 1, CQ_WW_CW = 2, CQ_WPX_SSB = 3, CQ_WPX_CW = 4, CQ_WPX_RTTY = 5 }; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(const QString _klogDir, const QString tversion); ~MainWindow(); private slots: //void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); void slotClearNoMorErrorShown(); void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, int errorCodeN, QString queryFailed); void slotQRZReturnPressed(); void slotQRZSpacePressed(); void slotQRZTextChanged(); void slotSRXTextChanged(); void slotSTXTextChanged(); void slotUpdateLocator(QString _loc); void slotLocatorTextChanged(); void slotMyLocatorTextChanged(); void slotFreqTXChanged(); void slotFreqRXChanged(); void slotSearchBoxTextChanged(); void slotCloseStats(bool _vis); void slotSearchToolNeededQSLToSend(); void slotToolSearchRequestedQSLToSend(); void slotToolSearchNeededQSLPendingToReceive(); void slotToolSearchNeededQSLRequested(); void slotToolLoTWMarkAllQueuedThisLog(); void slotToolLoTWMarkAllQueued(); void slotToolLoTWMarkAllYesThisLog(); void slotToolLoTWMarkAllYes(); void slotModeComboBoxChanged(); void slotBandComboBoxChanged(); //void slotIOTAComboBoxChanged(); void slotOperatingYearComboBoxChanged(); void slotOKButtonClicked(); void slotSpotItButtonClicked(); void slotClearButtonClicked(); void slotRefreshDXCCWidget(); void slotUpdateTime(); void slotLogWinShow(); void slotLogRefresh(); void slotScoreWinShow(); void slotQSODelete(const int _id); void slotShowAwards(); void slotUpdateStatusBar(const QString statusm); void slotSetup(const int _page=0); void slotrstTXTextChanged(); void slotrstRXTextChanged(); void slotADIFExport(); void slotLoTWImport(); void slotLoTWExport(); void slotADIFExportAll(); void slotADIFImport(); void slotRQSLExport(); void slotCabrilloExport(); //void slotQSLViaTextChanged(); void slotTimeOutInfoBars(); // Clears the infoLabels when the timeout emits the signal void slotSetPropMode(const QString _p); void slotFillEmptyDXCCInTheLog(); void slotUpdateCTYDAT(); void slotUpdateSATSDAT(); void slotShowStats(); void slotWorldReload(); void slotExitFromSlotDialog(const int exitID); //void slotDownloadFinished(QNetworkReply *reply); void fillQSOData(); void newFile(); void openFile(); bool saveFile(const QString _fileName); bool saveFileAs(); bool slotOpenKLogFolder(); void slotFilePrint(); //void slotFileClose(); //void slotHelpHelpAction(); void slotHelpAboutAction(); void slotHelpCheckUpdatesAction(); void slotAboutQt(); void slotRecalculateAwardsButtonClicked(); // logpanel //void slotRighButtonFromLog( const QPoint& pos); void slotDoubleClickLog( const int _qsoID); //void slotDoubleClickLog( const QModelIndex & index); //SEARCH void slotShowSearchWidget(); // The SearchWidget request being shown //SEARCH // CLUSTER void slotAnalyzeDxClusterSignal(const QStringList _qs); // CLUSTER //CLUBLOG void slotElogClubLogShowMessage(const QString _s); void slotElogClubLogProcessAnswer(const int _i, const int _qID); void slotElogClubLogDisable(const bool _b); //CLUBLOG void slotShowSoftUpdateResults(const bool _b); // Software Update: Receives the signal to see if it is needed or not to update //SATELLITE //void slotSatBandTXComboBoxChanged(const QString _q); void slotDefineNewBands (const QStringList _bands); void slotSatTXFreqNeeded(const double _f); void slotSatRXFreqNeeded(const double _f); void slotSatChangeRXFreq(const double _f); void slotSatChangeTXFreq(const double _f); //HAMLIB void slotHamlibTXFreqChanged(const double _f); void slotHamlibModeChanged(const QString _m); //DXCCWIDGET void slotShowQSOFromDXCCWidget(const int _q); void slotShowQSOsFromDXCCWidget(QList _qsos); //UDP Server (WXJT-x) void slotWSJXstatusFromUDPServer(const int _type, const QString _dxcall, const double _freq, const QString _mode, const QString _report, const QString _de_call, const QString _de_grid, const QString _dx_grid, const QString _sub_mode); void slotWSJTXloggedQSO(const int _type, const QString _dxcall, const double _freq, const QString _mode, const QString _dx_grid, const QString _time_off, const QString _report_sent, const QString _report_rec, const QString _tx_power, const QString _comments, const QString _name, const QString _time_on, const QString _de_call, const QString _de_grid); private: bool maybeSave(); void updateBandComboBox(const QString _band); UpdateSatsData *updateSatsData; //UPDATE CTY.DAT DownLoadCTY *downloadcty; HamLibClass *hamlib; bool hamlibActive; // void createStatusBar(); void createUI(); void createUICQWW(); void createUIDX(); void reconfigureDXMarathonUI(const bool _dxM); //void createDXClusterUI(); void clearBandLabels(); void createMenusCommon(); void createMenusCQWW(); void createActionsCommon(); void createActionsCQWW(); void createActionsDX(); void createScorePanel(); void initialContestModeConfiguration(); bool readCtyFile(); bool isQSLReceived(const int _qsoId); bool isQSLSent(const int _qsoId); bool validCharactersInCall(const QString _qrz); // Looks for SQLi and no valid chars in the QRZ QString readDataFromUI(); // Reads the QSO data from the UI and returns the SQL Query QString readDataFromUIDX(); QString readDataFromUIDXModifying(); void actionsJustAfterAddingOneQSO(); void clearForNextQSO(); void clearUIDX(bool full=false); //full= false leaves some data to allow pileup or normal Dx in same band; full removes freqs and everything void setAwardDXCC(const int _qsoId, bool modifying); // Adds or modify the status of a DXCC entity // data << dxcc(id) << band(id) << mode(id) << confirmed(0/1) << qsoid(id) << modify(0/1); void checkIfWorkedB4(const QString _qrz); bool checkContest(); void showStatusOfDXCC(const QStringList _qs); void showDXMarathonNeeded(const int _dxcc, const int _cqz, const int _year, const int _log); bool createConnection(); void createData(); bool processConfigLine(const QString _line); void readConfigData(); void defineStationCallsign(); QString selectStationCallsign(); void checkIfNewBandOrMode(); void selectDefaultBand(); void selectDefaultMode(); void readActiveBands (const QStringList actives); void readActiveModes (const QStringList actives); bool checkIfNewMode(const QString _mode); void addNewValidMode(const QString _mode); void qsoToEdit (const int _qso); void completeWithPreviousQSO(const QString _call); void showAwards(); void showDXMarathon(const int _year); void updateQSLRecAndSent(); double checkFreqRanges(double _f); void setRSTToMode(const QString _m); // CLUSTER void clusterSpotToLog(const QString _call, const QString _freq); QStringList dxclusterServersList; QString dxclusterServerToConnect; int dxclusterServerPort; // CLUSTER QWidget *mainWidget; //QWidget *dxClusterTabWidget;//, *searchTabWidget; World *world; FileManager *filemanager; Locator *locator; Awards *awards; Utilities *util; //WorldEditorWidget *worldEditor; //HelpHelpDialog *helpHelpDialog; //HelpAboutDialog *helpAboutDialog; AboutDialog *aboutDialog; QPushButton *addButton; //QLabel *distShortLabelN; //QLabel *distLongLabelN; StatisticsWidget *statsWidget; DXCCStatusWidget *dxccStatusWidget; //QSqlRelationalTableModel *logModel; //QWidget *logPanel; //QTableView *logView; //QTreeWidget *searchResultsTreeWidget; QLabel *logLabel; QWidget *scoreWindow; //, dxWindow; QTextEdit *scoreTextEdit; LogModel *logModel; LogWindow *logWindow; UDPServer *UDPLogServer; ShowErrorDialog *showErrorDialog; // QGroupBox *gridGroupBox, *qrzgroupBox;//, *searchgroupBox; QFrame *dxUpLeftInputFrame;//, *dxUpRightOutputFrame; QLineEdit *qrzLineEdit, *nameLineEdit, *qthLineEdit, *locatorLineEdit; QComboBox *bandComboBox, *modeComboBox; QDateEdit *dateEdit; QTimeEdit *timeEdit; //QStatusBar *statusBar, *qsoStatusBar; QString statusBarMessage; QTabWidget *dxBottonTab, *dxUpLeftTab, *dxUpRightTab; QMenu *fileMenu; QMenu *toolMenu; QMenu *qslToolMenu; QMenu *lotwToolMenu; //QMenu *lotwMarkAllAsQueuedMenu; //QMenu *lotwMarkAllInThisLogAsQueuedMenu; QMenu *viewMenu; QMenu *setupMenu; QMenu *helpMenu; QAction *klogFolderAct; QAction *openAct; QAction *saveAct; QAction *exitAct; QAction *printLogAct; QAction *addAct; QAction *editAct; QAction *removeAct; QAction *logWinAct; QAction *setupAct; QAction *helpAct; QAction *aboutAct; QAction *aboutQtAct; QAction *updateAct; QAction *scoreWinAct; QAction *scoreeWinAct; QAction *ADIFExport; QAction *ADIFExportAll; QAction *ADIFImport; QAction *LoTWExport; QAction *LoTWImport; QAction *ReqQSLExport; QAction *CabrilloExport; QAction *fillQsoAct; QAction *fillDXCCAct; QAction *findQSO2QSLAct; QAction *findRequestedQSLAct; QAction *findQSLPendingToReceiveAct; QAction *findQSLDXRequestedAct; QAction *lotwMarkSentQueuedThisLogAct; QAction *lotwMarkSentQueuedAct; QAction *lotwMarkSentYesThisLogAct; QAction *lotwMarkSentYesAct; QAction *downloadCTYAct; QAction *downloadSATSAct; QAction *showStatsAct; QAction *loggWinAct; /* QAction *delQSOFromLogAct; QAction *qsoToEditFromLogAct; QAction *qslSentViaBureauFromLogAct; QAction *qslSentViaDirectFromLogAct; QAction *qslRecViaBureauFromLogAct; QAction *qslRecViaDirectFromLogAct; */ QAction *qslSentRequestedAct; QAction *qslRecRequestedAct; //QAction *delQSOFromSearchAct; //QAction *qsoToEditFromSearchAct; //QAction *qslSentViaBureauFromSearchAct; //QAction *qslSentViaDirectFromSearchAct; //QAction *qslSentViaDirectMarkRcvReqFromSearchAct; //QAction *qslSentViaBureauMarkRcvReqFromSearchAct; //QAction *qslRecViaBureauFromSearchAct; //QAction *qslRecViaDirectFromSearchAct; //QAction *qslRecViaBureauMarkReqFromSearchAct; //QAction *qslRecViaDirectMarkReqFromSearchAct; QLineEdit *rstTXLineEdit; QLineEdit *rstRXLineEdit; QLineEdit *STXLineEdit; QLineEdit *SRXLineEdit; QPushButton *OKButton, *spotItButton, *clearButton; QStringList bands; QStringList modes; QStringList entitiesList, propModeList; // UI DX //QLabel *entitySecLabel, *iotaAwardLabel, *entityNameLabel, *propModeLabel; //entityPrimLabel QLabel *infoLabel1, *infoLabel2, *dxMarathonLabelN, *dxMarathonTopScoreLabelN; //QPushButton *flagIcon; // To paint a flag of the worked entity //QLabel *bandLabel1, *bandLabel2, *bandLabel3, *bandLabel4; //QLabel *bandLabel5, *bandLabel6, *bandLabel7, *bandLabel8; //QLabel *bandLabel9, *bandLabel10, *bandLabel11, *bandLabel12; //QLabel *continentLabel, *prefixLabel, *cqzLabel, *ituzLabel; //QLabel *gradShortLabel, *distShortLabel; //QLabel *gradLongLabel, *distLongLabel; //QComboBox *iotaContinentComboBox, *entityPrimDivComboBox, *entitySecDivComboBox, *entityNameComboBox, *propModeComboBox; QComboBox *operatingYearsComboBox; QLineEdit *operatorLineEdit, *stationCallSignLineEdit, *myLocatorLineEdit;//, *commentLineEdit, *iotaNumberLineEdit; QTextEdit *notesTextEdit; QDoubleSpinBox *rxPowerSpinBox, *txFreqSpinBox, *rxFreqSpinBox; //*myPowerSpinBox, QLCDNumber *freqQLCDNumber; QLCDNumber *dxccConfirmedQLCDNumber, *dxccWorkedQLCDNumber, *wazConfirmedQLCDNumber, *wazWorkedQLCDNumber, *localConfirmedQLCDNumber, *localWorkedQLCDNumber, *qsoConfirmedQLCDNumber, *qsoWorkedQLCDNumber, *dxMarathonQSOLCDNumber, *dxMarathonDXCCQLCDNumber, *dxMarathonCQQLCDNumber, *dxMarathonPointsQLCDNumber; //eQSL //QComboBox *eqslSentComboBox, *eqslRecComboBox, *lotwSentComboBox, *lotwRecComboBox, *clublogComboBox; //QDateEdit *eqslSentQDateEdit, *eqslRecQDateEdit, *lotwSentQDateEdit, *lotwRecQDateEdit, *clublogQDateEdit; //QComboBox *qslSentComboBox, *qslRecComboBox, *qslSentViaComboBox, *qslRecViaComboBox; //QDateEdit *qslSentQDateEdit, *qslRecQDateEdit; //QTextEdit *qslmsgTextEdit; //QLineEdit *qslViaLineEdit; //QLineEdit *searchBoxLineEdit; //QPushButton *searchBoxClearButton, *searchBoxExportButton, *searchBoxSelectAllButton, *searchBoxReSearchButton; //QRadioButton *searchAllRadioButton; QPushButton *recalculateAwardsButton; //bool searchSelectAllClicked, stationCallSignShownInSearch; bool checkNewVersions, reportInfo; // Selected in the Setup->Misc to check if new versions and report info back to KLog's servers bool txFreqBeingChanged, rxFreqBeingChanged, updatingBands; // When the freqs is being modified it is defined to true to prevent other automated to change. bool txFreqBeingAutoChanged, rxFreqBeingAutoChanged; // This is defined to true when freq is being changed by the Sat tab to prevent a loop. bool qslingNeeded; bool noMoreErrorShown; // If true, the errors shown in slotQueryErrorManagement will not be shown anymore in that KLog execution bool noMoreModeErrorShown; // If true, the non-valid modes received from WSJT-x will not be showed to the user bool wsjtxAutoLog; // If true, logged QSO are automatically logged into the log when sent from WSJTX MainWindowSatTab *satTabWidget; MainWindowMyDataTab *myDataTabWidget; MainWindowInputComment *commentTabWidget; MainWindowInputOthers *othersTabWidget; MainWindowInputEQSL *eQSLTabWidget; MainWindowInputQSL *QSLTabWidget; SearchWidget *searchWidget; InfoWidget *infoWidget; bool keepSatPage; // UI DX SetupDialog *setupDialog; // DXClusterWidget *dxClusterWidget; bool dxClusterShowHF, dxClusterShowVHF, dxClusterShowWARC, dxClusterShowWorked, dxClusterShowConfirmed, dxClusterShowAnn, dxClusterShowWWV, dxClusterShowWCY; //QWidget *dxClusterWidget; //QListWidget *dxClusterListWidget; //QPushButton *sendDXClusterButton; //QLineEdit *inputDXClusterLineEdit; // // int infoTimeout; // timeout that temporary info will stay in the infobars QTimer *timer, *timerInfoBars; QDateTime *dateTime; QString infoLabel1T, infoLabel2T; QString klogDir, ctyDatFile, defaultADIFLogFile, configFileName; QString softwareVersion; bool itIsANewversion; QString currentQrz; QString previousQrz; QString stx; QString srx; QPalette palRed, palBlack; // To paint Text in red or black(normal) bool realTime, UTCTime, alwaysADIF, needToSave, useDefaultLogFileName, upAndRunning, qrzSmallModDontCalculate, imperialSystem, sendQSLWhenRec, manageDxMarathon, keepMyData, completeWithPrevious, completedWithPreviousQTH, completedWithPreviousLocator, completedWithPreviousName, completedWithPreviousIOTA, completedWithPreviousQSLVia; bool cleaning; bool manageMode; // If true, the DXCC and awards will take the mode into consideration to decide if needed or worked. False implies only band is taken into account // Station Setup bool configured, modify; bool needToEnd; // Just to control if the software needs to end. bool qrzAutoChanging; //To stop executing the slotQRZTextChanged just because KLog uppercase a letter QString mainQRZ, stationQRZ, operatorQRZ, myLocator, dxLocator; QString lastOperatorQRZ, lastStationQRZ, lastMyLocator; double myPower, lastPower; int my_CQz, my_ITUz, defaultMode, defaultBand, currentMode, currentModeShown, currentBand, currentBandShown; int currentEntity, previousEntity; bool InValidCharsInPrevCall; int currentLog; // This is to be able to manage multiple logs without showing // them all at the same time. int modifyingQSO; // When modifying, the QSO is saved here. int selectedYear; // Station Setup QColor defaultColor; QColor neededColor; QColor workedColor; QColor confirmedColor; QColor newOneColor; // bool clublogActive, clublogRealTime; QString clublogUser, clublogPass, clublogEmail; eLogClubLog *elogClublog; int clublogAnswer; QStringList clublogPrevQSO; // // Contest int points, qsoPoints, multipliers, qsoMultiplier; QString contestMode; Contest *contest; // Contest DataProxy *dataProxy; DataBase *db; bool DBinMemory; QTextDocument *doc; SoftwareUpdate *softUpdate; bool callingUpdate; bool UDPServerStart; //LOGVIEW //QString bandOld, modeOld; //LOGVIEW signals: void queryError(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); // To alert about any failed query execution protected: void keyPressEvent(QKeyEvent *event); void closeEvent(QCloseEvent *event); }; #endif klog-0.9.8.1/filemanager.cpp0000644000175000017500000071371513532572307014606 0ustar develdevel/*************************************************************************** filemanager.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "filemanager.h" //#include FileManager::FileManager(DataProxy *dp) { //qDebug() << "FileManager::FileManager()-1" << endl; constrid = 1; dataProxy = dp; util = new Utilities; klogVersion = util->getVersion(); db = new DataBase(Q_FUNC_INFO, klogVersion, util->getKLogDBFile()); ignoreUnknownAlways = false; world = new World(dataProxy, Q_FUNC_INFO); awards = new Awards(dataProxy, Q_FUNC_INFO); //dataProxyPrepared = new DataProxy_SQLite(klogVersion); noMoreQso = false; hashLogs.clear(); //qDebug() << "FileManager::FileManager()-1 - END" << endl; } /* FileManager::FileManager(DataProxy *dp, const QString _klogDir) { //qDebug() << "FileManager::FileManager()-2: Dir" << _klogDir << endl; dataProxy = dp; db = new DataBase(0); util = new Utilities; ignoreUnknownAlways = false; world = new World(dataProxy, klogDir); awards = new Awards(dataProxy); klogVersion = util->getVersion(); dataProxyPrepared = new DataProxy_SQLite(klogVersion); noMoreQso = false; hashLogs.clear(); klogDir = util->getHomeDir(); } */ FileManager::FileManager(DataProxy *dp, const QString _klogDir, const QString _softVersion) //FileManager::FileManager(const QString _klogDir, const QString _softVersion, DataBase _db) { //qDebug() << "FileManager::FileManager()-3: Dir(2)" << _klogDir << endl; constrid = 2; dataProxy = dp; util = new Utilities; util->setVersion(klogVersion); db = new DataBase(Q_FUNC_INFO, klogVersion, util->getKLogDBFile()); klogVersion = _softVersion; //dataProxyPrepared = new DataProxy_SQLite(klogVersion); klogDir = _klogDir; ignoreUnknownAlways = false; world = new World(dataProxy, klogDir, Q_FUNC_INFO); awards = new Awards(dataProxy, Q_FUNC_INFO); noMoreQso = false; hashLogs.clear(); //qDebug() << "FileManager::FileManager()-3: Dir(2) - END" << endl; } FileManager::~FileManager() { } bool FileManager::checkADIFValidFormat(const QStringList _qs) { QStringList qs = _qs; if (qs.size()!= 2) { //qDebug() << "FileManager::checkADIFValidFormat-0 (not two) " << endl; return false; } QString q0 = qs.at(0); QString q1 = qs.at(1); //qDebug() << "FileManager::checkADIFValidFormat: " << qs.at(0) << endl; //qDebug() << "FileManager::checkADIFValidFormat: " << qs.at(1) << endl; int len = 0; int i = (qs.at(0)).count(":"); if (i == 2) { // DATE:8:D / 20141020 len = (q0.section(':', 1, 1)).toInt(); } else if (i == 1) { // DATE:8 / 20141020 len = (q0.section(':', 1, 1)).toInt(); } else { //qDebug() << "FileManager::checkADIFValidFormat-1 " << endl; return false; } //i = (qs.at(0)).indexOf(":"); //i = (qs.at(0)).length() - i -1; //qDebug() << "i = " << QString::number(i) << "/" << qs.at(0) << endl; //len = ( (qs.at(0)).right(i)).toInt(); //qDebug() << "len = " << QString::number(len) << endl; if ( (q1).length() != len ) { //qDebug() << "FileManager::checkADIFValidFormat-2: " << (qs.at(1)) << " - " << QString::number((qs.at(1)).length()) << "/" << QString::number(len) << endl; return false; } if (len <= 0) { //qDebug() << "FileManager::checkADIFValidFormat-3 " << endl; return false; } //qDebug() << "FileManager::checkADIFValidFormat-4 (true)" << endl; return true; } bool FileManager::adifLogExport(const QString& _fileName, const int _logN) { //qDebug() << "FileManager::adifLogExport" << endl; return adifLogExportToFile(_fileName, _logN, false, false, false); } int FileManager::adifLoTWLogExport(const QString& _fileName, const int _logN) { //qDebug() << "FileManager::adifLoTWLogExport: " << _fileName << endl; if (!dataProxy->doesThisLogExist(_logN)) { //qDebug() << "FileManager::adifLoTWLogExport - The log does not exist" << endl; return -1; } QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return -2; QString stationCallToUse = QString(); QStringList stationCallSigns; stationCallSigns.clear(); stationCallSigns << "NONE"; stationCallSigns << dataProxy->getStationCallSignsFromLog(_logN); //bool callsignTyped = false; if (stationCallSigns.length()>1) { QString msg = QString(tr("The log that you have selected contains more than just one station callsign.") + "\n\n" + tr("Please select the station callsign you want to export the log from:")); bool ok; stationCallToUse = QInputDialog::getItem(this, tr("Station Callsign:"), msg, stationCallSigns, 0, false, &ok); if (ok && !stationCallToUse.isEmpty()) { //qDebug() << "FileManager::adifLoTWLogExport: StatioNCallsign: " << stationCallToUse << endl; } else { stationCallToUse = (QInputDialog::getText(this, tr("Define Station Callsign"), tr("You have selected no callsign. KLog will export QSOs without a station callsign defined and those with the call you are entering here.") + "\n\n" + tr("Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined:"), QLineEdit::Normal, "", &ok)).toUpper(); if (ok) { //callsignTyped = true; } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); QString aux = QString(tr("No station callsign has been selected and therefore no log will be exported") ); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: // Ok was clicked return -3; break; default: // should never be reached break; } } } } QTextStream out(&file); int numberOfQsos = dataProxy->getHowManyQSOInLog(_logN); int step = util->getProgresStepForDialog(numberOfQsos); int i = 0; QProgressDialog progress(tr("Writing ADIF file..."), tr("Abort writing"), 0, numberOfQsos, this); progress.setMaximum(numberOfQsos); progress.setWindowModality(Qt::ApplicationModal); out << "ADIF v3.0.7 Export from KLog\nhttp://www.klog.xyz/klog\n" << klogVersion << "\nKLOG" << endl; out << "" << QString::number(numberOfQsos) << endl; QDateTime dateTime = (QDateTime::currentDateTime()).toUTC(); out << "" << dateTime.toString("yyyyMMdd-hhmm") << endl; out << "" << endl; QString queryString = QString("SELECT call, freq, bandid, band_rx, freq_rx, modeid, qso_date, time_on, prop_mode, sat_name, lotw_qsl_sent, station_callsign FROM log WHERE lognumber='%1'").arg(_logN); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "FileManager::adifLoTWLogExport: " << query.lastQuery() << endl; if (!sqlOK) { //qDebug() << "FileManager::adifLoTWLogExport: Query Error" << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); return -4; } QSqlRecord rec = query.record(); int nameCol; QString aux, aux2; QString bandst, bandrxst; bool propsat; while ( (query.next())) { //qDebug() << "FileManager::adifLoTWLogExport: Start of While" << endl; if (query.isValid()) { nameCol = rec.indexOf("station_callsign"); aux = (query.value(nameCol)).toString(); if ( ( (stationCallToUse == "NONE") && util->isValidCall(aux) ) || (aux == stationCallToUse) ) { // We are only exporting the QSO from the appropriate station callsign or with empty stationcallsigns but we will add the one entered by the user. nameCol = rec.indexOf("lotw_qsl_sent"); aux = (query.value(nameCol)).toString(); if (aux == "Q") { //qDebug() << "FileManager::adifLoTWLogExport: Start of isValid" << endl; propsat = false; // Reset the QSO in case it is a Satellite QSO nameCol = rec.indexOf("call"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "FileManager::adifLoTWLogExport: " << QString::number(nameCol) << "/" << aux << endl; if (aux.length()>0) { out << "" << aux<< " "; } //qDebug() << "FileManager::adifLoTWLogExport: CALL" << endl; nameCol = rec.indexOf("qso_date"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length()) == 10){ aux.remove(QChar('-'), Qt::CaseInsensitive); aux.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux << " "; } } nameCol = rec.indexOf("time_on"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "FileManager::adifLoTWLogExportToFile-time_on: " << aux << endl; if ( ((aux.length()) == 5) || ((aux.length()) == 8) ){ aux.remove(QChar(':'), Qt::CaseInsensitive); out << "" << aux << " "; } nameCol = rec.indexOf("bandid"); aux = (query.value(nameCol)).toString(); //qDebug() << "FileManager::adifLoTWLogExportToFile-Band-1: " << aux << endl; aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "FileManager::adifLoTWLogExportToFile-Band-2: " << aux << endl; //aux = db->getBandNameFromID2(aux.toInt()); aux = dataProxy->getNameFromBandId(aux.toInt()); //qDebug() << "FileManager::adifLoTWLogExportToFile-Band-3: " << aux << endl; if (dataProxy->getIdFromBandName(aux)>=0) { out << "" << aux << " "; bandst = aux; } nameCol = rec.indexOf("band_rx"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); aux = dataProxy->getNameFromBandId(aux.toInt()); if ( dataProxy->getIdFromBandName(aux)>=0) { out << "" << aux << " "; QString bandrxst = aux; } //qDebug() << "FileManager::adifLoTWLogExport: BAND_RX" << endl; nameCol = rec.indexOf("modeid"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); // get SubModeId to check if it is the same or not from modeid aux2 = dataProxy->getSubModeFromId(aux.toInt()); //aux = db->getModeNameFromID2(aux.toInt()); aux = dataProxy->getNameFromSubMode(aux2); //qDebug() << "FileManager::adifLoTWLogExportToFile - MODE aux2: " << aux2 << endl; //qDebug() << "FileManager::adifLoTWLogExportToFile - MODE aux: " << aux << endl; if ((aux.length()>1) && (dataProxy->getIdFromModeName(aux)>=0)) { //haveMode = true; out << "" << aux << " "; } if ((aux != aux2) && (aux.length()>1) && (dataProxy->getSubModeIdFromSubMode(aux2)>=0) ) { //haveMode = true; out << "" << aux2 << " "; } //qDebug() << "FileManager::adifLoTWLogExport: SUBMODE: " << aux2 << endl; nameCol = rec.indexOf("freq"); aux = (query.value(nameCol)).toString(); //qDebug() << "FileManager::adifLoTWLogExportToFile FREQ1: " << aux << endl; aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ //TODO: Check if the Band is correctly defined. BAND Wins and freq is lost if not correct if (dataProxy->getBandIdFromFreq(aux.toDouble()) == dataProxy->getIdFromBandName(bandst)) //if (db->isThisFreqInBand(bandst, aux)) { out << "" << aux << " "; } } //qDebug() << "FileManager::adifLoTWLogExport: FREQ" << endl; nameCol = rec.indexOf("freq_rx"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ //TODO: Check if the Band is correctly defined. BAND Wins and freq is lost if not correct if (dataProxy->getBandIdFromFreq(aux.toDouble()) == dataProxy->getIdFromBandName(bandrxst)) //if (db->isThisFreqInBand(bandrxst, aux)) { out << "" << aux << " "; } } //qDebug() << "FileManager::adifLoTWLogExport: FREQ_RX" << endl; nameCol = rec.indexOf("prop_mode"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>1){ out << "" << aux << " "; if (aux == "SAT") { propsat = true; } } //qDebug() << "FileManager::adifLoTWLogExport: PROP_MODE" << endl; nameCol = rec.indexOf("sat_name"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; if (!propsat) { out << "SAT "; } } //qDebug() << "FileManager::adifLoTWLogExport: SAT_NAME" << endl; out << " " << endl; i++; if (( (i % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << "FileManager::adifLoTWLogExport: MOD 0 - i = " << QString::number(i) << endl; aux = tr("Exporting LoTW ADIF file...") + "\n" + tr(" QSO: ") + QString::number(i) + "/" + QString::number(numberOfQsos); progress.setLabelText(aux); progress.setValue(i); } else { //qDebug() << "FileManager::adifLoTWLogExport: Mod: "<< QString::number(i) << " mod " << QString::number(step) << " = " << QString::number(i % step) << endl; } } } } //qDebug() << "FileManager::adifLoTWLogExport: End Of Valid" << endl; } //qDebug() << "FileManager::adifLoTWLogExport: End of While " << endl; return i; } bool FileManager::adifLogExportToFile(const QString& _fileName, const int _logN, bool justMarked, bool _qslRequested , bool _lotw) { // If _logN = 0, then we will export ALL the logs. //qDebug() << "FileManager::adifLogExportToFile: " << _fileName << endl; bool exportJustMarkedQSO = justMarked; //bool marked = false; bool exportOnlyQSLRequested = _qslRequested; //bool haveMode = false; noMoreQso = false; QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return false; QTextStream out(&file); QString aux1, aux2, queryString, bandst, bandrxst; // bandst & bandrxst are to check if the band is properly defined int nameCol = 0; QSqlQuery query1; int numberOfQsos = 0; int currentQso = 0; //bool noMoreQso = false; int step = 1; bool propsat=false; // Just to check if we have added the prop_mode needed by LOTW when SAT QSO //bool bandOK = false; // Just to check if the band is properly defined bool exportAll = false; if (_logN <=0) { exportAll = true; } else { exportAll = false; } bandst = QString(); bandrxst = QString(); if (exportJustMarkedQSO) { //TODO: Count the marked QSO and adjust the numberOfQsos numberOfQsos = 0; QSqlQuery query; if (exportAll) { queryString = QString("SELECT marked FROM log"); } else { queryString = QString("SELECT marked FROM log WHERE lognumber='%1'").arg(_logN); } bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } QSqlRecord rec = query.record(); while ( (query.next())) { if (query.isValid()) { nameCol = rec.indexOf("marked"); aux1 = (query.value(nameCol)).toString(); if (aux1 == "X") { numberOfQsos++; } else { } } else { } } //qDebug() << "FileManager::adifLogExportToFile - numberOfQsos = " << QString::number(numberOfQsos)<< endl; } else { if (exportAll) { aux1 = "SELECT count(id) FROM log"; } else { aux1 = QString("SELECT count(id) FROM log WHERE lognumber='%1'").arg(_logN); } bool sqlOK = query1.exec(aux1); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().number(), query1.lastQuery()); } query1.next(); if (query1.isValid()) { numberOfQsos = (query1.value(0)).toInt(); } //qDebug() << "FileManager::adifLogExportToFile - numberOfQsos = " << QString::number(numberOfQsos)<< endl; } //qDebug() << "FileManager::adifLogExportToFile END - numberOfQsos = " << QString::number(numberOfQsos) << endl; step = util->getProgresStepForDialog(numberOfQsos); //step = getProgresStepForDialog(numberOfQsos); QProgressDialog progress(tr("Writing ADIF file..."), tr("Abort writing"), 0, numberOfQsos, this); progress.setMaximum(numberOfQsos); progress.setWindowModality(Qt::ApplicationModal); out << "ADIF v3.0.7 Export from KLog\nhttp://www.klog.xyz/klog\n" << klogVersion << "\nKLOG" << endl; out << "" << QString::number(numberOfQsos) << endl; QDateTime dateTime = (QDateTime::currentDateTime()).toUTC(); out << "" << dateTime.toString("yyyyMMdd-hhmm") << endl; out << "" << endl; if (exportAll) { queryString = QString("SELECT * FROM log"); } else { queryString = QString("SELECT * FROM log WHERE lognumber='%1'").arg(_logN); } QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } //QSqlQuery query("SELECT * FROM log"); QSqlRecord rec = query.record(); //qDebug() << "FileManager::adifLogExportToFile - before the While" << endl; while ( (query.next()) && (!noMoreQso) ) { //marked = false; if (query.isValid()) { if (exportJustMarkedQSO == true) { nameCol = rec.indexOf("marked"); aux1 = (query.value(nameCol)).toString(); if (aux1 == "X") { //qDebug() << "FileManager::adifLogExportToFile: MARKED: " << aux1 << endl; currentQso++; nameCol = rec.indexOf("call"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile: " << QString::number(nameCol) << "/" << aux1 << endl; if (aux1.length()>0) { out << "" << aux1<< " "; } nameCol = rec.indexOf("qso_date"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("qso_date_off"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("time_on"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile-time_on: " << aux1 << endl; if ( ((aux1.length()) == 5) || ((aux1.length()) == 8) ){ aux1.remove(QChar(':'), Qt::CaseInsensitive); out << "" << aux1 << " "; } nameCol = rec.indexOf("time_off"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile: time_off-682" << QString::number(nameCol) << "/" << aux1 << endl; if ( ((aux1.length()) == 5) || ((aux1.length()) == 8) ){ aux1.remove(QChar(':'), Qt::CaseInsensitive); out << "" << aux1 << " "; //qDebug() << "FileManager::adifLogExportToFile: time_off exported-682" << endl; } nameCol = rec.indexOf("bandid"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "FileManager::adifLogExportToFile: bandid1: " << aux1 << endl; aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile: bandid2: " << aux1 << endl; aux1 = dataProxy->getNameFromBandId(aux1.toInt()); //aux1 = db->getBandNameFromID2(aux1.toInt()); //qDebug() << "FileManager::adifLogExportToFile: bandid3: " << aux1 << endl; if (dataProxy->getIdFromBandName(aux1)>=0) { out << "" << aux1 << " "; bandst = aux1; } nameCol = rec.indexOf("band_rx"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( (0 < aux1.toInt()) && (aux1.toInt() < 30) && (aux1.length()>0) && (dataProxy->getIdFromBandName(aux1)>=0)) { aux1 = dataProxy->getNameFromBandId(aux1.toInt()); //aux1 = db->getBandNameFromID2(aux1.toInt()); out << "" << aux1 << " "; bandrxst = aux1; } nameCol = rec.indexOf("modeid"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); // get SubModeId to check if it is the same or not from modeid aux2 = dataProxy->getSubModeFromId(aux1.toInt()); aux1 = dataProxy->getNameFromModeId(aux1.toInt()); //aux1 = db->getModeNameFromID2(aux1.toInt()); //qDebug() << "FileManager::adifLogExportToFile - MODE aux2: " << aux2 << endl; //qDebug() << "FileManager::adifLogExportToFile - MODE aux1: " << aux1 << endl; if ((aux1.length()>1) && (dataProxy->getIdFromModeName(aux1)>=0)) { //haveMode = true; out << "" << aux1 << " "; } if ((aux1 != aux2) && (aux2.length()>1) && (dataProxy->getSubModeIdFromSubMode(aux2)>=0) ) { //haveMode = true; out << "" << aux2 << " "; } nameCol = rec.indexOf("srx"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0) { out << "" << aux1 << " "; } nameCol = rec.indexOf("srx_string"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("stx"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("stx_string"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("cqz"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())>0) && (0 < aux1.toInt()) && (aux1.toInt() < CQZones+1) ){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ituz"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())>0) && (0 < aux1.toInt()) && (aux1.toInt() < ITUZones+1) ){ out << "" << aux1 << " "; } //qDebug() << "FileManager::adifLogExportToFile: DXCC - Now..." << endl; nameCol = rec.indexOf("dxcc"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; //qDebug() << "FileManager::adifLogExportToFile: DXCC " << aux1 << endl; } //qDebug() << "FileManager::adifLogExportToFile: DXCC - Exported!" << endl; nameCol = rec.indexOf("address"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("age"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("cnty"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("comment"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("a_index"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ant_az"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ant_el"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ant_path"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("arrl_sect"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("checkcontest"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("class"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("cont"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("contacted_op"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("contest_id"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("points"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("multiplier"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("transmitterid"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("country"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("credit_submitted"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("credit_granted"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("distance"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("dark_doc"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("eq_call"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("email"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ if (aux1.contains("@") && (aux1.contains("."))) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("eqsl_qslrdate"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("eqsl_qslsdate"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("eqsl_qsl_rcvd"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && (aux1!="N") ) { out << "" << aux1 << " "; } nameCol = rec.indexOf("eqsl_qsl_sent"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && (aux1!="N") ){ out << "" << aux1 << " "; } nameCol = rec.indexOf("fists"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("fists_cc"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("force_init"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("freq"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "FileManager::adifLogExportToFile FREQ1: " << aux1 << endl; aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile FREQ1.1: " << aux1 << endl; if ((aux1.length())>0){ //TODO: Check if the Band is correctly defined. BAND Wins and freq is lost if not correct if (dataProxy->getBandIdFromFreq(aux1.toDouble()) == dataProxy->getIdFromBandName(bandst)) //if (db->isThisFreqInBand(bandst, aux1)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("freq_rx"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ //TODO: Check if the Band is correctly defined. BAND Wins and freq is lost if not correct if (dataProxy->getBandIdFromFreq(aux1.toDouble()) == dataProxy->getIdFromBandName(bandrxst)) //if (db->isThisFreqInBand(bandrxst, aux1)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("guest_op"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("hrdlog_qso_upload_date"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("hrdlog_qso_upload_status"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && ((aux1!="Y") || (aux1!="N") || (aux1!="M")) ){ out << "" << aux1 << " "; } nameCol = rec.indexOf("gridsquare"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_gridsquare"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_antenna"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_dxcc"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_fists"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("iota"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile (IOTA): " << aux1 << endl; if (((aux1.length())>=4) && ((aux1.length())<=6)){ //if ((aux1.length())==6){ out << "" << aux1 << " "; } nameCol = rec.indexOf("iota_island_id"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile (IOTA_ID): " << aux1 << endl; if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_iota"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if (((aux1.length())>=4) && ((aux1.length())<=6)){ //if ((aux1.length())==6){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_iota_island_id"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("k_index"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_itu_zone"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("lat"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("lon"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_lat"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_lon"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("lotw_qslrdate"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("lotw_qslsdate"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("lotw_qsl_rcvd"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && (aux1!="N") ) { out << "" << aux1 << " "; } nameCol = rec.indexOf("lotw_qsl_sent"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && (aux1!="N") ){ out << "" << aux1 << " "; } nameCol = rec.indexOf("clublog_qso_upload_date"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("clublog_qso_upload_status"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && ((aux1!="Y") || (aux1!="N") || (aux1!="M")) ){ out << "" << aux1 << " "; } nameCol = rec.indexOf("qrzcom_qso_upload_date"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("qrzcom_qso_upload_status"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && ((aux1!="Y") || (aux1!="N") || (aux1!="M")) ){ out << "" << aux1 << " "; } nameCol = rec.indexOf("max_bursts"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ms_shower"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_city"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_cnty"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_country"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_cq_zone"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_name"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("name"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("operator"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("station_callsign"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("owner_callsign"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_postal_code"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_rig"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_sig"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_sota_ref"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_postal_code"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_state"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("state"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_street"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("notes"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ aux1.replace("\n", "---"); out << "" << aux1 << " "; } nameCol = rec.indexOf("nr_bursts"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("nr_pings"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("pfx"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("precedence"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("public_key"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("qslmsg"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("qslrdate"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("qslsdate"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("qsl_rcvd"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if (((aux1.length())==1) && (aux1!="N") ){ out << "" << aux1 << " "; nameCol = rec.indexOf("qsl_rcvd_via"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())==1){ out << "" << aux1 << " "; } } nameCol = rec.indexOf("qsl_sent"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if (((aux1.length())==1) && (aux1!="N") ){ out << "" << aux1 << " "; nameCol = rec.indexOf("qsl_sent_via"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())==1) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("qsl_via"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("qso_complete"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("qso_random"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("qth"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("rst_sent"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("rst_rcvd"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("region"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("rig"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("rx_pwr"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if (((aux1.length())>0) && (aux1.toDouble()>0) ){ out << "" << aux1 << " "; } nameCol = rec.indexOf("tx_pwr"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())>0) && (aux1.toDouble()>0)) { out << "" << aux1 << " "; } nameCol = rec.indexOf("prop_mode"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>1){ out << "" << aux1 << " "; propsat = true; } nameCol = rec.indexOf("sat_mode"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("sat_name"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; if (!propsat) { out << "SAT "; } } nameCol = rec.indexOf("sfi"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("sig"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("sig_info"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("silent_key"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("skcc"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("sota_ref"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("state"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("swl"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ten_ten"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ten_ten"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("uksmg"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ve_prov"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_usaca_counties"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("usaca_counties"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("vucc_grids"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_vucc_grids"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("web"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } if (exportAll) { nameCol = rec.indexOf("lognumber"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } } out << " " << endl; } else { //qDebug() << "FileManager::adifLogExportToFile: NOT MARKED" << endl; //marked = false; // Find something that bypass the while without breaking it all } } else { if(exportOnlyQSLRequested) { nameCol = rec.indexOf("qsl_sent"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( aux1 !="R" ) { goto EndOfWhile; } } currentQso++; nameCol = rec.indexOf("call"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile: " << QString::number(nameCol) << "/" << aux1 << endl; if (aux1.length()>0) { out << "" << aux1 << " "; } //qDebug() << "FileManager::adifLogExportToFile before 30 " << endl; nameCol = rec.indexOf("qso_date"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "FileManager::adifLogExportToFile: QSO_DATE: " << aux1 << endl; aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile: QSO_DATE-1: " << aux1 << endl; if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } else { //qDebug() << "FileManager::adifLogExportToFile: QSO_DATE not valid: " << aux1 << endl; } } nameCol = rec.indexOf("qso_date_off"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } //qDebug() << "FileManager::adifLogExportToFile before 50 " << endl; nameCol = rec.indexOf("time_on"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile-time_on: " << aux1 << endl; if ( ((aux1.length()) == 5) || ((aux1.length()) == 8) ){ aux1.remove(QChar(':'), Qt::CaseInsensitive); out << "" << aux1 << " "; } nameCol = rec.indexOf("time_off"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile: time_off-1489" << QString::number(nameCol) << "/" << aux1 << endl; if ( ((aux1.length()) == 5) || ((aux1.length()) == 8) ){ aux1.remove(QChar(':'), Qt::CaseInsensitive); out << "" << aux1 << " "; //qDebug() << "FileManager::adifLogExportToFile: time_off-1489-exported" << endl; } nameCol = rec.indexOf("bandid"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "FileManager::adifLogExportToFile: bandid21: " << aux1 << endl; aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile: bandid22: " << aux1 << endl; //aux1 = db->getBandNameFromID2(aux1.toInt()); aux1 = dataProxy->getNameFromBandId(aux1.toInt()); //qDebug() << "FileManager::adifLogExportToFile: bandid23: " << aux1 << endl; //TODO: If the DB has some blank fields (bandid or whatever, they will be exported as "-1" so not valid. // Check how to avoid exporting wrong data. if (dataProxy->getIdFromBandName(aux1)>=0) { out << "" << aux1 << " "; bandst = aux1; } nameCol = rec.indexOf("band_rx"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile before 60 " << endl; if ( (0 < aux1.toInt()) && (aux1.toInt() < 30) && (aux1.length()>0) && (dataProxy->getIdFromBandName(aux1)>=0) ) { //aux1 = db->getBandNameFromID2(aux1.toInt()); aux1 = dataProxy->getNameFromBandId(aux1.toInt()); out << "" << aux1 << " "; bandrxst = aux1; /*queryString = QString("SELECT name FROM band WHERE id='%1'").arg(aux1); query1.exec(queryString); query1.next(); if (query1.isValid()) { aux1 = (query1.value(0)).toString(); out << "" << aux1 << " "; } */ } nameCol = rec.indexOf("modeid"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); // get SubModeId to check if it is the same or not from modeid aux2 = dataProxy->getSubModeFromId(aux1.toInt()); aux1 = dataProxy->getNameFromSubMode(aux2); //aux1 = db->getModeNameFromID2(aux1.toInt()); //qDebug() << "FileManager::adifLogExportToFile - MODE2 aux2: " << aux2 << endl; //qDebug() << "FileManager::adifLogExportToFile - MODE2 aux1: " << aux1 << endl; if ((aux1.length()>1) && (dataProxy->getIdFromModeName(aux1)>=0)) { out << "" << aux1 << " "; //haveMode = true; } if ((aux1 != aux2) && (aux2.length()>1) && (dataProxy->getSubModeIdFromSubMode(aux2)>=0)) { //haveMode = true; out << "" << aux2 << " "; } //qDebug() << "FileManager::adifLogExportToFile before 70 " << endl; nameCol = rec.indexOf("srx"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("srx_string"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("stx"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("stx_string"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("cqz"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())>0) && (0 < aux1.toInt()) && (aux1.toInt() < CQZones+1) ){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ituz"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())>0) && (0 < aux1.toInt()) && (aux1.toInt() < ITUZones+1) ){ out << "" << aux1 << " "; } //qDebug() << "FileManager::adifLogExportToFile - DXCC to be exported: " << endl; nameCol = rec.indexOf("dxcc"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile - DXCC: " << aux1 << endl; //if ((aux1.length())>0){ if ( ((aux1.length())>0) && (0 < aux1.toInt()) && (aux1.toInt() < DXCCEntities + 5) ){ out << "" << aux1 << " "; //qDebug() << "FileManager::adifLogExportToFile - DXCC in the if" << endl; } //qDebug() << "FileManager::adifLogExportToFile - DXCC alreadyexported: " << endl; nameCol = rec.indexOf("address"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } //qDebug() << "FileManager::adifLogExportToFile before 80 " << endl; nameCol = rec.indexOf("age"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("cnty"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("comment"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("a_index"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ant_az"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ant_el"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ant_path"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } //qDebug() << "FileManager::adifLogExportToFile before 90 " << endl; nameCol = rec.indexOf("arrl_sect"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("checkcontest"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("class"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("cont"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("contacted_op"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("contest_id"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("points"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("multiplier"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("transmitterid"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } //qDebug() << "FileManager::adifLogExportToFile before 100 " << endl; nameCol = rec.indexOf("country"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("credit_submitted"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("credit_granted"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("distance"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("dark_doc"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("eq_call"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("email"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0) { if (aux1.contains("@") && (aux1.contains("."))) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("eqsl_qslrdate"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("eqsl_qslsdate"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } //qDebug() << "FileManager::adifLogExportToFile before eqsl_qsl_rcvd: " << endl; nameCol = rec.indexOf("eqsl_qsl_rcvd"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && (aux1!="N") ) { out << "" << aux1 << " "; } //qDebug() << "FileManager::adifLogExportToFile before eqsl_qsl_sent: " << endl; nameCol = rec.indexOf("eqsl_qsl_sent"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && (aux1!="N") ){ out << "" << aux1 << " "; } nameCol = rec.indexOf("fists"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("fists_cc"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } //qDebug() << "FileManager::adifLogExportToFile before force_init: " << endl; nameCol = rec.indexOf("force_init"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } //qDebug() << "FileManager::adifLogExportToFile before freq: " << endl; nameCol = rec.indexOf("freq"); //qDebug() << "FileManager::adifLogExportToFile before freq: nameCol: " << QString::number(nameCol) << endl; aux1 = (query.value(nameCol)).toString(); //qDebug() << "FileManager::adifLogExportToFile FREQ2: " << aux1 << endl; aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile FREQ2.1: " << aux1 << endl; if ((aux1.length())>0){ if (dataProxy->getBandIdFromFreq(aux1.toDouble()) == dataProxy->getIdFromBandName(bandst)) //if (db->isThisFreqInBand(bandst, aux1)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("freq_rx"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ if (dataProxy->getBandIdFromFreq(aux1.toDouble()) == dataProxy->getIdFromBandName(bandst)) //if (db->isThisFreqInBand(bandst, aux1)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("guest_op"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("hrdlog_qso_upload_date"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("hrdlog_qso_upload_status"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && ((aux1!="Y") || (aux1!="N") || (aux1!="M")) ){ out << "" << aux1 << " "; } nameCol = rec.indexOf("gridsquare"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_gridsquare"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_antenna"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("iota"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile (IOTA2): " << aux1 << endl; if (((aux1.length())>=4) && ((aux1.length())<=6)){ //if ((aux1.length())==6){ out << "" << aux1 << " "; } nameCol = rec.indexOf("iota_island_id"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile (IOTA_ID2): " << aux1 << endl; if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_iota"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if (((aux1.length())>=4) && ((aux1.length())<=6)){ //if ((aux1.length())==6){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_iota_island_id"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("k_index"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_itu_zone"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("lat"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("lon"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_lat"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_lon"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("lotw_qslrdate"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("lotw_qslsdate"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("lotw_qsl_rcvd"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && (aux1!="N") ) { out << "" << aux1 << " "; } nameCol = rec.indexOf("lotw_qsl_sent"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && (aux1!="N") ){ out << "" << aux1 << " "; } nameCol = rec.indexOf("clublog_qso_upload_date"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("clublog_qso_upload_status"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && ((aux1!="Y") || (aux1!="N") || (aux1!="M")) ){ out << "" << aux1 << " "; } nameCol = rec.indexOf("qrzcom_qso_upload_status"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("qrzcom_qso_upload_status"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())==1) && ((aux1!="Y") || (aux1!="N") || (aux1!="M")) ){ out << "" << aux1 << " "; } nameCol = rec.indexOf("max_bursts"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ms_shower"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_city"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_cnty"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_country"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_cq_zone"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_name"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("name"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("operator"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("station_callsign"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("owner_callsign"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_postal_code"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_rig"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_sig"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_sig_info"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_state"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("state"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_street"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("notes"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("nr_bursts"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("nr_pings"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("pfx"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("precedence"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("prop_mode"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>1){ out << "" << aux1 << " "; } nameCol = rec.indexOf("public_key"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("qslmsg"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("qslrdate"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("qslsdate"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("qsl_rcvd"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if (((aux1.length())==1) && (aux1!="N") ){ out << "" << aux1 << " "; nameCol = rec.indexOf("qsl_rcvd_via"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())==1){ out << "" << aux1 << " "; } } nameCol = rec.indexOf("qsl_sent"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if (((aux1.length())==1) && (aux1!="N") ){ out << "" << aux1 << " "; nameCol = rec.indexOf("qsl_sent_via"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())==1) { out << "" << aux1 << " "; } } nameCol = rec.indexOf("qsl_via"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("qso_complete"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("qso_random"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("qth"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("rst_sent"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("rst_rcvd"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("region"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("rig"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("rx_pwr"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if (((aux1.length())>0) && (aux1.toDouble()>0)){ out << "" << aux1 << " "; } nameCol = rec.indexOf("tx_pwr"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( ((aux1.length())>0) && (aux1.toDouble()>0)) { out << "" << aux1 << " "; } nameCol = rec.indexOf("sat_mode"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("sat_name"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("sfi"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("sig"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("sig_info"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("silent_key"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("skcc"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("sota_ref"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("state"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("swl"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ten_ten"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("uksmg"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("ve_prov"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_usaca_counties"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("usaca_counties"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("vucc_grids"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("my_vucc_grids"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } nameCol = rec.indexOf("web"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } if (exportAll) { nameCol = rec.indexOf("lognumber"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } } out << " " << endl; using namespace std; EndOfWhile: ; } if (( (currentQso % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux1 = tr("Writing ADIF file...\n QSO: ") + QString::number(currentQso) + "/" + QString::number(numberOfQsos); progress.setLabelText(aux1); progress.setValue(currentQso); } if ( progress.wasCanceled() ) { QMessageBox msgBox; QString aux = QString(tr("You have canceled the file export. The file will be removed and no data will be exported.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; break; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } else {} } // Closes the isValid else {} } //Closes the While //qDebug() << "FileManager::adifLogExportToFile - after the While" << endl; progress.setValue(numberOfQsos); if (noMoreQso) { //TODO: Remove the file (_fileName) file.remove(); return true; } else { return false; } return true; } bool FileManager::cabrilloLogExport(const QString& _fileName, const QString _contestType, const int logNconst) { //qDebug() << "FileManager::cabrilloLogExport" << endl; return cabrilloLogExportToFile(_fileName, logNconst); } bool FileManager::cabrilloLogExportCQWWToFile(const QString& _fileName, const int logNconst) { //qDebug() << "FileManager::cabrilloLogExportCQWWToFile" << _fileName, endl; /* START-OF-LOG: ARRL-SECTION: CALLSIGN: N6TW CATEGORY: SINGLE-OP ALL LOW CLAIMED-SCORE: CLUB: CONTEST: CQ-WW-SSB NAME: ADDRESS: ADDRESS: OPERATORS: [required for multi-op stations] SOAPBOX: [add lines if needed] SOAPBOX: QSO: 3799 PH 2000-11-26 0711 N6TW 59 03 K9QZO 59 04 0 QSO: 14256 PH 2000-11-26 0711 N6TW 59 03 P29AS 59 28 0 QSO: 21250 PH 2000-11-26 0711 N6TW 59 03 4S7TWG 59 22 0 QSO: 28530 PH 2000-11-26 0711 N6TW 59 03 JT1FAX 59 23 0 QSO: 7250 PH 2000-11-26 0711 N6TW 59 03 WA6MIC 59 03 0 END-OF-LOG: This is a template for the QSO portion of the log. --------info sent------- -------info rcvd-------- QSO: freq mo date time call rst exch call rst exch t QSO: ***** ** yyyy-mm-dd nnnn ************* nnn ****** ************* nnn ****** n QSO: 3799 PH 2000-11-26 0711 N6TW 59 03 JT1Z 59 23 0 000000000111111111122222222223333333333444444444455555555556666666666777777777788 123456789012345678901234567890123456789012345678901234567890123456789012345678901 Official Categories This is the list of categories the robot will accept. This will assure we get your category correct and avoid the errors of previous years CATEGORY: SINGLE-OP ALL HIGH CATEGORY: SINGLE-OP 160M HIGH CATEGORY: SINGLE-OP 80M HIGH CATEGORY: SINGLE-OP 40M HIGH CATEGORY: SINGLE-OP 20M HIGH CATEGORY: SINGLE-OP 15M HIGH CATEGORY: SINGLE-OP 10M HIGH CATEGORY: SINGLE-OP ALL LOW CATEGORY: SINGLE-OP 160M LOW CATEGORY: SINGLE-OP 80M LOW CATEGORY: SINGLE-OP 40M LOW CATEGORY: SINGLE-OP 20M LOW CATEGORY: SINGLE-OP 15M LOW CATEGORY: SINGLE-OP 10M LOW CATEGORY: SINGLE-OP ALL QRP CATEGORY: SINGLE-OP 160M QRP CATEGORY: SINGLE-OP 80M QRP CATEGORY: SINGLE-OP 40M QRP CATEGORY: SINGLE-OP 20M QRP CATEGORY: SINGLE-OP 15M QRP CATEGORY: SINGLE-OP 10M QRP CATEGORY: SINGLE-OP-ASSISTED ALL CATEGORY: SINGLE-OP-ASSISTED 160M CATEGORY: SINGLE-OP-ASSISTED 80M CATEGORY: SINGLE-OP-ASSISTED 40M CATEGORY: SINGLE-OP-ASSISTED 20M CATEGORY: SINGLE-OP-ASSISTED 15M CATEGORY: SINGLE-OP-ASSISTED 10M CATEGORY: MULTI-ONE CATEGORY: MULTI-TWO CATEGORY: MULTI-MULTI CATEGORY: CHECKLOG */ QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return false; QTextStream out(&file); QString aux1, queryString; int nameCol = 0; QSqlQuery query, query1; int numberOfQsos = 0; int currentQso = 0; int currentLog = logNconst; noMoreQso = false; queryString = QString("SELECT count(id) FROM log WHERE lognumber='%1'").arg(currentLog); bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } query.next(); if (query.isValid()) { numberOfQsos = (query.value(0)).toInt(); } QProgressDialog progress(tr("Writing Cabrillo file..."), tr("Abort writing"), 0, numberOfQsos, this); progress.setMaximum(numberOfQsos); progress.setWindowModality(Qt::WindowModal); out << "START-OF-LOG:" << endl; out << "ARRL-SECTION: " << endl; out << "CALLSIGN:" << endl; out << "CATEGORY:" << endl; out << "CLAIMED-SCORE:" << endl; out << "CLUB: " << endl; out << "CONTEST:" << endl; out << "NAME: " << endl; out << "ADDRESS:" << endl; out << "ADDRESS:" << endl; out << "ADDRESS:" << endl; out << "ADDRESS:" << endl; out << "OPERATORS:" << endl; out << "SOAPBOX:" << endl; out << "SOAPBOX:" << endl; out << "SOAPBOX:" << endl; out << "SOAPBOX:" << endl; //TODO: When the software supports several log, this should be taken into account in the following query. queryString = "SELECT freq, bandid, modeid, qso_date, time_on, station_callsign, rst_sent, rst_rcvd, call, stx FROM log"; sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } QSqlRecord rec = query.record(); while ( (query.next()) && (!noMoreQso) ) { if (query.isValid()) { /* This is a template for the QSO portion of the log. --------info sent------- -------info rcvd-------- QSO: freq mo date time call rst exch call rst exch t QSO: ***** ** yyyy-mm-dd nnnn ************* nnn ****** ************* nnn ****** n QSO: 3799 PH 2000-11-26 0711 N6TW 59 03 JT1Z 59 23 0 000000000111111111122222222223333333333444444444455555555556666666666777777777788 123456789012345678901234567890123456789012345678901234567890123456789012345678901 */ currentQso++; out << "QSO: " << endl; nameCol = rec.indexOf("freq"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << aux1.rightJustified(5, ' ', true) << " "; } else // if we dont have the freq but the band { nameCol = rec.indexOf("bandid"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); queryString = QString("SELECT cabrillo FROM band WHERE id='%1'").arg(aux1); sqlOK = query1.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().number(), query1.lastQuery()); } query1.next(); if (query1.isValid()) { aux1 = (query1.value(0)).toString(); out << aux1.rightJustified(5, ' ', true) << " "; } else { // if we dont even have the band, we add the freq "00000" out << "00000" << " "; } } nameCol = rec.indexOf("modeid"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); queryString = QString("SELECT cabrillo FROM mode WHERE id='%1'").arg(aux1); sqlOK = query1.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().number(), query1.lastQuery()); } query1.next(); if (query1.isValid()) { aux1 = (query1.value(0)).toString(); out << aux1 << " "; } else { out << "NO" << " "; } nameCol = rec.indexOf("qso_date"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); QDate date = QDate::fromString(aux1, "yyyyMMdd"); if (util->isValidDate(date)) { out << aux1 << " "; } else { out << "0000-00-00" << " "; } } nameCol = rec.indexOf("time_on"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); //qDebug() << "FileManager::adifLogExportToFile-time_on: " << aux1 << endl; if ( ((aux1.length()) == 5) || ((aux1.length()) == 8) ){ aux1.remove(QChar(':'), Qt::CaseInsensitive); //out << aux1.resize(2) << " "; } else { out << "0000" << " "; } nameCol = rec.indexOf("station_callsign"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ( (0 <= aux1.length()) && (aux1.length() <= 14) ) { out << aux1.rightJustified(13, ' ', true) << " "; } else { out << QString("NOCAL").rightJustified(13, ' ', true) << " "; } nameCol = rec.indexOf("rst_sent"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << aux1.rightJustified(3, ' ', true) << " "; } nameCol = rec.indexOf("call"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((0 <= aux1.length()) && (aux1.length() <= 14) ) { out << aux1.rightJustified(13, ' ', true) << " "; } else { out << QString("NOCAL").rightJustified(13, ' ', true) << " "; } nameCol = rec.indexOf("rst_rcvd"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << aux1.rightJustified(3, ' ', true) << " "; } nameCol = rec.indexOf("stx"); aux1 = (query.value(nameCol)).toString(); aux1 = util->checkAndFixASCIIinADIF(aux1); if ((aux1.length())>0){ out << "" << aux1 << " "; } } else { } } // END OF WHILE out << "END-OF-LOG:" << endl; file.close(); return true; } bool FileManager::cabrilloLogExportToFile(const QString& _fileName, const int logNconst) { //qDebug() << "FileManager::cabrilloLogExportToFile" << endl; QString fn = _fileName; //TODO: Message "You must select a proper file format QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog: Cabrillo Log Export not implemented")); msgBox.setText(tr("I am sorry but the Cabrillo Export To File feature has still not been implemented.")); msgBox.exec(); return false; } bool FileManager::printQs(const QStringList _line) //bool FileManager::printQs(const QString _q, const QStringList _line) { QStringList qs = _line; for (int i = 0; i'); //qDebug() << "FileManager::adifCheckMoreThanOneLog: data.0: " << data.at(0) << endl; //qDebug() << "FileManager::adifCheckMoreThanOneLog: data.1: " << data.at(1) << endl; if (firstLog) { log1 = (data.at(1)).toInt(); firstLog = false; } else { if (log1 == (data.at(1)).toInt()) {} else { file.close(); return true; } } } } } } //qDebug() << "FileManager::adifCheckMoreThanOneLog: JUST ONE!" << aux << endl; file.close(); return false; } */ bool FileManager::adifLoTWReadLog(const QString& tfileName) { //qDebug() << "FileManager::adifLoTWReadLog: " << tfileName << endl; QString fileName = tfileName; QFile file( fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { //qDebug() << "FileManager::adifLoTWReadLog File not found" << fileName << endl; return false; } QStringList fields, qsToPass; bool hasEOH = false; int numberOfQsos = 0; int numberOfQsosLoWTHeader = 0; QString line = QString(); QString auxString = QString(); QString aux = QString(); qint64 pos; //Position in the file bool inHeader = true; pos = file.pos(); fields.clear(); qsToPass.clear(); //int step = 1; while ( !file.atEnd() ) { line = (file.readLine()).toUpper(); numberOfQsos = numberOfQsos + line.count("EOR>"); if ((line.count("")>0) && (!hasEOH)) { hasEOH = true; } numberOfQsosLoWTHeader = numberOfQsosLoWTHeader + line.count(""); } //847 //qDebug() << "FileManager::adifLoTWReadLog QSOs found: " << QString::number(numberOfQsos) << endl; QProgressDialog progress(tr("Reading LoTW file..."), tr("Abort reading"), 0, numberOfQsos, this); progress.setWindowModality(Qt::ApplicationModal); progress.setVisible(true); progress.setValue(0); progress.setMaximum(numberOfQsos); //step = util->getProgresStepForDialog(numberOfQsos); file.seek(pos); /* Optional header information may be included before the actual data in the file. To include optional header info, the first character of the file must be something other than <. Any amount of header info of any value except may be included. The header info must be terminated with . Any number of characters of any value except < may follow . The first < after is the start of the first field of the first data record in the file. */ //qDebug() << "FileManager::adifLoTWReadLog: Going to read the HEADER" << endl; //Read HEADER line = file.readLine().trimmed().toUpper(); //qDebug() << "FileManager::adifLoTWReadLog: " << line << endl; if ( (!(line.startsWith('<'))) && (inHeader) ) { // The file has a header if (line.contains("")) // To check if the first line contains the EOR but not alone in the line. { inHeader = false; } line.clear(); // We should finish the if with real data in "line" or a clear one. while ( inHeader && hasEOH) { line = file.readLine().trimmed().toUpper(); if (line.contains("")) { inHeader = false; line.clear(); //TODO: Maybe this clearing deletes a line that may have data... } } pos = file.pos(); } else if (!(line.startsWith('<'))) { // The file does not have any header. // Reading the first QSO... /* Cases: 1.- One big line with several QSO 2.- One QSO uses several lines. - THIS IS USUALLY THE CASE FOR LOTW 3.- Last line of one QSO includes data of the next one */ inHeader = true; while (inHeader) { pos = file.pos(); line = file.readLine().trimmed().toUpper(); if ( (line.startsWith('<')) ) { inHeader = false; line.clear(); //TODO: Maybe this clearing deletes a line that may have data... } } } file.seek(pos); //START reading QSO data... //qDebug() << "FileManager::adifLoTWReadLog: QSO data reading started..." << endl; while ((!noMoreQso) ) { if (!file.atEnd()) { line.clear(); line.append(file.readLine().trimmed().toUpper()); if (line.contains("")) { noMoreQso = true; } //line.append(file.readLine().toUpper()); // TODO: Check if we should remove extra spaces,tabs and so on... //qDebug() << "FileManager::adifLoTWReadLog-line:" << line << endl; fields << line.split("<", QString::SkipEmptyParts); /* DL4ZAA 15M 21.31700 SSB PHONE 20150329 112900 Y 20170910 */ qsToPass.clear(); auxString.clear(); foreach (aux, fields) { aux = aux.trimmed(); if ( (aux.contains('>')) && (auxString.length() > 0) ) { qsToPass.last() = qsToPass.last() + auxString; //qDebug() << "FileManager::adifLoTWReadLog Modified in qsToPass: " << qsToPass.last() << endl; //qsToPass << aux.trimmed(); //qDebug() << "FileManager::adifLoTWReadLog Added to qsToPass: " << aux.trimmed() << endl; auxString.clear(); } else if (( aux.contains('>')) && (auxString.length() <= 0) ) { qsToPass << aux.trimmed(); } else { auxString = auxString + "-" + aux.trimmed(); //qDebug() << "FileManager::adifLoTWReadLog auxString: " << auxString << endl; } //qDebug() << "FileManager::adifLoTWReadLog fields: " << aux << endl; } if (auxString.length()>0) { //qDebug() << "FileManager::adifLoTWReadLog auxString2: " << auxString << endl; qsToPass.last() = qsToPass.last() + auxString.trimmed(); } //qDebug() << "FileManager::adifLoTWReadLog END fields" << endl; //qDebug() << "FileManager::adifLoTWReadLog Mod: " << qsToPass.join("/") << endl; //qDebug() << "FileManager::adifLoTWReadLog END2 fields" << endl; fields = qsToPass; if (fields.contains("EOR>")) // We are going to add a QSO to the log... prepare the Query! { //qDebug() << "FileManager::adifLoTWReadLog: START of QSO "<< endl; //dataProxy->isThisQSODuplicated() //int getDuplicatedQSOId(const QString _qrz, const QString _date, const QString _time, const int _band, const int _mode); QString str, _call, _date, _time, _band, _mode; QString field; foreach (str, fields) { field = readAdifField(str).at(0); if (field == "CALL") { } else if (field == "QSO_DATE") { } else if (field == "TIME_ON") {} else if (field == "BAND") {} else if (field == "MODE") {} else {} //qDebug() << "FileManager::adifLoTWReadLog: " << str << endl; } //qDebug() << "FileManager::adifLoTWReadLog: END of QSO "<< endl; fields.clear(); } // END of if (fields.contains("EOR>")) // We are going to add a QSO to the log... ! else { if (file.atEnd()) { noMoreQso = true; } //qDebug() << "FileManager::adifLoTWReadLog: fields DOES NOT contains EOR>" << endl; } } } return true; } bool FileManager::adifReadLog(const QString& tfileName, const int logN) { //qDebug() << "FileManager::adifReadLog:" << tfileName << endl; //int n = 0; //QSqlDatabase db = QSqlDatabase::database(); //int maxLogs = dataProxy->getNumberOfManagedLogs(); // To manage several logs bool sqlOK = true; QStringList queries = QStringList(); queries.clear(); QSqlQuery query; QStringList fields, qsToPass, qsAux; QStringList currentQSOfields = QStringList(); fields.clear(); qsToPass.clear(); qsAux.clear(); QString fieldToAnalyze = QString(); QString fileName = tfileName; QString line = QString(); QString aux = QString(); QString auxString = QString(); QString _band = QString(); bool inHeader = true; bool EOR = false; noMoreQso = false; bool preparedQBool = false; qint64 pos; //Position in the file int i = 0; //Aunxiliar variable int numberOfQsos = 0; int step = 1; int errorCode = -1; //int qsosInTransaction = 0; bool ignoreErrorCode19 = false; QFile file( fileName ); //bool moreThanOneLog = adifCheckMoreThanOneLog(file); int howManyLogs = howManyLogsInFile(file); fillHashLog(file); //I am creating several logs when importing a file //We need to fill the hashLog to process then in processLog bool keepLogsInFile = false; //qDebug() << "FileManager::adifReadLog: Logs: " << QString::number(howManyLogs) << endl; if (howManyLogs>1) { QMessageBox msgBox; aux = QString(tr("There is more than one log in this logfile.") + "\n" + tr("All logs will be imported into the current log.") + "\n" + tr("Do you want to continue?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked //qDebug() << "FileManager::adifReadLog: clicked YES" << endl; keepLogsInFile = true; break; case QMessageBox::No: // No Save was clicked //qDebug() << "FileManager::adifReadLog: clicked NO" << endl; keepLogsInFile = false; return false; break; default: // should never be reached keepLogsInFile = false; return false; //qDebug() << "FileManager::adifReadLog: default" << endl; break; } } if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { //qDebug() << "FileManager::adifReadLog File not found" << fileName << endl; return false; } bool hasEOH = false; pos = file.pos(); while ( !file.atEnd() ) { line = (file.readLine()).toUpper(); numberOfQsos = numberOfQsos + line.count("EOR>"); if ((line.count("")>0) && (!hasEOH)) { hasEOH = true; } } //qDebug() << "FileManager::adifReadLog QSOs found: " << QString::number(numberOfQsos) << endl; QProgressDialog progress(tr("Reading ADIF file..."), tr("Abort reading"), 0, numberOfQsos, this); /*progress.setWindowModality(Qt::WindowModal);*/ progress.setWindowModality(Qt::ApplicationModal); progress.setVisible(true); progress.setValue(0); progress.setMaximum(numberOfQsos); step = util->getProgresStepForDialog(numberOfQsos); //step = getProgresStepForDialog(numberOfQsos); //qDebug() << "FileManager::adifReadLog (STEP)/Number: " << QString::number(step) << "/" << QString::number(numberOfQsos) << endl; //qDebug() << "FileManager::adifReadLog (number & step: " << QString::number(numberOfQsos % step) << endl; file.seek(pos); /* Optional header information may be included before the actual data in the file. To include optional header info, the first character of the file must be something other than <. Any amount of header info of any value except may be included. The header info must be terminated with . Any number of characters of any value except < may follow . The first < after is the start of the first field of the first data record in the file. */ //qDebug() << "FileManager::adifReadLog: Going to read the HEADER" << endl; //Read HEADER line = file.readLine().trimmed().toUpper(); //qDebug() << "FileManager::adifReadLog: " << line << endl; if ( (!(line.startsWith('<'))) && (inHeader) ) { // The file has a header if (line.contains("")) // To check if the first line contains the EOR but not alone in the line. { inHeader = false; } line.clear(); // We should finish the if with real data in "line" or a clear one. while ( inHeader && hasEOH) { line = file.readLine().trimmed().toUpper(); if (line.contains("")) { inHeader = false; line.clear(); //TODO: Maybe this clearing deletes a line that may have data... } } pos = file.pos(); } else if (!(line.startsWith('<'))) { // The file does not have any header. // Reading the first QSO... /* Cases: 1.- One big line with several QSO 2.- One QSO uses several lines. 3.- Last line of one QSO includes data of the next one */ inHeader = true; while (inHeader) { pos = file.pos(); line = file.readLine().trimmed().toUpper(); if ( (line.startsWith('<')) ) { inHeader = false; line.clear(); //TODO: Maybe this clearing deletes a line that may have data... } } } file.seek(pos); // START reading QSO data... //qDebug() << "FileManager::adifReadLog: QSO data reading started..." << endl; preparedQuery.prepare( "INSERT INTO log (call, qso_date, bandid, modeid, time_on, time_off, srx, stx, srx_string, stx_string, qso_date_off, band_rx, rst_sent, rst_rcvd, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, checkcontest, class, contacted_op, contest_id, country, credit_submitted, credit_granted, distance, eq_call, email, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, force_init, freq, freq_rx, gridsquare, my_gridsquare, iota, iota_island_id, my_iota, my_iota_island_id, k_index, lat, lon, my_lat, my_lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, clublog_qso_upload_date, clublog_qso_upload_status, max_bursts, ms_shower, my_city, my_cnty, my_country, my_cq_zone, my_name, name, operator, station_callsign, owner_callsign, my_rig, my_sig, my_sig_info, my_state, state, my_street, notes, nr_bursts, nr_pings, pfx, precedence, prop_mode, public_key, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, qth, rx_pwr, tx_pwr, sat_mode, sat_name, sfi, sig, swl, ten_ten, web, points, multiplier, lognumber) VALUES (:call, :qso_date, :bandid, :modeid, :time_on, :time_off, :srx, :stx, :srx_string, :stx_string, :qso_date_off, :band_rx, :rst_sent, :rst_rcvd, :cqz, :ituz, :dxcc, :address, :age, :cnty, :comment, :a_index, :ant_az, :ant_el, :ant_path, :arrl_sect, :checkcontest, :class, :contacted_op, :contest_id, :country, :credit_submitted, :credit_granted, :distance, :eq_call, :email, :eqsl_qslrdate, :eqsl_qslsdate, :eqsl_qsl_rcvd, :eqsl_qsl_sent, :force_init, :freq, :freq_rx, :gridsquare, :my_gridsquare, :iota, :iota_island_id, :my_iota, :my_iota_island_id, :k_index, :lat, :lon, :my_lat, :my_lon, :lotw_qslrdate, :lotw_qslsdate, :lotw_qsl_rcvd, :lotw_qsl_sent, :clublog_qso_upload_date, :clublog_qso_upload_status, :max_bursts, :ms_shower, :my_city, :my_cnty, :my_country, :my_cq_zone, :my_name, :name, :operator, :station_callsign, :owner_callsign, :my_rig, :my_sig, :my_sig_info, :my_state, :state, :my_street, :notes, :nr_bursts, :nr_pings, :pfx, :precedence, :prop_mode, :public_key, :qslmsg, :qslrdate, :qslsdate, :qsl_rcvd, :qsl_sent, :qsl_rcvd_via, :qsl_sent_via, :qsl_via, :qso_complete, :qso_random, :qth, :rx_pwr, :tx_pwr, :sat_mode, :sat_name, :sfi, :sig, :swl, :ten_ten, :web, :points, :multiplier, :lognumber)" ); /* if (db.transaction()) { //qDebug() << "FileManager::adifReadLog: Transaction Opened" << endl; } else { //qDebug() << "FileManager::adifReadLog: Transaction NOT Opened" << endl; } */ //file.seek(pos); fields.clear(); // while ( (!file.atEnd() ) && (!noMoreQso) && (sqlOK)) while ((!noMoreQso) && (sqlOK)) { if (!file.atEnd()) { line.clear(); line.append(file.readLine().trimmed().toUpper()); //line.append(file.readLine().toUpper()); // TODO: Check if we should remove extra spaces,tabs and so on... //qDebug() << "FileManager::adifReadLog-line:" << line << endl; //fields.clear(); //TODO: Check if I should clear fields... I think I should not because I could loose data if a line contains data after an fields << line.split("<", QString::SkipEmptyParts); } //TODO: Check what happens //qDebug() << "FileManager::adifReadLog START fields" << endl; qsToPass.clear(); auxString.clear(); foreach (aux, fields) { aux = aux.trimmed(); if ( (aux.contains('>')) && (auxString.length() > 0) ) { //qsToPass << auxString + aux; qsToPass.last() = qsToPass.last() + auxString; //qDebug() << "FileManager::adifReadLog Modified in qsToPass: " << qsToPass.last() << endl; qsToPass << aux.trimmed(); //qDebug() << "FileManager::adifReadLog Added to qsToPass: " << aux.trimmed() << endl; auxString.clear(); } else if (( aux.contains('>')) && (auxString.length() <= 0) ) { qsToPass << aux.trimmed(); } else { auxString = auxString + "-" + aux.trimmed(); //qDebug() << "FileManager::adifReadLog auxString: " << auxString << endl; } //qDebug() << "FileManager::adifReadLog fields: " << aux << endl; } //qDebug() << "FileManager::adifReadLog-W-1" << endl; if (auxString.length()>0) { //qDebug() << "FileManager::adifReadLog auxString2: " << auxString << endl; qsToPass.last() = qsToPass.last() + auxString.trimmed(); } //qDebug() << "FileManager::adifReadLog END fields" << endl; //qDebug() << "FileManager::adifReadLog Mod: " << qsToPass.join("/") << endl; //qDebug() << "FileManager::adifReadLog END2 fields" << endl; fields = qsToPass; if (fields.contains("EOR>")) // We are going to add a QSO to the log... prepare the Query! { //qDebug() << "FileManager::adifReadLog: fields contains EOR>" << endl; preparedQuery.bindValue( ":lognumber", logN); while ( (!EOR) && (!fields.isEmpty()) ) { //qDebug() << "FileManager::adifReadLog-W-2" << endl; fieldToAnalyze = (fields.takeFirst()).trimmed(); if ( fieldToAnalyze.contains("EOR>") ) { //qDebug() << "FileManager::adifReadLog-W-2.1" << endl; currentQSOfields << fieldToAnalyze; //preparedQBool = processQsoReadingADIF(currentQSOfields, logN, keepLogsInFile, hashLogs); preparedQBool = processQsoReadingADIF(currentQSOfields, logN, keepLogsInFile); if (preparedQBool) { //qDebug() << "FileManager::adifReadLog: preparedQBool = true" << endl; } else { //qDebug() << "FileManager::adifReadLog: preparedQBool = false" << endl; } } else { //qDebug() << "FileManager::adifReadLog: Not contains EOR" << endl; if ((!fieldToAnalyze.contains('>')) && (currentQSOfields.length()>0)) { //qDebug() << "FileManager::adifReadLog: Contains > & currentsQSOfields.length>0" << endl; auxString = currentQSOfields.at(currentQSOfields.length()-1); auxString = auxString + "\n" + fieldToAnalyze; //currentQSOfields.at(currentQSOfields.length()) = auxString; fieldToAnalyze = auxString; } currentQSOfields << fieldToAnalyze; EOR = false; } } sqlOK = preparedQuery.exec(); //qDebug() << "FileManager::adifReadLog: executedQuery1: " << preparedQuery.executedQuery() << endl; //qDebug() << "FileManager::adifReadLog: executedQuery2: " << preparedQuery.executedQuery() << endl; //qDebug() << "FileManager::adifReadLog: LastQuery2: " << preparedQuery.lastQuery() << endl; if (( (i % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << "FileManager::adifReadLog: MOD 0 - i = " << QString::number(i) << endl; aux = tr("Importing ADIF file...") + "\n" + tr(" QSO: ") + QString::number(i) + "/" + QString::number(numberOfQsos); progress.setLabelText(aux); progress.setValue(i); } else { //qDebug() << "FileManager::adifReadLog: Mod: "<< QString::number(i) << " mod " << QString::number(step) << " = " << QString::number(i % step) << endl; } if (sqlOK) { //qDebug() << "FileManager::adifReadLog: (1) in While sqlOK (QSO added) = TRUE" << endl; } else { errorCode = preparedQuery.lastError().number(); //qDebug() << "FileManager::adifReadLog: QSO DUPE" << endl; //qDebug() << "FileManager::adifReadLog: (1) LastQuery: " << preparedQuery.lastQuery() << endl; //qDebug() << "FileManager::adifReadLog: (1) LastError-data: " << preparedQuery.lastError().databaseText() << endl; //qDebug() << "FileManager::adifReadLog: (1) LastError-driver: " << preparedQuery.lastError().driverText() << endl; //qDebug() << "FileManager::adifReadLog: (1) LastError-n: " << QString::number(preparedQuery.lastError().number() ) << endl; if ((errorCode == 19) && (!ignoreErrorCode19)) { // There are some repeated QSO QMessageBox msgBox; aux = tr("It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported)"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked //qDebug() << "FileManager::adifReadLog: (1) clicked YES" << endl; sqlOK = true; break; case QMessageBox::YesToAll: // Yes was clicked //qDebug() << "FileManager::adifReadLog: (1) clicked YES to ALL" << endl; ignoreErrorCode19 = true; sqlOK = true; break; case QMessageBox::No: // No Save was clicked //qDebug() << "FileManager::adifReadLog: (1) clicked NO" << endl; sqlOK = false; break; default: // should never be reached sqlOK = true; //qDebug() << "FileManager::adifReadLog: (1) default" << endl; break; } //; } else if((errorCode == 19) && (ignoreErrorCode19)) { sqlOK = true; //qDebug() << "FileManager::adifReadLog: errorCode=19 && ignoreErrorCode19" << endl; } else { //qDebug() << "FileManager::adifReadLog: (2) LastQuery: " << preparedQuery.lastQuery() << endl; //qDebug() << "FileManager::adifReadLog: (2) LastError-data: " << preparedQuery.lastError().databaseText() << endl; //qDebug() << "FileManager::adifReadLog: (2) LastError-driver: " << preparedQuery.lastError().driverText() << endl; //qDebug() << "FileManager::adifReadLog: (2) LastError-n: " << QString::number(preparedQuery.lastError().number() ) << endl; emit queryError( Q_FUNC_INFO, preparedQuery.lastError().databaseText(), preparedQuery.lastError().number(), preparedQuery.lastQuery()); noMoreQso = true; /* QMessageBox msgBox; aux = tr("An unexpected error ocurred while importing. Please send this code to the developer for analysis: "); msgBox.setText(aux + "FM-1 #" + QString::number(errorCode) ); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: // Yes was clicked //sqlOK = false; //qDebug() << "FileManager::adifReadLog: (2) I have just set sqlOK=False (1)" << endl; noMoreQso = true; return; break; default: // should never be reached //sqlOK = false; //qDebug() << "FileManager::adifReadLog: (2) I have just set sqlOK=False (2)" << endl; break; } */ } } /* //qDebug() << "FileManager::adifReadLog: qsosInTransaction: " << QString::number(qsosInTransaction) << endl; if ((qsosInTransaction>=step*10) && (qsosInTransaction>200) ) { qsosInTransaction = 0; if (db.commit()) { //qDebug() << "FileManager::adifReadLog: MIDcommit OK: " << QString::number(i) << endl; if (db.transaction()) { //qDebug() << "FileManager::adifReadLog: MIDTransaction Opened" << endl; } else { //qDebug() << "FileManager::adifReadLog: MIDTransaction NOT Opened" << endl; } } else { //qDebug() << "FileManager::adifReadLog: MIDcommit NOK: " << QString::number(i) << endl; errorCode = preparedQuery.lastError().number(); QMessageBox msgBox; aux = tr("An error ocurred while importing. No data will be imported. Please send this code to the developer for analysis: "); msgBox.setText(aux + "FM-2 #" + QString::number(errorCode)); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: // Yes was clicked sqlOK = false; noMoreQso = true; //qDebug() << "FileManager::adifReadLog: I have just set sqlOK=False (3)" << endl; break; default: // should never be reached sqlOK = false; //qDebug() << "FileManager::adifReadLog: I have just set sqlOK=False (4)" << endl; break; } if (db.rollback()) { //qDebug() << "FileManager::adifReadLog: MIDcommit NOK: Rolledback" << endl; } else { //TODO: Check the error if db.rollback returns false //qDebug() << "FileManager::adifReadLog: MIDcommit NOK: Roleback returned FALSE¿?" << endl; } } } else { qsosInTransaction++; } */ if ( progress.wasCanceled() ) { QMessageBox msgBox; aux = QString(tr("You have cancelled the file import. The file will be removed and no data will be imported.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; break; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } currentQSOfields.clear(); queryPreparation(logN); // to clear Values //progress.setValue(i); i++; } // END of if (fields.contains("EOR>")) // We are going to add a QSO to the log... ! else { if (file.atEnd()) { noMoreQso = true; } //qDebug() << "FileManager::adifReadLog: fields DOES NOT contains EOR>" << endl; } //TODO: Check how to stop the importing process } // END OF WHILE if (noMoreQso) { //qDebug() << "FileManager::adifReadLog: noMoreQso = true" << endl; progress.setValue(numberOfQsos); } else { //qDebug() << "FileManager::adifReadLog: noMoreQso = false" << endl; } if (sqlOK) { //qDebug() << "FileManager::adifReadLog: sqlOK = true" << endl; } else { //qDebug() << "FileManager::adifReadLog: sqlOK = false" << endl; } if (sqlOK) { /* if (db.commit()) { //qDebug() << "FileManager::adifReadLog: Last commit OK" << endl; } else { errorCode = preparedQuery.lastError().number(); QMessageBox msgBox; aux = tr("An error ocurred while importing. No data will be imported. Please send this code to the developer for analysis: "); msgBox.setText(aux + "FM-3 #" + QString::number(errorCode)); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: // Yes was clicked sqlOK = false; //qDebug() << "FileManager::adifReadLog: I have just set sqlOK=False (5)" << endl; break; default: // should never be reached sqlOK = false; //qDebug() << "FileManager::adifReadLog: I have just set sqlOK=False (6)" << endl; break; } if (db.rollback()) { } else { //TODO: Check the error if db.rollback returns false } } */ } else { //qDebug() << "FileManager::adifReadLog: sqlOK = NOK" << endl; } progress.setValue(numberOfQsos); //qDebug() << "FileManager::adifReadLog END " << endl; return true; } bool FileManager::processQsoReadingADIF(const QStringList _line, const int logNumber, const bool _keepLogsInFile) //bool FileManager::processQsoReadingADIF(const QStringList _line, const int logNumber, const bool _keepLogsInFile, QHash &_logs) { //qDebug() << "FileManager::processQsoReadingADIF: log: " << QString::number(logNumber) << endl; //qDebug() << "FileManager::processQsoReadingADIF: log: " << _line.at(0) << endl; //qDebug() << "FileManager::processQsoReadingADIF: " << _line.join("/") << endl; //QHash &hashLogs = _logs; //QFile &file = _f; //bool keepLogsInF;// = _keepLogsInFile; //TODO: Check if needed or remove it completely. This line is just to remove a warning int i = -1; QDate date; QTime time; QStringList qs = _line; QStringList oneField; QString field, data; QSqlQuery query; //confirmed = 0; // 0 means worked, 1 means confirmed QString queryString, stringFields, stringData; //int lastId; //int dxcc = 0; //int cqz = 0; //int ituz = 0; //int i; // Aux value QString aux; // Aux string QString aux2, aux3; QString qrzCall = ""; QString submode = QString(); bool bandRXDef = false; int bandi = -1; int bandrxi = -1; bool rstRXr = false; bool rstTXr = false; //KLog does not understand (and will not import) a QSO without these fields bool haveCall = false; bool haveBand = false; bool haveMode = false; bool haveSubMode = false; bool haveTime = false; bool haveDate = false; //bool ret; //int lenght = 0; //int currentLog = logNumber; //qDebug() << "FileManager::processQsoReadingADIF" << QString::number(qs.size()) << "/" << QString::number(logNumber) << endl; //TODO: To remove the next line, it was just to measure the time it takes. ignoreUnknownAlways = true; QString str; //preparedQuery.bindValue( ":confirmed", '0' ); //qDebug() << "FileManager::processQsoReadingADIF: Entering the foreach" << endl; foreach (str, qs) { //qDebug() << "FileManager::processQsoReadingADIF: " << str << endl; if ( !( (str.contains(":")) && (str.contains(">")) ) ) { //qDebug() << "FileManager::processQsoReadingADIF: NOT (contains : and >): " << str << endl; } else { //qDebug() << "FileManager::processQsoReadingADIF: (contains : and >): " << str << endl; oneField = str.split(">", QString::SkipEmptyParts); //qDebug() << "FileManager::processQsoReadingADIF: (oneField)" << oneField << endl; if (checkADIFValidFormat(oneField)) { i = (qs.at(0)).count(":"); field = (oneField.at(0)).trimmed(); // Needs to be cleared FIELD:4:D data = (oneField.at(1)).trimmed(); data = util->checkAndFixASCIIinADIF(data); if (i == 2) { // DATE:8:D / 20141020 //lenght = (field.section(':', 1, 1)).toInt(); field = field.section(':', 0, 0); } else if (i == 1) { // DATE:8 / 20141020 //lenght = (field.section(':', 1, 1)).toInt(); field = field.section(':', 0, 0); } else { //qDebug() << "FileManager::checkADIFValidFormat-1 " << endl; //return false; } //field = oneField.at(0).trimmed(); //data = oneField.at(1).trimmed(); //lenght = field.indexOf(":"); //field = field.left(lenght); //qDebug() << "FileManager::processQsoReadingADIF (field/data): " << field << "/" << data << endl; if (field == "CALL") { qrzCall = data; if (util->isValidCall(qrzCall)) { preparedQuery.bindValue( ":call", qrzCall ); } haveCall = true; //qDebug() << "FileManager::processQsoReadingADIF-CALL:" << data << endl; } else if (field == "QSO_DATE") { //qDebug() << "FileManager::processQsoReadingADIF-QSO_DATE:" << data << endl; preparedQuery.bindValue( ":qso_date", (date.fromString(data, "yyyyMMdd")).toString("yyyy/MM/dd") ); haveDate = true; } else if (field == "BAND") { //preparedQuery.bindValue( ":bandid", data ); i = dataProxy->getIdFromBandName(data); //i = db->getBandIDFromName2(data); if (i>=0) { preparedQuery.bindValue( ":bandid", QString::number(i) ); haveBand = true; bandi = i; //qDebug() << "FileManager::processQsoReadingADIF-Band: " << data << "/" << QString::number(i) << endl; } else { //qDebug() << "FileManager::processQsoReadingADIF-Band - Wrong band: " << data << "/" << QString::number(i) << endl; } /* queryString = QString("SELECT id FROM band WHERE name ='%1'").arg(data); query.exec(queryString); query.next(); if (query.isValid()) { preparedQuery.bindValue( ":bandid", query.value(0).toInt() ); //qDebug() << "FileManager::bprocessQsoReadingADIF-Band: " << data << endl; } */ } else if (field == "MODE") { i = dataProxy->getSubModeIdFromSubMode(data); // get modeid if (i>=0) { { if (!haveSubMode) { preparedQuery.bindValue( ":modeid", QString::number(i) ); haveMode = true; haveSubMode = true; } } } } else if (field == "SUBMODE") { i = dataProxy->getSubModeIdFromSubMode(data); if (i>=0) { preparedQuery.bindValue( ":modeid", QString::number(i) ); preparedQuery.bindValue( ":submode", QString::number(i) ); haveSubMode = true; haveMode=true; //submode = data; } } else if (field == "SRX") { preparedQuery.bindValue( ":srx", data ); //qDebug() << "FileManager::bprocessQsoReadingADIF-srx: " << data << endl; } else if (field == "STX") { preparedQuery.bindValue( ":stx", data ); //qDebug() << "FileManager::bprocessQsoReadingADIF-stx: " << data << endl; } else if (field == "TIME_ON") { if (data.length() == 4) { data = data + "00"; } preparedQuery.bindValue( ":time_on", (time.fromString(data,"hhmmss")).toString("hh:mm:ss") ); haveTime = true; aux3 = (time.fromString(data,"hhmmss")).toString("hh:mm:ss"); //qDebug() << "FileManager::bprocessQsoReadingADIF-time_on: " << (time.fromString(data,"hhmmss")).toString("hh:mm:ss") << endl; } else if (field == "QSO_DATE_OFF") { preparedQuery.bindValue( ":qso_date_off", (date.fromString(data, "yyyyMMdd")).toString("yyyy/MM/dd") ); } else if (field == "BAND_RX") { i = dataProxy->getIdFromBandName(data); //i = db->getBandIDFromName2(data); if (i>=0) { preparedQuery.bindValue( ":band_rx", QString::number(i) ); bandRXDef = true; bandrxi = i; } /* queryString = QString("SELECT id FROM band WHERE name ='%1'").arg(data); query.exec(queryString); query.next(); if (query.isValid()) { preparedQuery.bindValue( ":band_rx", query.value(0).toInt() ); } */ } else if (field == "TIME_OFF") { if (data.length() == 4) { data = data + "00"; } preparedQuery.bindValue( ":time_off", (time.fromString(data,"hhmmss")).toString("hh:mm:ss") ); } else if (field == "RST_SENT") { preparedQuery.bindValue( ":rst_sent", data ); rstTXr = true; } else if (field == "RST_RCVD") { //qDebug() << "FileManager::bprocessQsoReadingADIF-rst_rcvd: " << data << endl; preparedQuery.bindValue( ":rst_rcvd", data ); rstRXr = true; } else if (field == "SRX_STRING") { preparedQuery.bindValue( ":srx_string", data ); } else if (field == "STX_STRING") { preparedQuery.bindValue( ":stx_string", data ); } else if (field == "CQZ") { preparedQuery.bindValue( ":cqz", data ); //cqz = data.toInt(); } else if (field == "ITUZ") { preparedQuery.bindValue( ":ituz", data ); //ituz = data.toInt(); } else if (field == "DXCC") { //dxcc = data.toInt(); preparedQuery.bindValue( ":dxcc", data ); } else if (field == "ADDRESS") { preparedQuery.bindValue( ":address", data ); } else if (field == "AGE") { preparedQuery.bindValue( ":age", data ); } else if (field == "CNTY") { preparedQuery.bindValue( ":cnty", data ); } else if (field == "COMMENT") { preparedQuery.bindValue( ":comment", data ); } else if (field == "A_INDEX") { preparedQuery.bindValue( ":a_index", data ); } else if (field == "ANT_AZ") { preparedQuery.bindValue( ":ant_az", data ); } else if (field == "ANT_EL") { preparedQuery.bindValue( ":ant_el", data ); } else if (field == "ANT_PATH") { preparedQuery.bindValue( ":ant_path", data ); } else if (field == "ARRL_SECT") { preparedQuery.bindValue( ":arrl_sect", data ); } else if (field == "AWARD_GRANTED") { preparedQuery.bindValue( ":award_granted", data ); } else if (field == "AWARD_SUBMITTED") { preparedQuery.bindValue( ":award_submitted", data ); } else if (field == "CHECKCONTEST") { preparedQuery.bindValue( ":checkcontest", data ); } else if (field == "CLASS") { preparedQuery.bindValue( ":class", data ); } else if (field == "CONT") { preparedQuery.bindValue( ":cont", data ); } else if (field == "CONTACTED_OP") { preparedQuery.bindValue( ":contacted_op", data ); } else if (field == "CONTEST_ID") { preparedQuery.bindValue( ":contest_id", data ); } else if (field == "COUNTRY") { preparedQuery.bindValue( ":country", data ); } else if (field == "CREDIT_SUBMITTED") { preparedQuery.bindValue( ":credit_submitted", data ); } else if (field == "CREDIT_GRANTED") { preparedQuery.bindValue( ":credit_granted", data ); } else if (field == "DISTANCE") { preparedQuery.bindValue( ":distance", data ); } else if (field == "DARK_DOK") { preparedQuery.bindValue( ":dark_dok", data ); } else if (field == "EQ_CALL") { preparedQuery.bindValue( ":eq_call", data ); } else if (field == "EMAIL") { if (data.contains("@") && (data.contains("."))) { preparedQuery.bindValue( ":email", data ); } } else if (field == "EQSL_QSLRDATE") { preparedQuery.bindValue( ":eqsl_qslrdate", (date.fromString(data, "yyyyMMdd")).toString("yyyy/MM/dd") ); } else if (field == "EQSL_QSLSDATE") { preparedQuery.bindValue( ":eqsl_qslsdate", (date.fromString(data, "yyyyMMdd")).toString("yyyy/MM/dd") ); } else if (field == "EQSL_QSL_RCVD") { preparedQuery.bindValue( ":eqsl_qsl_rcvd", data ); } else if (field == "EQSL_QSL_SENT") { preparedQuery.bindValue( ":eqsl_qsl_sent", data ); } else if (field == "FISTS") { preparedQuery.bindValue( ":fists", data ); } else if (field == "FISTS_CC") { preparedQuery.bindValue( ":fists_cc", data ); } else if (field == "FORCE_INIT") { preparedQuery.bindValue( ":force_init", data ); } else if (field == "FREQ") { //qDebug() << "FileManager::processQsoReadingADIF -FREQ: " << QString::number(data.toDouble()) << endl; preparedQuery.bindValue( ":freq", data); if (haveBand) { if (dataProxy->getBandIdFromFreq(data.toDouble()) == bandi) //if (db->isThisFreqInBand(db->getBandNameFromNumber(bandi), data)) { preparedQuery.bindValue( ":freq", data); } else { // IF band is defined but not the same than freq, Band wins } } else { preparedQuery.bindValue( ":freq", data); i = dataProxy->getBandIdFromFreq(data.toDouble()); if (i>=0) { preparedQuery.bindValue( ":bandid", QString::number(i) ); haveBand = true; //qDebug() << "FileManager::processQsoReadingADIF-Band: " << data << "/" << QString::number(i) << endl; } } } else if (field == "FREQ_RX") { //haveBand = true; //bandi = i; //i = db->getBandIDFromName2(data); if (bandRXDef) { if (dataProxy->getBandIdFromFreq(data.toDouble()) == bandrxi) //if (db->isThisFreqInBand(db->getBandNameFromNumber(bandrxi), data)) { preparedQuery.bindValue( ":freq_rx", data); } else { // IF band is defined but not the same than freq, Band wins } } else { preparedQuery.bindValue( ":freq_rx", data); } } else if (field == "GRIDSQUARE") { preparedQuery.bindValue( ":gridsquare", data ); } else if (field == "GUEST_OP") { preparedQuery.bindValue( ":guest_op", data ); } else if (field == "HRDLOG_QSO_UPLOAD_DATE") { preparedQuery.bindValue( ":hrd_qso_upload_date", data ); } else if (field == "HRDLOG_QSO_UPLOAD_STATUS") { preparedQuery.bindValue( ":hrd_qso_upload_status", data ); } else if (field == "MY_GRIDSQUARE") { preparedQuery.bindValue( ":my_gridsquare", data ); } else if (field == "MY_ANTENNA") { preparedQuery.bindValue( ":my_antenna", data ); } else if (field == "IOTA") { //qDebug() << "FileManager::processQsoReadingADIF (IOTA): " << data << endl; data = awards->checkIfValidIOTA(data); /* if (data.length()==4) //EU-1 { data.insert(3, "00"); } else if (data.length()==5) //EU-01 { data.insert(3, "0"); } */ if (data.length() == 6) { preparedQuery.bindValue( ":iota", data ); } } else if (field == "IOTA_ISLAND_ID") { preparedQuery.bindValue( ":iota_island_id", data ); } else if (field == "MY_IOTA") { /* if (data.length()==4) //EU-1 { data.insert(3, "00"); } else if (data.length()==5) //EU-01 { data.insert(3, "0"); } */ data = awards->checkIfValidIOTA(data); if (data.length() == 6) { preparedQuery.bindValue( ":my_iota", data ); } } else if (field == "MY_DXCC") { preparedQuery.bindValue( ":my_dxcc", data ); } else if (field == "MY_FISTS") { preparedQuery.bindValue( ":my_fists", data ); } else if (field == "MY_IOTA_ISLAND_ID") { preparedQuery.bindValue( ":my_iota_island_id", data ); } else if (field == "K_INDEX") { preparedQuery.bindValue( ":k_index", data ); } else if (field == "LAT") { preparedQuery.bindValue( ":lat", data ); } else if (field == "LON") { preparedQuery.bindValue( ":lon", data ); } else if (field == "MY_LAT") { preparedQuery.bindValue( ":my_lat", data ); } else if (field == "MY_LON") { preparedQuery.bindValue( ":my_lon", data ); } else if (field == "MY_ITU_ZONE") { preparedQuery.bindValue( ":my_itu_zone", data ); } else if (field == "MY_POSTAL_CODE") { preparedQuery.bindValue( ":my_postal_code", data ); } else if (field == "LOTW_QSLRDATE") { preparedQuery.bindValue( ":lotw_qslrdate", (date.fromString(data, "yyyyMMdd")).toString("yyyy/MM/dd") ); } else if (field == "LOTW_QSLSDATE") { preparedQuery.bindValue( ":lotw_qslsdate", (date.fromString(data, "yyyyMMdd")).toString("yyyy/MM/dd") ); } else if (field == "LOTW_QSL_RCVD") { preparedQuery.bindValue( ":lotw_qsl_rcvd", data ); } else if (field == "LOTW_QSL_SENT") { preparedQuery.bindValue( ":lotw_qsl_sent", data ); } else if (field == "CLUBLOG_QSO_UPLOAD_DATE") { preparedQuery.bindValue( ":clublog_qso_upload_date", (date.fromString(data, "yyyyMMdd")).toString("yyyy/MM/dd") ); } else if (field == "CLUBLOG_QSO_UPLOAD_STATUS") { preparedQuery.bindValue( ":clublog_qso_upload_status", data ); } else if (field == "MAX_BURSTS") { preparedQuery.bindValue( ":max_bursts", data ); } else if (field == "MS_SHOWER") { preparedQuery.bindValue( ":ms_shower", data ); } else if (field == "MY_CITY") { preparedQuery.bindValue( ":my_city", data ); } else if (field == "MY_CNTY") { preparedQuery.bindValue( ":my_cnty", data ); } else if (field == "MY_COUNTRY") { preparedQuery.bindValue( ":my_country", data ); } else if (field == "MY_CQ_ZONE") { preparedQuery.bindValue( ":my_cq_zone", data ); } else if (field == "MY_NAME") { preparedQuery.bindValue( ":my_name", data ); } else if (field == "NAME") { preparedQuery.bindValue( ":name", data ); } else if (field == "OPERATOR") { if (util->isValidCall(data)) { preparedQuery.bindValue( ":operator", data ); } } else if (field == "STATION_CALLSIGN") { if (util->isValidCall(data)) { preparedQuery.bindValue( ":station_callsign", data ); } } else if (field == "OWNER_CALLSIGN") { if (util->isValidCall(data)) { preparedQuery.bindValue( ":owner_callsign", data ); } } else if (field == "MY_RIG") { preparedQuery.bindValue( ":my_rig", data ); } else if (field == "MY_SIG") { preparedQuery.bindValue( ":my_sig", data ); } else if (field == "MY_SIG_INFO") { preparedQuery.bindValue( ":my_sig_info", data ); } else if (field == "MY_SOTA_REF") { preparedQuery.bindValue( ":my_sota_ref", data ); } else if (field == "MY_STATE") { preparedQuery.bindValue( ":my_state", data ); } else if (field == "STATE") { preparedQuery.bindValue( ":state", data ); } else if (field == "MY_STREET") { preparedQuery.bindValue( ":my_street", data ); } else if (field == "MY_USACA_COUNTIES") { preparedQuery.bindValue( ":my_usaca_counties", data ); } else if (field == "MY_VUCC_GRIDS") { preparedQuery.bindValue( ":my_vucc_grids", data ); } else if (field == "NOTES") { preparedQuery.bindValue( ":notes", data ); } else if (field == "NR_BURSTS") { preparedQuery.bindValue( ":nr_bursts", data ); } else if (field == "NR_PINGS") { preparedQuery.bindValue( ":nr_pings", data ); } else if (field == "PFX") { preparedQuery.bindValue( ":pfx", data ); } else if (field == "PRECEDENCE") { preparedQuery.bindValue( ":precedence", data ); } else if (field == "PROP_MODE") { preparedQuery.bindValue( ":prop_mode", data ); } else if (field == "PUBLIC_KEY") { preparedQuery.bindValue( ":public_key", data ); } else if (field == "QRZCOM_QSO_UPLOAD_DATE") { preparedQuery.bindValue( ":qrzcom_qso_upload_date", data ); } else if (field == "QRZCOM_QSO_UPLOAD_STATUS") { preparedQuery.bindValue( ":qrzcom_qso_upload_status", data ); } else if (field == "QSLMSG") { preparedQuery.bindValue( ":qslmsg", data ); } else if (field == "QSLRDATE") { preparedQuery.bindValue( ":qslrdate", (date.fromString(data, "yyyyMMdd")).toString("yyyy/MM/dd") ); } else if (field == "QSLSDATE") { preparedQuery.bindValue( ":qslsdate", (date.fromString(data, "yyyyMMdd")).toString("yyyy/MM/dd") ); } else if (field == "QSL_RCVD") { preparedQuery.bindValue( ":qsl_rcvd", data ); //preparedQuery.bindValue( ":confirmed", '1' ); } else if (field == "QSL_SENT") { preparedQuery.bindValue( ":qsl_sent", data ); } else if (field == "QSL_RCVD_VIA") { preparedQuery.bindValue( ":qsl_rcvd_via", data ); } else if (field == "QSL_SENT_VIA") { preparedQuery.bindValue( ":qsl_sent_via", data ); } else if (field == "QSL_VIA") { //qDebug() << "FileManager::bprocessQsoReadingADIF-QSL_VIA: " << data << endl; if (data == "BUREAU") // This comprobation is to "correct" old logs, mainly from KLog // comming from older ADIF files { preparedQuery.bindValue( ":qsl_sent_via", "B" ); } else if ( (data == "B") || (data == "D") || (data == "E") )// M Deprecated value from ADIF 304 { preparedQuery.bindValue( ":qsl_via", data ); } else { // If values are not valid, are not imported. //TODO: Send an error to the user to show that there was an invalid field } } else if (field == "QSO_COMPLETE") { preparedQuery.bindValue( ":qso_complete", data ); } else if (field == "QSO_RANDOM") { preparedQuery.bindValue( ":qso_random", data ); } else if (field == "QTH") { preparedQuery.bindValue( ":qth", data ); } else if (field == "REGION") { preparedQuery.bindValue( ":region", data ); } else if (field == "RIG") { preparedQuery.bindValue( ":rig", data ); } else if (field == "RX_PWR") { //qDebug() << "FileManager::bprocessQsoReadingADIF-rx_pwr: " << data << endl; preparedQuery.bindValue( ":rx_pwr", data); } else if (field == "TX_PWR") { //qDebug() << "FileManager::bprocessQsoReadingADIF-tx_pwr: " << data << endl; preparedQuery.bindValue( ":tx_pwr", data); } else if (field == "SAT_MODE") { preparedQuery.bindValue( ":sat_mode", data ); } else if (field == "SAT_NAME") { preparedQuery.bindValue( ":sat_name", data ); } else if (field == "SFI") { preparedQuery.bindValue( ":sfi", data ); } else if (field == "SIG") { preparedQuery.bindValue( ":sig", data ); } else if (field == "SIG_INFO") { preparedQuery.bindValue( ":sig_info", data ); } else if (field == "SILENT_KEY") { preparedQuery.bindValue( ":silent_key", data ); } else if (field == "SKCC") { preparedQuery.bindValue( ":skcc", data ); } else if (field == "SOTA_REF") { preparedQuery.bindValue( ":sota_ref", data ); } else if (field == "STATE") { preparedQuery.bindValue( ":state", data ); } else if (field == "SUBMODE") { preparedQuery.bindValue( ":submode", data ); } else if (field == "SWL") { preparedQuery.bindValue( ":swl", data ); } else if (field == "TEN_TEN") { preparedQuery.bindValue( ":ten_ten", data ); } else if (field == "UKSMG") { preparedQuery.bindValue( ":uksmg", data ); } else if (field == "USACA_COUNTIES") { preparedQuery.bindValue( ":usaca_counties", data ); } else if (field == "VE_PROV") { preparedQuery.bindValue( ":ve_prov", data ); } else if (field == "VUCC_GRIDS") { preparedQuery.bindValue( ":vucc_grids", data ); } else if (field == "WEB") { preparedQuery.bindValue( ":web", data ); } else if (field == "APP_KLOG_POINTS") //Importing own ADIF fields { preparedQuery.bindValue( ":points", data ); } else if (field == "APP_KLOG_MULTIPLIER") //Importing own ADIF fields { preparedQuery.bindValue( ":multiplier", data ); } else if (field == "APP_KLOG_TRX") //Importing own ADIF fields { preparedQuery.bindValue( ":transmiterid", data ); } else if (field == "APP_KLOG_LOGN") //Lognumber in a multiple-log file { //TODO: Think about how to import a file with different logs //isThisQSODuplicated(const QString _qrz, const QString _date, const QString _time, const int _band, const int _mode) } else if (field == "APP_N1MM_POINTS") //Importing from N1MM { preparedQuery.bindValue( ":points", data ); } else { } } else { //qDebug() << "FileManager::processQsoReadingADIF (field) CheckAdif FALSE: " << field << endl; } } } //preparedQuery.bindValue( ":lognumber", i); //qDebug() << "FileManager::processQsoReadingADIF: logNumber: " << QString::number(logNumber) << endl; // if ((haveSubMode) && (!haveMode)) // { // We can guess the mode from a submode! // preparedQuery.bindValue( ":mode", dataProxy->getIdFromModeName(dataProxy->getModeFromSubMode(submode)) ); // haveMode = true; // } if (!(haveBand && haveCall && haveMode && haveTime && haveDate )) { aux2 = tr ("This QSO is not including the minimum data to consider a QSO as valid!.") + "\n\n\n" + tr("Please edit the ADIF file and make sure that it include at least:") + "\n\nCALL, QSO_DATE, TIME_ON, BAND "+ tr("and") +" MODE.\n\n" + tr("This QSO had:") + "\n"; if (!haveBand) { aux2 = aux2 + tr(" - The band missing and the following call: ") + qrzCall + ".\n"; //aux2 = "Band missing " + qrzCall + " "; } if (!haveCall) { aux2 = aux2 + tr(" - The call missing but was done at this time: ") + aux3 + ".\n"; //aux2 = "Call missing " + aux3 + " "; } if (!haveMode) { aux2 = aux2 + tr(" - The mode missing and the following call: ") + qrzCall + ".\n"; //aux2 = "Mode missing " + qrzCall + " "; } if (!haveDate) { aux2 = aux2 + tr(" - The date missing and the following call: ") + qrzCall + ".\n"; //aux2 = "Date missing " + qrzCall + " "; } if (!haveTime) { aux2 = aux2 + tr(" - The time missing and the following call: ") + qrzCall + ".\n"; //aux2 = "Time missing " + qrzCall + " "; } aux2 = aux2 + "\n\n" + tr("Do you want to continue with the current file?"); //qDebug() << "FileManager::processQsoReadingADIF - Missing fields: " << aux2 << endl; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog: Not all required data found!")); msgBox.setText(aux2); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); msgBox.setIcon(QMessageBox::Warning); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked break; case QMessageBox::Cancel: noMoreQso = true; break; default: // should never be reached break; } } if ((!rstTXr) && (!rstTXDefault)) { QMessageBox msgBox; aux = tr("This log seems to lack of RST-TX information.") + "\n\n" + tr("Click on Yes to add a default 59 to all QSO with a similar problem.") + "\n\n" + tr("If you select NO, the QSO may not be imported."); msgBox.setWindowTitle(tr("KLog: No RST TX found!")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setIcon(QMessageBox::Warning); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked rstTXDefault = true; break; default: // should never be reached rstTXDefault = false; break; } } if ((!rstRXr) && (!rstRXDefault)) { QMessageBox msgBox; aux = tr("This log seems to lack of RST-RX information.") + "\n\n" + tr("Click on Yes to add a default 59 to all QSO with a similar problem.") + "\n\n" + tr("If you select NO, the QSO may not be imported."); msgBox.setText(aux); msgBox.setWindowTitle(tr("KLog: No RST RX found!")); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setIcon(QMessageBox::Warning); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked rstRXDefault = true; break; default: // should never be reached rstRXDefault = false; break; } } if ((!rstTXr) && (rstTXDefault)) { preparedQuery.bindValue( ":rst_sent", "59" ); } if ((!rstRXr) && (rstRXDefault)) { preparedQuery.bindValue( ":rst_rcvd", "59" ); } preparedQuery.bindValue( ":lognumber", QString::number(logNumber)); return true; } void FileManager::queryPreparation(const int _logN) { //qDebug() << "FileManager::queryPreparation log: " << QString::number(_logN) << endl; //Prepares the query, ALL fields to default except lognumber, as may change... QStringList columns; columns.clear(); columns << dataProxy->getColumnNamesFromTableLog(); if (columns.size()<2) { //qDebug() << "FileManager::queryPreparation: <2 " << endl; return; } for (int i=0;i'); //qDebug() << "FileManager::howManyLogsInFile: data.0: " << data.at(0) << endl; //qDebug() << "FileManager::howManyLogsInFile: data.1: " << data.at(1) << endl; if (logs.contains(data.at(1))) { } else { logs.append(data.at(1)); } } } } else if (line.contains("EOR")) { atLeastOneLog = true; } else { } } //qDebug() << "FileManager::howManyLogsInFile: JUST ONE!" << aux << endl; file.close(); if ( (logs.size()<2) && atLeastOneLog ) { return 1; } return logs.size(); } bool FileManager::fillHashLog(QFile &_f) { //qDebug() << "FileManager::fillHashLog:" << endl; //hashLogs //1.- Run the log and fill hashLogs //2.- Run the file and continue the log series to be able to translate the files log into our own log hashLogs.clear(); QStringList qs; qs.clear(); qs << dataProxy->getListOfManagedLogs(); int i = 0; for (i=0;i'); //qDebug() << "FileManager::howManyLogsInFile: data.0: " << data.at(0) << endl; //qDebug() << "FileManager::howManyLogsInFile: data.1: " << data.at(1) << endl; if (logs.contains(QString::number(data.at(1).toInt()+10000))) { } else { logs.append(QString::number(data.at(1).toInt()+10000)); } } } } else if (line.contains("EOR")) { //atLeastOneLog = true; } else { } } file.close(); return logs; } void FileManager::setVersion(const QString _version) { util->setVersion(_version); } QStringList FileManager::readAdifField (const QString _field) { // This function receives a QString with an ADIF field and returns a QString with the following format: // ADIF-tag, value // If the QString is not an ADIF tag, it returns a clear QStringList. // We are expecting the ADIF format: // D // Data /* //qDebug() << "FileManager::readAdifField: " << _field << endl; QStringList result; result.clear(); if (!((_field.startsWith("<")) && (_field.contains(":")) && (_field.contains(">")))) { //qDebug() << "FileManager::readAdifField: NOT (contains : and >): " << str << endl; return QStringList(); } // Now we have the data in the result[1] result = _field.split(">", QString::SkipEmptyParts); QString aux = result.at(0); QString data = result.at(1); QString type = QString(); int length = -1; QString fname = QString(); if ( !((aux.endsWith(">")) && !(aux.contains(":"))) ) { return QStringList(); } int i = aux.count(":"); if (i == 1) { lenght = (aux.section(':', 1, 1)).toInt(); fname = aux.section(':', 0, 0); } else if (i == 2) { lenght = (aux.section(':', 1, 1)).toInt(); fname = aux.section(':', 0, 0); type = aux.section(':', 2, 2); } else { //qDebug() << "FileManager::readAdifField: NO proper format(1): " << str << endl; return QStringList(); } if (length<1) { //qDebug() << "FileManager::readAdifField: NO proper format(2): " << str << endl; return QStringList(); } // Now data is splitted in the appropriate variables. We start checking format! result.at(0) = fname; if (fname == "QSO_DATE") { QDate date; date.fromString(data, "yyyyMMdd"); if (date.isValid()) { result.at(1) = data; return result; } else { //qDebug() << "FileManager::readAdifField: NO proper format(date): " << str << endl; return QStringList(); } } else if (fname == "TIME_ON") { QTime time; if (data.length() == 4) { data = data + "00"; } time.fromString(data,"hhmmss"); if (time.isValid()) { result.at(1) = data; return result; } else { //qDebug() << "FileManager::readAdifField: NO proper format(time): " << str << endl; return QStringList(); } } else if (fname == "BAND") { if (dataProxy->getIdFromBandName(data)>0) { result.at(1) = data; return result; } else { //qDebug() << "FileManager::readAdifField: NO proper data(BAND): " << str << endl; return QStringList(); } } else if (fname == "MODE") { if (dataProxy->getSubModeIdFromSubMode(data)>0) { result.at(1) = data; return result; } else { //qDebug() << "FileManager::readAdifField: NO proper data(BAND): " << str << endl; return QStringList(); } } else if (fname == "QSL_RCVD") { } else if (fname == "QSLRDATE") { QDate date; date.fromString(data, "yyyyMMdd"); if (date.isValid()) { result.at(1) = data; return result; } else { //qDebug() << "FileManager::readAdifField: NO proper format(qslrdate): " << str << endl; return QStringList(); } } else { //qDebug() << "FileManager::readAdifField: NO Field found: " << str << endl; return QStringList(); } //qDebug() << "FileManager::readAdifField: NO Field found-2: " << str << endl; */ return QStringList(); } QString FileManager::prepareStringLog() { //qDebug() << "FileManager::prepareStringLog: " << endl; QStringList columns; columns.clear(); columns << dataProxy->getColumnNamesFromTableLog(); if (columns.size()<2) { //qDebug() << "FileManager::prepareStringLog: <2 " << endl; return QString(); } QString queryFields, queryValues; queryFields.clear(); queryValues.clear(); for (int i=0;iOÿ Y0B/!iIENDB`klog-0.9.8.1/flags/iq.png0000644000175000017500000000100313532572307014017 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f9 x[ ֠j68%dT6d`8$v"e1Ӟ$]vpOb\bB'^gabfg󥷗|HO_YIZ-e13AO(e$pP: 10 d mwZ{Ds@h7Z1(e@,/^߿ MP1@A5@s-k޲UD(; UИݯ_jZ31!ԃm 3 00p3Z?Nv_vvS T @?EY;x D߿sͬx(/i Lׯ2o?*-@S~T=Z@_^AB@ ?Xj0R+7IENDB`klog-0.9.8.1/flags/lr.png0000644000175000017500000000072213532572307014032 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<dIDATxbd`f@(?`BP6z߿ڼrk D߿?~|bcc@߿Y$$/L@ {ܴQڸ?%Zzf)'w^g A 4Ͽ߿X%eNZ@߾f?n b$,*3y w]r1l0h/Ʌ뗬`ōkrIT\'`c r4@_v9c7ODaH_ @,$FԨEf@ng ’IENDB`klog-0.9.8.1/flags/me.png0000644000175000017500000000070013532572307014012 0ustar develdevelPNG  IHDR 䅪tEXtSoftwareAdobe ImageReadyqe<bIDATxTR/CQ?#mc.!$"tb` `4u`"Hl 0T"b T{9ιy9y|~ET'fbD9"l}AcJ {́կmԛc=WV Ź,[ac0q9H`;/f{ Je;璐b,p#h~x#i;.F 饟U&oapӓC`A=~.'.*w|*#P_tZ락'ύ jKsm/_|h_2CgϐW ıýF4XڒI9MjRA)8=BOAj I~IENDB`klog-0.9.8.1/flags/lc.png0000644000175000017500000000101013532572307014002 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<IDATx4Q=kTA3o7Y7F0! M@Ơ؄P,&bh*kH*6@A,}o{sgހ|{>/b첌tm D&Jath# MHCy7 F$FQ H6ʭ|+8;B4yGsnJ[/dQ*0T+:1@ƕtatFQUՕ:& 5ʺF!T5qh̒Z%`YKoTy}^ +y}$ͳ, [놝 ~7O E;*+._8(aٶ#"ϟo[%'ēߚNꯟ_~3X + /oWy>?@/0XQI  /Ԙ&y 6!j IENDB`klog-0.9.8.1/flags/ua.png0000644000175000017500000000067613532572307014032 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<PIDATxbdh1 ?(# rr1Pz(* jd!7nG3K,TCœ~KG00T??߿ !~!@lTd6H+ks X. l$P*  rJSߟ wHʖbc:@20?/WdbRz@C, HTE( @ P6  @uJDA:#B?bz@I8`@pAHnGIENDB`klog-0.9.8.1/flags/yt.png0000644000175000017500000000112113532572307014043 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx$A 0To{ֹBRR|:f tY\(c@ w&/\$vY \/镽m-̝ɜH@D\1aapq02?3?P'###b/xϜy:&jý?{4ZE]cܻ/_``3[/OOOϟ?淯_UUU8L6:0s?PVS[˗HzU##f&ʟS~g󻓙_fO22@4:_X@ק_?~I@YXX~32r$X998 * Ʒo-yׯ_Mݻwp Z t`&C WM$BIENDB`klog-0.9.8.1/flags/ni.png0000644000175000017500000000077413532572307014032 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd( cC@*b` g2/@5M_d J3 ?#÷bj *_hPDߟz 6IQ./nFFӿY8sgO>ķP1jd ĂQ_Y (@1O]h Eeal[ X.wZ;`80B&P2@lHBAEa%@o& ~(o`$1h?x@ _"(=v!Q /1blIENDB`klog-0.9.8.1/flags/tw.png0000644000175000017500000000072113532572307014046 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<cIDATxbdPЯ ?<|. PYK4fgfb: P+#l@,Esgee|07ރ?_f@,@k_7DP X5sǟ 4l[Pٿ>h2Ah20ߧ ?x47H@&N  f  @Q$ t@40S @~aH'#H DBP1@1~EHl ISf捧IENDB`klog-0.9.8.1/flags/fi.png0000644000175000017500000000075113532572307014015 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<{IDATxb|30I`2.?A0bab`*kƿePr!ڝ_l8Dٛ@S`dd@5_ ߟ?$d 15#o~ @m@w?Po Јa_հ tl@ 4Β*NW7T`S9bad%Pj" /c`dxqh*Ws'>~@0cfr @V@5:<Yƀz;@"rVQ_(@>}`iIENDB`klog-0.9.8.1/flags/fam.png0000644000175000017500000000102413532572307014154 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd8a`ï ?X@BQ?_L܌Uec??5e {K@  o & ~rK0&%7i>O'*k@ Q T??0 ÿ3y:  r_ d? \zd6P 6:I4CV4I@O'%soH H(xc?/FN/nc 3IC7F)!~Fff!D@@ aWpci6TP ];T@ae/IENDB`klog-0.9.8.1/flags/jp.png0000644000175000017500000000064413532572307014031 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<6IDATxb+Df($SHŋSط#of h @^…Ç?}?9Bb$ի/(ZpK@LG`˗YT @,@ gV h,))* &@ H :sqߵ L @@1}. e@?B޽ @ ޽{H &l争=IENDB`klog-0.9.8.1/flags/fk.png0000644000175000017500000000121013532572307014006 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb_XCrɛL~10%?hTc%e< '? ?~@ 1;3A 1Q1<5e; 1H|z"'۞?_~ 1J^I 3 7M+ m׶E"A~ן.Uf?Y__9$j ~L~~|?a'ןoA6 C~7/{)aSH?;0oϿ>gxׯm=+ _Rh? ~0s@5pp`05eX  ~d_@o&vV/b=qd_?/.[ X\\ W?[_ן@aݷ N|E _ "[{ 2oRpL 6{)GQF?3З~Aٕ?@,70H70&k@,Ry!- ?L<pl|/a FbO1&y qnC1IENDB`klog-0.9.8.1/flags/kw.png0000644000175000017500000000074613532572307014044 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<xIDATxbdN``1B^F䀡jE rbc?ŊW40|dӿ 7HP)׿_@,, 7,?O?UADY2_c"d"%)`dd41 ?vj?n 6,t|?ȉh_m:zЅ`ɿ_|ϗ?, +6P' $e/ʇJHJ_?`E@F F b _"he);IENDB`klog-0.9.8.1/flags/hk.png0000644000175000017500000000101713532572307014015 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb| Hd,fb`   0oN>޴ X@j{(/nOk_@L@V?T߿L@?9鿺:0#ÿ_ b ?9kj̓&q?5+ח/ A@j7;9ߴ?'7 `o5 q4^(8?[gN &PPuMb<d<6?+|XQ_?9c?/P1@?L cYTYP˫W,rr  P1@1>d`Ȍ?q`=歆bIENDB`klog-0.9.8.1/flags/vu.png0000644000175000017500000000113413532572307014045 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxL @5k C$^u"b24bҗ'wXVu??0ϟ0˦MpoF2Mno?A* / QV@15K7.c߿JA~_P=@ !8w,Z'!?_~H20HÏ;V.Ms?~o7 Ic/+u o?2ׯ@;~ $ $PTr@4;_&:@ 1 ߿D'C c@'}?I02|a -?ArI  d$P=//bad`0'`$h)PĀLr0$QOJQIENDB`klog-0.9.8.1/flags/cd.png0000644000175000017500000000102013532572307013773 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<IDATxt?LAƟRL !LU8 CL?,jX]+L,4ơ$~URЄ āW^ہ{{=V;ߵP(> P ҃/]͐n9ʲ<[r-%M뇻by,Aˈ0f3tg?M^q,zZ ,|ik` +yV3> BA 7`+rԁKhu) $%{}р᫩l@Ҧ 7j `:'F3[PePP\0L"j Х#5FxL:_zL1^Q+f~x&x5^IENDB`klog-0.9.8.1/flags/nr.png0000644000175000017500000000101713532572307014032 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdg1$  P#x?׵W bR?4Hʈ @S2/0?j0 d @, \03?Ю ׀ā ޟ^@,gҰ՟`d07!qS/@(K>~a#{O_ϯ 7]ϟ`W)H @L @glӞ/p0~]zӗo?}Ǐa4`O  &9w a?0S f@i FK(-r 9IENDB`klog-0.9.8.1/flags/kr.png0000644000175000017500000000112013532572307014022 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb+1@18كGW_d--|w 5 ׯ_oݺ"bbʊg/^]F@PPXHHFVh@l~mhb,%Au bn^^o޼yPbիW\{pL/~%)"7RR= /EDDo0fl29}vvni)FF޾}U]7W؇?GIIIF o޼9m4= 8U-T0 1|$o'OB@,"UYyZ߿10Br10<h1VVnn..J;>2 c1Þ'44 w_,+tgϯ_@b;⺗ 'ɉ @,"ISXÊo~fc4fn{ϯ`[1쾾ﱱ H8UFߺ_v}zq|l*goW|￿mz/j2~bKߩp/y[ 1h߿ ivU叿f ۾ρ.b~j* X"M$(9?YeEJr?Pdb<>Ôs {10|g  +9IENDB`klog-0.9.8.1/flags/gw.png0000644000175000017500000000100413532572307014024 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπd``b?"?$\] $L2m'O30_`Qh@_F߿KAV !~5Щ- I) @l߿Ϛq@ϿdS @2'/ׯ?_aJ|c ~0T @ @@2Tj? S D _II?s /а?q @_ G <700@A aq%#aIENDB`klog-0.9.8.1/flags/il.png0000644000175000017500000000065713532572307014030 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<AIDATxb|%p.@1'*dALL  ##kYuߒ/Bq'@@\ Ua7g/?o5 @\5X?g+Uaޥ?w@ =)~ v\g Y ~@ $x 4@< @,.Z l ?e r?Êxmd J)yo~.IENDB`klog-0.9.8.1/flags/sy.png0000644000175000017500000000064613532572307014055 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<8IDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@,>~e!Fw@~{ѧ?_z@L@ 7u[u{ݏvM:fß? >T yZ4v0@1}!w F +--޽{@ ?UTT.^@`$P ( ?`0 @D20ϞJ* ҶIENDB`klog-0.9.8.1/flags/it.png0000644000175000017500000000064413532572307014034 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<6IDATxbd10ax*RU baPZ RIJJbb e&ba`?￿@Po QVh@ TFW @` 5 B1bbzh￿%(@ f F ߿T @Wa` @JCv > @c?ܒ o BFFF8PR)#(AlY8@ 8.VwQrIENDB`klog-0.9.8.1/flags/pk.png0000644000175000017500000000107113532572307014025 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb#|Ez4 f1XH1߿ߛfl 㯏? e_ ZGh@1ATC?U+[;F,,@A5%$vϟ?ȇpT  F3߿ ~D N8@`HHHHC -@ V3azDIENDB`klog-0.9.8.1/flags/ht.png0000644000175000017500000000074713532572307014037 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<yIDATxbdU?ï Ï? HI$A!}`䄂p& Tݫ=WR` ǎ?̱bj՛_@!rP~C~1EY Ъ Sd$j5? @ 9H!Yo D9iZ~ɿ@o. L `6] {@?I ~h)˿?0 57T؋ %AF7#D3PH @cpE?H BD ʐ!qIENDB`klog-0.9.8.1/flags/smh.png0000644000175000017500000000053613532572307014207 0ustar develdevelPNG  IHDRvbKGD pHYsgRtIME0uluIDAT(c'1NfpT #/`e\W<,2b `M u2eswcxW{AX~}á`/+  s0te030 r1ܼwP?p0p2Ä| Uݿb%> |`59bC_^̓IENDB`klog-0.9.8.1/flags/dm.png0000644000175000017500000000115413532572307014015 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdd@ @(fU?WD~1@_ T $2 Z\9+ ϟVX@,~{_PC̕_)=͍$@=@L 0×v?QVS~y?~1BI/\Α@X}q ש1|{v d+1\ N ߿@=t/2Kd?)Ծ({bdf(.~¢H9οvnt!n&@()j?@Lr~r1%fz~4D5P @,@[SD@Zcπ3/vPH5#C.JDB/>}*" $M,8̃IENDB`klog-0.9.8.1/flags/ar.png0000644000175000017500000000077213532572307014024 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb<a Ͽ?E@󏍉 X>aHU?@ÿg/\= X~a @@K@\([?b})& h6  `> $YD:?a6bZ }/2q{p f .T B?2@ f`cN93@\O 0r+T l, @,YJ^~<@C4A'yD Xcd`e_`Ȃt2@ t78N@~ ~} ?@H-(l pmA`IENDB`klog-0.9.8.1/flags/ps.png0000644000175000017500000000073013532572307014036 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<jIDATxb@ ow20\L@߿a$شi@50zt߿7Po8@dHuWo FFƇ?oA)L`j* ?~ht@,?_ I`K $~d!ϯ^XU t?ݪ'xז~_e~-G=۟5Y%H? `|P0_? P 1$@T1p4qIENDB`klog-0.9.8.1/flags/to.png0000644000175000017500000000065213532572307014041 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<a{g1k2K@51Ȩ! Ƽ /e"l~8_7|ﯿw~b(? a>儕/_>n?bj( 5 h6 "3cϿr@5翤О?  oR_^qc?#C(j\+RL 2%>%IENDB`klog-0.9.8.1/flags/cv.png0000644000175000017500000000102113532572307014016 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdH1 cJ rNCA2Ql$o&;0m+d4Ѐz>*}bO@` @r `~Wh@4R \<nY_5*N@L@`dFnzA$zMbɆ[@eddcF#33Wu5{Pi_?g<-3ɽڵ  <e޼y@,JӘo'2puծ/TuuXPSf_@ fL\l /H..mƋ/gxj ;#W2Q 1A `B% [IENDB`klog-0.9.8.1/flags/england.png0000644000175000017500000000076013532572307015027 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb#߷/礥10ܾ P?T'zQѿ?#gϞ D\5H߿߿@@,h!$P_J;@ pEF+.ONHh'P@12(D$O 0z79NIENDB`klog-0.9.8.1/flags/vn.png0000644000175000017500000000073213532572307014041 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<lIDATxbπPX@_upɒ2ҒKF6hU wg@ տH_/8,bE5P 7P@1#P5?.'"4M /R Df{ $@ 䤿~;ͯ@ @ï~TIvo WM$w/o@C00H38ȀT3:9~P@ L0HJQd$ȗ@+jDc0RZ2IENDB`klog-0.9.8.1/flags/bs.png0000644000175000017500000000101613532572307014016 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdfb`ccc60 R18: Mǎ Ȱwܽ7$䯨 =1~D@m x?3wn +@5@ f1~3c@4x1Fz`!J {ˏ~_P@ma~ ~'5䷬"7P@lׯ?A~1$98 ^/xJIENDB`klog-0.9.8.1/flags/gr.png0000644000175000017500000000074713532572307014034 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<yIDATxb?pb4x (" P]L3S@  ?ÃGѣG q02Ttxb(nߟ/$R? @1[v3أ TuhҶ ZPW0@֭G̍7s%CH?'˅Cwŋ7""H"31н@{@,}eI!fT apq0 Xy$˯@_y=$"ڹ&@1޼QTH(… 0:{ 7C#??;0kPl~IENDB`klog-0.9.8.1/flags/ie.png0000644000175000017500000000074113532572307014013 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<sIDATxbd10ax򔉁 ă??DTc 8 Ck5T⌌@ (ߟ11 XX@O>/|󅗕?|QXbh2P ?&_@Kj ?P_HP1@= 4b? lz0,rI`'HoA (t=@'1; 7aA XInI7eE###00)$bd(e`cP|`^]K @7dJr IENDB`klog-0.9.8.1/flags/mg.png0000644000175000017500000000070513532572307014021 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<WIDATxb|= O@XƁ(' $Ra_6m yP@ӧ ϟT@/ _@6,bAQ dMJHR 5 @p @e 쿿_$P?c` j y!}@`/>%ߧ~2@_?QTߟ^1InP_ b@Pz9H?/@1>~H3<G)<&I$cݛxIENDB`klog-0.9.8.1/flags/sg.png0000644000175000017500000000072413532572307014030 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<fIDATxb|ׯ?s$  K)f_|I[ǏN1?|i@51kk>~Ϟ=,?,`cHݯ,+  @,/;vp VWT7P/@@ '>xښ~ 1HU3 XVrxx3qq l0ß?0JJxxLLLo |gp,?f0 @`! @, xB4`OVY}IENDB`klog-0.9.8.1/flags/np.png0000644000175000017500000000067313532572307014037 0ustar develdevelPNG  IHDR YgAMA7tEXtSoftwareAdobe ImageReadyqe<MIDATxb4<-;/p^  cc?G? 0 n1 ݱqEBtaR!BLmw%VD7rYIc G?s`Hfv  pi58|- ӥ-@~cFy \c-?I׎Rk`ɉqa=mO Kb/9p>)IENDB`klog-0.9.8.1/flags/rs.png0000644000175000017500000000064713532572307014047 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<IIDATxtPMK@m6\DZ؜{UQG7QDWգ TQ4"q6ff罙 Q3Ÿx">HvdyȘE>_+*7>ao $k ;iܘLZ=K/-]wT ڋQߩθŒ*vd2렌\4jMxo\EunF8%dQAserw^2 :DBWNomy T,+ C$۶azyhBV -? 0Xx<4IENDB`klog-0.9.8.1/flags/cx.png0000644000175000017500000000114013532572307014022 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdgYDf@120nUa;O?? (gߛvl 6o\O85:~o@=~Do:e6 kV|4߿W۔I@1U*qs1y!kZrcįX_ݪ~vWҕ_wic)*IU~vO vR̯}$j`HIz_~_~>ʓ#kO?~ T߯@j1S__)) ﯩ="{ll! ??B0X@ d,? 3XTR"@Cux23$KK0 [+>$ڰRd"G/0   P=BeIENDB`klog-0.9.8.1/flags/cs.png0000644000175000017500000000066713532572307014032 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IIDATxbd` 10d@,1U&aFwOx$r3{IK&_m@U y< T T7￿~E20| SSMM!QQl<N0DE9o ƿ/_20?ݸ@,B h@< k>ІP@,~ z̀ dEDtv˿י0/0"~3ˠt3@IIH(7#B bb b@I@sg_IENDB`klog-0.9.8.1/flags/gl.png0000644000175000017500000000072613532572307014023 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<hIDATxb#L) @,@ >>>  $" ={@,A|aX ߿joaϟ?U D ?x߾KWl: nC ˖aj ƿ!!?|Лџ??VV z1Gͨ{bH=#GQT-fhbj`r~d8df/^4cP 2 ,@40 ) 2ft1Q66G>|` BBP1@1~(b@I@[JăIENDB`klog-0.9.8.1/flags/al.png0000644000175000017500000000113013532572307014003 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb򏁁X0"#8@%'U߿,y5߹odr3ϯѕ |wB9t{ϯ_} eZ@,?Wq3߿~fs2߯_ ~53_K?=珟"_~ 5 _߿KA%/_ 7 !c~_k}cϯ>Kagdh6Б@~ ??rc0?~Qc@Aj@ Љ 6>f?f!ֿ~|r6  VEĘ!O0PȠ?@FX@1?`HBc ,0eB@Mv=IENDB`klog-0.9.8.1/flags/no.png0000644000175000017500000000100013532572307014017 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|rsE]D3?`A @,@Qj )FFF0~ "߿n@,`{H|σ@ ׿_,+  U@_ @=@$@W߿@g@c@e>#sdv@m@$ H 9 @ɂgqq&&=ffܬ? l줷v~|o7~aQVz@d@ g'D/ H'?f ?$A.,_P3@WaQމ̮ 1$`$ZlIENDB`klog-0.9.8.1/flags/bh.png0000644000175000017500000000071113532572307014004 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<[IDATxb n/*_1  xyy!*5ü_f? @6i@@._a5w ~ѿ_@ tu761CTĀ#fb/_f=x @@Lp'KKBb1ΜfXoà60@L@'#&j`pm1@AS{{?{P !5@1zJPP$Ç ?~+T=MWYɀwTmIENDB`klog-0.9.8.1/flags/cr.png0000644000175000017500000000073513532572307014025 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<oIDATxbdoe1$ F?Ĺ A>*Wm1z;d*,!{@?gf+`X3 ?|@, 1?Ŀ`/:lkJA @ ؀_!(h\HD ӽdުO=t/PF4\L@)@@J*~# % XD[9} q(s7엿L||2'?YAr J Pz-@120΋: h0= d@qeԐExt¹$@yIENDB`klog-0.9.8.1/flags/gh.png0000644000175000017500000000075213532572307014016 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<|IDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@,`J̓( 7P@ ` >7:BSx+)% =Z FL<q_ڴJNh#@1}2?DWD/9_?㣁ܟ0 j 2?￿~߯ߎmDemd ? }" R7 j D #- 6N? /05c Fd=  !pB0br(IENDB`klog-0.9.8.1/flags/nl.png0000644000175000017500000000070513532572307014027 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<WIDATxbπPX@`U 5/w9~LO)V*<'ρJ@~$(+  XD 3T j Ə??< AT40Ved@+o>Ƞ_^kן $߿ <{;g óOzH߯@u5@H?p20 _ uœ#@?`@hc`FDB2kgIENDB`klog-0.9.8.1/flags/nc.png0000644000175000017500000000111713532572307014014 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd>1@B!C O.3~.ϿFg  e'|0l@Ҧ`YEa3?-}߶Q ܻwR &1|((12AP60 7,<ԃ lME"#VJQB]@,`8Ot̯߿vNL{h?`@$# l{?{'ٱPϟRR~7[ h?~eѿgO1 ЂB\p!xh֛Z|Lg_*! zH ̀AǏ$IENDB`klog-0.9.8.1/flags/sardinia.png0000644000175000017500000000070713532572307015212 0ustar develdevelPNG  IHDR n pHYs  tIME-.^ (fIDAT(mQ=OP}|% :*IX 'vBXt؁h&= /|Y:l6qN @navVu4M~d2Mv+nPJa\$I~ZTp'& "c>HX/D"LlV<sAx` 81E xޏ,@SC-^$'(EI"napqw{p?-޹3b8H44RnRJ&aJdY J%tnz^3Ǝ7x<-ÍRoIENDB`klog-0.9.8.1/flags/br.png0000644000175000017500000000112113532572307014012 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdHf@ `/03 @5F7g`￿6ZXl9 ϟ߿UOBY;K^?K_h@5T T5ToUդ $~涐eO; o bL_g~ UszhdČY/D:U6[R?f?OGsA_2ЖҶ0<t{W|x_D˒_.fg y)h)˖bU?}n[/I^r2|d   &go~Ko2,@ `H?$x$A^; 3˿kaܿ(@128"b9F1C/AnIENDB`klog-0.9.8.1/flags/mv.png0000644000175000017500000000103613532572307014036 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb| p(6 й'$PdK|K m @b'O@@߿?$+  Xvÿi-j?X??PdQaYy?1e@r1H3Is 2 E:_@ '_S]]= `? r$t?cd<K.d+ ou@2wͿp߿_T NWqyP߯ j`Y8P1@QR jH$ @xb110iK0{IENDB`klog-0.9.8.1/flags/se.png0000644000175000017500000000103613532572307014023 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdpndu ?_~a Xs=1onߟD@Ml'3{@E07/bPba/_`P3йAF2_@0o&#0oFvO{  0 A!T I AEBHH#A8, ڒ`篲Ifد_@ՠ  0D O)@a`fԿ߲B<_9H FdxD@2B s$@ܹy'IENDB`klog-0.9.8.1/flags/lb.png0000644000175000017500000000100513532572307014005 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπ`$cIbJHtT1_? @o dM3@i?a@~ٿ &)%1H```|ռS~h,',󟑑-<@11011 F ;w?0?btJw]_nƋȚrd21:@5@1oV$ʙ @r>z PO`8~yO 0.(  f&` LA ePb"e@`SD>|IENDB`klog-0.9.8.1/flags/qa.png0000644000175000017500000000070213532572307014014 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<TIDATxb?(/IB~10 ظCW߿&]|-@@^T" ~I!ibBV߿FZ `_  Xh[\U2/ PA^c & -? UL P_Rr/67H@1?l/ jo`5 Iq:? H%@1~| ep '޽@yY @k}[T^YIENDB`klog-0.9.8.1/flags/bg.png0000644000175000017500000000071613532572307014010 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<`IDATxb+Df($SHŋS`ddZ@,w>ݑa/B? 0DL, Ff2G~ B $ Dt c 5S d޲IU%sX Raf:%@a´f!|g W0aן b@s @,=q S@;JB~3˨򷎁 X$P(? $ A@H&w߿~篊ŋR@9Ff?LlV} O<@ӠXF_Pdbad4 paw p1iIENDB`klog-0.9.8.1/flags/td.png0000644000175000017500000000107213532572307014023 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbu/`='KL՟?3  $͇_}EZ ߿Ekپx~q@`$lk[-,3qZqA jCS @ $90BQN:T? ʑ͐-xP8)0aZMWC@ #o&+HNI?,R.Ku?i2ɥC;#iJ yp< @0t 6 @ @ fz~C X~5rPϿ N(H0Xj / QA6?Yف~gb#/9P  7Atpu(nfbG&H :"z[VIENDB`klog-0.9.8.1/flags/uy.png0000644000175000017500000000102413532572307014046 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb#"AL8(MX0 ,=Ͽ߿~2ڏ۷o611``XgN?8c011]q Xw&e`k߀ An\@q0?ln? t?YA3 ho?^p?X_ @,E;0}|%8Yf +Ɋ?y KA0ϕ"@!& 5#l}`87$? t? o-Z@>4!,?`?(YL ̓"K{IENDB`klog-0.9.8.1/flags/es.png0000644000175000017500000000072513532572307014027 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<gIDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@, 3}^_/03f`@1 T?'00t|}/jb@v_1bØUzW[Fz@L`EO?Zf]#l 7P@11Ęw/q?̆@7  200w,0Ɵ 2x XfARC!@T @_Q#OC@ ZGIENDB`klog-0.9.8.1/flags/gu.png0000644000175000017500000000077513532572307014040 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbɀb„PdMR@ ?@ܿ7P ̨ /߂U_໥LD@=K3a` & `{pć @Dm: 79ǿ~#P@0h@mI߮?u_Fbv{& k7;/Y* & \_J y̯ߌjiwۘW1*z,T @ '{Ӂ0 kFjzbb? 0HsdIENDB`klog-0.9.8.1/flags/in.png0000644000175000017500000000076713532572307014034 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbA0!0 rpC1*%>^092v8Y% H@` @SR,0fd@,L9X;ܑ﯑mU #?_&Fضlk9O h ( T'bb;~,͵k_?b B`}) Zd ::~|ߟ?@#/q9@0a!_`00b  EE @I0?` !h?H"` ç ?~k}_Go?_~_RZi΍?~10}#̦,ǿwϛNn?oAԻOT2 $_bhm"$?1:૷ X2ݔ.<-)a3` 3׏o9f19'1~>e`````fd? ,,L n}~u _W0tVw15eadfb#R2?s_B20001orS/\x}c.Y<> rր Ϫ2IENDB`klog-0.9.8.1/flags/bb.png0000644000175000017500000000111113532572307013771 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`nds1u> Pz'?L2_ f?L,c/o0 X&߿bïe%6h?@3n~ϯ?~@, wUD/ _6oC_?/ ׯ`Kj ?_mp; 6 @@ lï̿x~1} /x@J;߿@~ b4 ` tOVa`GIAa X D o7/0cad` fg{5̽IENDB`klog-0.9.8.1/flags/py.png0000644000175000017500000000073113532572307014045 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<kIDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@, _gcc?CbG~nYo6 99o~ħpCA˧8?2``@1[5 WX Ʒsis>i! 3ӓ/Abs㗿&I8/'fiA 49P{AzK8 (UX_120F8IRS]IENDB`klog-0.9.8.1/flags/mp.png0000644000175000017500000000112513532572307014027 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdmd~`Ə_ ?0/  U@1m,/O{I6w_/)KG>ddU~u Ϙ~+! ?PHGmml }/P@11?H5I㊭0HnM%NG? 6ZUm^!~6c1?'SYY P@m Ѐϟe\~W>8ACm `mL1~ox"Rv2 %9 ? otS9^>qn4}~S4 _Ƌr%G~٢7Y tP?bd`NDH0DB`0@ྭIENDB`klog-0.9.8.1/flags/bj.png0000644000175000017500000000074613532572307014016 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<xIDATxbd 10Æ Ck5H@ 3&J~ XX|}߿2cG"Fe Ȯ@7#єBH@ 2/P?HP4 yma^Ӏ"yf3up& z/Xc/$o`(HȨz~@ @9@A4@TC4j/HrK񗅉ߟ<@#߿t@1220|G/021T4$k<@+IENDB`klog-0.9.8.1/flags/ng.png0000644000175000017500000000074213532572307014023 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<tIDATxbd10av_M߿ xަb``a / ծ 3q00 o? M37 PPקL(x_~[Gh@1d ?H@t@?j A6P@=4_ 8  @p:?ir@տ$O &* @JCV5 P1@c ƒܒ o  LJJ!_ P Ǡp$+ gP430|v PIENDB`klog-0.9.8.1/flags/nf.png0000644000175000017500000000113213532572307014014 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb`pf{g~?~||ڽAsllxw)^)οNNMn{kH?|߿ ``AVBk V} t#ñǞ{ݳ ;&0g @  ??t!m~j &_@3UE-; ?`/~YPAm  (tȰ߿{˧߿yuo@=4_ bRY.Y7_ 2*@ I~I6VvMNMq@ʢ* $z@C86w_CGˏ/MZ >T GHIENDB`klog-0.9.8.1/flags/pt.png0000644000175000017500000000105213532572307014035 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdd`Xn2"baPZ Reˠ?a?aM O '׿ٖ_/jFYY 6 MöXo߿ 访[e7uZ_h:@11b￿Y~' L~f)Bhh@5d9_"ro$F_GX''o|Wj`(@ ov_X5D`X X1G_@CA7 P/j /@ ~0L ?cc0Fv|IENDB`klog-0.9.8.1/flags/li.png0000644000175000017500000000103113532572307014013 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd]00 1J_0brB9Pso?H3Vl 6`Zo߿ T7X86H ;r}cgAAJ dm?=7uw_SZ/oo_~e~ X4?P'#?@N7 b\fˁy1|_$f&(򍁁Z?$7  ? AJ!M5l P߿LA@,$~oƿ L`0Ͽ ` x`$* @}a0IENDB`klog-0.9.8.1/flags/jo.png0000644000175000017500000000073113532572307014025 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<kIDATxb@ ow20\L@߿a$شi@50zt߿7Po8@dHuWo FFƇ?/Z @QQ?~iǢ;&?xYJ$9 d= ߿?j`' P?@=UO`w-+_?ϿJG[H{?k%)J@`@￿ |UUb u#^|>Nl+jl~<(, c 3=σeYM6onm^Z過'4uN$. 3Ub '8?J({R 4OI=i L:ei  s 180 7 ioO^j=mQ}FX^q☙߀ &97o~ g;-W2WfvG޽?(۷k\AFOot߷9oOJIqܽ{ X A*LKz/̚_޿7^AԔBQ $995~|v劐_&&FFf $fhqhZ E v&[IENDB`klog-0.9.8.1/flags/mx.png0000644000175000017500000000107613532572307014044 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdf`ba?^cb`$JQ$@25Fw200BLL ߬9 Ⱦ5o@ӫ~ ?7$b hȿ?f߻rY kf߿7a@hoxsꉭw:_~6 ï_ j`%- h?`26d6jwS!A]: l? /@50 L}y NT@@'1/ү_AA 5HyBLLr@O#-8m٘؀|yfkV@TLi)IENDB`klog-0.9.8.1/flags/zm.png0000644000175000017500000000076413532572307014051 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdndf2c`F@/0  X&yN>|߯_pٷ X f ߿? ,qϯ jhF D߬'WR("r@22Pk\8Gd) h6B~@dAV/oEK~Ô/ @u@ RBmi XJp,:03 WE Ȑx= | ͯwKݵIENDB`klog-0.9.8.1/flags/tk.png0000644000175000017500000000117613532572307014037 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd> c&y?01{!4'0$ %+ dÓiϓW#X>Y)voEϝ)#X#6t@11?~{U|@wyp+e_Nj@@}?cvK~Sad%'@e@ e{ֺg~fxoxG@#\+z7V_=J'(U'P1@l ǯ xع??w P_.{0~J;ayI^@120FK/ π1000e@[%tIENDB`klog-0.9.8.1/flags/cn.png0000644000175000017500000000073013532572307014014 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<jIDATxb@@n", @,@D}5o,Xx? $}m&i,7۪f3˪ u~,@K/k붿fϯ/AJ~I( X@u8M~@Uk q8V7T@@ / : D UM@ @ĉ΀l0X X@$P (7xX_bb<Ȍ?Ha `:s056IENDB`klog-0.9.8.1/flags/et.png0000644000175000017500000000112013532572307014016 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdTda/_0_`ap0 çwթm ydޔ; X~1f| տE_/@VDh.@0(H?3139_~x@Hs321v̄> 2x:` ٿ@>1 ZϿNK|#@4!(#ӏB%scHNp 51jQ T"?f(W]su m`Xj9_j/9$ؘ ~342`T @_QPhR@`! =ڮIENDB`klog-0.9.8.1/flags/gm.png0000644000175000017500000000075513532572307014026 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb<`0D v@?\9Up,IDAT(ϭ=n@wm,c_@DD(%9 pq b6"fӛ7#zw?pB<) .+r!ZId}!ۃc1vNIK $Ep5 !+ 'j)`y,+s3`;%SchC$;{'hʥt`n *A_XIENDB`klog-0.9.8.1/flags/aw.png0000644000175000017500000000101413532572307014017 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx, (}XUِ9 aJs9H ͗DQbykIϣk7G`` -?a1b`ҞAſ A< ӧ_Zg_@*TR/B@/,l~%߯PK"/!n &a}@,?Av1hd `j ߷yt< edse@NOCf[*v=KkU"`0Mb'(H =@60K!?çF$(:_h2\,hҪUIENDB`klog-0.9.8.1/flags/la.png0000644000175000017500000000106313532572307014010 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbˀ 8a "[36:u${6kz?XB߿￿џ%61"p#YFϿ~cǟL2\@T(AH/@1 ab|̿`@ ïcx |? ? @~ TN{' ɫuC@ @ ) տ~@LA`rjeAG @@h1ÿ0p@@1"") Bzf?IENDB`klog-0.9.8.1/flags/ec.png0000644000175000017500000000076413532572307014012 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbyS' @A0P D@0{,V@!@?nt g$BJ$#8zr V u n O?; ,8E-/? IL} @,oI= o4?L\ J$Ư?@_Py_P/ 6$eUR:{ @(00p|  RbYT/ou!Pl?H $@l#KIENDB`klog-0.9.8.1/flags/gp.png0000644000175000017500000000075013532572307014024 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<zIDATxb} c 1PQV8GUګBcƪp"R٤)1O1~KK ##??&>47t 7 QBÔ C_aK!H(@L _-X gcb 2A  :f @,L_= tr17㟿 7 *p4ҌB#G =4(d| %J:`7YOEIENDB`klog-0.9.8.1/flags/cg.png0000644000175000017500000000101113532572307013776 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd8@R XՊ`? 'F &}@MSҿHUK6P/Zq,zbd0LRD[sA~ob* 4n_fh:@42ߟ4v @yR߯$?|k~/FhbDÔI_@U3 j럿B~ XgQ` CbaǏ_(oi0 !$bʰ'4"ݘ fv&RIENDB`klog-0.9.8.1/flags/cl.png0000644000175000017500000000070213532572307014011 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<TIDATxbdH?&.b``00 ×?Qf N/'3#FFFfff&&H˗/!B?CУ?~ T  ;]x7?_P@0p|ڸ 9K5 ý;L8??ӿ8X&o_߿~ F"ޟ:@,@0AQ$0`"Lm2 @~aH'#H DBP1@1~.b@I@h9?9IENDB`klog-0.9.8.1/flags/bw.png0000644000175000017500000000067313532572307014032 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<MIDATxbT=߯@H̀0,V@@$U0JN.%)s[҉z yX_0gxV$U@ b#///I@+ $Vx}b(++{ Q@R^^럿@>\DE9H߿ ſ~Rl6bb|-???~Cd~u@iQgx a!A HpcdXG X@I  0eF_ 0~G-@12l)R0@Z gu}a^eNIENDB`klog-0.9.8.1/flags/zw.png0000644000175000017500000000107613532572307014060 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbf&`fBb1_9gno `ߟ?@_~betW307Fe?}@, ;q:&_?@Ư~ "Y_@,&U1+0띧wU7H_ d{@1=y/ϟP D+**=z XXL^:R}{Ud`~~s@,EQ_X~12 @J~ Ӓbg`FF @KȢ/?4+ ZW 1Y\]OQ͞NMGK//zzHY`Xٿ=@P FF>_N^aA_EVS̠y´˿oo_ ~1LX\@P*˾Xv[^ r99I? _ qasG_ ?0__6O FPq'k1|`tI0?$* Z4K.IENDB`klog-0.9.8.1/flags/vg.png0000644000175000017500000000116613532572307014034 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbܟ^VoŜ8~վ!/`1: 1 ͻ@; 1:b' ! %P]1>^!<,,)!V?7שc+T=Nd|ױ7r3/*E ?1ӫ ,@߿~?PC*/ۭ[d,@5uTݺ͡#ߟk9j@@ @IJrI?@ڀ.X2_ȑ􏁁 )CnIENDB`klog-0.9.8.1/flags/cw.png0000644000175000017500000000035313532572307014026 0ustar develdevelPNG  IHDRvbKGD pHYsgRtIME6HN8xIDAT(cdЮw^<ÚW:@*`fshx+Gox~Nwc`ddb8*ATaױ;Dc<{!c;ãIr#v gJ30|!B R(2at'Yb IENDB`klog-0.9.8.1/flags/sh.png0000644000175000017500000000120513532572307014024 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|k9-k۱7=P=CeAo ~10@1KWR)>*Dz5I%Ѯ&1 gK 1/W j1\?c3Z = 1P|8 H)#%wXO~-o.]{6#Ы}t{o8i ?0(g߿ߟ_{3Kq:/(h 0ԀP9xJ:?^)# ~OB ( >0JR ,"&y G9I٫h_xIENDB`klog-0.9.8.1/flags/mm.png0000644000175000017500000000074313532572307014031 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<uIDATxbd`8~10c``a`(VQ\MWǏ|o?0ϟ0˦Mʤ.+ g{ u~ee6`YnaG%jH$H@gO j`~3|wڏ31V5h:@;~ӧ?eo m K~ Ln6`' o},$0d pE5ei`ARl_? `# $ A@5".\  3V[YIENDB`klog-0.9.8.1/flags/hr.png0000644000175000017500000000101413532572307014021 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπPX@$?߿~eJk`S(ZG;(\~ee6pտZqܔ~ R   ߿}/Gǟg03ӷo߾~ sj)/'N|@O>  65{jU@Ǐ!p{?}~|c:}$5" YL5*e 0q az@$ bȿ`$X@12dU@ Df08v%3%&IENDB`klog-0.9.8.1/flags/gs.png0000644000175000017500000000116613532572307014031 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbYYY{tA(IuݴA(@ O2~eÇB*U˞|9qׯ~BM1b~  T=q1`?MR ( <,ͮJJ/bb8 洴ѷCL0;!ُjZ(G98 fK12wPŒT!3y*$ŴTST1io@ m8%}p I~ {C"^} X~PXP3$.:xi ۷**@  ȗA/X3d_^ @f`f  $)OIENDB`klog-0.9.8.1/flags/ro.png0000644000175000017500000000075713532572307014045 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd>010?`` !@0SݤTL?D~?߿_6m  O^L=b`o(_f@, 3U B@&C40 @, UxEtba0 Nbh@4P_$ `I`'H u `n@0I?@  TR䍿LL R0: 20K\|o0 ÿ?xC 'oEEIENDB`klog-0.9.8.1/flags/dz.png0000644000175000017500000000110613532572307014027 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbT ǯ_|af[(` @,o}$,*)T?ϯ~fV~mv_@?_[= @1 &:]'<^O䇗w Ji000>Fj?|׷b~o `1'@(@]ۯ>?z,o~ Ÿ@  @^6rgo~ϟ~1KϮ \`x տ1Mec`z<&I>mP!j&@IENDB`klog-0.9.8.1/flags/mo.png0000644000175000017500000000111413532572307014024 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd 10` B0 jjed)ϟOJ,/8/~_@ղ<@; &?$)qj? d~D@=@W :?i_5~i &ofu1 Z)Z kVP./P)@1>6"6k,j;;/0  ռ  _%J8Y8wFw?޽h9P?  $ PP)n)]Am}a5bb0%%A~o|߿@#$@ t_ P `)!E?@A>wAIENDB`klog-0.9.8.1/flags/mk.png0000644000175000017500000000123013532572307014017 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<*IDATx< 0TK"RDxiD{ybr2}1x{rf _(NAӧ Q7HY~?P8Oa1#@H*15+25(Ў?ρ ݯJf Xl'|@ ?ͨ$bwd a߯>7Wa` ?O͠wY_A`8a30/SǒfxA7ߌj0(nahP?Yb_ÿ @L?k T@DV;0IENDB`klog-0.9.8.1/flags/fm.png0000644000175000017500000000105013532572307014012 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx4 g4Z >㤭YL0"5bT_?s' *!@ͽn202 TMbar H1cd`Xy1Ph HHP@_CW~xPP?ДSނg m! tɏ/nV7/π2$bL^ @P6в@`IEt|rIENDB`klog-0.9.8.1/flags/gn.png0000644000175000017500000000074013532572307014021 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<rIDATxbπ5|c.c`F@ X@@@%\302af;&ϟMS7XO2 Df`o~T-#  Xf Q?` @Ư_ D@ t7#P?an6DÿH4I@f#i$!@`'i%6 NU~?=P@40Qdm@ `/@ L0HJ 00fd L @ +8*?1h4ѳo 8I313g!=IENDB`klog-0.9.8.1/flags/hm.png0000644000175000017500000000124113532572307014016 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<3IDATxb<^|CrǻXV*Dsg101KMy<"[M-ܣ1  =F;! 鐎>_aQY.3߲we~pkt ano!$AXx?{CABHJ*d1ba`*Sҿ@@T{@?~120)@ח_J#~ߟ<@Hat__~f_X~+JH'PH@1_ h׿8ׯ~?寵Ͻן ?5?~ei~זӿ  @@> _{wץ_U 4h.P@49@:k)@_@qc"k0 o @ _8vbi!zh]3IENDB`klog-0.9.8.1/flags/pr.png0000644000175000017500000000105413532572307014035 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`@_ 0b1 XUa8t?o 2N[@ k=󪰚W@? 01u @6pXn,X?13ca 1FF0>PǀI6c+VP n0ڍ7~aP_ 7a@nWȯ4Guve;z ]x>PwYLB\FFg׮?0ݩ_$?`H-XP÷o{vSujc@2j'6_[7- -+1UIENDB`klog-0.9.8.1/flags/gb.png0000644000175000017500000000112713532572307014005 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<IDATxb4sC^a``ߊ+mS[_wo~Ȫr:]v'E>л?FUE!5Cn_?+ yF[L5]^gw^ +TWy'##Ż Ogwxci7;N07z*mn0|;?f`׊+7>ݷGĀ\{re7; 3%?qp׿߿Eeѐy lmY@?'`Jk<7BtΫ>0{+%_my3gCsv͋Llnqa3;/Y0ϟ@0o\d>S\3}l7s!30jJ3jJ#.氦9mY~;-m0m?2z!9[ A K~IENDB`klog-0.9.8.1/flags/tr.png0000644000175000017500000000075413532572307014047 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<~IDATxbπPX@ $-(ҼN33Ȗ\F8U@'?yT R;R߿d3m `ALMAꔕwtk` @ڨII7lZT @L ' uq1W/$͚ffP M 10kk%=oDIČ`K/ E2@40 hYYAN5Bi`ARl_':8  F$8;\FoIENDB`klog-0.9.8.1/flags/do.png0000644000175000017500000000077413532572307014026 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd\c߿|'( T7? YDSS Lݴ @J_? ,{P5, 0 ¤(?L!5L 6b rvYD$rТDW_0LAJ:k ƿ222pF&>]?mȼ߿wSzh??q}  PK<D?/ۀUt (lp C 20f H@5$) rLLb\A @$0*jDBH?p+ C IJwOI;WIENDB`klog-0.9.8.1/flags/fj.png0000644000175000017500000000114213532572307014011 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb<[TkؘʟˤK~ 0T ?`?o@@1o]G\+}cvCC_  rҴ/2*ƫj2w6A,?bl/X $@l2HTzB ?xK!"^ 0W1@1=3rcXyoX}fW|~/?@61*( &%*.5WQ2Uo3ó1@\ Jտga~gr$ X  ׷)nۏO  ?F4B{)w{g_2 XI/IڀlF@ܳ/N  F̯ _`W @`8FIENDB`klog-0.9.8.1/flags/my.png0000644000175000017500000000107313532572307014042 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`8)yaӒ?I{ @3gT]G[ ohaga˳g1vnP5. JApVbcܨxɣw 0{ƃ FffbfwLJϴ6/Ie+d,#s}bd`8:e"vU@';a*QN_`30mx@1d`/Loߟ9$={󧌼|eu,@!fI# ˛w垤h~@&2 &pȀ/= @g u 0,Mbُ'O0@f3@ L g[fTIENDB`klog-0.9.8.1/flags/mz.png0000644000175000017500000000111013532572307014033 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbg(c`a`DF`$ @`q"UĈp%lWI[ W000(|˿*(߯_ܲ@|v /dJcaa.u X10?uݗ~?@~ H 귬] I7ƺb\|}/}zK z-9 [v~{Yga~ d  200WepϿڏc@_ 4Û?3xf`? #edWQyv X$!No@r$(~30!_a Ư z1@~PL`c0fI@3IENDB`klog-0.9.8.1/flags/pm.png0000644000175000017500000000126113532572307014030 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<CIDATxbTMf8#?K^ol``  0  1Pmf{5>w+G!:;!EE @ B?>~I$&/1WG Ƿ^dꬨЛo$E_h* 1sl!^P.'.TLARK@߿c￟n߾c{?_N10'/$ :*E9̎r1 nPx =N΃17 3qrɰJ x]r?'3c 30|GtwD?6ps c RIENDB`klog-0.9.8.1/flags/ph.png0000644000175000017500000000103213532572307014017 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb\vzp7/  aP ʊʩ!\c3dҀH/(U#@߿۶ɚ5}/eeo@L |cbZR%+?4$bH=f`tm-z??!@ X>30<\ W}n?t՟_ ?NP2gcV?[) X.ka`)?kd P-@5|e`_afY/0 K/?yA@`# $ A@_ ` mL7!U_)IENDB`klog-0.9.8.1/flags/ml.png0000644000175000017500000000073213532572307014026 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<lIDATxbd10ax\ 3 A2p@, _]*O/adI?D~ٴ XX?￿ 7CѯoP5,baY d?` 7P@ 0bbzh￿k(@ f ID$i տfÿpの@`' jd5} nb$%Aߌ ho? J@J$bd(e`B{x` DB c4r2 ZIENDB`klog-0.9.8.1/flags/ga.png0000644000175000017500000000075113532572307014006 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<{IDATxbdhf@ `$!0 RA7DUFjo;͚v9ђɐ}M} y?￿ ~/ CG@ amTv)fTooZ<|?N+X002/00~32d@,`k SI5?i*!C!j Fr  l?i92@0h`?N)ba4?L`SCx90~#zo~3<A`#h_plIENDB`klog-0.9.8.1/flags/ne.png0000644000175000017500000000103113532572307014011 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbc`@?`/021a@0ۀWx9֖a2,-E#DudG6\!U<22 R߿EdJ͓ @u@K6 32>= Xdt89@yZ.a@j.S[3bi!/ 0 X̬@ ɩ`Ucga?@123x@ D߿UT.6] `f#' T?  ϟ@ PPƀ(c0eA IENDB`klog-0.9.8.1/flags/uz.png0000644000175000017500000000100313532572307014044 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`H\LCC…Yw+5_" 0ӧi;w=wſM3ᅴ6U ޼'a!Ǐ s޽~P,?bIep/D=߿y(߿[ kb'//+О3!.xbr,#?^6@130$e5ߟ?n "@to $rm {Vן_ϟ߿ s HJ1 {_' !! 0:̀$LX ``@,=,/J0~ ~}Y,YY,*;V)~gzP\b:h2PAD~*{_7ӯN2 @Oog/ά/ QQ--zIr]"@=t{_[_I1#E~26*|ӊbЋ^j<~@s+.aVضd/F%  CoY_Ӧٺ_bE +Yp$+_@?ߧz ¿kI|f9R_"B@" XURSppHJJBι\\/d: aqa r c!@q`u)=IENDB`klog-0.9.8.1/flags/northernireland.png0000644000175000017500000000075213532572307016616 0ustar develdevelPNG  IHDR n pHYs  tIME 5OIDAT(}QM(a~C3ʞVٙRr&j~Ϧ\\6)Q$E}EZV&-'v}yz^lЬϊ2+P(s!Hn^qd#n90nu"DI +T  @eBs"W{􈫤|];r >_Q8w<CĴ1+"@lci3OMD#qI %"hY'旵RƇ=Ϋca8W|5F hdBEy֗RhqIJjy~68o!|YiXQ=daL$=n6IJplEpdcFIENDB`klog-0.9.8.1/flags/mh.png0000644000175000017500000000116413532572307014022 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdf~c~!61M2' &T vABF+w\з̜?8*") 11221CLZ7#`3+;y?Wqo/t@1 [ H'96^(1C^+*:)줆t$L 5oV]w9pы_@` @K~3{!/Q=&]'_:7?j5G &o O޴S{޿?P&ߠ ?iQ|f|C_?/1Na~@sg``xQ4lKIENDB`klog-0.9.8.1/flags/cu.png0000644000175000017500000000106313532572307014023 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb긜7 0 H0DE?? ϟ"sgOϞ%%a`?`Ǐt9<}ׯ  a L22211Gvf3߳gcv0r %9n , ̿Nḑ]__@ b`@ v`?˫*ZTc b|& 00;ϟpehH`ËJ~ EzgM a߿?þ9xTt&4RS0 L ` SvepIENDB`klog-0.9.8.1/flags/an.png0000644000175000017500000000075013532572307014014 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<zIDATxb#A DϟH$@,@ >>>  ϟR3b*2>7!FF? j ~!k;@1yvvNut.}}  h@nϿӵ5~__o_D?tҟ_ |T$mǓ@ze`@o߾燺>zs@<:jP !W TJ}y"G} @cO$=i X f TR/ßd?UMBE~1@E SAe z/o ߿/@h@qfOOV9h:d0ؿؿ L/^ ./g_XI&&!>6bz$Uj?σO/$1*=!9HXωU +:I6F- jK Fd @#$8!\  hGIENDB`klog-0.9.8.1/flags/wales.png0000644000175000017500000000121413532572307014525 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|9 `ɟ00bJKv~?"D٤.UMVA!i.Ii{H#˽;~Ywߘ߼_uD?? )Y_up~}7?y~TX#/_b: @.Zr]~rʷb}⟓ ӂ,C|6Qq1 wu  wo$*1 FzP  'bo) "1E%P$>ZRw1. [HS1$%x-ٟ= K^xP_! L20hzIENDB`klog-0.9.8.1/flags/europeanunion.png0000644000175000017500000000073713532572307016312 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<IDATx,Q=KA݋1+!)$_`%Z[$""D'v4Dce!Q$ΌovΛyo[(y&&b5,3 %"K`0`p(@KViaYvZ'xh83Tck*UƉ{PbBĜ DNvcGJ-qQ|1<2T(dfw\xbrstGC!cbFvsϮ7Q2DylYJ׳v % #sdv@m@$ H 9 @ɂgqq&&=ffܬ? l줷v~|o7~aQVz@d@ g'D/ H'?f ?$A.,_P3@WaQމ̮ 1$`$ZlIENDB`klog-0.9.8.1/flags/lk.png0000644000175000017500000000116313532572307014023 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxDƱ 0%3 Rpqg ҈3O1v=ڼ- `g˟??\"bd _@K]7-S=!(ﯿ_{|{  ߿7_sAn;7'Bn&( & Hj/.7r3K%8hbZT / ` S/?W} XaP X_H?ٕ_h@؆~7I?~><ǟ16#bF \,L2300񑍕ֿX3{n#RDPe}`TsRS_IENDB`klog-0.9.8.1/flags/ws.png0000644000175000017500000000073413532572307014051 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<nIDATxbd`f@ `䏟 w9 XKDLLnd${W^߿F~ٴ X9Я_ QVh@1a?кzP?@`u?A/i޽7!~u  4/d @IX`Ԯwo` @'A!T X2g{ob ѿa$#IČ`!(PUd@ c+/߿@?H? `c2d!_* ƯɀR@`o] .oIENDB`klog-0.9.8.1/flags/bo.png0000644000175000017500000000076413532572307014023 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb/e~01@`8ގ(oKlhF[l܉B)Ѐp ߼**?H(& XEeSO?X`<@|Ib0?Po]0oXy?0 # A@PE13 ?ojfl%`@,k0? f@a1@~bO(\  WO ($" ?Ib H| a#8 !,n! P #|9FIENDB`klog-0.9.8.1/flags/ai.png0000644000175000017500000000120313532572307014001 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx1]hP9J+ 71, G0XaD\emlz_#n^)ryOXϿg2120| ^6R=m/]"#cjghS gުk ?1+  ?  OMwԕ' X~;ﯿJX+k?Pwbd[jÏD_#yvF?|! ~/8q}gq@~ o`1%B_u￟h_Y~  @ym8 A2@9? @#P'RD~#ܿ@7$@YH@{IENDB`klog-0.9.8.1/flags/th.png0000644000175000017500000000070413532572307014030 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<VIDATxbπPX@ a@oHRWZ"{ <"bd3c>} FG׍9:hAϿBe[e3"}$Ͽ߿ѯ__8)/ ~q'ȑ@z~@D(,߿ h/lfI 7/;8vЌ`6IISϟ8۷o;;SI č2FJmٻ F$8bͪIENDB`klog-0.9.8.1/flags/ag.png0000644000175000017500000000111713532572307014003 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd vo#_οaߟ~߿[a&1.g 2!1H[z1?9-<0J*w?3 .??{LgQbi?Vv.&?25<_ W0bz?~-) %(%D2b 2~4y}oϟ#o#"%K~2T @L@ t?u?.^q@!I䇿Lb⌿uy=wT[&Sh( ƫ i.6 "iIENDB`klog-0.9.8.1/flags/fr.png0000644000175000017500000000104113532572307014017 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb,zߟ??022*'b ¦$A@? ~mE@40g߿ _~@6x=|Ϟ "@K890Kt&8@[zM"-b봗bP߿@*)qm@@/A00q;^ 7Lh3 |Tt@P?zD_6ˏ_@A]T aUV j=I,$߿@|z?.Nf &H@ %1d@|m?~}ˏ_Ҝ@ǏzA {f uDIENDB`klog-0.9.8.1/flags/vc.png0000644000175000017500000000110113532572307014015 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`8߻  D?  Puu"Iղ/Pf?L'"~i&j~o8~-#  Vϟ`@\5ϟ xkF"Yx_ᗉ_@5@տgʻ'^2+؋_gfdt0tbHoZ~|~ qI7oйfLD~mï~RA6(X$/oTCD`a {$$؀>abd`e` #o,3e0 @ [q(h!PhEcO{Zέ IENDB`klog-0.9.8.1/flags/ao.png0000644000175000017500000000065413532572307014020 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<NIDATx\QJA=/wp\qH! |~e`..;n82y3N~NH)DB!HI K!ELp((p0&/`ol(D\"M5d|о' ӱ[-4a-bݺğu`f#bo 5Će3X#:y\YUAkWe[+|u({^Q&aQ=GgčSPej7``y"o)7cvfR\^+)m~/(4!1# /ଜݢ! )  Hu?|PWz5%3_]Hƛ1e,i73feqp놅0Əϊa:@};~%"x߿C$n7`ee>3@aC얯& }h&tIENDB`klog-0.9.8.1/flags/sk.png0000644000175000017500000000106213532572307014030 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb;?8A8 @,@Y&.. &f 2 @@>1ç//P0?`dd@1Bdm^G {}הwl1EBEjk]]vzCƔ?__L?b @t-[=Gi ? lĸA뻽KFr?\{~20 aL@7JJs"YY@ $ A@pĀE\*=MIENDB`klog-0.9.8.1/flags/am.png0000644000175000017500000000076113532572307014015 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbׯ0?1@1QW)'veýL02 OW001$T~joF ? t &B5&a2~: XDf51yۿ*_2HW7lWAouMp~ 8<Ý q 9^?(T_?o?/?[ŜH@9jp=X'2000#F F ?>0^o ~1 01 ?Hq ͦWIENDB`klog-0.9.8.1/flags/ad.png0000644000175000017500000000120313532572307013774 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbL?~bZ1I?~Ea @?`d1\Oo04&@K M ;1ן~u\5 (7T} @ B.c^=VBzE҈Rf a,l@, @ԁLj D #- 6N f/@123@T$p<31ShBIENDB`klog-0.9.8.1/flags/st.png0000644000175000017500000000111013532572307014033 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb:c`#/@,V >Uz00Ͽ?Lu7 s>- T_0ׯ~-#@,@p}wҵ~r of[E `+8yw>_|쿙:1w/~_ld~k+W^.hɯ_~E @B\A~fgrLToN_!: X¿O"F?yW`?0y @[0 t! :ez ?=%$?#_/ ĸ!8"!E/hD?@^mI9џ\IENDB`klog-0.9.8.1/flags/de.png0000644000175000017500000000104113532572307014000 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbqf?f_ pb{qq9 / ~^n5@011U8y $?A~N@" ,X_@:~"?~@Ne@b@ь7h4LVg2-K , z#2ׯP `@;D?H%@1??ڀ T /@b`PPI@҄ab_A*$B$b`.a ?FL A@@@ X~e3o?6fA1?`@03b21@wt_XIENDB`klog-0.9.8.1/flags/ma.png0000644000175000017500000000066013532572307014013 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<BIDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@,`<_ =` 5 3UUHY6>/=P @ ?Hnԯp! S AM Ȇ߿n?4d#IvX*_g@V00H3ċ` P@ L0HJl$"pP1@1~EHIDATxb#L) @,@?DN!/^ Ld@1  PUcvOw?h?P m_N7n|"gbb_?p1@ 03 ֻo^a; Xƃۗ3ݼ0xW{e95Cݻ[>>>dc,HwAb0]/uTIENDB`klog-0.9.8.1/flags/sr.png0000644000175000017500000000100113532572307014030 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdg``/0 $YP(F0p4I\"=  fkJ7܁*1$ŠO1?0 0,$#w$9߿@C"?Ц߿ d0JI}\ Xf|S:@*~gk @ ?A԰_e~!;i߿@nOO߿$^`7Lo(Mk^6`?@4,?3#W!;?pHBй ` Bybd(f`_H pH0i hIENDB`klog-0.9.8.1/flags/tn.png0000644000175000017500000000075713532572307014046 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπPX@_upɒ2ҒKF6hU wg@  rr_ee6 Pqq ?1eeoh߿ nj ?t迆 %@rџ W^^8?//H~_F GGl$9 "CCA~53$|@n@50Cڀ._X_L J۶߳}5Bi`ARl_y:F2@H%%HP1@1~EH+( H ܿ>81 ()̌ @ 516F23   po濿?~g{W;$ _ϿTܐKt@(!.?_?wS1>4@120#G$A$@/Z:YIENDB`klog-0.9.8.1/flags/ck.png0000644000175000017500000000111213532572307014004 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbܝ^K/:aaWG+坟Hm 2 ?~!#b47o\]@k~#&%"³޷33r߿ -/14 eH^i?MUB K]Q Tʩɿ~jt@1=0pƹ Sg Vx_z'N~OT<n߱g^_~nݏ:ue*Z?3= ۀ^IJ;e@,⏞ ;[̤A}_mmm 謿A2H t̞%y@R^B]2 H__ /e:P@5Y 1? @1[AF@ `?`_l vHn IENDB`klog-0.9.8.1/flags/fo.png0000644000175000017500000000073213532572307014022 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<lIDATxb3 ʽ^Ub/yYR $Bgb6D?>xlh@UV 1 vFu&hc'JHo `S(@3_{ϯ E/ 2l$r2@# qk~$L=}/G X _@ af!#+ 4P=Kx,>`ȰMC x0_i{IENDB`klog-0.9.8.1/flags/ke.png0000644000175000017500000000107113532572307014012 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb` 9 Law]2-$w>@U;;qX'O<~<-IIw?}[n޼ T @WOTտ%K%&Ȧg7P],}|߿?tܭ;P,9@07Bϔ8b۪dljuyd9#/5؇9FxAZK$3 (N;5,bG/ʟ# ƫ+)C>x0yӟ?$@b /gaf9pd%@1ylJm 3"+)ʈП8~D6!?~?P?bbdgR ~$a0[b=+ `iIENDB`klog-0.9.8.1/flags/ge.png0000644000175000017500000000112213532572307014003 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|5 BH2e?0\ X^8Ϥo((?ï~KJhj )ubwgxgO><~ h@l*bua7p?; Y@tր?101߿s(P6v3ӿo?^ˏ3D?6o;Porr_ P&3UF?mI~&;G6032IPm.1YTRM瓋 ?6}k۷+ &ٷSw,v#37oͬ (.'###;$ЈCM_h'\: ҶNsKIENDB`klog-0.9.8.1/flags/us.png0000644000175000017500000000114113532572307014040 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbLN?1?%o^P rn@+0Dc0P,Je >{2}RjL{D`bjX~ @AefxG/}cq@m4h}ݯ_ZU|~>}ûw޼yo/N<@, wofk ˟ -W~z+n `/_/Τ?WCrm~~Ѭׯ >~+W^|ݲe@d?[/i'7 GJJ-t΀!0eb^0#i/_2|t1_@K [.˫}feqQ?b`x?I U?(?A"?>30|`.D [0+IENDB`klog-0.9.8.1/flags/mn.png0000644000175000017500000000075413532572307014034 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<~IDATxbπ^20x@+?$U]`?j|?af'@>i@50/_w$E_FYY RA/C_? `AQ`bbTϟP!D !a\L?UgZRj$N PO 6 ?00H?f`j?@ : @fa"觿RL\ #I?L@J "" 3\f`@A‚N[YIENDB`klog-0.9.8.1/flags/mq.png0000644000175000017500000000121713532572307014032 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<!IDATx1%xB& ɼvYoJ2.ucӡэLIYB^IT' gzp)ԅ#G?W_<~">O"\g`@, /UUZ ߾oE7o~ ٫ϛJ?}^nV#'}W6?I_w /Ͽ ,?| yk.K 𲳱2>y_@F$x{6VE1uzLgV.PBb ta4{?_>ySn.VN߿AFP ?m$/_ %! ɦ_bb+@%>4310b`ݗ/W}") G.!$@ :hIENDB`klog-0.9.8.1/flags/mu.png0000644000175000017500000000076013532572307014040 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb<`0D X?D`>i@b`pbP? _@@lYy R\?iVo 4ᯜ0'8@iPڦ aF\(`T #X$H 2y4 6*)1 _?VIS FF0Pmb } (hBA o} 2C0%A  3jc@123E1gb0eWIENDB`klog-0.9.8.1/flags/ug.png0000644000175000017500000000102313532572307014023 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb` #wt?0֟ V U?A 0fd}i;@c`J1 X_ ƿ_ 3f;@,L eo |;Q 12߿d ?? t@25{VQQQwg߿BS@,@ϟ_=ocbbbV H1=R@ P@o6 ֿ h6$ Csn'397ؖEHsP<T r 1׍EM w xn p` x1{qjDM9jP{R~eQ[wnUW O=>WRSW>_z;_}S# ]Ƞ<ށEz{}ɷK ”*s>H[E]@?@1gt5U9}PH߿/~?~{+}7 1wET(5M͵cq,S_2GW4  8IENDB`klog-0.9.8.1/flags/cm.png0000644000175000017500000000101513532572307014010 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd X3Ȁ+ÿ0B97_`fSVEWֆl]LtkFXr]h@#S TO>_ƿfP_oFFY%8c`9T'Eu&.$l4eD| Jd*P[ 0߿ ~__ _PT @_~:??@,@ I@gd} =P@4$_!k:& <zI? `@ Ʌ J D dPIENDB`klog-0.9.8.1/flags/na.png0000644000175000017500000000120713532572307014012 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`_ -2q/)W` 1~}C  26OK h*U;(_} d96oD פO"͇x?K1-h@L tc <_zl @@ɯ9{2ߘ  @e2_5-k߿ /ba&n% 70(FͻßpcȐh!(. `DOaIENDB`klog-0.9.8.1/flags/ci.png0000644000175000017500000000070513532572307014011 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<WIDATxb?cSG  Կ'āR  X00V?? {ӱM_ۿ,,*bTo4@/%~]@,@12e?P i WfK@? 4~1kIt`at̟@ @U"`˿ L@Mܒ =8^~1R@q D}PL3c vCIENDB`klog-0.9.8.1/flags/ba.png0000644000175000017500000000112113532572307013771 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`8.O.fQ/$ 1VIƷE1Sm*>^3mŮwaf20~l@K h˿ 0m.KOj @ Ts?8G?ϟ~AT Tq٫߻z'@?5_ @ l?_CN]?e`?6 ߟ?u¢w>A["``@s$>{ۀ @h:@l_Rhb2@{{ƏY3 ȱ@ ;@ Tj/ `@IENDB`klog-0.9.8.1/flags/tj.png0000644000175000017500000000076013532572307014034 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπ gCV"`Ml_O(H_@Ư~l@WNNN$i` fSb{?,f&G AT̲y.@gb{Ǐ<<Y~a`bf!!?0 3ʅ3(OL< #6qL-AIENDB`klog-0.9.8.1/flags/sl.png0000644000175000017500000000066413532572307014040 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<FIDATxbd8̀103` 0@1n⨷8T۫BdeX%Nt@ O?Q￿ TR׿_44bUaWd ߿@PiEYDJ Ư_sr2- qFFG˿  e@ybbսX\,a_,_\ @\|1{߯_ a@ zp20\ `JKJBC;"0 a%"?$1Rq}IENDB`klog-0.9.8.1/flags/nu.png0000644000175000017500000000107413532572307014040 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb,.2W݉"Y?~t'IK9 A_by%u'gb7?_>z?feLL*c1!3% 22ɚ F08(0Stګ'$“HMciSm9,3l Sμ 7X0h|:epkHP|ן?@5^'sq {ϼ 1hNyV *:yLVO~ 1pG U  .c ATCCh-$DA$ @@@ 30'+ I@e`wXhg?@F hc Hx|!IENDB`klog-0.9.8.1/flags/cf.png0000644000175000017500000000114613532572307014006 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbԿ/Vҿ9~axA/c 2L1ئ}2k m<n_9loO R? ). }@LB e߼тObBW 11>D5s-;;3g~?A}@LB]~~g-j0?Ĩ_XXkR_MZ]$mmmr}ZZڽ{~/00@$4EEEŋ V@)(0[b_* @NcHIENDB`klog-0.9.8.1/flags/is.png0000644000175000017500000000102413532572307014024 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdПϥcfVYaï? LD`Pm l#1QBaKwi^fz ,CtԮ ? ϣG@_T_ :94_@H`@=@@% [g&@)+g8@,l ~0I D a @w  DC@`k/|IENDB`klog-0.9.8.1/flags/mc.png0000644000175000017500000000057413532572307014021 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@,`J̓( 7P@1#P5Pş? $ ++p1!$ԿBBB q&&ׯ˿ |q,P1@4@85?j\0222 * @ /^b b0 P _{IENDB`klog-0.9.8.1/flags/scotland.png0000644000175000017500000000121113532572307015216 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|C[\b`b?_`ýw w?H;@1|&ߦG/H xۤ0E.fM;@̇.[21 <o{Ǜ;lm$=eX 7=\ < D8|!#b l".)ճS*=g˹; XvgwbR̛@{=-[7boV\' 7ٻ/_l~c @60ϯd k8]kd_9~N0*s3aaG_(_V`X2ñ gT~OfF#=TxδF @1ο,F(ew<[7?ϣk1g @Ƿk0r0H0|fR P+@@)KӣiIENDB`klog-0.9.8.1/flags/kn.png0000644000175000017500000000113413532572307014023 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd 10@ D20aH* FVjjpp o'O|ߛ6m O>*o-!쿧Wk]\b:h2P@~5w_F<>fԙg  r0߳[~_t¯/{2^@ѿf`>- _?fP bh)?1Bwܶe׿~-!kZocOׯ3 @, L ! Yr/;VqpP @5@u`8K@m|ZZK u ӿ@?#g'7 ߬G~3 4l00+d_}< GAA@S- \0~IENDB`klog-0.9.8.1/flags/au.png0000644000175000017500000000124113532572307014017 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<3IDATxb<^|CrǻXV*Dsg101KMy<"[M-ܣ1  =F;! 鐎>_aQY.3߲we~pkt ano!$AXx?jN !Lgdl_s `K ~I0U@,`m{Ue;UM.w~S_([gIYit ;?1BP" 1 ̷R=<.Ϻ.IÝw4LUg#,\4_ r[fέ F>?\?L[8)~Qoh(?BϞ= ?{ףGXA##? (,&a66%R @'#*ee?f~/ ׿_`]^?7ï_ @CH$V 4o ~3Jz @_J~_ l[mg P(r7P'PBr뿿e@JJW /P {*T@1e L&20iyx9IENDB`klog-0.9.8.1/flags/pf.png0000644000175000017500000000076213532572307014026 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb"$6@a = )Bl9֬J )rE|@ @@A  f@_3\tc5#;!?FFƏ>?W?.:ϝ?}sb}󟷟2J^fW7 j /?z13AĂP+4Y9e@,%$w/W0Ƚa_v/(X$)7㟿@9߿ad"/q_Cb1/IENDB`klog-0.9.8.1/flags/pa.png0000644000175000017500000000100713532572307014012 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb#L)aa @@,@y>>> 2^ }כ6 g9qfLR|{ϟ~U3 $/×@Q&C4"b^?8 X)Xo߿6VKWϿ2I?~b:$oF11>o BY*&&?ߟ 0u '׌&LxS/0?P_w^  XN't=0d3TfMMΞPtC \]ï? _@Pp?y] z-IENDB`klog-0.9.8.1/flags/hu.png0000644000175000017500000000066013532572307014032 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<BIDATxb<ˀ0B@bp 'VBBء,irN<6'O 2$P)d*+  XfGV  V V @10>}@'AUX#@@123ddw?~ D  UR:[p X~H_~AUH?  t@0b$$0Pf P/H@12X3 g@"m~gIENDB`klog-0.9.8.1/flags/bz.png0000644000175000017500000000113013532572307014022 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbɀ0 & v E𓝃7n_y 3'㻏2ϟ/ .g?? vd~_7hT D2L j@oD7u^c&Y>")yX~-b@L@'習 v>wG?%ytt"`eQ|!_GǓ?W`P~_@Wi &_^<?>dP}OoHog{P;^g ÿ?@,0__agr? W4;<{ S!@, ^1~ _,6=/@? H o _ 0b@f 0(t0IENDB`klog-0.9.8.1/flags/gq.png0000644000175000017500000000103113532572307014016 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbA10da &~Ǘo&߿_0￿7@,@]|>< HI4 Y^Yo #? AH-@1aã?~0B˗']8& ~aOh` 0 ?D3/8X٘8>}(L| bb0ā~}@, L~ h?'Pϟ@:@, _>"&OX/H5p|,210 û71 `C&5aIENDB`klog-0.9.8.1/flags/sv.png0000644000175000017500000000076513532572307014054 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdп c?(B PZ ?˜Qw XJcx?` ? u@ORh/@1?UYׯ3ur@4٘|@edd:?HXwcR>}@,B ׿ _L \5|CuOmk͉bةĸGU9@?@@yg~Kы_08~C/$I3O IQ?7H05(b 2eG$cCbtXlMIENDB`klog-0.9.8.1/flags/jm.png0000644000175000017500000000117513532572307014026 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb '_1?0~10``c 1U;{ MA%11=D26'. k 103<4 =[p ߿?~Y٫b*do _W[_@ۄ~* & o0zwR_ 0 l_b*~K׭?~Tj  @N}zbi;UWJ| 1FB1bKMG3I:.Q$^K0FGO_w_w@_2<`tc - >sw!IENDB`klog-0.9.8.1/flags/bd.png0000644000175000017500000000077013532572307014005 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdpf@ /D1XúLVwO²\9fgYdR'p5!t@,`?y/H_'ߏYׯ~-+, T @,@gMlwڥL~o/ _{Vj &s o'@$/{~/_ Ͽ?@UIC9H?F5 /67Bj@4Y@!À$A6 0t hV?5_% 9ʿWȀ @,  6(@DQbdDH _ak9IENDB`klog-0.9.8.1/flags/kh.png0000644000175000017500000000104513532572307014016 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbda` dC` _ }j@@d_aG _^**?D/ 7H5PWZ @ ZO6 wn3~lA2 tDud]-+/7)P/b_32 gp{x2pp2ppga X6a93' H>OO&&6V` `  1Fv rK0}^@#²Oua`/8X@nz^A{Utߧ"`9P<(LAa/>ڰyЈDC1 AL43UIENDB`klog-0.9.8.1/flags/za.png0000644000175000017500000000120213532572307014021 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb`hfh_~ 7O _>30|d`x 3bt#,G1?1MY3_>|yrDo_XHݯ(+ 1~!' s1h$ LGㅃ-Of A 7o4 Xqwxǟo? ' idxDxߝQC&,~}lS./xYde~3KI7_0.6Iؽu/^? @+HE]ϋ"7hyg}c0H] 2f/` F ` B._CIENDB`klog-0.9.8.1/flags/um.png0000644000175000017500000000107313532572307014036 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbn?[(ۿ<nۉW~r߿}˗O`Ç bj0j@״0|߿IX-(`#@ yeȚ/?q(LL̷v  = h*P5gx?@3 @,@9 9dW@r恗6µ^2/] $3ٳ@Q@8U_~ǟ? RG絴 p 1g E$%gN }߿%A?~_6ii'СC&&&smO?=xtxD100|10|@`FEH{IENDB`klog-0.9.8.1/flags/bv.png0000644000175000017500000000100013532572307014012 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|rsE]D3?`A @,@Qj )FFF0~ "߿n@,`{H|σ@ ׿_,+  U@_ @=@$@W߿@g@c@e>#sdv@m@$ H 9 @ɂgqq&&=ffܬ? l줷v~|o7~aQVz@d@ g'D/ H'?f ?$A.,_P3@WaQމ̮ 1$`$ZlIENDB`klog-0.9.8.1/flags/pl.png0000644000175000017500000000056613532572307014036 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb# ?l X@ 3300G_= Ȍ##?H)VFj0ģ X?{? Yi I_ !~_ 69vXd<"T00H3 pE5ei`ARl_? `# $ A@pĀE\Ǵ]IENDB`klog-0.9.8.1/flags/ru.png0000644000175000017500000000064413532572307014046 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<6IDATxb?BAX )̀l#/ dj?6 ==gd䌿 d@$$XX XoH7?_Iyy?|4D/ THRH\) @@,5|HӟD efE ?phU=L0HJ倢 `g1 H W*M  ?e8aIENDB`klog-0.9.8.1/flags/ss.png0000644000175000017500000000045613532572307014046 0ustar develdevelPNG  IHDRvbKGD pHYsgRtIMEUIDAT(c2(),*n*f^2? _ܖ&1AS1C{>}/Sh-k `b```􏁑? >0=W($-*;sc O <IENDB`klog-0.9.8.1/flags/pw.png0000644000175000017500000000104613532572307014043 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd c"?#Yp('E0 ) YHkps{2ǿRʈ)kRqQ{@, L OHv?P,#ÿ2@;0+WjedxAPhub/H @WP_~{Mddx01>T^> &02a >[Ǭ  7ߊp ' X_??ވ c@s eÜw?xʬsw>+$> ~cfK0\}v+(3/#0f! t@12e?@P?h :ZYIENDB`klog-0.9.8.1/flags/tm.png0000644000175000017500000000112113532572307014027 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdd$?|!ѐ~10`? 1|s" u  Rss ?çO~>|u'ϥ7x۷ 1sn=xٽ?;3&ۇ{+ן߿~hobjϿ~_]LSyo  X~/+o_r'RTK({Ƿ@ K8 Xa_8~}/هW~؆?@o5 /ǯ\q/`j50ghn `~q0pi >߽"s)I?  Vl bdEğ 2 w A&IENDB`klog-0.9.8.1/flags/sz.png0000644000175000017500000000120313532572307014044 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx (>lк,~$ˡdöMC_,ίj ,2 0@OO߿woֿ]y3-fN6 o`@+_mu/0E3(. '1b P Fo>D$? <PKT`$aN::yIENDB`klog-0.9.8.1/flags/tt.png0000644000175000017500000000115113532572307014041 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxA0ڧr%tF~QWkf1xy8 \y)))DF2N?i@17{hooqҥ[n]s.,ׯzD<|/_"7` v P3w~޼Mj@?00 3ga;7?oj[}_ïܿj w,ވpQg}yo? 4?滏z>)Lexp/Li_?@,L< ?Vn?2|bg`?0 F| ?"CA@!#IENDB`klog-0.9.8.1/flags/pe.png0000644000175000017500000000061513532572307014022 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπs (*KA@VW1f?@˦M rdp_ee6 Pտj߿6Lh@/ĕ44 N_50@`' *V `うa` fprV @t@40 ) 6/$ѩ C * ƯH "B =a;n'IENDB`klog-0.9.8.1/flags/tv.png0000644000175000017500000000103013532572307014037 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd@ C`X T[Rÿ2 bo%KA9s?x%@1BFFO> D'^~Ͽ@Ȁ_6N]*0-@1\Bu|t/ R 3N7 І/l?Zd!=2HOB S ~ ,pI?@t܎)'ȱt+@1ןߗV/Qt[  ,0޾} @ io0_[N뗂gw^߿u ݑ"~2E'sր#?,5&SPɽIENDB`klog-0.9.8.1/flags/bq.png0000644000175000017500000000064013532572307014016 0ustar develdevelPNG  IHDRvbKGD pHYsgRtIMERz-IDAT(ύ̱Kqg T$CA D NAMA`JAK$fVf(AF*oxZ,ڧ^ZQ ? $JGZ"-$&3‘^6@$/ֽKR[&u|YⴇgEQHdo Wbdl6(F9t¯&PNykFBMӈbD幇p':i=sTgs]оDSw,U}IENDB`klog-0.9.8.1/flags/ch.png0000644000175000017500000000055713532572307014015 0ustar develdevelPNG  IHDR &qgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπP@, ^u5###7Ï0gl`S-d:II$/T~7@hYe@ׯ@ 020q/@m,*~  fe֭PIssSeeR@_@q)@T0HQ|?ڀ)&ǏIENDB`klog-0.9.8.1/flags/kp.png0000644000175000017500000000106113532572307014024 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb4 ï?@ bc ƃ7(?v @1~d`d_ ,L|? ~IJb|9(Q^_Wٽo߿@oFf /[?k栠ll~?B@ /U0 tN ϟ? r.Э/^޼% ߿{ϟ E?BUm* v-Y–_REMgm7ofx& b` -xx=zP򕁋?+?:p(c?AA`˩ߵY@ sH,cq5@12x @6@ Xg "IENDB`klog-0.9.8.1/flags/ms.png0000644000175000017500000000114613532572307014035 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb<]{IvէzM|,9+_/`1/%@ 1Ȼ96&88i oy5Y?e5?s _T_z 7P@'&drJ?cZiƢS73 @~ mT; ß?oܼ*ǭ׏_@@15+<-Q,4(ٺ v@c~a|ww9?u,h?5@ :=?(!! $@:&D~//#C$,FH 2wF-5 IENDB`klog-0.9.8.1/flags/lt.png0000644000175000017500000000077413532572307014043 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb}D $l bb j&f2?P@ÿߟ. &Fg  BUh.@\ _@3B7`0beu@a(s˗? /_ 6? X~0i)Ii@h XϟB`~h@T @,k[t hֿ?e`/PN?.2?_J?0.?Y8z00/fKJ  $?`` #rāg%"wCݙIENDB`klog-0.9.8.1/flags/va.png0000644000175000017500000000105113532572307014017 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|}^; #=&Ͽr?P5 H?E8/^`?Hϟg`??` ! u0 @fϗOP@16lzE]?ÿ``4g'O7 X}b<ٿ~.%>iFǎIɲ1 E +Ż7ؙߚ勗 u?P@<Y?n F&F&FVEb20 pN!!`xw?ÿe I ?hh0SF.7IENDB`klog-0.9.8.1/flags/lu.png0000644000175000017500000000074113532572307014036 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<sIDATxbo??_ÿ  X>al 2/ӟ!0KS'@0ׯe? U"Aߌ@/俒*HP'O^ ߾}+((r ` 022~ X ޅX##0T@@ ; 9s cC pA;eO>_p0@A.:47ß@i=~c00b/`_`LA $@yk ߿IENDB`klog-0.9.8.1/flags/ky.png0000644000175000017500000000120313532572307014033 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbZXOxޕr[L D M> ?01'3sW   jE} p116(Ŝ5 1 ("$!! ,*WY"12: rz1$ "V'ԙںe'nu ßߌ~ɯ_<c@`UѲ h@00]ןʯgmXNy6P.@_o@5+ ([ @P矿 ح+~0@P? ~8 ~~b %bd`Ѕ(2  %WIENDB`klog-0.9.8.1/flags/si.png0000644000175000017500000000077613532572307014041 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb+Df(?Ïsq05(|@,<~=󿿭 LLFFF%,xxBB,~? CB}CO~ԙg[s=bof_@ ~ɿ>f`x@@'aW"__`b B Xcl@@#0/ïPL@ӧ@gr2:ן@@%'3L /vo!.7A?T=L@JJ@ba@/#0!!T.^\1 Pp,IENDB`klog-0.9.8.1/flags/cc.png0000644000175000017500000000116113532572307014000 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdef?I_0?lsA/oZ.߿W{8ξcT6 @|d&any5l+Ǐ?}?_μa@L "9~)7boV_jl_7L@1W1 Rg7lm"27^"1 } %  ,~ﯿש I'v_ 0~'6ٯEA@,@  ϗ9~/_`@,`HCKh @߿@@ /1?P~'a(w#@шU;MlAƭG\Mˏo4{qr13c~$b9@?˿2KsojH/bat?~@]?Dv:\37P@@zn: _p @ @uBO3'_?2 >qE^~ibd@a c8ƒ:8.EiS^wIENDB`klog-0.9.8.1/flags/dk.png0000644000175000017500000000075713532572307014023 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb zAR Q] VxyK}ϟ3I /7m jP~P@r`r2 ? @?0!n{b###H=>Y/ R4mhD d@@.H @~h0bvBIENDB`klog-0.9.8.1/flags/so.png0000644000175000017500000000101713532572307014034 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbTߟ? 1 /B97hh&ȰO@Q]z7$a*8 W_AJ2`8#P@1*6vr? t@a f8gd; _ NR<%* ? `W+ g?$ϿAfd2@,@[e Ӱ_@vy / 3a -W  ` t@12~eHb@G < mxȮIENDB`klog-0.9.8.1/flags/at.png0000644000175000017500000000062313532572307014021 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<%IDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@, 5DŁVY?~&.ovb|򥨨(ؖ `J!$77۷o$*8; BV?bXXk$_oeߴ˿4Xa%!?at@CIIPEr0@HT @_Q#OC@|WZ^IENDB`klog-0.9.8.1/flags/by.png0000644000175000017500000000100213532572307014017 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxLA {$mYJ֚a&N 0tg!fKq(|qn@2$EO0|Ȱk| jP H(+ XP Q Rob5ƍ `?9 A?!@  *wRTyPmp@?6׭?i20O F'?H߯_߿Qs mnj)}f $?AOL>2,> X2|TS"'_a @譿@~0/I?x|ڴʔa@0  o7u[TbeIENDB`klog-0.9.8.1/flags/canary.png0000644000175000017500000000036413532572307014674 0ustar develdevelPNG  IHDR n pHYs  tIME 0p57IDAT(c?zxgL 3y˝DU D[)#럕'W1~"230(H?Տ??1'Ө'M4-1BIENDB`klog-0.9.8.1/flags/balear.png0000644000175000017500000000061613532572307014645 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<0IDATxTMKA UUŏPԛTxAUۃ+ Kw233;KLƘj,TbU9u f(fLjW'YBHZYer$3L +Lt؂"$|lu{؟r2rqOڕ L |~}"# @1!;&  ; !6[1D# 0/JN&rH 鿿~ z:|5s6y,l\1YY21= ?X~`'0A?z11`?|MZyˋ` d.$1310H10 !IENDB`klog-0.9.8.1/flags/ae.png0000644000175000017500000000063013532572307014000 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<*IDATxbπk P V8)妛/F4e{/ђ"[@` ?y/=߿_ Ȑ@,`CTt^`dd| XNe;ȓI@f;/ NU~q: @Af kk_~JY篊ŋII?es!$=p$@ziٟ>IENDB`klog-0.9.8.1/flags/az.png0000644000175000017500000000111513532572307014024 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdxÿ? @?@l XvU)DT߿? ? _ 4@0pq10< g߿@3_@ r1aFFI~x_@$$͜ @, LL M?EEJIU^߮^߿ ğaWTfUP|ed.,$00P#$~ak?ޗLK{f폻w8#P'H0@ gsf?^y"?_ŵ!*_B2? X>1GM_pЀl ߟ1#C)P(j$a0e#WIENDB`klog-0.9.8.1/flags/ly.png0000644000175000017500000000064313532572307014043 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<5IDATxbdɀ00ؿ$@b`BWZ\}`f6{jW&ɱ"4E} x_j "$296H! T/ *b9/ PE Ư_06H@lo`JAF im @W qfj ?,P9ӑ@6( (!!(@V* ` %"$ r(IENDB`klog-0.9.8.1/flags/lv.png0000644000175000017500000000072113532572307014035 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<cIDATxb 10db` / @߿I 37m >y R D@90 _~ree =( 4 ߿?10˓'yBg: 2A9,ll ƿ222pF&>˛sed60@n ɓX}P8( P_I9bz  ?W@` X.II1E0B:0,"!E/hD?@|(IEPZIENDB`klog-0.9.8.1/flags/gt.png0000644000175000017500000000075513532572307014035 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdNc`,$ߧo#8(." FϿ*  H@! Q@Ew_4_Zh@]21@s_6,a XcrT{~5b  P?}4 @I!N rҟ a s ï0E@E @4@#?&1>%?~102D!3#0nY \2No{ϟ`W{1p*1 sIENDB`klog-0.9.8.1/flags/kz.png0000644000175000017500000000115013532572307014035 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd.? >Q ?`d0I @@ U1a@џ?ba``x w0qAr2n>_4/@113cmͿ֚@ $[/h0L~p| O/f ?'Ko_\o%B XaQ[]KO?/@ @"}?*{kKf tҿ? Rnk(0XSO+ =FPI@`2(r3Eix_d_q@ bdX_%;x\@0001iZsqIENDB`klog-0.9.8.1/flags/ee.png0000644000175000017500000000065513532572307014013 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<?IDATxbdp~cF@?P(0 v`yS+4kvrOVȦܙR60 2 OA߿ (/ ?Yav?t?@AU R R$ tba״ϣG7B_`FIr4P @)|dFӧO @J/\@,^+%@P @PHUm>mެT A@e@ _/R=mګ_UV7!&3uvVo5?@SA$+$Rz X1e=!Cp?`@,@k~aEd0@H :+4f&Zt8IENDB`klog-0.9.8.1/flags/marquesas.png0000644000175000017500000000056313532572307015421 0ustar develdevelPNG  IHDR v 9bKGD pHYs  tIME88YIDAT(ϝ-O`FOӎ: &0$nĐZ6dEѥkbϽ(&P@1RJQCr _wo#cz q@J,v `}cfϵҘiEbI~3G 0<)%e)hAA|uM wau,Əy <~rSbIENDB`klog-0.9.8.1/flags/kg.png0000644000175000017500000000077613532572307014027 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbȀ`$2p) 0أꊐ{3# pzU}ߓ @7_F ] ($+  XGfߌ~.` @T @L @΀ΤQŨYH/%@ ߟ(?/~}20'od/b˯O~BU-: ~bï_fd`]P1@5@<uկ~1ן}N %%A 1@7#ِ0$b|03v!f Tg_TIENDB`klog-0.9.8.1/flags/tl.png0000644000175000017500000000100213532572307014024 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxLA ]=3=\$IfMNp :J!s#5^ 1|?@?$˦Mp¿Oc/ $ f@ ?/aJAC40 @L@ Gg 6biknn8syI_`?6Hm[_~&VbWb:@,@'1|W|<F"I O{_P?f >CL\22@u # !~1˴ӊ3|``0&` ` |^#iIENDB`klog-0.9.8.1/setuppagecolors.cpp0000644000175000017500000001721413532572307015542 0ustar develdevel/*************************************************************************** setuppagecolors.cpp - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppagecolors.h" SetupPageColors::SetupPageColors(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageColors::SetupPageColors" << endl; newOneColorButton = new QPushButton; neededColorButton = new QPushButton; workedColorButton = new QPushButton; confirmedColorButton = new QPushButton; defaultColorButton = new QPushButton; newOneColorButton->setText(tr("New One")); neededColorButton->setText(tr("Needed in this band")); workedColorButton->setText(tr("Worked in this band")); confirmedColorButton->setText(tr("Confirmed in this band")); defaultColorButton->setText(tr("Default")); newOneColorButton->setAutoFillBackground ( true ); QVBoxLayout *buttonsLayout = new QVBoxLayout; buttonsLayout->addWidget(newOneColorButton); buttonsLayout->addWidget(neededColorButton); buttonsLayout->addWidget(workedColorButton); buttonsLayout->addWidget(confirmedColorButton); buttonsLayout->addWidget(defaultColorButton); setLayout(buttonsLayout); connect(newOneColorButton, SIGNAL(clicked()), this, SLOT(slotNewOneColorButtonClicked()) ); connect(neededColorButton, SIGNAL(clicked()), this, SLOT(slotNeededColorButtonClicked()) ); connect(workedColorButton, SIGNAL(clicked()), this, SLOT(slotWorkedColorButtonClicked()) ); connect(confirmedColorButton, SIGNAL(clicked()), this, SLOT(slotConfirmedColorButtonClicked()) ); connect(defaultColorButton, SIGNAL(clicked()), this, SLOT(slotDefaultColorButtonClicked()) ); setNewOneColor("#FF0000"); setNeededColor("#FF8C00"); setWorkedColor("#FFD700"); setConfirmedColor("#32CD32"); setDefaultColor("#00BFFF"); //qDebug() << "SetupPageColors::SetupPageColors - END" << endl; } SetupPageColors::~SetupPageColors() {; } void SetupPageColors::slotNewOneColorButtonClicked() { //qDebug() << "SetupPageColors::slotNewOneColorButtonClicked " << endl; QString style = "* { background-color: "; style = style + (giveColor(newOneColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; newOneColorButton->setStyleSheet(style); } void SetupPageColors::slotNeededColorButtonClicked () { //qDebug() << "SetupPageColors::slotNeededColorButtonClicked " << endl; QString style = "* { background-color: "; style = style + (giveColor(neededColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; neededColorButton->setStyleSheet(style); } void SetupPageColors::slotWorkedColorButtonClicked () { //qDebug() << "SetupPageColors::slotWorkedColorButtonClicked " << endl; QString style = "* { background-color: "; style = style + (giveColor(workedColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; workedColorButton->setStyleSheet(style); } void SetupPageColors::slotConfirmedColorButtonClicked () { //qDebug() << "SetupPageColors::slotNeededColorButtonClicked " << endl; QString style = "* { background-color: "; style = style + (giveColor(confirmedColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; confirmedColorButton->setStyleSheet(style); } void SetupPageColors::slotDefaultColorButtonClicked() { //qDebug() << "SetupPageColors::slotDefaultColorButtonClicked " << endl; QString style = "* { background-color: "; style = style + (giveColor(defaultColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; defaultColorButton->setStyleSheet(style); } QColor SetupPageColors::giveColor (QColor c) { // Receives the actual color, shows the user a color picker and returns the color that the user selects. QColor colorb; color = c; colorb = color; color = QColorDialog::getColor (color, this, tr("Choose a color")); if (color.isValid ()) { //qDebug() << "SetupPageColors::giveColor valid color: " << color.name() << endl; return color; } else { //qDebug() << "SetupPageColors::giveColor NOT valid color" << endl; return colorb; } } QString SetupPageColors::getNewOneColor() { //qDebug() << "SetupPageColors::getNewOneColor: " << (newOneColorButton->palette().color(QPalette::Button)).name() << endl; return (newOneColorButton->palette().color(QPalette::Button)).name(); } QString SetupPageColors::getNeededColor() { return (neededColorButton->palette().color(QPalette::Button)).name(); } QString SetupPageColors::getWorkedColor() { return (workedColorButton->palette().color(QPalette::Button)).name(); } QString SetupPageColors::getConfirmedColor() { return (confirmedColorButton->palette().color(QPalette::Button)).name(); } QString SetupPageColors::getDefaultColor() { return (defaultColorButton->palette().color(QPalette::Button)).name(); } void SetupPageColors::setNewOneColor(const QString c) { QString style = "* { background-color: "; style = style + c; style = style + "; }"; newOneColorButton->setStyleSheet(style); } void SetupPageColors::setNeededColor(const QString c) { QString style = "* { background-color: "; style = style + c; style = style + "; }"; neededColorButton->setStyleSheet(style); } void SetupPageColors::setWorkedColor(const QString c) { QString style = "* { background-color: "; style = style + c; style = style + "; }"; workedColorButton->setStyleSheet(style); } void SetupPageColors::setConfirmedColor(const QString c) { QString style = "* { background-color: "; style = style + c; style = style + "; }"; confirmedColorButton->setStyleSheet(style); } void SetupPageColors::setDefaultColor(const QString c) { QString style = "* { background-color: "; style = style + c; style = style + "; }"; defaultColorButton->setStyleSheet(style); } klog-0.9.8.1/mainwindowmydatatab.cpp0000644000175000017500000002207113532572307016363 0ustar develdevel/*************************************************************************** mainwindowmydatatab.cpp - description ------------------- begin : Jul 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mainwindowmydatatab.h" MainWindowMyDataTab::MainWindowMyDataTab(QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowMyDataTab::MainWindowMyDataTab" << endl; myPowerSpinBox = new QDoubleSpinBox; operatorLineEdit = new QLineEdit; stationCallSignLineEdit = new QLineEdit; myLocatorLineEdit = new QLineEdit; keepThisDataForNextQSORadiobutton = new QRadioButton; lastOperatorQRZ = QString(); // Last QRZ used by the user, will remain if the button is checked and removed if not lastStationQRZ = QString(); // Last QRZ used by the user, will remain if the button is checked and removed if not lastMyLocator = QString(); // Last locator used by the user, will remain if the button is checked and removed if not stationQRZ = QString(); // Defined in the configuration by the user, will be used if the user configured so in the setup operatorQRZ = QString(); // Defined in the configuration by the user, will be used if the user configured so in the setup myLocator = QString(); // Defined in the configuration by the user, will be used if the user configured so in the setup createUI(); myPower = 0; lastPower = 0; //qDebug() << "MainWindowMyDataTab::MainWindowMyDataTab - END" << endl; } MainWindowMyDataTab::~MainWindowMyDataTab(){} void MainWindowMyDataTab::createUI() { myPowerSpinBox->setDecimals(2); myPowerSpinBox->setMaximum(9999); myPowerSpinBox->setSuffix(" " + tr("Watt")); QLabel *keepLabel = new QLabel(); keepLabel->setText(tr("Keep this data")); keepLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); keepLabel->setToolTip(tr("Data entered in this tab will be copied into the next QSO.")); keepThisDataForNextQSORadiobutton->setToolTip(tr("Data entered in this tab will be copied into the next QSO.")); myPowerSpinBox->setToolTip(tr("Power used for the QSO in watts.")); operatorLineEdit->setToolTip(tr("Logging operator's callsign.")); stationCallSignLineEdit->setToolTip(tr("Callsign used over the air.")); myLocatorLineEdit->setToolTip(tr("My QTH locator.")); QLabel *myPowerSpinBoxLabelN = new QLabel(tr("Power")); myPowerSpinBoxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *operatorLabelN = new QLabel(tr("Operator")); operatorLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *stationCallSignLabelN = new QLabel(tr("Station Callsign")); stationCallSignLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *myLocatorLabelN = new QLabel(tr("My Locator")); myLocatorLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QGridLayout *myDataInputTabWidgetLayout = new QGridLayout; myDataInputTabWidgetLayout->addWidget(myPowerSpinBoxLabelN, 0, 0); myDataInputTabWidgetLayout->addWidget(operatorLabelN, 1, 0); myDataInputTabWidgetLayout->addWidget(stationCallSignLabelN, 2, 0); myDataInputTabWidgetLayout->addWidget(myLocatorLabelN, 3, 0); myDataInputTabWidgetLayout->addWidget(myPowerSpinBox, 0, 1); myDataInputTabWidgetLayout->addWidget(operatorLineEdit, 1, 1); myDataInputTabWidgetLayout->addWidget(stationCallSignLineEdit, 2, 1); myDataInputTabWidgetLayout->addWidget(myLocatorLineEdit, 3, 1); myDataInputTabWidgetLayout->addWidget(keepLabel, 4, 1); myDataInputTabWidgetLayout->addWidget(keepThisDataForNextQSORadiobutton, 4, 2); setLayout(myDataInputTabWidgetLayout); //myDataInputTabWidget->setLayout(myDataInputTabWidgetLayout); // i = dxUpLeftTab->addTab(myDataInputTabWidget, tr("My Data")); //connect(stationCallSignLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); } void MainWindowMyDataTab::clear(const bool _keepMyData) { // _keepMyData comes from the setup if (_keepMyData) { //qDebug() << "MainWindowMyDataTab::clear: TRUE" << endl; } else { //qDebug() << "MainWindowMyDataTab::clear: FALSE" << endl; } if (keepThisDataForNextQSORadiobutton->isChecked()) { myPowerSpinBox->setValue(lastPower); operatorLineEdit->setText(lastOperatorQRZ.toUpper()); stationCallSignLineEdit->setText(lastStationQRZ.toUpper()); myLocatorLineEdit->setText(lastMyLocator); } else { if (_keepMyData) { myPowerSpinBox->setValue(myPower); operatorLineEdit->setText(operatorQRZ.toUpper()); stationCallSignLineEdit->setText(stationQRZ.toUpper()); myLocatorLineEdit->setText(myLocator); } else { myPowerSpinBox->setValue(0); operatorLineEdit->clear(); stationCallSignLineEdit->clear(); myLocatorLineEdit->clear(); } } } void MainWindowMyDataTab::show() { //qDebug() << "MainWindowMyDataTab::show: " << QString::number(myPower) << "/" << operatorQRZ << "/" << stationQRZ << "/" << myLocator << endl; myPowerSpinBox->setValue(myPower); operatorLineEdit->setText(operatorQRZ); stationCallSignLineEdit->setText(stationQRZ); myLocatorLineEdit->setText(myLocator); } void MainWindowMyDataTab::setSetupMyPower(const double _power) { myPower = _power; } void MainWindowMyDataTab::setSetupOperator(const QString _op) { operatorQRZ = _op.toUpper(); } void MainWindowMyDataTab::setSetupStationQRZ(const QString _op) { stationQRZ = _op.toUpper(); } void MainWindowMyDataTab::setSetupMyLocator(const QString _op) { myLocator = _op.toUpper(); } void MainWindowMyDataTab::setMyPower(const double _power) { //qDebug() << "MainWindowMyDataTab::setMyPower: " << QString::number(_power) << endl; myPowerSpinBox->setValue(_power); } double MainWindowMyDataTab::getMyPower() { if (myPowerSpinBox->value() > 0) { lastPower = myPowerSpinBox->value(); return lastPower; } else { return 0.0; } //return myPowerSpinBox->value(); } void MainWindowMyDataTab::setOperator(const QString _op) { //qDebug() << "MainWindowMyDataTab::setOperator: " << _op << endl; operatorLineEdit->setText(_op); } QString MainWindowMyDataTab::getOperator() { lastOperatorQRZ = (operatorLineEdit->text()).toUpper(); return lastOperatorQRZ; } void MainWindowMyDataTab::setStationQRZ(const QString _op) { //qDebug() << "MainWindowMyDataTab::setStationQRZ: " << _op << endl; stationCallSignLineEdit->setText(_op); } QString MainWindowMyDataTab::getStationQRZ() { lastStationQRZ = (stationCallSignLineEdit->text()).toUpper(); return lastStationQRZ.toUpper(); } void MainWindowMyDataTab::setMyLocator(const QString _op) { myLocatorLineEdit->setText(_op); } QString MainWindowMyDataTab::getMyLocator() { lastMyLocator = (myLocatorLineEdit->text()).toUpper(); return lastMyLocator.toUpper(); } void MainWindowMyDataTab::setData(const double _power, const QString _stationQRZ, const QString _operator, const QString _myLocator) { if (_power > 0.0) { myPower = _power; } else { myPower = 0; } if (_stationQRZ.length()>0) { stationQRZ = _stationQRZ; } else { stationQRZ = QString(); } if (_operator.length()>0) { operatorQRZ = _operator; } else { operatorQRZ = QString(); } if (_myLocator.length()>0) { myLocator = _myLocator; } else { myLocator = QString(); } } klog-0.9.8.1/setuppagelogsnew.h0000644000175000017500000001152213532572307015360 0ustar develdevel#ifndef SETUPPAGELOGSNEW_H #define SETUPPAGELOGSNEW_H /*************************************************************************** setuppagelogsnew.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new log // #include "dataproxy.h" #include #include #include //TODO: Read the data when the user clicks the OK button //TODO: Fill the data from the list of logs when the user wants to edit a log class SetupPageLogsNew : public QDialog { Q_OBJECT public: //SetupPageLogsNew(QWidget *parent = 0); SetupPageLogsNew(DataProxy *dp, QWidget *parent = 0); void setEditing(const bool b); void setStationCallSign(const QString _st); void setOperators(const QString _st); void setComment(const QString _st); void setDateString(const QString _st); void setTypeN(const int _n); void setType(const QString _st); void setCMode(const int _n); void setCOperators(const int _n); void setCAssisted(const int _n); void setCPower(const int _n); void setCBands(const int _n); void setBands(const int _n); void setCOverlay(const int _n); private slots: void slotOKButtonClicked(); void slotCancelButtonClicked(); void slotStationCallSignTextChanged(); void slotTypeComboBoxChanged(); void slotCatAssistedComboBoxChanged(); void slotCatOperatorsComboBoxChanged(); void slotOperatorsTextChanged(); void slotCatPowerComboBoxChanged(); void slotCatBandsComboBoxChanged(); void slotBandsComboBoxChanged(); void slotCatModeComboBoxChanged(); void slotCatOverlayComboBoxChanged(); signals: void newLogData(const QStringList _qs); // void cancelled(const bool _c); // Cancel button is clicked private: //bool isThereAnyNotManagedLog(); void createWidget(); void gatherAndSend(); QStringList getValidCatOptions(const int _currentCat, const int _higherCat); int getSelectedTypeContest(); void fillWithType(const int _n); void updateAllCats(); void showOK(); void showNOK(); void clear(); DataProxy *dataProxy; QDateEdit *dateEdit; QLineEdit *stationCallsignLineEdit; QLineEdit *operatorsLineEdit, *commentLineEdit; QComboBox *typeComboBox; QComboBox *contestCatModeComboBox; QComboBox *contestCatOperatorsComboBox; QComboBox *contestCatAssistedComboBox; QComboBox *contestCatPowerComboBox; QComboBox *contestCatBandsComboBox; QComboBox *contestBandsComboBox; QComboBox *contestCatOverlayComboBox; QString stationCallsign, operators, comment, dateString, typeConteststr; int typeContest, typeContestSelected, contestCatMode, contestCatOperators, contestCatAssisted, contestCatPower, contestCatBands, contestBands, contestCatOverlay; bool stationCallsignFilled, operatorsFilled; int typeOperation; // DX, CQ-WW-SSB, CQ-WW-CW, CQ-WPX-SSB, CQ-WPX-CW QPushButton *okButton, *cancelButton; QStringList logData; bool editing; QLabel *catAsLabel, *catOpLabel, *catModeLabel, *catPowerLabel, *catBandsLabel, *overlayLabel; QLabel *typeLabel, *validCats, *stationCallsignLabel, *operatorsLabel, *commentLabel, *dateLabel; //nameLabel->setBuddy(); bool checking, bCass, bCOp, bCMo, bCPo, bCBa, bCOv, bCTy; }; #endif // SETUPPAGELOGSNEW_H klog-0.9.8.1/charts/0000755000175000017500000000000013532577071013101 5ustar develdevelklog-0.9.8.1/charts/statsqsospermodebarchartwidget.h0000644000175000017500000000454513532572307021612 0ustar develdevel#ifndef STATSQSOSPERMODEBARCHARTWIDGET_H #define STATSQSOSPERMODEBARCHARTWIDGET_H /*************************************************************************** statsqsospermodebarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerModeBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerModeBarChartWidget(DataProxy *dp, QWidget *parent = 0); StatsQSOsPerModeBarChartWidget(); void prepareChart(); signals: public slots: private: void createUI(); DataProxy *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-0.9.8.1/charts/statsqsospermodebarchartwidget.cpp0000644000175000017500000000544313532572307022143 0ustar develdevel#include "statsqsospermodebarchartwidget.h" StatsQSOsPerModeBarChartWidget::StatsQSOsPerModeBarChartWidget(){} StatsQSOsPerModeBarChartWidget::StatsQSOsPerModeBarChartWidget(DataProxy *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerModeBarChartWidget::StatsQSOsPerModeBarChartWidget" << endl; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); prepareChart(); } void StatsQSOsPerModeBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerModeBarChartWidget::prepareChart() { QString x_axisTitle; QString x_axisElem; QStringList x_axis; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); x_axisTitle = QString(); x_axisElem = QString(); x_axis.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per mode")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, x_axis.count(), this); progress.setWindowModality(Qt::WindowModal); //qDebug() << "StatsQSOsPerModeBarChartWidget::prepareChart: SelectedGrapth-1: MODES " << endl; x_axis.append(dataProxy->getModesInLog(-1)); x_axisElem = tr("Modes"); x_axisTitle = tr("QSO per mode distribution"); aux.clear(); for (int i = 0; i < x_axis.count();i++ ) { numberPerX = dataProxy->getQSOsInMode((x_axis.at(i)), -1); //qDebug() << x_axis.at(i) + "-" + QString::number(numberPerX) << endl; *set0 << numberPerX; numberPerX = 0; //qDebug() << "StatsQSOsPerModeBarChartWidget::prepareChart QSOs: " << QString::number((x_axis.at(i)).toInt()) << "/" << QString::number(numberPerX) << endl; aux = tr("Reading data ...") + "\n" + tr("Modes: ") + QString::number(i) + "/" + QString::number(x_axis.count()); //aux = tr("Reading data ...") + "\n" + tr("Modes: %1/%2").arg(QString::number(i)).arg(QString::number(x_axis.count())); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = x_axis.count(); } } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(x_axisElem); chart->addSeries(series); chart->setTitle(x_axisTitle); axis->append(x_axis); chart->createDefaultAxes(); chart->setAxisX(axis, series); } klog-0.9.8.1/charts/statsqsospercontinentbarchartwidget.h0000644000175000017500000000460313532572307022662 0ustar develdevel#ifndef STATSQSOSPERCONTINENTBARCHARTWIDGET_H #define STATSQSOSPERCONTINENTBARCHARTWIDGET_H /*************************************************************************** statsqsospercontinentbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerContinentBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerContinentBarChartWidget(DataProxy *dp, QWidget *parent = 0); StatsQSOsPerContinentBarChartWidget(); void prepareChart(); signals: public slots: private: void createUI(); DataProxy *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-0.9.8.1/charts/statsqsospermonthbarchartwidget.cpp0000644000175000017500000000550113532572307022337 0ustar develdevel#include "statsqsospermonthbarchartwidget.h" StatsQSOsPerMonthBarChartWidget::StatsQSOsPerMonthBarChartWidget(){} StatsQSOsPerMonthBarChartWidget::StatsQSOsPerMonthBarChartWidget(DataProxy *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerMonthBarChartWidget::StatsQSOsPerMonthBarChartWidget" << endl; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); prepareChart(); } void StatsQSOsPerMonthBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerMonthBarChartWidget::prepareChart() { QString x_axisTitle; QString x_axisElem; QStringList x_axis; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); x_axisTitle = QString(); x_axisElem = QString(); x_axis.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per month")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, x_axis.count(), this); progress.setWindowModality(Qt::WindowModal); QStringList months; months.clear(); months << tr("Jan") << tr("Feb") << tr("Mar") << tr("Apr") << tr("May") << tr("Jun") << tr("Jul") << tr("Aug") << tr("Sep") << tr("Oct") << tr("Nov") << tr("Dec"); x_axis.append(months); x_axisElem = tr("Months"); x_axisTitle = tr("QSOs at Month"); aux.clear(); for (int i = 0; i < x_axis.count(); i++ ) { numberPerX = dataProxy->getQSOsOnMonth(i+1, -1); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour: " << x_axis.at(i) << " - " << QString::number(numberPerX) << endl; *set0 << numberPerX; numberPerX = 0; aux = tr("Reading data ...") + "\n" + tr("Months: ") + QString::number(i) + "/" + QString::number(x_axis.count()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = x_axis.count(); } //qDebug() << "BarChartStats::prepareChart CQz: " << QString::number((x_axis.at(i)).toInt()) << "/" << QString::number(numberPerX) << endl; } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(x_axisElem); chart->addSeries(series); chart->setTitle(x_axisTitle); axis->append(x_axis); chart->createDefaultAxes(); chart->setAxisX(axis, series); } klog-0.9.8.1/charts/statssentconfirmedpiechartwidget.cpp0000644000175000017500000000362113532572307022447 0ustar develdevel#include "statssentconfirmedpiechartwidget.h" StatsSentConfirmedPieChartWidget::StatsSentConfirmedPieChartWidget(){} StatsSentConfirmedPieChartWidget::StatsSentConfirmedPieChartWidget(DataProxy *dp, QWidget *parent) { //qDebug() << "StatsSentConfirmedPieChartWidget::StatsSentConfirmedPieChartWidget" << endl; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); prepareChart(); } void StatsSentConfirmedPieChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsSentConfirmedPieChartWidget::prepareChart() { QPieSeries *series = new QPieSeries(); //PieSlice append(string label, real value) int sent = dataProxy->getHowManyQSLSentInLog(-1); int confirmed = dataProxy->getHowManyConfirmedQSLInLog(-1); //qDebug() << "QSOs: " << QString::number(qsos) << endl; //qDebug() << "Confirmed: " << QString::number(confirmed) << endl; //qDebug() << "Worked: " << QString::number(qsos - confirmed) << endl; series->append(tr("Sent - %1").arg(sent), sent); series->append(tr("Confirmed - %2").arg(confirmed), confirmed); QPieSlice *slice = series->slices().at(1); slice->setExploded(); slice->setLabelVisible(); slice->setPen(QPen(Qt::darkGreen, 2)); slice->setBrush(Qt::green); QPieSlice *slice1 = series->slices().at(0); slice1->setExploded(); slice1->setLabelVisible(); slice1->setPen(QPen(Qt::blue, 2)); slice1->setBrush(Qt::blue); chart->addSeries(series); chart->setTitle("Sent / Confirmed status"); chart->legend()->hide(); chartView->setRenderHint(QPainter::Antialiasing); } klog-0.9.8.1/charts/statsworkedsentpiechartwidget.h0000644000175000017500000000453713532572307021450 0ustar develdevel#ifndef STATSWORKEDSENTPIECHARTWIDGET_H #define STATSWORKEDSENTPIECHARTWIDGET_H /*************************************************************************** statsworkedsentpiechatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy.h" #include "charts/statsgeneralchartwidget.h" class StatsWorkedSentPieChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsWorkedSentPieChartWidget(DataProxy *dp, QWidget *parent = 0); StatsWorkedSentPieChartWidget(); void prepareChart(); signals: public slots: private: void createUI(); DataProxy *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-0.9.8.1/charts/statsqsosperdxccbarchartwidget.h0000644000175000017500000000454513532572307021607 0ustar develdevel#ifndef STATSQSOSPERDXCCBARCHARTWIDGET_H #define STATSQSOSPERDXCCBARCHARTWIDGET_H /*************************************************************************** statsqsosperdxccbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerDXCCBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerDXCCBarChartWidget(DataProxy *dp, QWidget *parent = 0); StatsQSOsPerDXCCBarChartWidget(); void prepareChart(); signals: public slots: private: void createUI(); DataProxy *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-0.9.8.1/charts/barchartstats.h0000644000175000017500000000615013532572307016116 0ustar develdevel#ifndef BARCHARTSTATS_H #define BARCHARTSTATS_H /*************************************************************************** barchartstats.h - description ------------------- begin : ago 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "dataproxy.h" #include "charts/statsgeneralchartwidget.h" #include "charts/statsqsosperyearbarchartwidget.h" #include "charts/statsqsosperbandbarchartwidget.h" #include "charts/statsqsospermodebarchartwidget.h" #include "charts/statsentitiesperyearbarchartwidget.h" #include "charts/statscqzperyearbarchartwidget.h" #include "charts/statsqsosperdxccbarchartwidget.h" #include "charts/statsqsospercontinentbarchartwidget.h" #include "charts/statsqsosperhourbarchartwidget.h" #include "charts/statsqsospermonthbarchartwidget.h" #include "charts/statsworkedconfirmedpiechartwidget.h" #include "charts/statsworkedsentpiechartwidget.h" #include "charts/statssentconfirmedpiechartwidget.h" //#include "charts/statspiechartwidget.h" class BarChartStats : public QWidget { Q_OBJECT public: BarChartStats(DataProxy *dp, QWidget *parent = nullptr); ~BarChartStats(); void prepareChart(const int _selection, const int _log=-1); void clear(); signals: public slots: private: void createUI(); void cleanLayout(); DataProxy *dataProxy; QChart *chart; QChartView *chartView; QWidget *mainWidget; StatsGeneralChartWidget *genchart; QVBoxLayout *mLayout; StatsQSOsPerYearBarChartWidget *qsoPerYearBarChartWidget; //QBarCategoryAxis *axis; }; #endif // BARCHARTSTATS_H klog-0.9.8.1/charts/statsgeneralchartwidget.cpp0000644000175000017500000000066013532572307020526 0ustar develdevel#include "statsgeneralchartwidget.h" StatsGeneralChartWidget::StatsGeneralChartWidget() { //qDebug() << "StatsGeneralChartWidget::StatsGeneralChartWidget" << endl; } StatsGeneralChartWidget::StatsGeneralChartWidget(DataProxy *dp, QWidget *parent) { //qDebug() << "StatsGeneralChartWidget::StatsGeneralChartWidget" << endl; } void StatsGeneralChartWidget::prepareChart() {} void StatsGeneralChartWidget::createUI(){} klog-0.9.8.1/charts/statsqsospercontinentbarchartwidget.cpp0000644000175000017500000000541613532572307023220 0ustar develdevel#include "statsqsospercontinentbarchartwidget.h" StatsQSOsPerContinentBarChartWidget::StatsQSOsPerContinentBarChartWidget(){} StatsQSOsPerContinentBarChartWidget::StatsQSOsPerContinentBarChartWidget(DataProxy *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerContinentBarChartWidget::StatsQSOsPerContinentBarChartWidget" << endl; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); prepareChart(); } void StatsQSOsPerContinentBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerContinentBarChartWidget::prepareChart() { QString x_axisTitle; QString x_axisElem; QStringList x_axis; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); x_axisTitle = QString(); x_axisElem = QString(); x_axis.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per continent")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, x_axis.count(), this); progress.setWindowModality(Qt::WindowModal); QStringList continents; continents.clear(); continents << dataProxy->getContinentShortNames(); x_axis.append(continents); x_axisElem = tr("Continents"); x_axisTitle = tr("QSOs per continent"); aux.clear(); for (int i = 0; i < x_axis.count(); i++ ) { numberPerX = dataProxy->getQSOsWithContinent(x_axis.at(i), -1); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour: " << x_axis.at(i) << " - " << QString::number(numberPerX) << endl; *set0 << numberPerX; numberPerX = 0; aux = tr("Reading data ...") + "\n" + tr("Hours: ") + QString::number(i) + "/" + QString::number(x_axis.count()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = x_axis.count(); } //qDebug() << "BarChartStats::prepareChart CQz: " << QString::number((x_axis.at(i)).toInt()) << "/" << QString::number(numberPerX) << endl; } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(x_axisElem); chart->addSeries(series); chart->setTitle(x_axisTitle); axis->append(x_axis); chart->createDefaultAxes(); chart->setAxisX(axis, series); } klog-0.9.8.1/charts/statsqsosperhourbarchartwidget.cpp0000644000175000017500000000554413532572307022176 0ustar develdevel#include "statsqsosperhourbarchartwidget.h" StatsQSOsPerHourBarChartWidget::StatsQSOsPerHourBarChartWidget(){} StatsQSOsPerHourBarChartWidget::StatsQSOsPerHourBarChartWidget(DataProxy *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerHourBarChartWidget::StatsQSOsPerHourBarChartWidget" << endl; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); prepareChart(); } void StatsQSOsPerHourBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerHourBarChartWidget::prepareChart() { QString x_axisTitle; QString x_axisElem; QStringList x_axis; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); x_axisTitle = QString(); x_axisElem = QString(); x_axis.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per hour")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, x_axis.count(), this); progress.setWindowModality(Qt::WindowModal); QStringList hours; hours.clear(); hours << "00" << "01" << "02" << "03" << "04" << "05" << "06" << "07" << "08" << "09" << "10" << "11" << "12" << "13" << "14" << "15" << "16" << "17" << "18" << "19" << "20" << "21" << "22" << "23"; x_axis.append(hours); x_axisElem = tr("Hours"); x_axisTitle = tr("QSOs at hour"); aux.clear(); for (int i = 0; i < x_axis.count(); i++ ) { numberPerX = dataProxy->getQSOsAtHour((x_axis.at(i)).toInt(), -1); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour: " << x_axis.at(i) << " - " << QString::number(numberPerX) << endl; *set0 << numberPerX; numberPerX = 0; aux = tr("Reading data ...") + "\n" + tr("Hours: ") + QString::number(i) + "/" + QString::number(x_axis.count()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = x_axis.count(); } //qDebug() << "BarChartStats::prepareChart CQz: " << QString::number((x_axis.at(i)).toInt()) << "/" << QString::number(numberPerX) << endl; } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(x_axisElem); chart->addSeries(series); chart->setTitle(x_axisTitle); axis->append(x_axis); chart->createDefaultAxes(); chart->setAxisX(axis, series); } klog-0.9.8.1/charts/statsgeneralchartwidget.h0000644000175000017500000000065513532572307020177 0ustar develdevel#ifndef STATSGENERALCHARTWIDGET_H #define STATSGENERALCHARTWIDGET_H #include #include #include #include "dataproxy.h" class StatsGeneralChartWidget : public QWidget { Q_OBJECT public: StatsGeneralChartWidget(); StatsGeneralChartWidget(DataProxy *dp, QWidget *parent = 0); virtual void prepareChart(); private: virtual void createUI(); }; #endif // GENERALCHARTWIDGET_H klog-0.9.8.1/charts/statsqsosperhourbarchartwidget.h0000644000175000017500000000454513532572307021643 0ustar develdevel#ifndef STATSQSOSPERHOURBARCHARTWIDGET_H #define STATSQSOSPERHOURBARCHARTWIDGET_H /*************************************************************************** statsqsosperhourbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerHourBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerHourBarChartWidget(DataProxy *dp, QWidget *parent = 0); StatsQSOsPerHourBarChartWidget(); void prepareChart(); signals: public slots: private: void createUI(); DataProxy *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-0.9.8.1/charts/statsqsosperbandbarchartwidget.cpp0000644000175000017500000000544313532572307022123 0ustar develdevel#include "statsqsosperbandbarchartwidget.h" StatsQSOsPerBandBarChartWidget::StatsQSOsPerBandBarChartWidget(){} StatsQSOsPerBandBarChartWidget::StatsQSOsPerBandBarChartWidget(DataProxy *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerBandBarChartWidget::StatsQSOsPerBandBarChartWidget" << endl; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); prepareChart(); } void StatsQSOsPerBandBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerBandBarChartWidget::prepareChart() { QString x_axisTitle; QString x_axisElem; QStringList x_axis; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); x_axisTitle = QString(); x_axisElem = QString(); x_axis.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per band")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, x_axis.count(), this); progress.setWindowModality(Qt::WindowModal); //qDebug() << "StatsQSOsPerBandBarChartWidget::prepareChart: SelectedGrapth-1: YEARS " << endl; x_axis.append(dataProxy->getBandsInLog(-1)); x_axisElem = tr("Bands"); x_axisTitle = tr("QSO per band distribution"); aux.clear(); for (int i = 0; i < x_axis.count();i++ ) { numberPerX = dataProxy->getQSOsInBand((x_axis.at(i)), -1); //qDebug() << x_axis.at(i) + "-" + QString::number(numberPerX) << endl; *set0 << numberPerX; numberPerX = 0; //qDebug() << "StatsQSOsPerBandBarChartWidget::prepareChart QSOs: " << QString::number((x_axis.at(i)).toInt()) << "/" << QString::number(numberPerX) << endl; aux = tr("Reading data ...") + "\n" + tr("Bands: ") + QString::number(i) + "/" + QString::number(x_axis.count()); //aux = tr("Reading data ...") + "\n" + tr("Bands: %1/%2").arg(QString::number(i)).arg(QString::number(x_axis.count())); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = x_axis.count(); } } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(x_axisElem); chart->addSeries(series); chart->setTitle(x_axisTitle); axis->append(x_axis); chart->createDefaultAxes(); chart->setAxisX(axis, series); } klog-0.9.8.1/charts/statsqsospermonthbarchartwidget.h0000644000175000017500000000455313532572307022012 0ustar develdevel#ifndef STATSQSOSPERMONTHBARCHARTWIDGET_H #define STATSQSOSPERMONTHBARCHARTWIDGET_H /*************************************************************************** statsqsospermonthbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerMonthBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerMonthBarChartWidget(DataProxy *dp, QWidget *parent = 0); StatsQSOsPerMonthBarChartWidget(); void prepareChart(); signals: public slots: private: void createUI(); DataProxy *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-0.9.8.1/charts/statsentitiesperyearbarchartwidget.cpp0000644000175000017500000000532113532572307023011 0ustar develdevel#include "statsentitiesperyearbarchartwidget.h" StatsEntitiesPerYearBarChartWidget::StatsEntitiesPerYearBarChartWidget(){} StatsEntitiesPerYearBarChartWidget::StatsEntitiesPerYearBarChartWidget(DataProxy *dp, QWidget *parent) { //qDebug() << "StatsEntitiesPerYearBarChartWidget::StatsEntitiesPerYearBarChartWidget" << endl; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); prepareChart(); } void StatsEntitiesPerYearBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsEntitiesPerYearBarChartWidget::prepareChart() { QString x_axisTitle; QString x_axisElem; QStringList x_axis; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); x_axisTitle = QString(); x_axisElem = QString(); x_axis.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("Chart title")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, x_axis.count(), this); progress.setWindowModality(Qt::WindowModal); //qDebug() << "StatsEntitiesPerYearBarChartWidget::prepareChart: SelectedGrapth-1: YEARS " << endl; //qDebug() << "BarChartStats::prepareChart: SelectedGrapth-2: DXCC " << endl; x_axis.append(dataProxy->getOperatingYears(-1)); x_axisElem = tr("DXCC Entities"); x_axisTitle = tr("DXCC Entities per year"); aux.clear(); for (int i = 0; i < x_axis.count();i++ ) { numberPerX = dataProxy->getDXCConYear((x_axis.at(i)).toInt(), -1); *set0 << numberPerX; numberPerX = 0; aux = tr("Reading data ...") + "\n" + tr("Entities: ") + QString::number(i) + "/" + QString::number(x_axis.count()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = x_axis.count(); } //qDebug() << "BarChartStats::prepareChart DXCCs: " << QString::number((x_axis.at(i)).toInt()) << "/" << QString::number(numberPerX) << endl; } series->append(set0); set0->setLabel(x_axisElem); chart->addSeries(series); chart->setTitle(x_axisTitle); axis->append(x_axis); chart->createDefaultAxes(); chart->setAxisX(axis, series); } klog-0.9.8.1/charts/statsqsosperbandbarchartwidget.h0000644000175000017500000000454513532572307021572 0ustar develdevel#ifndef STATSQSOSPERBANDBARCHARTWIDGET_H #define STATSQSOSPERBANDBARCHARTWIDGET_H /*************************************************************************** statsqsosperbandbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerBandBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerBandBarChartWidget(DataProxy *dp, QWidget *parent = 0); StatsQSOsPerBandBarChartWidget(); void prepareChart(); signals: public slots: private: void createUI(); DataProxy *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-0.9.8.1/charts/statsqsosperyearbarchartwidget.h0000644000175000017500000000454513532572307021626 0ustar develdevel#ifndef STATSQSOSPERYEARBARCHARTWIDGET_H #define STATSQSOSPERYEARBARCHARTWIDGET_H /*************************************************************************** statsqsosperyearbarchatwidget.h - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerYearBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerYearBarChartWidget(DataProxy *dp, QWidget *parent = 0); StatsQSOsPerYearBarChartWidget(); void prepareChart(); signals: public slots: private: void createUI(); DataProxy *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERYEARBARCHARTWIDGET_H klog-0.9.8.1/charts/statsqsosperyearbarchartwidget.cpp0000644000175000017500000000524113532572307022153 0ustar develdevel#include "statsqsosperyearbarchartwidget.h" StatsQSOsPerYearBarChartWidget::StatsQSOsPerYearBarChartWidget(){} StatsQSOsPerYearBarChartWidget::StatsQSOsPerYearBarChartWidget(DataProxy *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerYearBarChartWidget::StatsQSOsPerYearBarChartWidget" << endl; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); prepareChart(); } void StatsQSOsPerYearBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerYearBarChartWidget::prepareChart() { QString x_axisTitle; QString x_axisElem; QStringList x_axis; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); x_axisTitle = QString(); x_axisElem = QString(); x_axis.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("Chart title")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, x_axis.count(), this); progress.setWindowModality(Qt::WindowModal); //qDebug() << "StatsQSOsPerYearBarChartWidget::prepareChart: SelectedGrapth-1: YEARS " << endl; x_axis.append(dataProxy->getOperatingYears(-1)); x_axisElem = tr("QSOs"); x_axisTitle = tr("QSOs per year"); aux.clear(); for (int i = 0; i < x_axis.count();i++ ) { numberPerX = dataProxy->getQSOonYear((x_axis.at(i)).toInt(), -1); //qDebug() << x_axis.at(i) + "-" + QString::number(numberPerX) << endl; *set0 << numberPerX; numberPerX = 0; //qDebug() << "StatsQSOsPerYearBarChartWidget::prepareChart QSOs: " << QString::number((x_axis.at(i)).toInt()) << "/" << QString::number(numberPerX) << endl; aux = tr("Reading data ...") + "\n" + tr("QSO: %1/%2").arg(QString::number(i)).arg(QString::number(x_axis.count())); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = x_axis.count(); } } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(x_axisElem); chart->addSeries(series); chart->setTitle(x_axisTitle); axis->append(x_axis); chart->createDefaultAxes(); chart->setAxisX(axis, series); } klog-0.9.8.1/charts/statsworkedconfirmedpiechartwidget.h0000644000175000017500000000457513532572307022447 0ustar develdevel#ifndef STATSWORKEDCONFIRMEDPIECHARTWIDGET_H #define STATSWORKEDCONFIRMEDPIECHARTWIDGET_H /*************************************************************************** statsworkedconfirmedpiechatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy.h" #include "charts/statsgeneralchartwidget.h" class StatsWorkedConfirmedPieChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsWorkedConfirmedPieChartWidget(DataProxy *dp, QWidget *parent = 0); StatsWorkedConfirmedPieChartWidget(); void prepareChart(); signals: public slots: private: void createUI(); DataProxy *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-0.9.8.1/charts/statssentconfirmedpiechartwidget.h0000644000175000017500000000456113532572307022120 0ustar develdevel#ifndef STATSSENTCONFIRMEDPIECHARTWIDGET_H #define STATSSENTCONFIRMEDPIECHARTWIDGET_H /*************************************************************************** statssentconfirmedpiechatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy.h" #include "charts/statsgeneralchartwidget.h" class StatsSentConfirmedPieChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsSentConfirmedPieChartWidget(DataProxy *dp, QWidget *parent = 0); StatsSentConfirmedPieChartWidget(); void prepareChart(); signals: public slots: private: void createUI(); DataProxy *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-0.9.8.1/charts/statsentitiesperyearbarchartwidget.h0000644000175000017500000000457413532572307022467 0ustar develdevel#ifndef STATSENTITIESPERYEARBARCHARTWIDGET_H #define STATSENTITIESPERYEARBARCHARTWIDGET_H /*************************************************************************** statsentitiesperyearbarchatwidget.h - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy.h" #include "charts/statsgeneralchartwidget.h" class StatsEntitiesPerYearBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsEntitiesPerYearBarChartWidget(DataProxy *dp, QWidget *parent = 0); StatsEntitiesPerYearBarChartWidget(); void prepareChart(); signals: public slots: private: void createUI(); DataProxy *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERYEARBARCHARTWIDGET_H klog-0.9.8.1/charts/barchartstats.cpp0000644000175000017500000001357513532572307016462 0ustar develdevel#include "barchartstats.h" /*************************************************************************** barchartstats.cpp - description ------------------- begin : ago 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ BarChartStats::BarChartStats(DataProxy *dp, QWidget *parent) : QWidget(parent) { //chart = new QChart(); //chartView = new QChartView(chart); //chart->setAnimationOptions(QChart::SeriesAnimations); //chart->legend()->setVisible(true); //chart->legend()->setAlignment(Qt::AlignBottom); //chartView->setRenderHint(QPainter::Antialiasing); dataProxy = dp; mainWidget = new QWidget(); mLayout = new QVBoxLayout; mainWidget->setLayout(mLayout); qsoPerYearBarChartWidget = new StatsQSOsPerYearBarChartWidget(dataProxy, 0); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mainWidget); setLayout(mainLayout); //cleanLayout(); //createUI(); } BarChartStats::~BarChartStats(){} void BarChartStats::clear() { //qDebug() << "BarChartStats::clear()" << endl; //cleanLayout(); prepareChart(1); } void BarChartStats::createUI() { //QVBoxLayout *graphLayout = new QVBoxLayout; //graphLayout->addWidget(chartView); //setLayout(graphLayout); } void BarChartStats::cleanLayout() { QLayoutItem *child; while ((child = mLayout->takeAt(0)) != 0) { delete child; } } void BarChartStats::prepareChart(const int _selection, const int _log) { cleanLayout(); switch (_selection) { case 1: { //qsoPerYearBarChartWidget->prepareChart() //genchart = new StatsQSOsPerYearBarChartWidget(dataProxy, 0); genchart = qsoPerYearBarChartWidget; mLayout->addWidget(genchart); } break; case 2: { //cleanLayout(); genchart = new StatsEntitiesPerYearBarChartWidget(dataProxy, nullptr); mLayout->addWidget(genchart); } break; case 3: { //cleanLayout(); genchart = new StatsCQZPerYearBarChartWidget(dataProxy, nullptr); mLayout->addWidget(genchart); } break; case 4: { //cleanLayout(); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-4: per band " << endl; genchart = new StatsQSOsPerBandBarChartWidget(dataProxy, nullptr); mLayout->addWidget(genchart); } break; case 5: { //cleanLayout(); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-5: per modes " << endl; genchart = new StatsQSOsPerModeBarChartWidget(dataProxy, nullptr); mLayout->addWidget(genchart); } break; case 6: { //cleanLayout(); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-6: per dxcc " << endl; genchart = new StatsQSOsPerDXCCBarChartWidget(dataProxy, nullptr); mLayout->addWidget(genchart); } break; case 7: { // How many QSO per Continent //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/Continent " << endl; //cleanLayout(); genchart = new StatsQSOsPerContinentBarChartWidget(dataProxy, nullptr); mLayout->addWidget(genchart); } break; case 8: { //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour " << endl; //cleanLayout(); genchart = new StatsQSOsPerHourBarChartWidget(dataProxy, nullptr); mLayout->addWidget(genchart); } break; case 9: { //cleanLayout(); genchart = new StatsQSOsPerMonthBarChartWidget(dataProxy, nullptr); mLayout->addWidget(genchart); } break; case 10: { //cleanLayout(); genchart = new StatsWorkedConfirmedPieChartWidget(dataProxy, nullptr); mLayout->addWidget(genchart); } break; case 11: { //cleanLayout(); genchart = new StatsWorkedSentPieChartWidget(dataProxy, nullptr); //genchart = new StatsPieChartWidget(dataProxy, Worked, Sent, nullptr); mLayout->addWidget(genchart); } break; case 12: { //cleanLayout(); genchart = new StatsSentConfirmedPieChartWidget(dataProxy, nullptr); //genchart = new StatsPieChartWidget(dataProxy, Sent, Confirmed, nullptr); //genchart = new StatsPieChartWidget(dataProxy, Worked, Confirmed, nullptr); mLayout->addWidget(genchart); } break; } } klog-0.9.8.1/charts/statscqzperyearbarchartwidget.cpp0000644000175000017500000000536213532572307021767 0ustar develdevel#include "statscqzperyearbarchartwidget.h" StatsCQZPerYearBarChartWidget::StatsCQZPerYearBarChartWidget(){} StatsCQZPerYearBarChartWidget::StatsCQZPerYearBarChartWidget(DataProxy *dp, QWidget *parent) { //qDebug() << "StatsCQZPerYearBarChartWidget::StatsCQZPerYearBarChartWidget" << endl; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); prepareChart(); } void StatsCQZPerYearBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsCQZPerYearBarChartWidget::prepareChart() { QString x_axisTitle; QString x_axisElem; QStringList x_axis; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); x_axisTitle = QString(); x_axisElem = QString(); x_axis.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("CQ Zones per year")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, x_axis.count(), this); progress.setWindowModality(Qt::WindowModal); //qDebug() << "StatsCQZPerYearBarChartWidget::prepareChart: SelectedGrapth-1: YEARS " << endl; x_axis.append(dataProxy->getOperatingYears(-1)); x_axisElem = tr("CQ zones"); x_axisTitle = tr("CQ zones per year"); aux.clear(); for (int i = 0; i < x_axis.count();i++ ) { numberPerX = dataProxy->getCQzonYear((x_axis.at(i)).toInt(), -1); //numberPerX = dataProxy->getQSOonYear((x_axis.at(i)).toInt(), -1); //qDebug() << x_axis.at(i) + "-" + QString::number(numberPerX) << endl; *set0 << numberPerX; numberPerX = 0; //qDebug() << "StatsCQZPerYearBarChartWidget::prepareChart QSOs: " << QString::number((x_axis.at(i)).toInt()) << "/" << QString::number(numberPerX) << endl; aux = tr("Reading data ...") + "\n" + tr("Years: %1/%2").arg(QString::number(i)).arg(QString::number(x_axis.count())); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = x_axis.count(); } } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(x_axisElem); chart->addSeries(series); chart->setTitle(x_axisTitle); axis->append(x_axis); chart->createDefaultAxes(); chart->setAxisX(axis, series); } klog-0.9.8.1/charts/statsworkedsentpiechartwidget.cpp0000644000175000017500000000355013532572307021775 0ustar develdevel#include "statsworkedsentpiechartwidget.h" StatsWorkedSentPieChartWidget::StatsWorkedSentPieChartWidget(){} StatsWorkedSentPieChartWidget::StatsWorkedSentPieChartWidget(DataProxy *dp, QWidget *parent) { //qDebug() << "StatsWorkedSentPieChartWidget::StatsWorkedSentPieChartWidget" << endl; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); prepareChart(); } void StatsWorkedSentPieChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsWorkedSentPieChartWidget::prepareChart() { QPieSeries *series = new QPieSeries(); //PieSlice append(string label, real value) int qsos = dataProxy->getHowManyQSOInLog(-1); int confirmed = dataProxy->getHowManyQSLSentInLog(-1); //qDebug() << "QSOs: " << QString::number(qsos) << endl; //qDebug() << "Confirmed: " << QString::number(confirmed) << endl; //qDebug() << "Worked: " << QString::number(qsos - confirmed) << endl; series->append(tr("Worked - %1").arg(qsos), qsos); series->append(tr("Sent - %2").arg(confirmed), confirmed); QPieSlice *slice = series->slices().at(1); slice->setExploded(); slice->setLabelVisible(); slice->setPen(QPen(Qt::darkGreen, 2)); slice->setBrush(Qt::green); QPieSlice *slice1 = series->slices().at(0); slice1->setExploded(); slice1->setLabelVisible(); slice1->setPen(QPen(Qt::blue, 2)); slice1->setBrush(Qt::blue); chart->addSeries(series); chart->setTitle("Worked / Sent status"); chart->legend()->hide(); chartView->setRenderHint(QPainter::Antialiasing); } klog-0.9.8.1/charts/statsworkedconfirmedpiechartwidget.cpp0000644000175000017500000000371013532572307022770 0ustar develdevel#include "statsworkedconfirmedpiechartwidget.h" StatsWorkedConfirmedPieChartWidget::StatsWorkedConfirmedPieChartWidget(){} StatsWorkedConfirmedPieChartWidget::StatsWorkedConfirmedPieChartWidget(DataProxy *dp, QWidget *parent) { //qDebug() << "StatsWorkedConfirmedPieChartWidget::StatsWorkedConfirmedPieChartWidget" << endl; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); prepareChart(); } void StatsWorkedConfirmedPieChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsWorkedConfirmedPieChartWidget::prepareChart() { QPieSeries *series = new QPieSeries(); //PieSlice append(string label, real value) int qsos = dataProxy->getHowManyQSOInLog(-1); int confirmed = dataProxy->getHowManyConfirmedQSLInLog(-1); //qDebug() << "QSOs: " << QString::number(qsos) << endl; //qDebug() << "Confirmed: " << QString::number(confirmed) << endl; //qDebug() << "Worked: " << QString::number(qsos - confirmed) << endl; series->append(tr("Worked, not confirmed - %1").arg(qsos-confirmed), qsos - confirmed); series->append(tr("Confirmed - %2").arg(confirmed), confirmed); QPieSlice *slice = series->slices().at(1); slice->setExploded(); slice->setLabelVisible(); slice->setPen(QPen(Qt::darkGreen, 2)); slice->setBrush(Qt::green); QPieSlice *slice1 = series->slices().at(0); slice1->setExploded(); slice1->setLabelVisible(); slice1->setPen(QPen(Qt::blue, 2)); slice1->setBrush(Qt::blue); chart->addSeries(series); chart->setTitle("Worked / Confirmed status"); chart->legend()->hide(); chartView->setRenderHint(QPainter::Antialiasing); } klog-0.9.8.1/charts/statsqsosperdxccbarchartwidget.cpp0000644000175000017500000001035713532572307022140 0ustar develdevel#include "statsqsosperdxccbarchartwidget.h" StatsQSOsPerDXCCBarChartWidget::StatsQSOsPerDXCCBarChartWidget(){} StatsQSOsPerDXCCBarChartWidget::StatsQSOsPerDXCCBarChartWidget(DataProxy *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerDXCCBarChartWidget::StatsQSOsPerDXCCBarChartWidget" << endl; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); prepareChart(); } void StatsQSOsPerDXCCBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerDXCCBarChartWidget::prepareChart() { QString x_axisTitle; QString x_axisElem; QStringList x_axis; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); x_axisTitle = QString(); x_axisElem = QString(); x_axis.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per DXCC")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, x_axis.count(), this); progress.setWindowModality(Qt::WindowModal); aux = tr("Reading data...") ; progress.setLabelText(aux); progress.setValue(0); QStringList entities; entities.clear(); entities << dataProxy->getEntitiesIds(); //qDebug() << "StatsQSOsPerDXCCBarChartWidget::prepareChart: SelectedGrapth-1: YEARS " << endl; QMap map; // key,value = number of QSO, dxcc int qsos = -1; map.clear(); aux.clear(); for (int i = 0; i < entities.size(); ++i) { qsos = dataProxy->getQSOsWithDXCC((entities.at(i)).toInt(), -1); if (qsos>0) { //qDebug() << "Checking: " << dataProxy->getEntityNameFromId((entities.at(i)).toInt()) << " - " << entities.at(i) << " - QSOs: " << QString::number(qsos) ; if (map.size()<10) { //qDebug() << "Inserting: " << dataProxy->getEntityNameFromId((entities.at(i)).toInt()) << " - " << entities.at(i) << " - QSOs: " << QString::number(qsos) ; map.insert(qsos, (entities.at(i)).toInt()); } else { QMapIterator it(map); while (it.hasNext()) { it.next(); if (it.key()< qsos) { //qDebug() << "Removing: " << QString::number(it.key()) << " / " << QString::number(it.value()) << endl; //qDebug() << "Replacing by: " << entities.at(i) << " / " << QString::number(qsos) << " - " << dataProxy->getEntityNameFromId((entities.at(i)).toInt()) << endl; map.remove(it.key()); map.insert(qsos, (entities.at(i)).toInt()); it.toBack(); } } } } aux = tr("Reading data...") + "\n" + tr("Entity: ") + QString::number(i) + "/" + QString::number(entities.size()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = entities.size(); } //qDebug() << "End of for iteration" << endl; } QMapIterator it(map); while (it.hasNext()) { it.next(); x_axis.append(dataProxy->getEntityMainPrefix(it.value())); numberPerX = it.key(); *set0 << numberPerX; numberPerX = 0; //qDebug() << "End of while iteration" << endl; } //qDebug() << "Out of while" << endl; x_axisElem = tr("DXCC"); x_axisTitle = tr("Top ten DXCC per QSO"); sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(x_axisElem); chart->addSeries(series); chart->setTitle(x_axisTitle); axis->append(x_axis); chart->createDefaultAxes(); chart->setAxisX(axis, series); } klog-0.9.8.1/charts/statscqzperyearbarchartwidget.h0000644000175000017500000000454213532572307021433 0ustar develdevel#ifndef STATSCQZSPERYEARBARCHARTWIDGET_H #define STATSCQZSPERYEARBARCHARTWIDGET_H /*************************************************************************** statscqzperyearbarchatwidget.h - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy.h" #include "charts/statsgeneralchartwidget.h" class StatsCQZPerYearBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsCQZPerYearBarChartWidget(DataProxy *dp, QWidget *parent = 0); StatsCQZPerYearBarChartWidget(); void prepareChart(); signals: public slots: private: void createUI(); DataProxy *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERYEARBARCHARTWIDGET_H klog-0.9.8.1/setuppagehamlib.cpp0000644000175000017500000004265713532572307015506 0ustar develdevel#include "setuppagehamlib.h" SetupPageHamLib::SetupPageHamLib(DataProxy *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageHamLib::SetupPageHamLib" << endl; hamlib = new HamLibClass(); activateHamlibCheckBox = new QCheckBox(); rigTypeComboBox = new QComboBox(); poolIntervalQSpinBox = new QSpinBox(); serialBaudsComboBox = new QComboBox(); serialPortComboBox = new QComboBox(); dataBitsComboBox = new QComboBox(); flowControlComboBox = new QComboBox(); parityComboBox = new QComboBox(); stopBitsComboBox = new QComboBox(); //RTSCheckBox = new QCheckBox(); //DTRCheckBox = new QCheckBox(); scanSerialPortButton = new QPushButton(); //serialBaudsSpinBox = new QSpinBox; serialPort = new QLineEdit; strings.clear(); //strings << "1200" << "2400" << "4800" << "9600" << "19200" << "38400" << "57600" << "115200"; createUI(); setDefaults(); //qDebug() << "SetupPageHamLib::SetupPageHamLib END" << endl; } void SetupPageHamLib::fillSerialPortsComboBox() { //qDebug() << "SetupPageHamLib::fillSerialPortsComboBox" << endl; serialPortComboBox->clear(); serialPortComboBox->addItems(getAvailableSerialPorts()); //serialPortComboBox->setCurrentIndex(0); } void SetupPageHamLib::createUI() { //qDebug() << "SetupPageHamLib::createUI" << endl; connect(scanSerialPortButton, SIGNAL(clicked(bool)), this, SLOT(slotScanPorts()) ); activateHamlibCheckBox->setText(tr("Activate HamLib")); activateHamlibCheckBox->setToolTip(tr("Activates the hamlib support that will enable the connection to a radio.")); //RTSCheckBox->setText(tr("RTS on")); //RTSCheckBox->setToolTip(tr("Setting RTS may be needed for some serial ports.")); //DTRCheckBox->setText(tr("DTR on")); //DTRCheckBox->setToolTip(tr("Setting DTR may be needed for some serial ports.")); rigTypeComboBox->clear(); strings.clear(); setRig(); //qDebug() << "SetupPageHamLib::createUI-20" << endl; //serialPortComboBox->addItems(getAvailableSerialPorts()); fillSerialPortsComboBox(); //qDebug() << "SetupPageHamLib::createUI-21" << endl; rigTypeComboBox->setCurrentIndex(0); //qDebug() << "SetupPageHamLib::createUI-22" << endl; QLabel *rigTypeLabel = new QLabel(tr("Radio")); rigTypeLabel->setBuddy(rigTypeComboBox); rigTypeLabel->setToolTip(tr("Select your rig.")); rigTypeLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); rigTypeLabel->setEnabled(true); //qDebug() << "SetupPageHamLib::createUI-30" << endl; QString poolTip = QString(tr("Defines the interval to pool the radio in msecs.")); poolIntervalQSpinBox->setToolTip(poolTip); poolIntervalQSpinBox->setMinimum(10); poolIntervalQSpinBox->setMaximum(5000); QLabel *poolIntervalLabel = new QLabel(tr("Pool interval")); poolIntervalLabel->setBuddy(rigTypeComboBox); poolIntervalLabel->setToolTip(poolTip); poolIntervalLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); poolIntervalLabel->setEnabled(true); QHBoxLayout *poolIntervalLayout = new QHBoxLayout; poolIntervalLayout->addWidget(poolIntervalLabel); poolIntervalLayout->addWidget(poolIntervalQSpinBox); serialPortComboBox->addItems(serialPorts); QLabel *serialPortLabel = new QLabel(tr("Port")); serialPortLabel->setBuddy(serialPortComboBox); serialPortLabel->setToolTip(tr("Select the serial port. Only the serial ports that are detected are shown.")); serialPortLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); serialPortLabel->setEnabled(true); scanSerialPortButton->setText(tr("Scan"));; scanSerialPortButton->setToolTip(tr("Click to identify the serial ports available in your computer.")); //qDebug() << "SetupPageHamLib::createUI-40" << endl; strings.clear(); strings << "1200" << "2400" << "4800" << "9600" << "19200" << "38400" << "57600" << "115200"; serialBaudsComboBox->addItems(strings); QLabel *serialBaudsLabel = new QLabel(tr("Bauds")); serialBaudsLabel->setBuddy(serialBaudsComboBox); serialBaudsLabel->setToolTip(tr("Select the serial port speed.")); serialBaudsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); serialBaudsLabel->setEnabled(true); //qDebug() << "SetupPageHamLib::createUI-50" << endl; dataBitsComboBox = new QComboBox(); strings.clear(); strings << tr("5 bits") << tr("6 bits") << tr("7 bits") << tr("8 bits"); dataBitsComboBox->addItems(strings); QLabel *dataBitsLabel = new QLabel(tr("Data bits")); dataBitsLabel->setBuddy(dataBitsComboBox); dataBitsLabel->setToolTip(tr("Select the serial data bits.")); dataBitsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); dataBitsLabel->setEnabled(true); //qDebug() << "SetupPageHamLib::createUI-60" << endl; flowControlComboBox = new QComboBox(); strings.clear(); strings << tr("None") << tr("Hardware") << tr("Software XON/XOFF"); flowControlComboBox->addItems(strings); QLabel *flowControlLabel = new QLabel(tr("Flow control")); flowControlLabel->setBuddy(flowControlComboBox); flowControlLabel->setToolTip(tr("Select the serial flow control")); flowControlLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); flowControlLabel->setEnabled(true); parityComboBox = new QComboBox(); strings.clear(); strings << tr("No parity") << tr("Even") << tr("Odd") << tr("Space") << tr("Mark") ; parityComboBox->addItems(strings); QLabel *parityLabel = new QLabel(tr("Parity")); parityLabel->setBuddy(parityComboBox); parityLabel->setToolTip(tr("Select the serial parity.")); parityLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); parityLabel->setEnabled(true); stopBitsComboBox = new QComboBox(); strings.clear(); strings << tr("1 bit") << tr("1.5 bits") << tr("2 bits"); stopBitsComboBox->addItems(strings); QLabel *stopBitsLabel = new QLabel(tr("Stop bits")); stopBitsLabel->setBuddy(stopBitsComboBox); stopBitsLabel->setToolTip(tr("Select the serial stop bits.")); stopBitsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); stopBitsLabel->setEnabled(true); //QHBoxLayout *checkLayout = new QHBoxLayout; //checkLayout->addWidget(RTSCheckBox); //checkLayout->addWidget(DTRCheckBox); QGridLayout *topData = new QGridLayout; topData->addWidget(rigTypeLabel, 0, 0); topData->addWidget(rigTypeComboBox, 0, 1); topData->addLayout(poolIntervalLayout, 0, 2); topData->addWidget(serialPortLabel, 1, 0); topData->addWidget(serialPortComboBox, 1, 1); topData->addWidget(scanSerialPortButton, 1, 2); topData->addWidget(serialBaudsLabel, 2, 0); topData->addWidget(serialBaudsComboBox, 2, 1); topData->addWidget(dataBitsLabel, 3, 0); topData->addWidget(dataBitsComboBox, 3, 1); topData->addWidget(stopBitsLabel, 4, 0); topData->addWidget(stopBitsComboBox, 4, 1); topData->addWidget(flowControlLabel, 5, 0); topData->addWidget(flowControlComboBox, 5, 1); topData->addWidget(parityLabel, 6, 0); topData->addWidget(parityComboBox, 6, 1); //topData->addLayout(checkLayout, 7, 1); QGridLayout *mainLayout = new QGridLayout; mainLayout->addLayout(topData, 0, 0); //mainLayout->addWidget(dataBitsGroupBox, 1, 0); //mainLayout->addWidget(stopBitsGroupBox, 1, 1); //mainLayout->addWidget(handShakeGroupBox, 2, 0); //mainLayout->addWidget(flowControlLineGroupBox, 2, 1); QVBoxLayout *mLayout = new QVBoxLayout; mLayout->addWidget(activateHamlibCheckBox); mLayout->addLayout(mainLayout); //mLayout->setAlignment(activateHamlibCheckBox, Qt::AlignHCenter | Qt::AlignTop); setLayout(mLayout); //qDebug() << "SetupPageHamLib::createUI-END" << endl; } void SetupPageHamLib::setRig() { //qDebug() << "SetupPageHamLib::SetRig" << endl; // Rutine to fill the rig combo boxes // Do not display debug codes when load the rig's rigTypeComboBox->insertItems(0, hamlib->getRigList()); /* rig_set_debug (RIG_DEBUG_NONE); // and continue... rig_load_all_backends (); rig_list_foreach (addRigToList, this); strings.sort (); rigTypeComboBox->insertItems (0, strings); strings.clear (); */ //qDebug() << "SetupPageHamLib::SetRig - END" << endl; } /* int SetupPageHamLib::addRigToList (const struct rig_caps *caps, void *data) { //qDebug() << "SetupPageHamLib::addRigToList" << endl; QString name; SetupPageHamLib *r = (SetupPageHamLib *) data; name = caps->model_name; //qDebug() << "SetupPageHamLib::addRigToList: " << name << endl; //if (name == "Dummy") // name = "None"; //r->rigname2rigid[name] = caps->rig_model; //r->rigid2rigname[caps->rig_model] = name; r->strings << name; return -1; // not 0 --> we want all rigs } */ QStringList SetupPageHamLib::getAvailableSerialPorts() { QStringList st; st.clear(); const auto infos = QSerialPortInfo::availablePorts(); for (const QSerialPortInfo &info : infos) { //st << info.portName(); st << info.systemLocation(); } return st; } void SetupPageHamLib::setDefaults() { //qDebug() << "SetupPageHamLib::setDefaults" << endl; rigTypeComboBox->setCurrentIndex(0); serialPortComboBox->setCurrentIndex(0); serialBaudsComboBox->setCurrentIndex(0); dataBitsComboBox->setCurrentIndex(3); flowControlComboBox->setCurrentIndex(0); parityComboBox->setCurrentIndex(0); stopBitsComboBox->setCurrentIndex(0); //RTSCheckBox->setChecked(false); //DTRCheckBox->setChecked(false); //qDebug() << "SetupPageHamLib::setDefaults-END" << endl; } QString SetupPageHamLib::getData() { //qDebug() << "SetupPageHamLib::getData" << endl; QString _output; _output.clear(); QString _rigType, _serialPort, _baudsSpeed;//, dataBits, stopBits, handshake, flowControlLine; _rigType = rigTypeComboBox->currentText(); _serialPort = serialPortComboBox->currentText(); _baudsSpeed = serialBaudsComboBox->currentText(); //qDebug() << "SetupPageHamLib::getData: " << _rigType << endl; _output.clear(); if (activateHamlibCheckBox->isChecked()) { _output = _output + "Hamlib=True;\n"; } else { } //if (RTSCheckBox->isChecked()) //{ // _output = _output + "HamLibSerialRTS=True;\n"; //} //if (DTRCheckBox->isChecked()) //{ // _output = _output + "HamLibSerialDTR=True;\n"; //} _output = _output + getDataBits() + ";\n"; //qDebug() << "SetupPageHamLib::getData: dataBits: " << getDataBits() << endl; _output = _output + getStopBits() + ";\n"; _output = _output + getFlowControl() + ";\n"; _output = _output + getParity() + ";\n"; //qDebug() << "SetupPageHamLib::getData: " << QString::number(hamlib->getModelIdFromName(_rigType)) << endl; _output = _output + "HamLibRigType=" + QString::number(hamlib->getModelIdFromName(_rigType)) + ";\n"; //_output = _output + "HamLibRigType=" + _rigType + "\n"; _output = _output + "HamlibSerialPort=" + _serialPort + ";\n"; _output = _output + "HamlibSerialBauds=" + _baudsSpeed + ";\n"; //qDebug() << "SetupPageHamLib::getData: " << _output << endl; return _output; } bool SetupPageHamLib::setRigType(const QString _radio) { //qDebug() << "SetupPageHamLib::setRig: " << _radio << endl; int _index = rigTypeComboBox->findText(hamlib->getNameFromModelId(_radio.toInt()), Qt::MatchFlag::MatchExactly); //qDebug() << "SetupPageHamLib::setRig: After: " << QString::number(_index) << endl; if (_index >= 0) { rigTypeComboBox->setCurrentIndex(_index); return true; } else { rigTypeComboBox->setCurrentIndex(0); } return false; } bool SetupPageHamLib::setSerialPort(const QString _port) { int _index = serialPortComboBox->findText(_port, Qt::MatchFlag::MatchExactly); if (_index >= 0) { serialPortComboBox->setCurrentIndex(_index); return true; } else { serialPortComboBox->setCurrentIndex(0); } return false; } bool SetupPageHamLib::setSerialSpeed(const QString _speed ) { int _index = serialBaudsComboBox->findText(_speed, Qt::MatchFlag::MatchExactly); if (_index >= 0) { serialBaudsComboBox->setCurrentIndex(_index); return true; } else { serialPortComboBox->setCurrentIndex(0); } return false; } void SetupPageHamLib::setActive(const QString _active) { //qDebug() << "SetupPageHamLib::setActive: " << _active << endl; if (_active.toUpper() == "TRUE") { activateHamlibCheckBox->setChecked(true); } else { activateHamlibCheckBox->setChecked(false); } } void SetupPageHamLib::slotScanPorts() { //qDebug() << "SetupPageHamLib::slotScanPorts" << endl; fillSerialPortsComboBox(); } //DataBits { Data5, Data6, Data7, Data8, UnknownDataBits } QString SetupPageHamLib::getDataBits() { //qDebug() << "SetupPageHamLib::getDataBits" << endl; int ret = dataBitsComboBox->currentIndex(); QString output; output = "HamLibSerialDataBits="; switch (ret) { case 0: output = output + "5"; //qDebug() << "SetupPageHamLib::getDataBits-0-5" << endl; break; case 1: output = output + "6"; //qDebug() << "SetupPageHamLib::getDataBits-1-6" << endl; break; case 2: output = output + "7"; //qDebug() << "SetupPageHamLib::getDataBits-2-7" << endl; case 3: output = output + "8"; //qDebug() << "SetupPageHamLib::getDataBits-3-8" << endl; break; default: // should never be reached //qDebug() << "SetupPageHamLib::getDataBits-d-8" << endl; output = output + "8"; break; } return output; } void SetupPageHamLib::setDataBits(const QString _st) { if (_st == "5") { dataBitsComboBox->setCurrentIndex(0); } else if (_st == "6") { dataBitsComboBox->setCurrentIndex(1); } else if (_st == "7") { dataBitsComboBox->setCurrentIndex(2); } else { dataBitsComboBox->setCurrentIndex(3); } } //FlowControl { NoFlowControl, HardwareControl, SoftwareControl, UnknownFlowControl } QString SetupPageHamLib::getFlowControl() { int ret = flowControlComboBox->currentIndex(); QString output; output = "HamLibSerialFlowControl="; switch (ret) { case 0: output = output + "None"; break; case 1: output = output + "Hardware"; break; case 2: output = output + "Software"; break; default: // should never be reached output = output + "None"; break; } return output; } void SetupPageHamLib::setFlowControl(const QString _st) { QString _s = _st.toUpper(); if (_s == "HARDWARE") { flowControlComboBox->setCurrentIndex(1); } else if (_s == "SOFTWARE") { flowControlComboBox->setCurrentIndex(2); } else { flowControlComboBox->setCurrentIndex(0); } } //Parity { NoParity, EvenParity, OddParity, SpaceParity, MarkParity, UnknownParity } QString SetupPageHamLib::getParity() { int ret = parityComboBox->currentIndex(); QString output; output = "HamLibSerialParity="; switch (ret) { case 0: output = output + "None"; break; case 1: output = output + "Even"; break; case 2: output = output + "Odd"; break; case 3: output = output + "Space"; break; case 4: output = output + "Mark"; break; default: // should never be reached output = output + "None"; break; } return output; } void SetupPageHamLib::setParity(const QString _st) { QString _s = _st.toUpper(); if (_s == "EVEN") { parityComboBox->setCurrentIndex(1); } else if (_s == "ODD") { parityComboBox->setCurrentIndex(2); } else if (_s == "SPACE") { parityComboBox->setCurrentIndex(3); } else if (_s == "MARK") { parityComboBox->setCurrentIndex(4); } else { parityComboBox->setCurrentIndex(0); } } //StopBits { OneStop, OneAndHalfStop, TwoStop, UnknownStopBits } QString SetupPageHamLib::getStopBits() { int ret = stopBitsComboBox->currentIndex(); QString output; output = "HamLibSerialStopBits="; switch (ret) { case 0: output = output + "1"; break; case 1: output = output + "1.5"; break; case 2: output = output + "2"; break; default: // should never be reached output = output + "1"; break; } return output; } void SetupPageHamLib::setStopBits(const QString _st) { if (_st == "1.5") { stopBitsComboBox->setCurrentIndex(1); } else if (_st == "2") { stopBitsComboBox->setCurrentIndex(2); } else { stopBitsComboBox->setCurrentIndex(0); } } void SetupPageHamLib::setRTS(const QString _state) { //if (_state.toUpper() == "TRUE") //{ // RTSCheckBox->setChecked(true); //} //else //{ // RTSCheckBox->setChecked(false); //} } void SetupPageHamLib::setDTR(const QString _state) { //if (_state.toUpper() == "TRUE") //{ // DTRCheckBox->setChecked(true); //} //else //{ // DTRCheckBox->setChecked(false); //} } klog-0.9.8.1/INSTALL-linux0000644000175000017500000000333713532572307014006 0ustar develdevelFollow these steps to build KLog. KLog requires Qt5 to be built. Currently, many distributions are still distributing Qt4 as a default Qt version so it may be needed that you install Qt5 to be able to build KLog in your system. install may depend on your distribution, however, check for similar names & versions and it will probably work :-) If you have any suggestion for this file, please contact me. (Contact details in the AUTHORS file). 1. Install the KLog dependencies - Install g++, make, qt5-qmake, qtbase5-dev & qttools5-dev libqt5charts5-dev, libqt5sql5-sqlite libqt5serialport5-dev & libhamlib-dev packages In Debian it is done with: apt-get install g++, make, qt5-qmake, qtbase5-dev qttools5-dev libqt5charts5-dev libqt5sql5-sqlite libhamlib-dev libqt5serialport5-dev In your distribution, you should know how to install new packages :-) Make sure you have qt5 available. You can do it with the qtchooser command. The output should be something like: user@debian:~$ qtchooser -l 4 5 default qt4-i386-linux-gnu qt4 qt5-i386-linux-gnu qt5 user@debian:~$ It should return the list of qt versions available, qt5 must be one of them. If qt5 is still not there, check your instalallation as one of the previous packages may be missing. 2.- Select the appropriate Qt version (Qt5) export QT_SELECT=qt5 3.- Untar klog tar xyzf klog-version.tar.gz enter the KLog directory cd klog-version 4.- Generate the Makefile qmake PREFIX=/usr/local KLog.pro 5. Make everything. make If everything goes OK, you should have the klog executable in the folder. 6.- To install KLog, execute the following from the root account. make install Now you are done. Just execute klog and enjoy! 73 klog-0.9.8.1/img/0000755000175000017500000000000013532577071012371 5ustar develdevelklog-0.9.8.1/img/klog_256x256.png0000644000175000017500000011705413532572307015061 0ustar develdevelPNG  IHDR\rfbKGD pHYs.#.#x?vtIME0A' IDATxu?3-XK`iiEA@E0@aYDPQ@t7HI)Hv3svaSb]|\{vf3}?wxxxxxxxxxxxxxxxxxxxxx!0> ^37 xpP%$$y͚5+VXoUQl6[ EQB4 Z("".Yr!I,#Iv]8Ȳ,ZnOX,1S~]˖-#4lǧh@pp0ӉjU,`Zq8\.ErL {|6AEQh4ш$n {zzS.kp< [GjժݻwFϯBʕ1gelEQ \Qr7/QDs̿~wd Vj1lX˜8yuO6VPn]tZ-)))X-kz /)=G5eYƥ((ğ^%6Qe4,E0{^xFLjZlhhhh f(?[-geeaX98vNIR~YFvW%FAժ5PAr\us;sJߊ |xޡC7o>v4 I *B*A@טHrR)ddfNzz:YY(t&&r"ta Qf9Lʭ&*p ၇ܝxjȐ!kԨQd"!1AP Z-f+/H||K8w|_Y 8\ k< B F`^kna $%F!))s!\yFn_J5mt"I "sC .|<(8U˖h333EQظ8.]$^3"PXҪUHO 1)l߃2! _ x @Wlzɻ@RHn80 ըU  `/$N_oրvO(VF2vKZ`,pJ4ޙ n%"v\41={֢9:Jgpe^^ٳ'8;RTq&?Suf̘ԩS; `/7@+ |Q6VkԐ+LM @hٸN"*N'/FY;~-1:VZ]všKOEiA%#ZI^/K9 U"T,nϏq50"ݫI7>?;M 0iM&:vLgP}JQ$W/.EǰWȼt|<fB`,C"#VG)U@ O?{@9 (-KY&q[6[w=IŋQZb;w&+(r>5dYy6 jtc5r42rZYmu"W쀬L*ܩr7 88,CVoD ܚAA_TW}yh Q$˯Q\.YYT׏' ]޽>Q'`ܣ(JȩޑSQ1?> PrP({xS,,?wNG00gؾ֩켱g_™爽t˿\%/ȰܵUc4ҽ{wdY&)) &N旽?2r-5(!.*?;}yڝJ$w`  6|OU*t"rJlj4 PII2Z/=GKR͆dbA5FEGuYݧ(g_S`j*껺ڎݭSZX­?_ ?5mm&M];1?N^E#ge à Fn{{ڻQhL8S [,EJ@_Ee$%x\XX;FСC/3g0eTfOGFNi@2e3\T 3 2* 5dvR{~!YY:.ڿ(שC\:l0K `Z Յ ȩY#n_-=*@fE9ɥVӭeo2|_K8N=Ks*U{?VPVAN: t{A S 22w`&搻S P6܈m?X]jcDyQ[7$ %> KJjB"'5'6(}}9l9;'MD\^zұcGZ 7oݸqSSܹQQ3(SLRF7JoP3PK1~/<E=)G_8N<_GshL&YYT;O=JСp6nTH@M񊌜 'sރB24"snB;^ չs}{n_ {Kd͗C@-!7UP3EơCG/bb{$&<Сu:Z-7Z؟D5鴭ٞ+hƌv=L@DViR]Ahe1h  b0v-i r&˻O߇U ={cZ@2א REAhh;l(NIBsWy>^` 2rftKnTԌQQ3FEH%*j3g޶¥?)PQL@z{/k׭a5w 88r ^^ޢb!99˗HqOը$A !J;|+U%I~abe]hLÆ SSePzC!!4$":^(tٱqx8\:]w3W5J>O}Z/IgoN|˟}#5E%N͛jF߾e ^{.AW:\M4b7K Lt6PWT%KS[JPz(2 QѹzVK.]\=^P{ϕ ?_VX.]xAj-z=iǏ#[-3=E*$Wc4r_Y׵;61u0d'|5ɲZq_okW]ŋ\PmUW(RZ~w%-Z$FZM]=6ZZurܓCf͚[DQle6]7K_'UiثnWa8u MݺQ~>%:Qe+ذ!ޕ*ARc2aOJr [՞"ɹ/;T K/SUOE\M6_rYL|4Ŗ-[y^]vkн{W-[ -::zD5n[$t:[Æ/xxlŌ7Zi5f3vÁ@ӱgO?m) {Q7T``ud6S{;Q=@M]|cTm^*j%SGM> @ƉV[6G^LE*ލOL f ̞]5kִv凯Y???222I:5Q 6޽faZZl622ܹKl(`;P`0(B.79F %c~C?=M.N|< j|oф Th ™[#ޟ6V+5c^(i얢HΝx!rY3KEl0$*jWu OSKbϚ^AlX,l66yL pdYu6i˶gUt}jk‚TƣFI7 gf&k;vA_>$a,FkҤh#9pa"PX( FCWS5U PA|'pnLz=WobML,g/iEQAlLFZֲ80}5jhz'NTLKKˑ, Nf/:=6[=zLJȲˢԩS"d7jKy >+TSNjPlA?VU #!+~[Dcvhd*(ҙ*$Q.^'mۈ^ƍ>P $Rj}0o>;$fc^˕߷IGyIrr['mݺ[tldݺu>㗋u:5ktK(Jw7ị{vx,`[o}f:vy·dP۱J}F!%KYӱW֬Q3 [xV64|BWxHy h5jkԀԄsӉ|((=SȮ6mJj!_e^rTO]Au'g0sΘF|sf09nQ^ѣǥ 4 Qh44jD|hЀ@TG LG>c^cۑe9ϋ/,IRDVV5md ɻtB5E6T=bu U{%i Gԉ'1,WwwpyJE,~}>4h(P"H=vs JMEneLi8 Qw^Bk4x`Bعc'qa~~~/TVM z+;vٺu+]v֭7ݺu],³EQ&tu,և;v䦟%##c(#[n-f5on\|Y ñ5ncNx|tZ=NÉfq98ޘj|*vHO>WX׳ɜjkx@E-9@FjpPh4:cPPGF#-S|9j$a*_oL\fVQ_"uYYT_Acκ7gʌIOOW_DŃ"lt~|AtG'5J pX8{,AottYc̘vCmEN(d^wxxer͚c{%wMF|z,gqw T D{R";F>Ş1c|ḮlRwdӧh4rdǦUd2f trME[mv /yG }NNWNݺQeʼ ͛x.ULS"ҹݺuh40id*z`[o#IPu r':5tt:uhDe8us\uІyzjAJ[4k)zLȲK#EK%55+W.rسgcڴiϣ˾^wʷrez~5~Uxi.A7rwsmv A \ܸ6=F:6zan_~ Bh јLӦcA\$n>0$nFʢ? ,?R^#λW9#""̽zCS;~zFՈN^GJ)XYQUFS8w .L۰~c E9q73/ڴi}RJUDQdĂP!""YqdN9͸g>rdE>*M`:E75r7RNާ۷'C Qs_x,+ h8d_%K82rARB'رn5ArǏҥ*rFC͛1p%&?-jr._<&`(נA+'f^:*p8E@ll fAEXq4{֜tq({: uy? ^::_ĄZnCHh(K!>>QF5 v;ǎǞ^_.6}԰!=}MOJֱc9zMbNTޝj{3#jq QҦT06hؒ98m:{*T7|4Bڴ^ω?7ߪnB @qPm`RXhu+$9^"RθKl1²9oۧWoF… ڽ sdY&11A@jiFeIɊ:U@}UjRΝKmQKFL&aYoo,Kph-[ M Bc}8GBbAIQ\.4F#U mwUp~ƥKI/Bߣ&bWd6m#d9Cƹs3c\FxW\e>|)-J4 <A8Ը[i4Azoo z=,!596RV-ʗ@ Ԯ]5גAzBÂvnbrX6-ۚ7зO_:=FD5( dݎf#B8K.SDg$ɉ{֩opus)ڷcU5qk:חՏŖr}'n~@XVxWly ߷s/ ιnF I3)t~$U #u:l;,3d$tT>""HڿGJj>5FEdr0!کRC S'}zVBrJ*| Uժ4;f#᯿2Vvaxyy-tNsy/aL.\XEWח?Lz„\Үۮ{hǹ7_F,wvR~ .em\^ZU a͆_t_3#bd"lћcッJ ŭ(ԙs|7ZWVVktj8KxvP=F7]vQ. N+dfeb4zBDрNFYYҳފH9b+W$ȥ da5p:OV9c@9˥hYh~͹7CΠ͛=p@I47_}5׶u_k+ߥ-)_]{z??fҤ O[kVdDi85F#w??Hc"hFڼZWxx EGZ;Gb(:.I\6֯INCP:#VV+除gAZj*V)9Y8v$E;\|VgR\(B\\qMLt41ryHMK Z*^M(5 b}c(" 1 Nɸ| M1׮V tn[Oě3.Yf3T.Z/-gM.\ZPעj[ݖ,(UF/hH=ru]m.IF4xQ]23%c6gNFF&ibFr81- (ZL zWvdvsebc!&6ظ㈏⥋BZZ:cp:8qŠC]r8Ť_ ba o*g[Wǣy9&$vopW:..cF{fZ(؆4:lݗ#G /Dj\s'Aq+U|ǎܢPI-"ͩ0;{]%|}}ldffNzZiiBVf&W\b19+ ||q:%\gp oۛJXbBCC ߷łfjC?qૅbиI#٭|lj#q<Xnvu :-ޱ_|Vx58ǹ,-Ǐ+06^ΛG̮ݹՖP-.*'C{SBABڵEShEnӚC%92ΜɉVZ.=38݂G,]bfˋ={ݫq..^fDžz )9 /}FCv4*_eٱ}o@l.Q+PJU7mBjZ=zJ||0=>P1IP˖syvEA͙KqC?<^Uq]9wV߇&#=4223ٲu39_5K/g],YY; *ovax41M[nݬi3bbb9s4Xm6Ed2㓓=RF,˜xfI&sM]Ԡ8n_r";ޣ]}0cƒ~|+eb~5jR٧,C4PBL'i|-z[,tI@T)e:iαo?ί^OkѢ+V ::\k/?zaFV|X9rY $a鈉eOawٷwy;9%8fڹ{w.H,<( `4`0hȠM68E!&6q/MdYVsi\Z?v=,}o%U+C5݋\$}`*_d_Qyyi,~II;v,']tɻu\@||§oV( 4j؈q^spE :oooZ-F,Ǿh$>>wSr0~˗>erdbBbu ooo|}}h42yt m۶؟Ln(A W+oGk*r|)`cI_|+  }WyAثZ㡔1H>~4?߾}{Ξ=ˇ^ &mҤIê\^ݿqƧVT'}L^=jL&|}}1Le?m1mt,(s藄~]b4V/bFԫž}sm[rv'Ál3£n'q2ZW {[$Ag..s[K2բ2Urk?5pmssz_~~ڍ:>_eoCBBشiӦM\\ϥ _Tf @բj1 TRdw~킴7Dpp0{ ^EZZ$׫EmvX㿯ӼDohAKJ$lf^u44ё[/J_~}Yrc z__ίY?אz$.F !ڃj,)@ñq44}z;КL\Xm/\@Lyw 穑;ct#(Djծi *h$@عs|届̿M\)<7lphZٲeKkVB \ E[-Z:gpv2Z6Eqkrd C~߆1(S~ ngȺrkD̚E"n#v }o.-#Y+g#f׮|+VȶmۨUVYjE[;v\h2$ z=!!!\rC={7믿v0aBZݺu:шjUzWdjU/# @v:Z֯M@ۉw l=K\\>OAaۖV %~Pۋ>~>>ڬ,233$== 0-[nZ~c SKg5AH(;]ѴF#Ŗs{/lFXРaZM.u[5jrxa8]AĚGm۶l޼4|F}H`f1{gZj# ƍ9o)F%.(Veͳ/^\rZIp].Wأ( ,]tURRR7W1r`KMex!lk֕"$v`?feKNfSXܳ{"g-uWX-ǽR`NdPѫ'%c> gϞ"l[Ag}{igY(٫Y `᯼꫇[]߾};ƅ X,y{{$e$qA6l0t+Sm3䉄KN쉚y[rnDouddPkF>Eaz'I d9r4׾fG+GVLlu@jɸxhy߿?Co>$>7|~ qgI WJ$I-k;djeYfnUBjYW=]'s6mz[E˅!VpfR~7_SE|SH5_ʼpsm WlFȩ_oݚN-WXX K 'G= O`A!ǏǞ~%[lY~ʕÇWk@62tз }K,\~ԍӧO%:e6DŸ|2x8;EAwX.F;gAB԰[3W֕Ns-6Vŵ@ؒS*_>'Ͽ'ct~}ϸf_V=]a]a֛2rZe7K_:1vXӞfG n 츛ҶmךAiQ&)g d/7^~~~{5h4sRݎ`? |}}S233Kt҅ڵkwlղLJ S;L9u#b|wYqqqZ=Ȋ%ʃ7gS{[ϏeV(MGƍ+eِotս1/j^/gO?۾?.$};Çz=vܚU&6mb L4jԨH`ҤIԫWٵkWmv 1kѠAUHOOCۻo_An^A8p`Nv$I4nЀxF=3*c` IDAT `۶mM{gq:$CVV˗/gܹ;P[0Z=?/&Ӝz̋/( 6|\ `u3,hԘ۷9z=67nʑo%1beՐ{!];N[>UV,gĩ \m(2.^⯹s1Ȯ@QXēl||Ύ;8p Vw^ĿuּO!js~~t:׫eϞ9lܫ<8v9s}n-:k,f3.jժnRX,;]?V{Ş 8bĈڴnefZps?˺u^eF+SRG}}s=qǓ^/wcD°XVV+=sz*S]AD qW T18Pmcro8bYy ]ղv\e˷iCס5P>{Yݻ nܨDm&z??έXyRZʕ+ӵkW*W9r$+WkoߞBZEط/Tq6-Ͱxf4@ 0yHJJ"%5lHHgyaÆ5jhdDDDV=sѣyKmٲepڵ#ڷGPDф)a1[?'NWF .-շCٻwo{9_V?MVeʂ]Xrq1WEuq#r@j6kw8➽D9ݱlHNsfS~=̈*XPmބlt*6;S+)B PJQ:((*WWEQbXPJQ"A(%H!}8%bpwY~v㽿KnGRhϧǟ$E&Hae-Ϊ>}o?3-Z"!wOII/zoY6o0:v0iTfvL^a!ͅ_qneV "]ϞĨ(!<sbci75-ƕ݄$T{˧"V6 uAAXE-Z5ɓ'}v+{YVTӦ>(+{aXdb!"0UR;:MA![r ɡ9]wN:L8qDnݖï9PʲR0!!!+}zA~w RʋǏڪU+=h  BS{kHFfPh Jwr] l>"(>.[Aao׻}Q刭"ϝˊә;w.UV%%%喜}ѵGZŒ)4g4H/ ϟE<7# A`hQgOCgSXXు)m۶s=utzpc ȸqPBIFp.k5mt_-d*` җ;*JCgՀ\Mw:w˞?U>Hj!ǒqg=KiE]n<(xo۵gGǎdfV?RA&w2aj׆M'N ̝ ؞ϞR.y{HqIsrxiҤIyBz:f˻d2WNtIsEQ$<<GY  z)ЀZN' `TRtE<W|ը1g~ ( N=zb& :(LY~t裛,I{k?CJN{{:ggg`,YRiYCCY3hӆCrWl,Ft'#8|alnF@RY Z9{&z=+ H5jTRV`@g0p82_/2̒g"ɍPۿ֥KܔfFA.\b R<2ϛe#_K/KWϜ)mD"0KMGEEtc=.]_=5Xqlh4|8A11:YwQǻwO?Mhh(v93l޼cϗwc)S+_~I!,уAAPPVK;Ŝr1ITTb:z86ٹ;QRiժm۶ܨeÉ!Q.wvG~^>. \t.BBo#H QdFo08$ noki7]o.̩kYذ!'u& 4Z-oJA|)Ă@^BF7?4<<؇Ȝ9s6m6OȒ%Kx뭷`I2oOyy \6Nx:>֯gS5#8>q٥.ɯcc|"x,XO?dRgAV<;z͗_~Itҷ/{ɒ%,^c铐Pz~/`4%-K̚5 ~@~aAx_MZ8v;NÎ"##SNQV TwAWbbΪUUV}<66T^:1M% #Fjxױc۴ic/.fcX}x]Cv1^ITPPV)kV+ƈ\v;kGVςGYJRd9~=5 cǎeʕ(jNtL*U|FØ1c裏UwG[3f x-˯4"?q џw$_|ֱ&'C@[p24;ͭR /"܎ yK1VUJ66 "==?nZrr=E?D'v*9995jF#$//R['lj\T/[8#|衇V#FCaa!Æ cСҡ>+=DL;wǼyl0Ao{4߱]uxV+F$s_T<$9s搐jrQn]|h^yEǑS2y];qJ;e[`<&\E+u V&M Qq׶`a;wk׮vr׮]m6Ъ6M q8Xlxy&zuTn<#Wq2nbk$*F#9AP zkz!Q?x;{/I_6"} p9T؁ح9ca5kwe W~V)~}= 6{nR~jժyO)u8p}E''O慦M6zA&Zv{իl۶ ٬;wСC<6Ag_Xu@pv_Vhd_FϦq%>[>A [,dMS={`%MGjE Y0[o^.7yc"TCN;(QJ8n @5$*g.'HBh4fqV^MS?-ogiTwmtZ,hz۴Qw/CaFUIk-[dt٬?  4P29>$fe{t:y>3]6FqƘfq) tx ϟ 2}Diӆ;}A ڵl~]4]{ç!)Ί{غ%̈t:K>nN(E6+v/9k 5(2 Dj"opww?9SAî^lsq{\F݋` 33{*PINNfƍg`۔),ڍ o@ϲp'q2GU޽;6m"%%S=|ԭ[FCFF3O\O-7sdb te@; Nw@"䙘*DDDp:|6;N5w8 88٬VgTEr'cj`N}^>Up={MΜᇾ}SwL[5>7_  c֬YC)ItQvm^͡C1ի v{>]" TZ.Oふ#(,H ~&]ڧJmwL*v]iA8 &bgP|{( aMܯi-TVxoR_PkO>K@ b rrrtq+,Yo)u|ӴmM F#M8>7nܘ8Υǎ Ckd ȏ|#V5Q۶a?Z oxeeRɏ Hѯep?ڝ#w\Tw˅b!$$oT?T2/FN'NQڱCBB(..xt%m PL>/ h;q2=gALL ?0)))NbvZ|nҥK>}:?a?Ms-.&NGz= SNdee/eyzi4ԭ[^֬\8~wK~VLk8=n$ G_x'١'A/ڶmRHEsI/^̙3gT|d21rH֯_Ov|/awʮ7WڤcO}kh8s.®iFyu\ЧOz쩎KS~]vrJP*'|sK+>,߀+1U۫o}4iW&<8ӧi3?p 4h~{Abb" ⯿ft6Ƿ={R38l`Op /ۇ0{6v@t8!$Oť~8E.=Cs pKƨJ0̻Qp}NR>uQQQ, p=:vc Q }W KTC-D*+8o7N I1?K硱ۈw:=(g//2e;>ޓyÇt:*>%֋ٳ'۶mc>ǔaS'~ CC1FDFAir5п??k'lܸq,\R(֌Ft?;[cIR D?ng7A IDATnћ []VFh7PFِ)`U./@n;/ 4) j=@K՜Z9]v|rrrr8NÙ7o~_ZfN]\0f:w|CjNd7sh{Z`?]xY a7|'*h]` +f K(ݻ(unN'+-3`.d0=v^ mpw}- JZ`P4҈";;7@ yhuC.%Ov갰0͛Gff&k(,T!33^`;vvQ~}lN' E2CG8tw0G4hЀ 1 @&Mhݺ5NbuF~(..f֭:uÇKj_tb0aÆ4jԈN:QZ5lٳgzΞ=ӧIII!99C0v`0GrjNf$:]ppHFoz70X*;sC ?x=)U݆yxWǔ:ۂtZ*Euv\~t\~ݍYHtp> . }tޝ'Or)λeo V2"((semۦjw]hV!!;E^oa ApJ` Bm\EvѴiSmFvvsqڶmKFlj}׮]1t:D QK:wLfؾ};j}ر#k棏>&6ƻS !h‚sjNj3 ܊Vb)0A+ҒTBwʆ͏WhX,>;[ͦvWOPRtm)LlX,V+6M@r(@L&W#JrF?0kgϞDDD ``X<.AN*wذajJSPB_~M6I޿ >a3A]a1F#u Bsv+߽KUcV4-[FvvLQX,yyyj:ۄ1`.5h4l66m`<=  祯;}l{|RV) <OJ_;Z>~n  �YJ(E rMN[V,ԳEG vS7!٪URUZZjEm1[DI|>]RGCPx>6 0zhj׮C|`ҥ?p"p R['zAZ=??#$GH0FL+Df8 XV֯_Ϻulv;5j`С4iDLvv~ &Ke}n@*q#!p@bovaH{P(]ί_YÍ٧xEwxSR Tw~y?*;|`j7@aapt:q1N7-w?]p\Vb8sZ V z;Պi%m۶ 6H5w6 8qo3g`0ݲ*Es8@u)矦Ko4q5eEA5:uꨈN#;;e˖w^:7oСCl۲s{gCA9gs x.!48[){J)ψ›" kҌrn;\N\n]~7 ?}v`ͦ{;vQRj|;@;ewRV<;99V F):qJ9"F;f,,C'B?Bز',=y:2d$`_~[UBRvkwyN=$:Yԛmے:i g}a1䷿rѮ];~aN"yԩR7Z1FrO2w&]ޒg`%6K1|mϓѯ%j]/GyEnǩ q(ԍҨ6o'=:`tQ@WDDDƯ;t.OY)-c"Ώas\Ί@tήCau0rHRRR\m ^MP~3bJB NL~hRPPfũ޽+VѥW(C9b#BN{lDa ۑ+ .ޓSX]vI[CCձJc*vi}eDp7b ,EXqEEE~R6 ˣ縉SyūFxk~"aN.]~}ƎK:uTmwɰ={egPXu-'z^ >Z߮Dcsx >0tPڴiX,֯_ʃ  /Sf\_Ё {z7#H-r oKb $H]pMW8*ȽP0N4jN@pvTBZ5JuZ~U6;TyRTqF #/މrvTagM.H #ۀV#z1hv.P^=Fdeew߱o߾2^PPƍmԯ__FNÕpn1M6l4 4Q>.^T''/$̱l6#)]=u7|%(,,$22ү( H[zIu(Lc>EA/#ʀ"9^Wܾ};?&M"--$ P0ki$6m[Nj<="G1{yUDdVZfK>}|Jz'+V ?#m@y0ˉHX~6>SB"P%m7.Я RmA~@Dx8W2ql/XXTt {p'2Y`4g^y.^>Vu=Mk0.dFL l͈#?%K \/# :AS6k9EП$w#5NLaQ-^L\\gٕ7W =ZLxl,6QįN!K~u"n, Iz,˅@4iҸTП+</ָ*8B4p뭓 p#t3fnݺ9$9r>stZJy^ÚB2ja\[p\|"=x -\%6g4,ajy7)n:Nc+Lzb_e;ظXlR^ɽj#.>oPRjwIŊJiū _[O<1-Ku:ƍߧFvZ&NݻU0Pzu K.L: KvNNzNC>}F@CdXIpb~C=CҶm[޺uX믘 F"8-la .`@S'4 t'z)m PEgKn3:V|h2yASz4dzGvS*OK݁AݎlBΕ+bWZKwXVΞ9GVj\`Pg;v LfǎM"%#<7(hē#u_'0dU suK y|'<@VV/}Fđu8MHO&p_ Ǩwt u"V:u#Pn]%c_/=F~\p88t4q["CT]hRL0-J_uG\TqOhkדw2#G,rrrx뭷3?o.c(nsJAOl @EΜ>C|8NYwc4Z x|/̗_~ /<ϡ#0>h>iiɉsJ+ eZ-ի),r10:)MuۗyѦMġC3fL);@f~uf|ٔw,Ţ_8{9]B=.T B*U;uq rRS(icWER"2J9Uy8p 5k{~b -?!H?Ͽ(Y @M,ٻЫW݈>~V ܐ~AN[ebAXrv鷍ŋ\$44e߮zɄ1rp\.'yyRZ5u䫅3Ϩ`",Th4Z-;vS4l^lRˍ.^f矻*| ׯMM:fN 뷚xsJ4~.Čk׮1w\N>5 Ǐu>`ܥ8l,XacCWXCth aVN[^'_Ioj^OȣfGLL.oZU< sNW@F ߠ>QQD_5XvLc2qG"!Zf 'T;P?xEBqQ16^DFzT5\eW8w48p|._|SsyL&=zLv:52] 4jH}~r}##P8NZ;&Vma0$rRf-!RYzu5jDVVچjf#z>]x=O>FDqB8=qx Du ++[jdX8~8=Ü?e灱$5lŊ++Kt:i߾ݑ~n4`f͛71{LDEFQPDtf7ݻwoa6\7n( ߦMڂϝPF[wȜ肛vJΩܹsϩ>Գ}RP",Dác6j]:%%;t:Yv-qqq$$$ȎO~=ڄ2͛ˌI=?Vcy\^py<[JiبN׮]UVC?w|AmC !0 hIDAT@!-;iT[WMȅ t:9qٙYTVQ:G|s:¬0a%n4թSϿ ݻ?$k]'Od̘1w u 5W6il6$ qsv;w^q(.*"8$FgIDB.U|K 9r~}=BX捍~ϰjidjժF_Ŭ[ 7ox1: NQ[OzuN7_Ŏ%GF ."##iٲ%V t:b8@XXM{B8MZ#ax%hZvF>K߿6nHzz::uЏѣG^~+ܞ5[6nHuNA!$$$<ʈ6 q@eT7-vp"%]W7i݀wZZjs L(^J$.[߿?_|mڴQ@:_ۻ/F@.,jQ8L OU$%%E(9c@@7of̘1rf|4!nVG!<bEfŋi۶tZjw]W* *oL|+M=2mY}޳^S.ɛ4xƍ#));vM9oUߊH|MG83ϨgL:է@Y€IZVoãCX#bygA]Zh6Ԯ]?ѣGCLZ-̜9sd@P㈭R%8t!⤉KG]"""xW={vGyBQ&`SvrJ.*E.4(!w*e Up;ʌ[jER PT p:uD=̼ qZ\`Ҩp<| n539$QE.5og}Ѯ{5^|Ez 4m'4XN "bHygHkvW_}EΝ)..F9v<Dzeˤ9r(˄8alFAD!Rn5yYVnn.3fDpWS%ZKa5Bpv8ge}[?>|iJt'ЭRssߋ@BM6SO=u7yPzw CJg<5&?Y8~+Y( 8|>e[q<;|'ё%>BINpLj#7oIII`ˠ 6mĸqHg[kޏ?իC8b}aRKir*фJt7P+Cʨhƒ /\jh0"h5 h4:s*# q|%;2X4|MbbbT}ǩqWxoN.fӺi|_#BٲLB`СǏ'//FNĉ_X?zU=WLɦ&zĈzCE"I`SN4oޜKz#"5$7Fغq3в1 6n(T/{ߝʝYWɪ]6ҬrrIVKl6*7+&2W7B*;łh@ 4huZ& ΝW4uiL_fKRSSQ ?j O3p5' ?V.aҭ[79x_ʱoRHR ,8 8~F hR߈"I5**޽{8WJz6l… 4ݠQ37ԮN@d$;. n ct۷o!(p91@͊9Z zv,[NtZիW/s޹QU)@Neu79CMN P@̒;K.q]wѭ[7k RՠVu=_ˢZ+לC%hJJ gϦ_~j۱2[@'sxo-fUr ;լ[n,\Ν;9z(&L`uNCLGWFq=vٹb{[y|)J 6dddpYz*Tj*xL54bww~+gW_{gU&߫=a!@@ʢ=MAE ,(* GPl $ D F[ichq BB ޛ?ޒB*p*yuwsWpwTywN9~8gΜ1j~9vlZjM7݄H/uk!yJbHH4D=.U䫪uՅd&!!pf;N' pXQN@Y;B9GM^Vn N"'zj$Ib], o%&L\+U6;yS(*V}W9~:Ljj*[6<͛7ݻTD+V;:uJ-g֫y7 ȼkTMiٲ%gf޼y4o#FvZfϞ͉RH_QڴG+⢀+W@6Su$IujI@. n~-oM7@@3%zF~Wu\z{ :jj(;ʺNxD5ڴ65Sfx~R /ʛ:dLbLj+W2| m)j_9L{2{{97x֭˗/gرFbnU{;H/JHcGzǎ#333K^0Mn7HbV5 e8[)'! k 4M qVjf' x۷/׻Uf&J/˼E8H{%bÚ5kx衇ۿ+#iJmGB[+qfW*Cwx饗0`@H87[V@Ve5"Ȯ5E$~a\umx|Bm`-uD8q"xoaLՒYg隋,݊ʹ.;LM)i2T&OLtb RRR<f\cIHqPGӧݻ7 ;OclZӞ20'< g|\!eZ,/*`TTT5k`ere~ALowU079|"pf H?Zu$Dpziun誕P<|ЃLDM3 umٲ(̙E].%~rY ǟ/y)yxd3rH֮};r#g׮]L4lO_?4㥩1ȹBVfdrm{ jv&FW:kHw΅ki?T+ E=nS Dp+ԥZZ6?86k7kR̈gj]>͠pⴉӧJ\\Qq=qX+r 6g MرG!dҪ/_v\ut vp8տXIb=npqDDAtt4%߳Q}ҥ ~)={ W*l6]73s:b}$7w>Ν;hMt:ر#SN%>>>lom۶ M#PAaaeeeTWt:nsлwjOy}\ƍ}JY _4_@PLOb>RO7@QjC5FSL';s?~^z裏z7ʨރe~J?;7xlps.\Y+ݻ7̘1^?HoZ9eYVܻ_@u%@_I0nx=HA HN@7G'iѢhӺZ2.6nd%R /jiK3.0l023ߣGFPdd$wfĉ>`INN~h$M I2%VQ!C2YP_F?4뜟53j~:,^'|xh?~;llƂ兼QԩSYt) ?hѢސY4|-[U^54&hP@M/(7~4OoJƍG׮]jX_ز=_|sqC[0\Mkm7HsŴk׎E1}t#__%; b6[LR*$U[@1 gn,Rec 'O$==` 1P×Ahf@BBWWdE2M5L䐛&&-G`C Pn 6 $kA<jY Ȩ+ah Ȑ6M3RhYn9s|t:6ԛlyW\|Ν;K.fJJJ0kS*7 )8`cQ *E}p5V}^ 5r>G%ө%#@V,TTTr8q].k &},W?X\\]Y"ߧNTR磄aag|Z]cdaSbX '~ݶɓKJJ|]A1]'(..p8{ kI]kPam/@(({չ6izsl]XXX8K77vvϸx⦎nڢ(R[fVZml1\i7.$xQ+2iiuJ ̽t :@> '0g͖[IjZ$ww|*++*>cF%4 ylO@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ :=FIENDB`klog-0.9.8.1/img/klog_logo.png0000644000175000017500000001022713532572307015052 0ustar develdevelPNG  IHDR00WbKGD pHYs.#.#x?vtIMEo3C$IDAThixeξ I $@XeQl WE@{A@506BPvEE%$lB!{/kuW AgΝy}:¯S"&RUAy5&zega}V0uT >}\llOIvB#f`UUS[k6ͥFc.?Μ-8 kYYŊ \((!@ܲlu{a4^' Rm?/|me> >-B?BC*l޴9hYOS_yy:tQ4Fl2}r~jKj"*#00l2i$̬  [%JVb&E]3W7.Xpo^~9s<_bY ˁIUUUq{/ׯ)SzdoyovPW@ {rh~4\3]*MڙBC`2L|055̛7 cǎ=nܘ&/@l\LfAϏ?xK;tX5#*7A'*o/d99XT@Kh3a[YisxBODtT\V :t8gO2o^'y=͖-S|NNN؞=O?{V.xjJόuzNY͕41ʈ7v8l4S2s6BʏS2Y»t{" Az|ӈ]7NO8vlA<忘եW._x9ouwBs^AlL\ҩStށy[6:cѠe,x{}=7|C[6kjDΝyX6*1dNtaa|MΝ(.QCHUE~3--K5+*2bJr!O<1!}߾>C֬N NN#hZ.>jF$"3Ν#hhDl&f@bǰjHA1T~ M@֨m F+CSKRڎ61Sv]KK@Ɂa\+A,NGE;(&%BAI|;a/B-jKK HH@etAADKtήZMA/!A|<'[Ά/|zs$8PR$]WX}!ߖ6lXԮ]Ns^S3z/]&ST&}(D)\UQo?o̅oEAEJ kZ\A^_7Çױضy3UW"~K.Uλ٩jv.]`{ؿo_@]/^k0Fo߱U@;qk9=FDUU8]zoX I\ٻ=J>og6li4PVnht[cx?dq!USSC%%u:7UȲL]BBB5e6}adwM[j&r./.@bЊ6+Cא6nd֬Y48r%; ;,'*XxNL<9:2&ƫZh jeΝ;7v̙>Yv|}nnn6-c(>f 1]p64* V"iF*9lMiλǎö7$Kq.jj0=KBCǀS?rѺu &0\hp9hq{$I,˸ndWчM2e&"LX曔1GC qғ8F>>,ѓI#F`~>[ HI!d pg@`_4 n[j6֢/6 tmj>wvӉnoi}#&Gk$@N;#?̨V|٣' .ɄÆS ppsL n%~rr \.߀@ @Y3pl6*++ JH X,dAQn~xN;xc( CcjHǗ@ G3g\|@bz#?߷ 9PWF^{b>5OR(E0XڴiCPpݺpSݜFV4$IF3-,¬ۓoҮ _g؃`<q*|6E>k`Ӧ L]I_!}&AAsܹ!?EA2[0q\|sշTUh4a6QU Ɍ@]]{s]<ޘ<8f!*π)CNPxoǪZnvKs^¬h ҥK|뀓?Ed6Q[[ppB㺗n- x<$IBXP՛zR]]]׮]g?cum'1GJA߷H~7zJ_m&"EMs/_^8oAɄl63l6nu ,OV}99'5ѼN]Brrp ))DJ" +VlˉfAjʺ?unGvh47=Mj[3AZj{@L3Xl~l\<FbDFߡWր]2㦦^EGꀉBne&7Ue@'>0,K6b9|Ȱ& [H]zUk!p:q؛4)u"xGՔ5{wt YYYjuUUQUUvdRcbbwx?0V1bgEq|7Rvɺ:ܲ hSwl r8rHhTTOMb./;VVVvj>6Ӆn񼟝m޽{}oFDsxo>Lf ?s@yTTTyJj={.9}zErKOHpLLtHFfk *ʯgj~F}^IENDB`klog-0.9.8.1/img/klog.ico0000644000175000017500000063355213532572307014034 0ustar develdevel ݢ& gPNG  IHDRx IDATxw|[ϹWxŎAv&IB ZVi@I-RJo[:e]e8@ aF;qbdIG؎mI~;tdK<<B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B;!H2G *>`7o& !ڂBt.yp ddff7--|Ǔ#%%zx<zzu]hp8ZD"B BD?T0T`ЊD"p8Be`$ UVVD" L lK.K!p/7`i999233{g呛KnnSSS Ät8&H8L$ю(qGG׀([}-K[m梨R++UEE]^^n~KYYǎ| 6+k@48طo}ӷO>v~~ݻ&`0HWPH}$u] nlߌۛ^m_WE)eY(e2#8nYYvyy⋊B̈q)H D ə2tc <4x߯TVV`0H*TW5Wmءv7fR ˶eێu=k{$???~ĉ'袵*))L^әTF)RH$ݻSTDQQ{H- ڔ˪f,f:9ZlT3] DRʦ̝; Z={TEEE߯Q ٶmw(WDo;hAHlFh32L|q>Srpf@%*FΞ= .{֞/v͛ٺe ;v2W+ @7ۀ m̼a…O
U\\\stN!]vef6l={Ftn] ǯUB4$謾7dȐ,X7i$k]j_II6ة~׶m ٸa6l`ӦM888 U.TsL R|[%!/iz?;n;UEyy:lcka:"֯_u(-/KDr3P SzX@tyuǏOWۭ`0RѫWJ)lf]ukRȰhS@`S86ItaeYVwu &O|gEw[PTWucwڵkٰ~=aוN_h Pzzql$I'%% ƏE,=EEV8nP]~߰~=ׯ'8鋸N TbfWE? $f×viʶ,hn~XP]g|WTVUI/FL@ "p)PVN,۫W_vi)YYޝ;wڑ-b_EE/`4I$:19D77##7't;oT'f~"az6l@u%{_$*e-G"I 3fLAK@t :ԩ,/OB L^B*0EǹI"yV|>}UV#7BHVǹ="AI b>{;p8 =Pwu]~?ĵBt6rU!h/NMMfzz ]g DE(D;I  1$m?^Rq|0/v!Dpo#---QH" 8; @V n!B, Y1 ( ġP# 2)M*HP`i$Dhš8  tB$> y NsDȞ*N^ PZ"XMӀ 87It09i bC2$DR̨]8<$'nRTU"ɹP*5xGt DK LTi/ލBA1KE'&h-``4 !^t@ PL*$ю$0kr,ȕdħ͕p|tM*fXs ɃYud)9$e`/p$oDq 1/˲8y] 81w5D0|uGla6gB@ Q`}8mɊ: REtIV1IXQ&[NPa` :y(` !f_.ZiW+P]G?߶0dKSa=N|?P9aG?-Y{r$ ¼""՛FDGT4`HBӎ`]HЩH4f>h#ю>k;-Z=\ yo>$d6_cNȝ]O`&(ȋ~=, 0?Kߛ̈A r^kK1#AN$4"sݘdMg^P} Wb:1W[0#.;d2n?08 S҇ "2#ȹPT.0؁)D#W-~$ه0}*-Lgx3T/V_X`(pf D;JZ I vcghޔ9ArKEjE vţH/W 1Q87G" $_} X7M Nt$ob:Ւq71.X=mMNMNmrjsXD׹腙{NuEѫftũy1WLmLĈ.,a(dߵY6@^Ջѫf>oNtp0=R RںS1p 07O]܇@eE~~P0 3/00E`G{^.w{DIu}I E2uG0Ѕ58SȨ*&I]=Mqnh! s-W1k$||Gc 0gn4y0T]x2^n(֕u|dOCq*p 0 &v1SLH @2x"cLFޢs 4 W!Z6fzL S۬-#' ){ӮERVX⺮ϲ.(X&';Lnj t~tsnuM"uIpK̅~Yɕap+*9-[,Ŝs1#L$0$E+0'/mU):ٷJ1[VNt]I3PS87db6O;,/}sRJ[R⦎_bhcorڡ]J` f߁ ˬHZ.Fpc BF:~]8G@?N15.?ĉ8neY|'en|@?@Ae43!ײڸ]RLgׁb׌$%H1S"HйhUVvD`:;ܬ3ЮΝK(TۯXŮ]x'HwjԿAkzmKӀ Kd,`f"bHй [9\9])?#lذat^e'5elSH$)Kp f ׌ܦS&`ssH!bBJ%Y`!B9R&u4Oށڣ)YYtB;n8L޽KJcg̘c;zR|`vf r`9&a- c)J=Ww(Ve%цCdG "L)2ՎYZ^$u?隔,zqC.ǨdvV */lf|[^aÇ8Xm[oaaVLZ%G)'5 tc-zhƽݦNb:ہ,IB"٬3!]_Ϙǘ1q{,׋ݖM +r<$Zվ?]urE=6ue$(Zj̲`tORDw \ Gѱd PunDǜ.s:,>7LߩSqЮSUժhSV1#EE{[Gz^u]nM/_ײ< ˲vndWAM]%pM5H;Fdj1ͤHF߿#$~8S?%яVTDU@k*ǫ+Ucǎ?o\oFF?O^;1\szR~ rC3{/LD; - M +:oOb s -McƝ1 QުJm}z mGl`{,E{NG+n=o>O)u+0KBC t_/vSwb$m*Eb:sܤt$f-9 /㩓V2nu}ÆwD,WwQ}{kx>ouKO-(_iP&){ r"Zנ'I\(% C4UCv͵!/!t_тο[,|q-]v/}ۡڲюv.Zȩ|W\'ŕh{a R[o :喕5VSJ2#UDF$',::W=}}:ݺusha?o6pZ7vӚ/И?Jetk_Ż=]$Lw5W1C] E : r3qюCJ^'zرH1e{LƃQ 'ėwS{ޓ'I&-fǎ?v &) a] IDAT+bn,].\/4(jS+bVtn @l{r\:Y7bǝ|{̼Wx|oKs$P 72땇wiɏًBr0K]/u]nYnL0z9wb!d8Zk(QJZRPUe;S4R;NEt&(6hCW0d⠊e2MۇG;:|@<^|1G\mⅦN)mnH'Ooi82 ÀW_%6mǦ-[}?eѯ_?Oȑ#ԡP( jxAAAwtවcnRTPLF31+ZBvaHv&@rvYfÇblf27wJ٘)[o(\/DJp liiiL0>}Z~uwc\b>̔MsUK FuNB p!Mԝ-aܙH/Y7deotc1A@>S瞋x+H[6^zͧFضoûMo1WK1妹T{)&Gˤ%͂܎]P(eYؾT*7zq(9 83|7` 0z:==\c^)[ 1hZ݇9Wށv Vʹn@rXL֭[3NSmsKR:O矅9?G :cp?cUW'$#;#;5Rއ.'6f신]H @)f+VbaH)ƍٹsWSw5fmtc7v]c=Noh -z9ޞ0z/-6`*u+3]hhRSEO?E֠mR+ff=$o[ UU=E*uqaFu&gM81˲f30 ,F~f7k{t֎:d0|p0SR@R+[9SO믾jk&r_2Yaͣ#D*u֙p}k `Ga:9+o躼Mߚ={֋;[q| .Pْy6rH+PO{gsnS܆Ht떦89=teY׏׭;T@43ubN ~ y̹~rFL+喨*ˇK e=aW*RAu,Ǐ~'jㆍU|̪цd@b,:_^}h,S, ۶,޽{s4ua*%{Ōu3礇dҥ))Iw_N}7ڱ[))vÂej _|a65y"RYIjn.'? }8 <g6m+ nxNkDVgރ rG~k[iף's  ġDgNc cM:-Ͷyqø['k4H ?f@45HJ,֭/NM=}tĨܹbKQX:%<7&iBq@2=^>GJV_=(v%z"MVs\RPr-Z;0^[PlDN" rk,ᮻnp`-P\ ލ*d q1|ЬsfwKKaEPPcYWXXXѲg_ A+fuΙCo4~u]\qǡotL½6% $H .ʲuy}z|>WwW\q;} (1lΩ9ţZrkeƛ,]o|\@u~weg4? c`DhcWӻ'y?XӧtV{Rh Ӧro0]klyYl_wHRRÇn䝫Ol˛ ʾ s.,ˢ_.5bY}FCʲMOĿS}1c}t `'eee1CEРJyN>mNSR<#btp{6  qrGblۮco /^_{) +W0W8{!fIKc8/!G.Nl٫Ks]LZ~3)qBo}>J?W\WصΊD(˦z',o.۶o'l{L&(&c/p/[^u~f„gc~;v /EmdN-_\r`/9m6mj.SR-H8@#g{܌Դn5WɓyWVZjO/U>SO;Ĭm'Yby%L8sՔ}5*%MHe%g3KRRZ.Hee(_P0`VM@c5q뫘x0nWMݕ,t5lH)`TXS)Slw[U_]e#ʟ,5ع߻_>qUGgܿR, KKkH~?_ I6e۬ӟsl}y*l!wx<_t.7>U{)߰4K DzuYdvXǛEp*7ll8̯y f.Twf3E8npPﺚg}R0nK/dgvvvAGܷti j\&}^ <.}C\rIi9]wy2(_\: #'dן:'q=\Ljt;{_/?Gu&xC$LRJKy'?JIAYֳNЪc0 9e*7߾WmdkQ@z~qȝ6kܹ,dF"[Hmq 0StBqq1o٬=O=:<ǚs'zk3g̚=fϞ5YO8aVٳ疽ګɳqE\;v\ 'PJ YcSR| voUaa"|7n$Ix}q]pYi8S뺄B!/^̂ oذa:Yy0nA}0If? (]o٠׎/7×\EstE\e+Byx|ܺyu]}~A'eYhWSC@6 '-wF0qc"~>"t^>p~~~VUUյ˖xׁYrZ닁 MHn/(XLx zժU}?x/ԭPs׎ڪWoL;-XgЮM=znu]ƍdz>cq[rИ\ԟ]: QˢlZ8|<qaŸѣ&ébÏWRr`3x c<3U8hmъ;[u ۳=V/߯޼y׍z~_pܛnJeddԜTVV]vLNx?d#Sr=^Ůtrrr@ iS&=(gpO8LPUBM޻o+T߷x-[ȝ4ɬ[?V@)ϟGBLH2Z?ٵjt5s7p]3m_i)۶ծ$К)G+*˾ny˳%f+@;oSw ;ܲgz0q{^)u?_ 49e YfSTGckx)O%Hб~cAO\xj48-bۀ'H5a7>X)^&-Y;$Gnʫlzf+ۦb&GMx蝫RH;5sc(߸-[ZWާۀcdo\;Ue)0` ʶlb۶>d~~;Ch`Tss sw,9sbg0hp~ |ueЭt5tSrՒ+{%ntε)ZkΝ˙gsہ:mf@ >y1KּsՒ3S#kppٍDHeS>z?VO ("XT >_.dmT@$-Cqzbg;r$şNV+Rs/첂AG0 l5k[ɼİXop':gq%5w/&%iH@yomŐiS3;;.=z`֭W\q~`fdpfo5T-g<?;|CJLt1ѣfx[kS3 Tǟ`ݟB 22t 9l jJ_a/1)GX;u*Æ5vj*@/~-!S!N9eӧOLJƜG v/Zb4̡y`i-jDb}zz`Μ׍M7T^l$BF:s@ss ]{ril?vD` vbM=d0pO;='LHM6lmsX26>63qތCv2yGIS~!?ʫx2EkȨr>Kww1x̏Gs.NO#\^N_4o׃>F5k>oۥƎ-,,<{03c ;cn[̐mk֬q?P(H@Zj7O{߯T#W0$hOяɫy.saΜ9;JKK` $k15{@JV3~K&]yEtftvZKYAr9(ۦq^/[GюCθX))mg <-[(߰MgoRd Lel~QF=f/kױO{ɵP25RS<>ϧl&ʷx#3>5ɘχ@ycGͮka}%$Ǐ1s꯳mcJGrC0ޘ97?vZ7|=Us IDATR㏗=AnZUV ,JCy*<9Ç$ftZkܪ*JK׏H 0Z7y2b7lm] (C< =z9thTӎ/' N&w})U{>QвaEut= _nnRVJ ]Eݓnزe+ {C**+SDSNJi0=rv0Gp_þOޜtIumÓO>_ sp \6bY1mx݇H ;{l~M]R^~;cF_E$h_9駝b۞Ҿe~vdŋ`tx˛ǃI{iA̺]z n(dى^/~. ?eYHBu^ϛKlv5W(Z!C֧E%hF;.2SIуVU*`~n6TV}>_'q`YB;ws.>h nt?(ZXA;C0jYRfjԸq=zt}<cD gϺ{ 6Hc^UJoX33#R49jIKFiZE$0I'@8_>)7tSy5裏f֬Y;KKKŬNDaOiAsw?Yji_ZϞt++|[?nTHrr|74}}NHqt7q~}ihm~PG׿df=rdA]Dkpl88ɹ=F{n=kL h7HMM91B` `YPolk^(֪[^p{Gb;)C ;;4o{_ɪ&sꎉ؃wwI~S~srrx˯Ry~N l{7sx"FJ)Ŷ7+]{yϯqwJefÏMCyϔ!󎓪:;*(( "`&&hgJM-kT;( 6TKY}-ǹ,* ;">~Vv;޹s[y9gTU b'hj42G+ Ccꘑ/-fw+oӔI;Q( Sq#_}7֌s*wuPxw8ǔ)<=o]n!=ZQ^H݄(oVL B"H\,b[ewqG͢둼VɎ/_}ro/~_~c_k!iҥK{%HB{'OyE8itEI{TdKKő# l鰢ѣsti.\ĪkX#l5 4Q`؆';_F1Ǡ:v;UE4.ۻ!i/$Ã=W^A(V?!U%UJ 1DIkRTw0HC44XSS}ߪs=I&ot'o%ԫ@N2E̿}z )h„ En^UUՏnߗSme˗0L70 XI?\;ܜ켦y[2%_0O<dn x /~(_|ƵY]uYˬ{cF゛7ڹHv¶n 9'i#2 rHF3)4޽pfvv&!bMw3P\[uV֭[#++ ]4}w{ƌu-(3chYK:gza9w ׯ?wСB}u{"-5 ݭ,^Z\K}qvesϿ`6.˗GMVVw/ F6)m~尿>*ݴB*=piiC==>Cx(cV=m8S0~]AKvM6 {64,iʦe hHk/Z +²^y4})0bpro#ȃ;nϱmM`d_v+]Mw***VWWt 1``YWVon߶5Qqν}! D=6/ 2-۶m a 4(**bҤI9>Rc|60Vt3ɯLް]ڷ+<g}8wj|R {²Hޝn'PjJO m30!2 @ q #FhXີR y*V,FO( izaZ%iFCSt/.5aP\0&g5wu{e%"߲8xΜ9/ٖe]V^^{챾h,e[eΟr}lYx=^:w. ̞Q-ɫt<^^/@`UU~SnN|(mxBBrW[ `o_RtZ+s ۽(hU~T?z 9u ( CP4q"f,JúuL.Sx %|+%Ԟ=Q]zl)v85KLШ8:J}|i/Iٺπ2HtFNl[GvYƍL1h' %EQW<#e رc?3gNGhjҥ&NeؖiYؖe;VBآHIIAQ\ughތX-eC?p8^x(݃RtK/dvEr27eCIOkhIחUUU}UU]'QSC;8]zimMc&Ջ'o8-wdfֿ_t:Ͳذ P <߶aٷ//HmVMnn.⚦mxjhh"+3K۷r8Mm˵jnpnv/Jdj`<${mG'߀wo<-¶,& e;?o>8Leo0 }v{8u*i]4;!н>f_1HyYCu&N?mp\: l/pRz ?!7J~}j'~ gr2 0Qcgާ}>-hO=MtfƬQS˼'cv_¶)5gEƍ&?4KQ4M{3g\vj͙3gqc/cGүgܸ͙3'Ԛkܹsd𫄳6N޾)xԵ~݆2^}-wyiK$ɦ|D~{Eݐy)i noSm3}j5}݃8fdč7hZDQZaoPed_N_yeB( Yhn7]Sk!;)<<,O=if /0 i$aRS~}z)=vRq֬ˮ`o 2irކiT}9~HlG<;/J@ Oz:x)BFϖYYYgCBu^ze벑EdZv~`meIoj]g˔kpH׍%Bt '.&'#2ɟ~8\oGZ? 223=)9²m+';ud)hB0ֿ-R.]o{ː?$sA Fs7ތ%6 f_1 #Բqu`VG(+Xk|cSR2vlE{Cqn7Ǝ%D o(IxyKEt.0M<c8DH+dln4kΎ[ru7no#R~TUYavd[o5ض`kV/.Cv?CזN85 ʸ??I~?WWwòZߟx}ybMxM/WX^yu}t0A wB;sV= |7Db##eO X 3b[eeQo0T%W^MhC19ل#Q`SaEQbqF eG[ZYtxޓKuZ5Inm`>1UUxMЫ{>'Dҫo:vkYeZ}#BF XڵB{!@V؎ H(uə{NfA~'n7>׋咽%h`8D<C4GOZ]1l_; )ۂ>?睇j!J^<>rOiĈ(#XRBW_f{Rp行}_P؉gdS&QSt]>(vux2>TXe%q?s硨JR8KF jYC>Pt?FŻm ^ya $&R^ΗƦYHOOkC0 w rm(>C~M7|nMlϢo<|MFŒ+!KM~n4ŢDQLӠ ŗ᪪R e+22޼/?SqU{dge(ض!ӌl( bUU֠(Ku۲?w]  1聬{=55jrswj \p?⸮GݨN1-sRbE486Mx!V]͚-3f"l+y/[Qqyt;D]k7%>oH E({}?7EX@ bNe:9|;>]Ν#G:tmF0n8 ;/OJ~vӫW/21Marv!PEH+SUS% ð IǴ:wks=ԣ]}"C8Q a"mcZ읿oPml--2-^~|鑷^spܚzN̈o“ˮ@zyc~&;iW0 yl6̜IŢE?o(J1i2N<OZZ3PUTMc_ꁇhX-3_S?^={ҹs` "(B`(Nd9l##?Rf0(}耫ݺu<䣅)8@4]ͣy|׬\rx\. ׯC eذa `Yzu7bHi{BAvLj.>Cps^/|s=dʾZ@U?|2hhtD0$ۑ:iy um&CNvDmcտ9 K6!e޷/Cd XPT5MbGBUZ+ K5c7q}L?眳3TUa=wegsBZ.H(LyE9 ATU%55. ]w=dݻ9mWJr3۳=::}DOH{(ڽpi~O1N3$\V֡l||tM R{f3+kDQ nwXXRiBely\)v$'Ѝ7`D P׮ Y3P5kڒT/&_wuEݻwSꇮ뎳%SK?y GO`ȑ4x4ǻ!e[:oD{ts_i%Rے^͛y8s8BM? 9fnTUUx[oG~Am-,Ԕ͝GJ Tc'@x3 &=<=r;@\))̹wIBvJco[J3 _?T 0Զ/ouU?Oͪ82Q6;Sd1V4檨*-[(6jB۞p<):fM깪*v,FyT|))ݻo304>fkRO{g3/ɢ{M|+!.G{?أS#'so #P]E}Cۍ'?7/|a Kظ]b^WܶMl5|ֵp܋؟ 999.˴L-]0x23p{7~j*h P__i0躋tz-&=tTmG] `6f* #H]h(}i:vB/x;dEŷ)s=ڂT~9mt>Ȏi:%r?jECxk)ud)^24Dy);@.i"ٛMדO$kWjW¨M9iD6ofka#dt /;a.7{Xu }vdb,YFC(Ddfy4 HލꕫH44$3CUU{ό;6y q uk)G}4OFkE^=8U_UU.Xih#;;ٳgӫw/S =-9x`{_܏Hp!0sd2 8e.H@CTTEknn6 blĥ\B0!HϞ=D#ض~P(T|A+juoz 3gΝ93bߝ€sA+ xS׷8ΓɱOcm߃,8n"9B݊ĶmK*Dzul}V$c@<9 "O/|2Gʕ2ddڥL:P஠lؑ[,_2a)-LN'/ ߃m i{TZLj y{88)Oid吭#='r BMIR@Э85U^.̌ |M? PDx}V^kVVV-{>g0{dZ$%-5 ۲pi:|#F Guͥk.uIQEޱ&6`@UJmƟBnyQP0-I2BaaٍjgH΅t̔W^auHֳm,}]u33}:SW+$g t΃ F(C>:߽ 6sr(ԉYgIA"?Ə?*iM]o<탁ei&233pBĈEc$hK[6m5$S1Xg*#rRPRdضT2-Nj祰Ї,O1#Ev;^Ytssx޿kq\rҥNzL:a\\.tC[sB Lom#~:FP˲z }Uz}fg S:¶;l61-d`x22r_94H'yUЦ|~e|?-k[ ➂HvZ`&G-矣Ǥ㒙;|oZj ~۲M/ br2lx,N,pc eۥ^mrG)k )ӯ?>!.MGAZjiqC[u(/@w@ >xP q{HepBzE$`0H`C px401`XX%%m@`9Brg%RҲ0-H((w#7 $˶Ϯ.Ps[RR;P-]7lqv3?cChӱM_nN Ǣ'V]8ov6CFkPl@xxU}FJ~sեc44|ߘTmmowwV4Jjތ|asJ>*,`Šǥ!Ё @DbH5b8]<}#$q58 ΑȖ?% |ke`eGӻ/A,#ljc}wB)i&0-Tȴ-!s( モm@*)7'v x!ü8Чi:UU P0L00 40L3ap~,TDכICC(NIMTUH$XzcFwV"Ak/H8of&y'$9v~f_|.}~u =w) f;аqN[LB"ew kͅeJM d2Vpİ`᫪|8+IoNN¶Iٓ'P|Eǚ%K \id/:a-,>0ItF׳Ϥ'%l]:OF:[oაO[ƻGudZ]tlg]ug}={z6iI4) JvH7!ѸˮeŨkw^XE4VY >P\bYbZ*5X4F(6mM~UGd_d>M$/@ttͅRќX4 L*iB|>1m2dw@BBu4͔fse!C8wH\qL^sM]lyx33%IKiWb"g ɽH¶ f3OX$" 6ַ}_CN(h&炩ttk-o-7 J$Xz ]{-ه CXV2M{7^V4eeCq:oN+ު*/#GQÔkb+BPQQ($L%6EmK]! f@3c8Q LبFzzE`0h@ ڬScIhhx Pp0D(" J~0H!H0(_˟pCp8D,!D8]9N b(>-p,d9I18&@o¶1Q]=K涸qBuv+NJ}B'8Lu_}|g9V.'1WuW,?@)~Uu?y|(X4/Ͽ<3d3;!~"[KK$? !b1DB\5(=&N'JƈA;˥4^aiVcY&Dx,N< O1qq:ǰƐ-yBm& c[&i4$@>^*-ɡHj,C4,vr>2 B!B!pP8up(D86 R]]M4%H/^cI&`;z Jx,!ߕ~gSzM@ٟǬ.%11wosή5 r5۾7߲mD '>da&̀+`^D҆ |r!) f4JZ^Ìog,zJ I`%eMrO<9,!ӠG ض,AQ'HĉbrbDhx,M[”p8,_[ĶLDc1,acۍ/Zsc]PUU²dXL)O G„a;^~1jp 4;P۪+ GBD"0XTZBZ6D6z!ئIѨ#8[{o a4EcPTEz8$m7bDQF# B4%IeaeH$$D|0t%YQBH@᱿׷˾~FEde! Άli6PPO(@(,SUUĢѦ*ŜH$B4YMqaxcYt!. 5њv9.at0asެS63a?/]Ϥ]`Rf3n|LPT>+>z!+qf$^;XW^2LLi, ŋ܌Dt%Chilm,2*@v0LD,NqwRXX,J,!E X<&aTUU'H$0 0D"9F4x}^l)1i=( ChT>iSԹH,JCC=2 53 Nd r^% IʌbDc1)B VzE BDKZ.c2w|>~]矿1q\'4[t[H@KnxTľioFEMr@4ٜטslzMrmS6NKcȭ0?O9hV4ɲAEau8͟ GCvFlYq!d wxWFR ɼmYRV^NCCgYNvf Gj?&UUUjjhw}WOGy'XGm\~?satEIUHxR},]0|8^]ʭ~nc=0[Mb4h)}j]Nƀxھ:izqR|9v<޲eoc㏳oOZ=d[uH]S :(gh|3eY6b{?At@,[-0m͛75ڶ-_5Q3T_u8S€6,Z8B5`26VW'89+ mfjUlmSQ^_~IiYeeei&lق6i77C!֯_ϱN +{{z$_z&YȆ??@sݧ7IJa!/L0^xaO'ZrEZVQ|0h$Bii)_~V_ϝSF=@˝:'d`mUG#>t6mތ(l,gfM rPZZE"ף:Sd*BMm5o|7BWs?i7x0O9EnҭY\b+.k4.D0>9EZ8tj.CfRBl1#(ڶ,h>Ǒ7B7޼-|㫻[n!RNpdɒz 3CVXʕ+w6,xT ØDC S,~'DqY۰(,]U߭BUU"`SVxTWWSXP/ uulں>ݺ( U5Utu[CC }/`#~ xo֊<*++PTY瓞Azz:PzrssU?v:6QQQm .": IDAT<.5 XI]C-=߆xlREn~nN:Y8n򱁺z3d֬]KzZ*%[M\.<!n"0ǸjV.~6dJ[f`";)qq|ÍmyU;Ou?XR촸bRS솿P-ݛQw.> LOV=:nݨ^3N_QP4hY*ps ,EU6c!#j0ԑKJ۫XZk:uļy={A{(>h%>m{5:,@\H/"um۶DaForpr}wGTP .p*) ʪ t] [2$=1p&Z͢#=Vo}+F})*,Dmli;<.i+oa8&c[6E\wȔZ^|'sW UNrӐ_r;kP nٲޠrR;NSQ8L3`QLxw&}sfI+ƖNa+VSS#F< B0p@RTUmZၑү?N=Wu䑍&@RPjy^9Yf?6I3YgRg#pRXsvnt :N#Frv0K8h]s>!ASO!6lUz ? ~֭sϣZk=ÓO>G֥+V7p% ]N;tPijYv{80-9s`&`mx*SNESU2uT]7*I<^F}:}>}/`Fc r]4(h7_~oLLݺu:3dÆ –Nѕ8 ؼjժnkͶ ≸S DS&rܤ.wM( EEL:8 U>;- !Jv=|@w߭{ԍ .čhj7Ox>4MtUM‘ qUז.[ gã6ٚMIIh!*M@(]ĂXg{{W+"Mz^!H(!=[gcvMBe3shh&q_5" K;S;YPYLM#GѨ_c?!srݷ'ޣ(D4oF;}*L` `2zbշW^ڵ9smͽ}, 8v'>gn9??ם jV޽k] L&s/b6oɓC:)+ ๽Zp=8Y@`(}ߴ'w?VI!jo͢ƋDlvkl}x|XrqBAڸkf5{,/H6;w|ZW4Fٳ^cÏ\j-3ݻwr>4AACv8hBH6O!C9yqqqܹիWӺoTݢ@{l@/`]^^+ӎ}}:$Vm,nwg8jnNvny\{s/>?%0Pۯj+Dh4:DQSUx}@@, 4 6ڴmExxyU+XrOSWK]8,\ ٵ&ԩ"C(XwKo ::FywNnADv8PRDEAk2afofX8Tك6oUfk F |\0L6gys.Zo[(T2 U={2и:h4ZoҥjAEL&qqqfF|&Lue.`,peC'7lؐ(Zn~hPKZ-GtԼ k;j/XSj7<\ ɶi &"$(vbxN\MryO#d9-[M9ISHv!5OTź+BdS_#a4:N?P;Zlo׮]OiѢEҿoM*pUATTZz}) l6[y]EWd"//k6f3 ~EQFLJ7mQjQ7 r:ľ}Ҁ:`>e(tg![O H9;w (,ٹe~LQS]K) hu$͚ŞO?|<!4ka#]`G22HV+ C㉏^C u:mo-7~z>q]g̘c=VfT{; Db hU Iرc999ORSV"# dCӇ?tYoQe;KAY9w/K֑Dh1"B厸VCm@ǠH BCi64F 5ʯj;˗ӣGK̙3پD͟tK>PPf&`תZjlddEQDTjF7n(A٠A_N:u$]I(bxgZFM .:HCؿ`}D)Hp_端8oR@Qc%hs +6 ]}̺+Vp…q`K-C UA@v8i2QzNEr].Z3gKN Hdw4YKnS]7&R!U۶ѨQVF>iw…h췫]hHNfOMͤi>~&E 0[8?ʵLD}R+DLBRR&/E2uPPm5k,zh]EQ$,,LhԨx̙ UV59rd弈u1;vLw}fS5=DQʆ `40~Fis(Z-Ξ3ֶ ^~xT(,o gwHFm65*hM&,\_k~Iy䆎U ^OΝl|(L<_<#88ܒKwRje8u&T^ļ/h,p%FwN#))ݻwoYxqA5o(tǗ,YZxxh4Ҍłf+bh4v)>|8Z0 V@݁h3׮Qæ_~bZէ]h8b%k/_ׯ/ZQĖǼ={!$[5BjzٳhԨ?3m۶^ʕ+۷&S/`CjթS'}bqFzYf4`Y(v5kweJk:(Jƍܴiӣ5kF_ۿמ,[?xF-Q%"#9n'eKF_2+EAQAՋ۱f͹D ^QÚ6uWmo6 zN$:f R]ڀR֭cɝwc_}}f͚U2_W^!!![\2@Odlz111J!3$BƍgΜyFIII.ߡ0-bjjPZsfEFFs^vŅl6[0--MY~<|~/k9OgVI2/ڀc+Sf UVOIaXnn , --Mq@u=O,c0w׭[(J#e%"x53~$ l}5 [ 7*|dբ6m+ ht}-wu@z~Ek4ǿ47DZ4rNbٽQ$CtcƌwHII.WfJ:֭K۲elX y,l6 бcG<|ذa&LP ^[\(Ӿ曟BBCC >źV+d%))iΕu{C pBRϪ&i7@p4u'J8V7KΉwDs{zmgAhFh zQ%BEF#IfwpzQHf͚?@ppp7KdddxkݭQyp ܹspo̱y]!XF:lذ~WꜸj}Ԟ9s欄{֭b{ 93 0++3gpqeٲel~ϕuSk*F!y\ٹDWyerFL[ۗvaIO/yP͚Ӌ,u"˗x̖>t=y6MTQDk0Jܹ$͞C_^CNJ Á!4CXSI?p?oW?իiٲewlٲz'&̱Zg?0((H L&S?%sI{z t: 4 ==XK]u3؎}l^[vmwK۹pg͆l&--gϲ{n9!!!NV9` \朅kdBb"sڵgg?;vR-3g,mWP7#pgСCΔz.ްaC `0ܹs+qQWM@QM?o@Np] :~O… =zdeѢEB~~kfFUފ}혗J򯿒BtVnJ ;Bid#lIA@KS{7({4=v5;wz#o`Aņ0|$̚EDTi{A@46O=w pmƘ1c*peÅ 9r$^73iH 2lKHHk2!((U,+p8tBllĉϟJX޸*f4/]=zеsgb0`"g IDATAN8Vu@lԩS?~;w{q=WJ;# !Z7oZ/]nv庈Xxq>lc[;hZN%&sٶs[ $\>Yr|ܹ=|p߈#y)w9NQ[ XGg|9bzR]7h/ W*`Pn~]KZ.+$v3d"f3"9'RX8th@9snlf۴78`_}ٳ'aaaH X,n&^bcc+hԾ#11mb66CJ ɨBgQ:⎮O!44Q;c6a_fgAҕTÇ7oNhh(vG͛4!:* Q`4hZdef'YsrrJ,PE߿7? KӡXf+ΝcOZm$''ZJ_+eaj0E]P-2.8 ջt/ڠ7p_u'ԩ4?~4(! dϞO?-}ZnFv8Z~8C| %Ak42r:tAAJ?͔ 4ǖ/c~5 ڵEJ+BZxWqeC?+s/NCD6'7l.d\@Z:wM-_|4NwܡtQUV熴ShEA f,V;C͛&QVdeeݚ?X(θYE$@ёŪ&BvRRRHLLd˖- dY;]Q 5L8F ]`zF(:=22C['$nSP% ׎))$2kf&ѭZ P(DTۜ7G-j7l'"Z3gX|eԉvMFXu:||Eؾ}2uZ=Ǐ΀(d;VlHHv8:zÆq8x;bȸfEKF'MbόT/߿?cǎEbOv&MTNcɒ%z6ۻKju%v͊f#++Kmnnzė keY^8:33S!\͚nWs\.!UM֭Z̟+NE={|oĈL0A8FEg05X-V Lbpa9ªU䴴Tz.mPKP0ebuS0Z  J^x9eࡂ^Gvfrss"++L223 33]Q tW}׮]'1 #=##iӾ*2CUѭny愄p}fh0`0 X,, ]blظa_OTz`:eʔp'(݁P}dIf߁}$&&… ʚA5>9rO?ɓ'w~GZu]zn޼yxXx5kԸI9ܩCg}pPpqHÁ]r ؝8v)iCe: ġ|:l&eZR֬%~}kV?Q[n|>֖Å8agw";z2c:Q-[Hv!gv'8&Q7qQ@Dhhz^";{ժ,%=&1n1PsbϑF'sR:t(۶mM6"##ݻ78pÁ(t:&NH@wG}Ĝ9sܿV` v¯{L|&&yWV~MiԨQ 6 ]_رh$44 FGSjU6v]]V հjMEݠU*K/j'P'Y|6o,_Iz%]>|)Skٲ6..N $$ׯyy1qfhт`BJ(I8vv dGr4Ν;O5KQ+Z!?CDcnl9kǎ;NJÑ#܉~l6OyūZ͛Pً1'HV+F"᫢6ItĮ>MܭbʺA@~`q䥥d2O?1mڴ|Oһwo, >3Cիf͚PV$IТE ]=B5ݕyY3l-W:Oh^C ǖ/Ě54?]P X2./GߔaEN^ز݋ݻKMNǾfAil{lXZbͪ 9\>@Qu:e?q^zWj[ѣ۷/~T^|E.YxWܺ5MjsKSBI^83gXx3wb[UjU4mBfͨS'N3 PlT^urVFÅp uٲe}-@-[,?rHvmۊJÆ*731PPs=Qe+p|Ujʂ t,{,z"*OE/bdd_/Ұ8]ͩZ*jDDDhnN#7z= H AT'\^jRQ%}l_[Aw=Chs ;;xh0lX.?zߒڽ{u>jc ]DRAc4[5j;0{lODFF^q͛}vE-[rݷ/MBB>@۩c21^=~'Xqk[f&k׬e'y)P0(UTGH:uСÇҳgODdΜ9hzF&ĺ*P}OhTWA;EATJ$('~.֭[0 /ZzNO!9TtTEy`ݿ EQ0Uȣ+?KMcc8]} ;Jf _.o1߇i8jwN\~Evs{=;Ny⧛W0cK?$j+ EAp w+eРA| 2UPI&n2q{:e0 zYe$ V:EDX`bgXNu)ȣh^:!C:tis2偸ɖ%ڵkU(Τ)^H(#XE!,4̌zWppǷh4ع{x':oR Zp=Yek+ t `i;vwpӈyzU">W( NaCiNZͱ8,%얃j֠СtHLQv{ū]jҬ_lbzFe PUy֭Yǽ[h5{իWjժ={KOO_^"#8~V !`0Utş\?(\$Ynѩ] 24͌QFǣ(R<6PPjԼA. iӀ(KBQrLA-o qtwF(b^=(b>wcǰgeV>(к0ZQ;-!J^t7@&;^-Sk>IT[X7iJW]Z--Z(2###)S8nْ5kQ>>VˁtؼNI(TE<=GԨY!$I.v/ EQh޼9)))^zܹsOυA0g :'z䱹~P@Q IYIIE%^EIeW>T0wcbbb۷' *U*( 39E +yLp@g$xj`$>C|v/D͛ܠEڀ4n<yL)^^"ltO=JD5laSOq|J6hЀ~h, zΝ;WH+SNsvabӦLjْ:_^A'N¶m8zF+G:|}FP|E:oС.]^动 q{pU\b#@jjjӭ^ %';ǹAv<\' t&TmVLݺul2]v(XV:G!]0~W\>>9 scX=}ZQFIΒU6AԦn`Z>4ӛ0g/Axo f@.]*p'N0zhOW  i޵+uR\:tf͢8wj/ l6j-}uRh4iӆ 5j-~@pWe+P(9" /3/0 s{ڴiSTR`/P,;:YXND㋸ PJX9~݇#d  Ṽ%1Zg(]_ؗFlawb8<.ԩSŋ3bݰVm۶h޹Z;vW^2gjY׮Xzm`5E K3fZee zp]S=!a%q(F&MСCHpp~EtpF8CN#dEv%|VX ,g^pp@剾h1I0 `,Lܹsڵkk4h@tt‰(rlV5@5/%.q*ѥ7)O_[8op׷d(BO?#}<Z3٥0Vk׎={Vp1plrvƩMWi4wέ͛pc4SqX`-Z}]U_?N<7naѐ%I>%%^maL&w%$lZFXN;oZqȊ\$sҝ8/1P5"""&6m4CTR|zAq^׍'2N{ы6XPdZ+Ÿ| F&j~NTb!a` /xp݋&l{X}nu:ekuzITKfKGź'K9&&ロ p8HMMe…l߾ƍZ/HөUC !!!qq$aTJSj9i63a:¿ۻ$ @,V0j8 }FY/$pŀ$Itԉf͚OjqXp=4x 'ʸ ͆lvnU1׊q_#yDFF5xakvtZ3#@9^CP/o"U )ٟ鉉,s= Q#Q%~H !߽d޽,=s65:u*GxGZ3ՋmЧOn6z[oźu*h𗎌 &OLxx8?8ΜabӦ3nfaaӑ+=s&_%%|"? Oa@KeIhDѓDo9z7oN׮]C//qxB΍,˪a deg(gTzwMZ结P(ȊLpH*nS&..N۴iԜHrl6ZQ,DARByO,VeYy={OPd*VVH6;+`^j a{4: ]p0@t@,}IY*h+AF#'Fɶ7,5i7|3wuk.">3䥗^"))~8pFJ*IooOرLڕH|t:֥?h1os: ?)W H:pYV Pt3VK46lHztk .Ht a˲\/2"p_**:p@k5T%E)B&P~ٜu!}ٙBEfbLdt%*N삙?F=8TE}eg|Joj宏2Y>(j[Dd՗k"`DE0|>d뮏>"o ETV^z֭[9zh3?--{͛sY3/^;&g~Cp^F}E)ό( ΝẁdR$#!&&(:E ~GIh׮'OHIIy;-2( $ߓkEF$2겠{@M/(ʚАP([2[a<٢Ej'&&˟'{ z 1}xxgDH hݺu$ Ap8"^_{(B~~e)* '++[[8A.h4Lx4j(} K3NEj":@?W Ȏy <5Zjtկ: m6U\FXfv%~~js_eDO>wtOW_"eƚxpܯ^z̞=GyB( &ۣht 87|.] rITy> غu+C v| 䧞=|^oߞ \9sss2j3_8@ {ORw-1GŐe֭[ӨQ`#G+ IT,8PdIqV5R+ @Q󙙙EYq;fdEv{Drm5o<^zw b n$AȲ.!,t8_ 8 ͏Jno Ə/^c٘Yȣϧ#jVvϞVV[xH_Z ӫSf5=>/'R҅[zh㥞ٸ֨qYw;߯G-db„ |TZՐ4 k׮΃>ȋ/H ^t:72Λ76mЩS',X@*UXw휸>mAQʇO@agz:s#Ee: v=ƯoP8۔{׫WMc:.ɤEEߕ 2kXW*S3YYY~*W) \?HFB[, WR[% Z T5t_8 PfB+o ZhA>}HOO^z̟?9s0c <)k0wZg=^F{-OZߟ|BS<}z耋eYYf8p lߕeLAA=*~(2١ +dff*BAؿt:u]sw6i$x|̓hӦ ӦM+6?@BBB0`@9w :'rjڔǒiR~},|DܬY X_q3gt Nt. PBCC]65jԨln;$ZtwCv r.qU̐ T߳ /> FQ U¦UR5WB6 Y 3OiUjF . aÂ:V+SNe޼y4iį[gc0.$%!z6^O5tA%0}= &!huk F>93;wz=_DF2|%AQ XT/WCOtgfѶm[)~z;?G<Ə?~}0n`YԆMlzErN*|]~¿_?_|ɮ?+000SҵkW/ ,ӪU+""":d¸ѣsbТEu1m4֬Y@Pؑu Ȳ`w(q*/7m⻤$m72E僪soř 2+BTT 򐔔!vCGӁ^ 0 9sw#"Nݲ\n7gd;rw\PȄZXgJppקVZ(-KCJW[Á(hn/ tI/pY+k/ 3cǎ%88ث(?֭[b [,ZѥKixhx!p(Tؑ~?|ϚǞSr]9~=xHq}iTiҤx䥥hp.b[nCՒ7He5jD5/ ..ɓ'<(ܹs2e _Lmӆ5j;4t:,p8FxMV #yǛ?yE̶BBTEE{8g9J HowiI6ml&n}^}ݙ||+~wBnI&~z֬YІ 'SiM$.Z 1FMgdw^8@iaATiVM;uznrzիUьDMY @S58Q{+ ;+, WUnfz^|E-ZW>c}ƿH.^6k=7UM$!u6mBkMcݴFiLL  `Ȑ!U꠪*M6Ih6>u:L4ٺ3+vޔ'fcI~>ϯX/x-zG98p^B/'0vXGn@6z811޽{ӳgOTUe˖-,^k>,C 6,:٪"+Kr2(%%%A[pTU-5GT`| HHHP=l0q:>k}{׋%POW1Q 38zG9؎P}7OHΝyS'RX|u+/]N%ўc$}B0ڟFǍGiii*at&POwڵkG֭ٶm[+V.++;(Ⱦo15Uãx8#:EiGnw _hF-hٲ%nj@~C_庇v%_WCI!{Su8O;w$qIǂ 6a\/TGRNȰ9\o Ҫ.nݢj11ݰ^$ .Ç-lw/PRRR_UU֭F=ᆪ]vtڕ~|uVAue0uFR?[EEv"jz#6OKcA-5TӍ%}_ MZZW\qiiii, C*_ثxzxd؜ٴ6 {r=f"A%acpQGV1c iii!rcܹY׋,5vBxWf۶m\۲%e]5͚=1˗<|9'x>ZGHg^N0 "F41ȑ#M+F3}6{^IJN=G~{UIDyE Ç(--%!!"`Wh(r/񂁹P#/f -i&hf$ Sr&ZW LnݚaÆ62$IoU7nkioF٠7GJYc*ҪOkrr6mȣpĦ!IMð:(.WԌ=)~˒1PA,< >/:x`:Ē%K(..n/߸q#w{|!UdL:۾=ޝFqqbhΖcǘ~=::&"hPnhg ($2 '7jR݈ٿj!PXg&&rd?3><11x~$#z|Ѓp@#z?6|5!! 4ςiPUU4$0dz#zM@`J=܃f/ȲLAA[fL>7x#"?ot~~<W (XcbHݛ^l" ׋(l-+ѣ9˯m޺uk^~eׯI|*cĈl޼uv:V?΍7HVVV?g޽<̜911<Թ3uEӢWf v"a0GsuMx{`߈096D;`Ɣu?@('zU^/d[qU+>/7(Z;[3 !:f=d$4>g# Vɉ/\HDAAW_}5W^y%SNe޼y{o3EZ\qJ4C04_@YYxC ੧⪫HDLoEff&mڴaڵl߾UUv;dĉ0b4^_e̘1,_uDv6k'}vxv VާQwYttFA[{a"`(SB(-Qn]\.w G}7C`^GCTI`,#7P,tƘFsP)똽7nxxdIBqxς@|HaBBwui1eee8NRSS:zhgь7͛̈́!v:Y#lx-.zi#8Q&j=,}3-hN:1n8RRRtTH=z9|pP7j*4hC'0vXv @tҽ;ddD~_cϮX~_划R,>GA83#Ċ o {}A?vU3 gh6 -p8{TZ)xY+n7¢MnNTrL"LѬY3FGv9s&:uSNl6HЭ[7ϟ|{A={%g.NQ*i_nay&YAxIJJ &SgذapB?Nyy9SN駟fʕ(BS;lnԱEn?.&_ϴqGԐ8"܀phJ v_]vUi,5mAc:[b111q|38oX6iȇX\.iP~`J@xH\i/7At6czZ&>>>ogl]6mbΝtޝ-[Q\\M7ĵ^ĉ#FX5q"^D /(hqzT|+M;v,999G( \|\z̙3[jrA+Ils]pGX5pO4v;N+{7 䳈xx=GD, ,FM(2HOO#1Q!YqR`>X8CL]Lii4S'4 ESer~_/X0' E7 I1x<dY-*I$/ڸgϞwEaaafbxblBϞ=_#ge &yfƏ^_spPz(zzɯרiks˱ X9eKDێ9UUq\QZI766nK.O? 6`صkyyyf׫ǔ^ߤ04%Kէ_F\DWú0k{бe,K~7>6M㶁>0 6у IDATI(**:)w)QDro<R) `1hff~lbvCzBi. i>ւ$,pBŶ Ϧlw}B$V^fQTTiڴ)999$$$$If͚1c ͛?GV䳋.-7g> |d [,86AD֭[Ӿ}4MN:tСg<#<ü~IK32x i"BvfV:C٧1G:xi-#YMGzu},E[iOuueEUU%>>>׌'-uï)#@DG@UK3  ~ܸ^ 2D/`$@#u]GOi]v_-l6̚5k[<ӿ͛W#Y-}Gtf_ch&d|׭cFn瓙nݺUkFiI kǩn+uBBt $'{?gOrL:O_(ELBY@K m6j,p -‹/4Ȳ2V#ꅪV`1DC|||)Ǐ^SΧUPՊ:TU%11rVk\M`>؍l#BO(Qi"9Slذ!F8b2R^rRR#??5kPTTҰK͛ٽ{7]te˖Ȳlψ#8q"+VwKwa[)ҍվw0 ;pGF!Ue1h֯DZcGx*R@kP]H6F5 O3bRO0.c@k믍 &Hcܿ#"UDC $ުSB25VfW{!111ܿUH[Uq4jԈ;wab 2sX,x<.]ʶmѣ 6 t\$$$0m4V^̈́ "vGt@N#9 5Hz缅&+<&,ӽ{wueѣGRRR^Hp8޽ExWoh{sMbhdҥ{V} A#QAuwpB͔Eb%ToߞN9v(NTVeܾ/xmFt2n/ %^o$Bj/E|jp8ݛ 7UVY@_'..ۍ0 y fa`2,SlOSU-8Gsb46_׬Z??!}xN ;vDNUGVV-Z`ܹ3,~w}Gڵ+XO dee1sL>s|͈d]y$(Ir? {͏hۆ ҿ"Ǚ;w.mڴK.8Z;ݻw'&&3f0~xTnOzh; 'y_l@dBŠk9D@1 aUsM!! >_tE?0 Nf>A% ll7L_?2AtqD^Eӊ^|whFHD )U STTD\\̸P7bPU~!Y BT|衇X,9,%Em: Q_z)~bͥm۶Y ʼ8h׮;v;f(--ꫯfȐ!k̙3'Y i9dy]6([;ecv?lу;@X,v޽{&33#;ocǎYޢ/Ҧ^=4;=V+N%K!@?<#Q:ej(jFHS1\wpx4lѣ(,,P d O@ x>vT| L=vYxqDʀs۷oOii).rWyhU%cǪ4tG`'0c JN5H$_mncfp A1l0Zj_ui7Uxn˓fxBZob8ʚӯErr2 ??UVt:C6mĞ={c0#Ø1c9r$/7n ;N=0xL&MsS%6Ǐ8/m۫W/x Yn$6u4UVm6rrrhܸ1P=kfq!{>cx x:; 5.?3Ώʕ,?** oFF8g)8*z.E"Bamh÷OwLyiDEد!nI/j79c :Z: tB wu%fIlȫ(Rmveln¹i1 CKz>H$مsM%A{= {2lDΈS)y[hd 90|'rT*S-$MCU&--+m۶qƐՊaɒ%lݺݻVQVVFÆ yw_4i'|Yɭ[!v7|ag))R^ࢋ.u뒑͛ٺu?cJYY?#уdSj}v>#.] @x҅?eeo֭v-Ew# g"ߟ{oAD HC "_*:YTDllg+kBDG`69pYɞY* Ț28qɀI4133+**%8l4 @'74Xe`jL[!_U#I(^g$SfKn;bG4bgi\YG/dJd` 3"ߊp"ضW>N9$zj<7[?neK֭[w8 (jZ\ʮ{oa˘$q+ZX' ;fEd* СCZ3O}͛ٳgٴj*(?p8L_~>=pPQ6r{IHO?D],Έ6:t(cƌAQB ץ~\veݻSVVfz]dYrzjy4M"I׾=vJX8RRk Q$܀|,}".Á%$O4񗢇c Hfpl6`p:\JJ)Pث yf?S@x ƈb"Mb \{Bz}E*9K|}^*RVaR$* ^tQ]$7py G,C4dYfE .U 4W8+RTilDBB4z;v>e#o4qP(`=Z%S,qByԩSMRU4LȚ&QwN{+VQ$WdEEqq?E7?t8NGű,#fEC:YՋvڱb =X,Y>_$5'bAqj1$aq88cK{ևYvxʊ=j,|ꋗݹiSpߘG웵{7/^&.CCU" g?BzQ\\Hs~Y*^TU2FCtCuTUؠi3H," 01읅sSN~u(IӉ*Uo0Cu)r1R(a%lrp{ܾu+gƇip;7L(QwyPZVjX,rBgK<\c>uJ0KsO$nAǠXdߗno|<;Wx|v3fΜoMyv`儗X9%mKd\t! v%aw(hd) `DIQ l6?i>dMcݤH^ Ãh1 49g6^/hA%ܝ:}]nWUJ>}СV]Cq233ܹ364D( V~#F0iҤdvvQoѪ-, 'O{Q3Vy1}tڶJa$?;G7o1˖񅯒 |C>"_xDuY 4PVV&jUĩl]%T;TM0)fPEQHIIANS.~˹SjpUUINNﯠ&pnXT|To};+aO׵>p-P~{ѡvZN'| ?3nolej=^\ SRր6o @u4<09}.B.b#Ƚ& F'i9}:_K&08o B1# _!:? >J'@= `_'aF9`l|7{`@%!!!2 :'읅suoKD؟j(**b߾}!7nξJ7sT ͔ @jj*7tSg$uV$ɯ7sL֯_Y!XNPܼ x fY,4+xdzOx z4nܘÇӹ?, .e˖1k,=#A+++#77/dYW^=e˖d\.WtH8$]vBfbO['x {3P I ,:t~J_rs~6虉0mz_"H. `ފÿYG P9Ր6UMfPCfy$90`VMQ`a0 kP]'p_P]XŌUUILL8"e622>==J΁EC8FU𗸘dz{].6mdT$IBe6mX,z'n&R ) 2ڼVY_O( 1G)k'1 f#%o Sh IDATҡC:5kV.X PZZf3F59s0|{G,ӡCF\bgf͚ŦMB#éSӂѪYC9Ueq ?:ą_ 28 0}.?ͧNq"gRo|"S ݵgZ3"T@B"[r="pF!R]==!!HաRczuQPPOpA; `{}$I== AvsCLz ɢg8)K/Fe5kݯ,(/¼y8yd)뭔Wv:h6o+(q'trŒh {>$'2.4Mjr2d֭2ϧW:t9sb SO=_kF.]HJJ{F$tN߾}q4u1o<*-G￟ޟrwO૿2|pKaܹD-J5IQ駟8PRMNDI\O9SÈD2[Ĭ?fA"|1w@_գ?eeta,E/ 2PW_3xu5I#j:Nُ5V nW#uAg\`62sGPIT?j :[VV~͛͛M5Nx<~`ߡyѼysrsstH^/ y] P9{֒b ;GXȘ9SஓwJm슜p( :+VrBlݺ{ҥKڶmkںT$}śodժU,YK;[ Bٳ' Yfl߾k׆llX(--eѢE4jԈݻW0cƌѣ}%P$U\̏p]߯2`l_s TխV~[RU#.SD+ޛb}H¬ňZ1&q0DS9: ԊkCߏS,2g. @OD0fKHj7R4jmfN7s.SpR|U4BDChxꩧh޼9餧 h".k,]DجՋ,-[ÇCfq! :wLǎRIU7bn' I$ HɦŇp7_FZkdx<4nܘ믿<6nXr^,<˖-cдiSSA;ӇXN' //={PZZʱc(((*v 33-ZмysP>iӦ -Z`ݺu!'p̎?7|Cܹ֭6^Sm6e whՙ8ȴ|G3Y}u[(,e诇({+apZ7B Bjo%߂/"v>]n!xe SHj0fQpYY>ǝP AY΃\r@ذvZ^}`߸LT0X,J9R]BU5$r!ȌK:{@jj*߫,o׮Zb?~<ѶX`ou./=;^\8))sV\IQQQHb!//[KźJY,$ڃ'.GŗO")j:s bERTT8Q((BNb۷ZYb~'5jDnn.)))!5tNFFM6Ti ˲ "꟥)*} t5MbCVV+Wȑ#!,6;v$33xeY_ t@v{'aJ˔&.Ko%iBo}kg_>5k!߆FIԪS=̜`%8iJ K*[Z~:uBڇYxSO:ebwốPsZ<xWv;=zgϞ~7l3G^Eq;hKk5\Cnnn%)O3 LFJʦ ؊h6,NvEG`rzK.aС$%%Ue#G0w\-[V)1n7. EYY%%%r())W.i;3p@_~=֮]7|$ {ǼyҚ7o{.eWa!:D6b!ui57v G(ׯ3"V2҆L]cR:RٺFj_@5*h9e^1( akTmS[O}-fz j>w#KhР7pCխ[w^lBLLcX5:)Tf'[ym3T/Um|N9{lZhAϞ=q8}YY4Z|MȿpE@ ;mGwԍ& Dyx<$&&r5װ{nVXc?? Mvj UUiԨW]u۷ogÆ JJJȠO>uis<?^^ ?Q~>0Bo2"/#oBKOBh, 1BK~va;54ӘX[1xg5u"ٺ&9KތךE @12+ߟu T]!QJTM ?ݸK#hт+zQ^^*ۆ$iXطQRjErbT\n 룘Ebлwoz>MӰJ#7sKb~4YƛGFG}f;pU&I.&M0rH:vX9 >^r_?A邦im֭ۖ[Un:Le$!.vIE޷K ,ry8p C !111,rg*ĵ D~X89ZHh5*.㎛SP;;И0 ćo}FKt bQ:@!,"Df!Z8fWC|=835`G"@a4 ĵIQF:PS<ИyEEEՆ4MC  4 MUC g'`%JuSbysʦ]v7vۆ$O֫Чr( is-B֭C4MpPTTW_}ůWf٧_b;VhV M?Kl?S.K 8izZ 99ÇӧOVk;Iؾ};3gdΝ>р3l0u,x^KE)26(e4mFY,Zltњm2&D=Q bFFbzdQ:L(G4MCE5:15Pe0XhF"!Pk+@/~2YzwSNپ7HQQQū#tx @Ӆ4ufnV `m['qpb}9.+sSL>k&C:T~ԄVMhӬ%뒘K]5p۱t֤( qqq\q9rEQ^^n7nzIZ^^۶mW^4mڔcj\'+Ɇ*f_G`?}`ƿ)mǭJIg䢨("9ukF =Z0~߁BRjz-يԶ' T5-'{^{w_O}h4Ș1cر#\\AJμyH`]:,V&t =w%SJXU"QC=2˒ X$U"j{ܝ l=6 P N >?P}Z$BBBj)?2APYsgY[%V,#1K.C0Fx|f&3Y%+g'P\Gb6 e*`Zh4 >#F8BT,YBZZ!X,BO&h 9vAi~fBLlZQ(HE2"Wsa4;vdԨQ4oER֯_=zR>(ppۄNF@ԀF# ^}]!xA).TV bm|bb.ۺP/$l[\%$gJ!zNZ 8rh*{\*gxK {:y Ѧ69!;/RZ&ep>@W)Q,Pe e8'(. e&TV&{ +F]9(1H*{d"44cr!lقqh?Nnb7*koefwhoLTZ~-V @KYN1K薯%q !yib$TfQׯmڴaǎwvL,YBVԩHՕBy9e]J<p3 (9%\'G5aͮK|"ww%8Rw(}%wL88m޵d%0 h}dIexݕ!P ܊9 U,v\c0執WkW11ѵ꘳kH+fZ}9oQ $!9+Z%$AB=6"PPPP: MuK :?rs 4O0PneMyZ Ѐ]RRR~;`Wkڴ)_=AAA 'E%Rի9¥ӓ4XДoVo ~c2s6I@h8AiƨsmqvEIIWCĉѥKZlYZcעWiҦ1X׻%Ut(> Kp[ô|_`b[@!%>@<s^<F FlȲ.@RRum߯lT:=d]SZ[؜Bښ4k25jԈӞuV5w;S@`w 8[{6t5wUp$IL>3gry5 ɗ'$:c >>*teQǡ@)loZU1`' Ջc챾=m0##%KYFh(l`Ph,qcY}1F8D%=?WK؁#z`< KV Eo4gԨQoβeɩuXbT x;f9ud \ gsAT+32OH;b eRo>JHݭx(dCCAx̎zSB ,*ݽ F@sbߏ蚭͵4L斆a5R B7s}wW.#ZA]{2`_ZpdTF]lk+/[RRSSyט={v' u -݇$gtؔu[PVSJLLCW5:pQ?>zy_)-yί\ع`f uЬ&z #"(-^`00n<:y ;^يt4`Dlƀ=lOkiXxJJJXrg[`6o̔)SXfE͎ ^#w~1x0-EDQ&_b(>1ç)+@XXcǎGc J͛Yr%\ƈP6c bp~E48DDk:}qc1FDht{b2M bnjmFdddq jL/^޽{nRoz9qύ& w>A5$!ͅKRjsWo ܴ9Ry/E(e7EK?SkQ_F ?補;w1_b/44dd6@|${ٵzHs3Y&wߟɰC),(߿zAק6+v5cu݃{d2} ח;&q}\1CҒ?]z*|nn駟gW_y8xŨ V:rڶDu$Ĕq.ӗK>b ,\ŤwZ[Vh^Te˖7f͚yUjj*6mڄ^wLy\#TFwfdϿ/ 薯b}w&K\ cD${㗙UlP 2o{WT?~Eꨜ'|͛=A$}#'3<." g`QkAI*&|\m(B:MQ(yPUME>Pvf`.J9޷Q_x 믑$^{۩>Ku -߱q+N+ŸOW7WpZ ^U' Iz}953 _~Y p]M`x0M(^9s`0ED+ &wz9 PeX˻fD?SHagRbzz:۶msZ/:.]O>w… -7} 4S4"-Ky}Y&?pQl~#ޛcjFýKxx] h4222Xl{A*LU$PӶM qh( Ge``Ƶl[R&e3tIh l׳t:Ç[nh`'رe˖[lٲjݍq(b7/SP1b(b=(>B 2Tof@Z^uf3o# wݺZb6#I a/ pPw]wEʵr?K \O6ɌpM6Zc!\e$H dsw; :mD@3ZOKJx9I!!!poelO:ū?N wE;Xs<wS\G-- @v%EfQ'TKh T* Ɛ!C]ȑ#~@jc:h|]~${gTF"*jKȱSFbI2F\x}bj۶-Fr(Vf6l@yy9jwUθeH*iOVùy,eE$7<2J^(U:upeE%0E8..YfQVV+R!Lyf.\SԠPoY SP$ץswٕAtg 8>us(U_TAZ%x>BB[Q틸AC0h@ IF6n䘠%Ibnq;ϹBn](ҿVI M@=y*4k噇IvïUYZmY PRTV{8٦M+AVٵ$J*d"f㶠Po@ewBE:!匉^募X]O-[dԩ/mĄ$1-bu$''ТE 4 EEE]7 Idɟ+WR֬1BY8ԡq#uFe0a󳯠[+zL`` r  =! YuQO(}ԽF1Q>@}a>||?t lujH)$[WwO}:#GDպ i|G;ޘh0S%!1.A,Xš@ӧӣG*3A@VԩS25joގ!Yybu;ٸ3_EDd!4m%M&Zn[o??? ;vK,$9O?ovbՄ=90CT]&N#bAR{cӞA]Wwdx6Ν['ܓKFP] @#pc&*)J(o3gΰj*:uTs͘1¦P:ꅐds$II^<*wr*wy5dYF_P>wmڴMQ B,V4i\s Vy{ dT+ŭYe+}/ˊ.h!YݫVǵ3`.e'4iw(yV:)ٜhc::: /ЬY3L{Z͖-[xYn]ՉaL}"K%e~|_˰ x\*Bgpkpi2:`0ɝwInDMJlf֭,_lGJ49?b$9z+FJ7:a A'9˜{$Tv%?C3zhbccX,,]ԫU]I/7$7ۮ<2¯E)3cǎ Ҹq'CW_yk [^_SԋjJ6`$$4@ٵٍ**v#?1z}ysj%6 IR* ?(YVt8pFJfZwٵ""._u_5 8+dEQztgyup~)&: ?˚ŗ*`A#?~Mr3-N9V1 -[^`񄅅yȲ̼yxg9|׾H>4K:>^u%#E3$FQ _ndʶFVZqw;XވŬ[?2?@l`2>yMi ;*cC Çsao;!3ȵ:^ȁk РnPML2_ Y$&O͛E1,JWHC7Fw29`6WS{lEŞt-0NJq, [⯿>=wiBVr*1O /_YR2$GQ +O]M8%iއ(9}̺-zfI.~ }Cf2j|&w?]`ߑJW^̘1#G:*}}9sf/GEÔ vXh%_Khx6hzɨQbx\p˗sNdYv#ywj-l26ldI'`*:B.rJ+؏,d^̪0Wt;~Ɗ~jRdeea ,Џ@f̘J?aР,O~lV>N!mIr"VcPp~܏c Va;+xwH=ca8L$=ŠJ*Ws8j$j̘1nݺyWL<9sx%|"+֭۷CѠrR sw(s|_9UVTg 52tPH@@~'ǏxbRRR* t)4|$voJGv%+dcjaEb 7ZC;jɐ{ȊmPTgjiӦ̛7<&NxE]+))qKy( `QI›u^l- vCSU DAF)TN w*cG?XRc1ߓ)--uh4[oҪU׵("KW8sg zsxrEJ72#0mB,,= V 2X=Ãhs\,::_|+?C`}^0o5kOԤEC蟄zX^/oB@J,}g@ʮ/je/h>̟?~:;51/:,$YիCoP#ǟ~rrrf̜֭9w}x]=|+Vy l)J2*I6y`sŀ)pQ ;-GVe,@n9(|\"0${^(2w\&OP;4ٺmP~۠\ᑊ[swh6^"QQdVZʲ"۪U+ƌCVBwEbV^htx*0b!78\^ I8Yo"j6܆V+&L`[< Qnpu)Z)``x%߮_~޽s7Yy5k8j مӪ]AvAs5g;<j(`!'O\dT$a!رwH2{ FWBVukQwxc[|-F#o@rd-'w^,f3(@xD>p7={S=^:n!WQe$)kw(" !K {$+g1qD@.1Dv!Y<7>JǪh:t`ڵ[V)--孷ޢm۶?mj3&=ft A LPē%@C#_ x8}ѣ[fǎ\xcJEVVK,!99.]TE9PA t22.,6)DQDRVnTwޝ={2fj5F"%%s1|TW 8\r(zP&5(Iv?ǘ1cxINN*]:u*%%|O*ᵄժrTǦP)~_y񇊙[l0!qwԉS4mM7`Æ/1N*f i5Zs7FOٳزyk-T2mrǘX,VF< Gx]< FữC^vgn ^bH6(IHVT35y8uT.]ȑ#>)mSOxHD-=Msڿ#&˺㽞7 QFq 7xbv!21qD=]4+p3-4dpMˉ18Fo>}R5!v&? ڵBa\N8AZZ:uM6Uczd~81qYBUn/*7ӷ7Z#Vǯj%::___~s4Llݺ+W2gJJJ;"g>QĔ1gqQ>P(2@/+.;kPWߡT8q"=: .f;kzd{ * TK@yl"~Yg8s׽LxXpNfO?Q̙3RXXHqq:A~*:冶oJƒ5khUVcI(E5}fx7xꩧ kD^eS"WP_`(PlQ/4x={h4`(7PףחU,3`M8h4^]8(RVV Oc*Egiٲge?=v: H_e IDATHH~~De3g)+ٵ@YYyyy :FEE),2P~^R$ <8ZɡR3ϙ26Y""UKXO>MYY۰߿[Ҹqc"##ΡA8fE%*2_ηiwb-Z=FW-2$%%aZͭVtu&TnEE:?*ZTvFM~!<Kן۳7氊c\e, X^h{;v ڶmKi۶-M6uȤZ$E}0E2pA:߭8µ9Y,V "G҈`q<-9(=o߀}~wQW=5,zgZuÒ5oFBقll6a29%ѤIZGlbxRŰuF^%nƭn}s|||C,S!:'.pE*H ̛25jDl@*sjRSiϼ6j旅iѢ. eҰXL # VM'Τqi\+ٳ[oj+psFEd#6Ѩ!:B͘ DX77n}8#n ,pEN 7܀J"-- vWR0lذӧOӢE ܞ_?7g^̈f Y|8b os0(gΜa͚5? e#ѣ;[4C|&3Nc.~[KyW5K O˷*䲲X~C9:]}bޗqc>*"Yj?ץ;H}Gcұ~48Eqr |v97r0m׮C}8\Hk f͚ž}X,X,~G:ގ;ؿ?wf֭PTTT[niӦѿZJq!vM`5OoW F(SVVR켫\"#߯#jo7L&ٳgkl\C\mӼys!/v@qq1Oj6CҸgЗ?a8++ӧOW++t4,ZUcF3LוeL ˟)( WBA?"">}`ػw/;wDς Gg_#4,-F^_F]Φ]aH!FlBHFQ&dY@XMhDEEZIBB>>>[AQHXYВ1z{p.}EDɮwf {lf:wL>>m-7W@t7@j뽱Uw brv42?<Cf3jP ?Fhr2Ī? "pEJ"551!J`0qFIJJZ%0ef-d^ȗ^I5wiײr殌Er"B,X6.t4mڔ2.]TtuzÇc0HLL<>eN4^R5 Э\NdD |W# !/ j 5.Dƿ/BCCٺu+}jdYfƍ9rߟwΝwNlllr5tRfΜP?P  ZmkLx~~~U g@o@W3aG\Q\\̙t, ZDXP8AH?}6mϏ>}\y|p tcۗ8tȢ/V <<]ׯ<`(?-)\f@/ j֭[ӳgOfJKKiѢ4Fs U?2'Tx@JD'ٸ+Ai9}U$4 ͛7'>>K.Q\\`lyiԨfQ(nD}㍤< q4e0Bz ൗj5 yH/?,?@>q4mڔ;\V93W죡DG9b"7_k{K|^|'|8={xh4V+6mѣ4n!2T?~<5εBgv1+NClb8D.?5I}y9ZXzy 4PUk4@a}w~PH$=IFdVCz缄"fbȑd9j{zZ5н/+61P GLT}B/b&=wMʻeȑtɣ[YǏgڴi̟?fӂxEޕq$8~)}C1[ (εhZodСb4=`4 GeV SEX 0a rR#a-A@Bޗ}""@޺ { ?/h׀oĉ)Ijzc/\.]KwgDbvHf;7]`w+{ko2 "*Z٭ZIrJai8M.ҥK,YRwEr =^`pڵM,4AK02>XSѲeKOHS՘f̙Ì38vW|#ky%MѐD=!Ry=),Qů^s*,v9r$;vt0=y饗 ~Y|*kz8!2c_;!m;!sq|MMFqkhɲJS7~7?kїz@=zy.^q8v/,U*VgopcW h+AjOQedSmk[$;1`tЖjXŌ5_|t(1Ná5|<=$ASArL8NhZ16pgy ׷ѫW/{= /JZNNo6|.\h5f>,:o߉"0( 9>wBD2+:0zh}}}9r=XUmF=}{᱇= ũo}+_}/m~ "j0f0ԬR3ڶmwAyy}WkyyyL>[ׁz,Kߑ'HݿtkJ6XCJOH} Yf^]!P$ h.gťP=V55ÁonٲӧO"""cEQ*>o#A[)O`RƿK(5̼Ob,vT*ڶmK߾}Z7nMV3 ).Fb!4^.!YON=rHe,_On7} 0={rqɓ]Ht:3Q,A[/@KO* /3oQТ9w_"97!;26lVcƌ!99-L¦M<5&-azQkXt hK%fFrZMTdAAAUPTTӧ" p=ו!] gѴijqf_-̢"2e #J dQ\ϕϞ=Gi=N[Q*x;8##ٳgS\\_Յ\*_v2p>ӂ,L` p_ ___uu]GZZxEQ$%%-[jt P~j4"##IHH .NJ sWp/7v+!.Zba<ZK %ТE v! 0ƍ~ݦܹݻwӪUcEhJ Ya̋ra/֭E$G  q5SEΝ;ӧONh"/=:jo5LVC_U=Jb13O?q饗2` \Ԛ5KZX;wOOv6n2C38c^V~ZLTx+_g~rjwZV SO=I'0 0&&~St:5ioa*+]lBͣWqs-eҨ$Z] ٹcb6Ͽ JHH`̘1̚5X IDATr%GQz (])h+Wrӵw4OE2PE?Byy9>`^v4Q'jQb=?s3xRkaG}/ K] Qr2,.M3=կ(Q}+p6k]/rXr%r &LKw-Emm8q-}kS[JݛL2wreq,|;U0gQ.K{dzbN?$ƌɓIKKQW|gL4?ܯ`)ڔ-KT!eqL\.W- )W) |^)'Ɛhգ/YWծ];f̘wߍb[?jR^^3<Ô)StAA(}/2I3/@[R`wAk(OLj̚5[ pMT ֞0jVϜx{1Pׇ p[. Liz P(zz=)\3gҩS'^z饠WV3ӸoTJ\52d`" Vݻ1ky$%Z(+Y r9n=ݚ ;O0tPv_Wf%K#Ʊ>vI/EQ6jX,_[4P,ţ'P 򂯬>!8q@'Nzj>?xڷo08)?,xmN |1VЯw"NٙB'жUc=~QVVƟ鷻aoڶmjLz Vwz˄( 8]p6R5&W#`?ݛtvWT*|hFΝ `;u@Yڧ_ÞLA9Pܣp0.[rh6Coys(Ck">gFiiihܷφ[P^^EҴiS ~.EEQdF%X}/P</!W-M~Q;S}j4@Uv7C37oO> 0۷­s,~9ߞ (.qBޔsNJdT36Ea̙3.]p8N.v-[0m4.]J~~`ȣrx<9=O6.o!?m.gI4i|'nKvӭ.?y%%%1vXx RRR(--[VjGq #ʕa۟P^LF3m68'h2hڢWP:壏Q[rڙ?p_ԥ嵑K"j_w=h&FZ+M:k,D%)BC)0zAV8}¼s7^g~BbD6ՊEUĚ|͊TVXͦk:vDp',X pC$d`hQG`C!k^Cm *`PWت!* OqgQ- ЀJ0 8]'Pgrrr;֭k׮ pr1*s  ;v:xse{J*6.Us3 ..NiYYY̝;ٳg*1':Yi mZi c0Z_oJqTW wx!oILc\ݮpӕq[eӡIǰUjgΜ9t9`a֭[6moF#IV~[ۖo ~ XKai,~4~)fƇS17nSLYf( ˖-dƍp5Ppe(JI Jaz/ غ &Q? wށ([~E9b=2 ?rOԚyb#]0@O4<yOP5?HC1\樺| @SpXC.8}23֭sΌ;xѽk }Ԇ S$V v_ ?R <1?}puq|^5ߏ/ % zɨO۶m]Ȳ4>'33 ŢŊb``XZ?~k`=l2 =y pӉƷ~iҤ gŢ}sg{仓">PʋOyu%55>}ФI~w ?ƍIMMEtڷ/e,~/a"1WcWdU7Z8;p|, ۵kG>}(--?>TU%??u֑M5V]VXO>z^砬m _,ynٹsC~ M/.MRIKKRiU|e21TGmUBvݐυB P粲"PjHM ;Q-|(č;g̘1k.PCƦ*L̇ [r)1L̮ b,,[Ђ #} /pyL̝;~NJ`ԐR?"\9bVz *^0xX Ϟ+vnFOcYYcbbyYjGyzJA\~*ʧKc >wu > 6:욐#*b1EqOUx>b: 7U<.)nl.BỎv /O>ݻ7, >ׂk>a?M|l}\Ȉػs=UU2dO>$۷[VXQl67oG᭷ޢHɩusS^[-c8| T84iLժ! Ma6}1ߕ`wcJJ ƍcĉ$%%9>'{1v&Cc~ e5QQ*Cw:s={LT&#Uh[T4WV=a28 5$5#EmzpV=!~L13QD?@ ֭M65*><9_jAd_ 5o*?,wWWL>.ͿMMҘ8q"{/qqq~UF+O> &~߻+x>܌ =__J&~pvFx(sKӹ 2{t“O>ɐ!C(,,c̙5~6l'v9(vۍ!<㤧t>қDƦI|EnBud^s( 78z\hD ', ^xƍ`.er.՘oWiv펩^:E3~6a-i`p8|ݻ3w\vJKKYd 'Of˖;ok>lÕ}}*gq g 3WE=fI*ݻp>ZԒR#g{f޼yoxC;wdڴi>n]Q*Ѯ-Sy(ϯJFFӧOtxBs-Ţ&ѳ𻼋#5p/@ IQDZWXWfwtєEQP,O*B^^22CWV^OE/(T'\.1K,gϞ+Ӆ3Om1j{SpEMh8qMhTϯSNۗk.XV+|ڵvU=UEN ޟEN,4^IKQ/tb]@=NHUUwgMFF+Zqc3 -xBz× ܯV$&&UN.̯KnTOw˸&q{ EEE I6A.h ;˅Z~&sm jihY \,Z]vqr;вepї*kK ~)Us+Ƿ3)¦*us"Czbbb1bc…޽_߸ ꪫ|5ѫG,Cs,@Q¢'S9B_~_ʎ]~*qR qo9O@͹ٲe :5dȐ!unذ+V:HEh,£h1g70@H 10`,8 Q%ØU8`AxKZjŘ1c7o^W M?(W:PIbvm Ǩ[2uA^}I950|֭:u*7ndҥ2k׮ok_WS66[%/:ika܃2mZhZatu[fs0ɺ7Zq'2k,֮]˩MСvZ0?zsmS>P?Xq7Pf cyXC\aލB;>`l5S,pa҂Cb\?KL z[KZ1~d2[ yKSKIuZ#Xw1:3={ҿ&4MfQVVƫʤI66zKrS+=śѥ˷+-Dܙ?Vƅel>n0H/[^@%k.5Pjc7}v˔qW}\b h޼..`HRЂ1L 5k֐Ą B?*7c-̟GZr XphA{^)sX{+}en)yy¼ :F|4K4#3DA0sLbccywB?*7tn1X- ïKd{|? GA'Liqo~*[IDU2zJ6櫍lϞ=={6SC0ydcW,),iE7?2V}V­hZæ2κr/JfjE!C:wBXd#*qENSSpUix5; Ez(T/骂@5W}ç]pA˔qӵk@f$&N&=Ŗt*+ט(SOsތS/TjX߿?f͢W^hV!`޷ofbܹ8P{é{%baK.DO˖-I&kӦ ƍcر4k֌Z_ƌÆ U^y4>qBs^sHp:S\s0"J7{tDXA/ҿUi"u4zIZZZ/ͦҸqcϤjZQU+6TͦbSm6TUnQi}|x2yW+B?*E.U1-6p}X)+wq٭p85|m)7ݗ7*UVV~z># hԨQu[lɰaԩSXo}y嗹{p*%Qώ4` 򀫀@` @Ϟ=ٱcGXggFhu^N`cV_}__{}I#`ؿ??8#?aN'#G t+e3 b>+Sb `ݗ% ϧ0O||<7t>(ݺu+ngӦM{シvVc̘14 ΑB⣋ /]0.y GڞxZǁxǠFG6 ^G_d IIIa4MrqTvՂSy<: YNFݜբf֬~-SYT}~10vX~aRSS)))PUO>#GQحݻyv?P V˘ O@UU^]n;'@Έ CU0^YU1ȃ@ `Nr\?-['<#˜a4r׎+xz{FMf+y|e1._[¡t '>QUկPjRYY… 8q"Wxh 萍4R!dU\rkH&s*O^aFCB.#LyU9 hF!<5j b>e! 8̉׏^zuְ Πm+>*< xcyyN.= \Ą99QqYth7a*{f\~唗תPvv6ӦMc޼yU\#k֬wH%rD|NPVPA>D0 >쿕PqmG j5N9| ]vn pu g-tY<ٕA~\7GO?BsٷC¦?/@&Mk={6'toѣ#aw{'ju1o5N5yZ1Q#՗=E-|ZmHlv7!@ 0'_yRSS3gNЍw]bƌ{b?KƊ"r]w[wTp5{9/$>7[[2|Xqq}1m4RSS)**T(X,RSSk~8>}:yy~Ey!ЈZaZqX!#bc"78\ =ڃ ^g@E/&SƍqKjΐkXkxkccgEWijTXh&/"]t ghSFߒ zF)$scX֬hZ9sѣ+WdvGt2lذ 2$!#0!X 1?j5\}@RPA&4`'pJnO ;I3R{KE)  zjPEKvʝw۠Z V”9Yv!J୏ 8 eK\7 bccJ8V R`[4BPD!#Ͼ'>rƹKణ }9|u|y衇x?> y8+U6ߝN?9מnNcS*Y~_@rU*YO9sfH7|?,"Ԅa2VsBiup^U1 p{ ]RLV|lBk: c'p9p1AT%\/jqK _ʸLX %\x}:?V܇ǰ}g%]Oc):|x@30DZMaO3Ρ U4^$t)3vUL@㟦V-P/>Gdsg}ƩmFVVVEad6-)IVn; Zmk++qiy$+.1lc+> ee~,ȹ#cUhz1`O3ߺ{ Bʭ'wm$G=$M}.U-)ү}W5:"?( W^y:SOZE+f5烗ZpEq\ث1-lț|.o}T@ 4!Fvv6glP{W#c(.U0O5<^TcZvuH5@  CtkRxX5+61 ыќ !Geqq1<'t˗/YjMѽgoˆҹV^z;*vpu:+ E#jM_ACsIӌ1^kE@lC/cy uL2TM 2BQQ0eotq%AcW_}5_|16m .~]̇RVt0֯_RaDUh*?(E7iw+^m߃ugn~ah0' []*rۮϧޣTU4G0W J~zwV}@cmd|ߞόC-o9awTsTUś}bڛ ׀&m9 $&XYYO Q k>m}pUd,F"8 {\,\Ν;3k,ZFEy >tdTUuKYTh(E`jY6q@; ] p+aSJ&*E B_=plr\oЅFax'QsꩧrP K,aҥ{}p`UUON{&GE.>U2&T0GMŹJџꯍ0S@q8Eeee!)Rp歯2*"@A}v @߾}#R? Rdff2t@ I}4ʂf]Y EE)@cQsS TRRByyyh< 6*XYڤ@Ov߻*֭G 6,˼SRRBFr\VΜ͔j)))C8?"@ͬ*--8$a= uw7ybF y iG5N.UEu=rꫯrI'SOUNƎˏ?go#0!T]<0eHk)--8*?0#@\XXXVXX!r_HZpm7Q .X= XArssyٳ'˗/FoP,\_~9a;N]IVw I~Osy{+$vQQEEEe%b'ņP_ uNĞDѸU9q֭\}\tEuQG 6p2X*kpH|Z,R7IgynBePPPP |K6(eEEEe5KZq/ZӬ 5jͅ|^V`o0'_:#Fo_,Nƍ9rd0Gɛi}I6U3jc oQ sC{STTzV$''477דWgw ]w0<5.F|]&B5푾4N#݁Y{\YYɢE8䓙5k!rjX>. p/"y3nSGgTQ Ӽ!U`@%''mIIɟ/Gh 0f`G;pAտ?p~2`x矃*=4Mko! G/DunCCsBM%ʹC oࡠ( ߿x~a#UXXx)2 ..MFfW|:7B\`(bYg>szIN8q"?6932eJ]wuPBm*l#+JCw(i^O PXXHAA?Hh @`eddgee0tAp] KV10<_$o&cq:ر3fгgOҸKXx1>}:'p7nwG:Bͦs;@1/.T~U׿G ( YYY۷h}D#@`֖~:p@')5] |-5Vr)@C@QQ~)Ç'--:_w`߾}̘1֭[3i$Ce2`]7B1vʭ p{V54kqHa|Znjw^lllj\\ަ2<+LoJs[7`"HH(;UN? }w|w̚5 J袋ѣ;v$--&MHII yyy޽>/JP,pDlwFGI64-6TVVr222w 5P.k\ff Ƶk. wOg>pXvеŜN'۷oge y6OLsKqn'%P1ANVVVz 3+;KV斧{=pz\ ojF_˚P|YޒV8qyvſ XUǥ;[ h0Lx=a322ɩ(,,x%|a!@pܘs^^^eFFx*ժz+*^ _4wo VkD BJz's*rss+6ʎ>{ْ4oe*ۏa[M1^խ^l6['G4.E/3Jcg]hdyUU> `@3R5PAYQ233qٳgz 1d84Ӄ[4lŔ/=aA)zÓ!@{+0(Dw9/2 `<}ogQ74ӦݿGq o޽V2(---ݳgQ)ڻwī5MKlШQ#σ;*-V+(z*╢cb2uqa?H@/膮#HU4/2_pNGП/C}ayӣ@ýk(*װX繄PYYIvvvn^^jPpB 3"??g[jRUզF D 5.K>kHBBNYyGXQ,n Mݟ~x+))_\\EKB51B˻dffrqaOOhuLdM7?ۊ'Ջns߽ZW3?Cp-A!F=*++fǿ?=Ok(27&&#,*MXIoָI].!w1ji+B YAXBS'k{FPp:h|kvaZAZ nM^4j\kyov8Eo:zlz \?ƺ|=0)2᨜`ۍiWw.EXw ==CъQ-լy҉6wPS Myw4m+ݳoC [lGmu8'8]Ӵ`Z'ģ*.]Osp:]ΛpYן42oH%r!:emv*o\c?ScbxÚl[`Ż?5IDATSu,A8lHCoD؀bnDu]wU'tT85 MsMx6E=                                                                                                                                                   DlzIENDB`PNG  IHDRx IDATxw|[ϹWq3$JR6RF)~[. B a&؉C%{ّWb;%RȺґ-B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!BT  #rIҀ{?P|Wd!DS@%ڵ뙚599ix\.+)) CRRvq\v8m8F(qǶm8p`0 *p8 |`8pxPvm1} fI Db t{1.33_zzzvdeeegdd8^`(D(RAB!B BaDz,eYcq"}m}aa8a8e磴LTiiYRRb|>okqqe?e-+m@8 ٵk)]vٵK.fNNӹsg]v~WT* Pض p2?Ŏq]?vEYRҁm2M aYeSRRbJKKKKK)--]1XBq1}=.;;O޽^{;ݻusBeee*(TEUބz,﷣z 0L1LrݶM+\RRBqq~+))ȶ/51+ `$e ƚ9jԨQ{oȐ!IJJrJU0+򦼟jWtBi:Pyy~WII|s H D ə;hРc2dӾ}{林ϧ~?PH88РJ"HM]Y7EYk{ox (jOqJ!Xݻ6hРnj>|8PR\LiYO# $jZ깚T}j]E σa`fP2\` BB#'rN;v윣>:c]n*.*D|>,˂:*ma7؞T zZ l`"im; P(? @ 4hy#F8qD'''‚)--Upђm 1?j0K-p8\sEfWTNԤ ~uF2N]AA}zcP(dB˲AOZ$DLH DfuQ3fLI&9J)GIqTW[]ԷR^HJKK)..⒒Ғ~?A˪u}ѝjצRTd *."D(44*_AG8NE 7}B$x;/k}Çlĉ]'M䔕o>UZRRYA]W놆Sx QPP@aa!+,= ̉]SP{` +P⯍ H B:ty!ZB999לp fΜi8bz'2R p<瓟Ϟ{),( yn֥0* èϪƼ>GoTx=\ DBhN6s;vT߯Huؾ};ywK#o: F蠭^rtπ=Dp'\L;I~5hРOcu Taa*ë+Z;wd׮]l߾;v0cE ;CB- D[1fʔ)͝;{"u5^]ܹ-[mVvޭ[- #@ zؖLIv4wܑ3gδS}cu޽[i&vH^hRл.މ]IZO>7ϙ3'{ԨQFj_aaek`Ti6oĦM84m(\W@ؖJM_z@ #<:+]vFޮ]r}l-%~J???7qJJ;<P( ܄N=,DH ZlÇ_vꩧ4sF @)Ukzk_)iڹ6l`?PKhR":IaeF{۶sG}iyyF0D)UkKʚ~tK׮]lڸmK/]$(w#p#f $ DIJJÇ_3o `@ҩIqˆ} qDH8G[_4!1.SE4I t%%!ɎN4HVƸHI[4o?a2$!{QؖH$9qz8EЭ!DѫSc]2$ 0RAXFtm& VLQI{@d?w $hz@>0(qD3@B4 K&?GŊcp:։z\u9C9 PVrWJ;q-j`)0؋l+*QLwtTl4"g^VmJ"6AZŵ~LG.呋= ܇>ه"/Wy õ+늀TQM^&SNP B(  Z~(')z_YiVy0zw"ȏ t%Y1R A`l@%(@ "XktD=^9П@gd M#"O*0'9HЪHԦ1*D"}9PWlBϵѕs􄬽rk #Gl"g({31HBkMɱtO@E Z +X&92/wtW}}qVVtˮ7D[ Ag0t9 F; U/6pG* [+zѴ}ѽiV$0#diအ% RZWG-W^8hy6CY@ )DCpT$IГTus s`ًHEW#;%っS6X1l"':9ցɥ#80E$ Nd_Unc]ѿQDә[~tno@ DHProے/ : H+?^=v-L~N$G.NDe \LuyD~)c|lHptwfH~=/ڦI`{"{^ΉuyDIv o}=/ėl<΅.DDFQ@DE,qqDI6=L3]lض'@AّɃmjCY$9s.Yp3p&&{%{B @id-ז p4H-3g#;Ƥź0-2_ |܃C\GbGmol2"@d @۠yaǸ<ͪb^dR?t aѢ,_˖-Kmc],'C; G D.[#GtzfZQm͉~"a6-UbyaEn;i.p&d9\;-^iUc1+w x ;*WD~򈃓mxl괨o@].t o;[;K6*RJhQK7ߜ-,k"&*7[7 4 5qo,XGԭU;_DfJG*$;Z`UlK/_6qg83Os hρ -L 48%@6xQavB/C>r5-Us'AJtBEnn9{?ٲeKOFg;<9qǷ5{Rh=;DF;e_d} XR~OѩWG+r"į#m~KFKBQK)[(Ek~R@Zk,51HgZD豷Pk#Zh5ztq"AW,o\7 Y{Bvw@Zo:Ko9-mket L? @T6PY1p$Vҁߣ[Pwaq^۶ܯrL|rw]|m0m d Ik#c&zؖE469;wK8@&*Et}=3a8#;<{RDZk]yM7r뭷t-g)nCaV0.j G'\ *ȆH^ӢCCv͵7C۩ S:wf0n"a4K`'Q՞ q Dzp,r^aeJt >B}pmfBi|/nuy}{ ڲ̆7a)CQN)E 1)`idxD*Oc[3N&7*d䥗r0dT]p\I8FW_)\>PALW_ũoAyRG_ggg?nYև}x݅Ǵm =IJƆ'ƕO&@b :Ё`d]~"3[8?aРf ҵ2MXQUZZZ> jp%%:>>AyЧT[.Xa}ME߹lٲ!?·8GM ѶP 2$W 71-HzO*px#]e@oN.[zsMkd 6{c#X-@ZZyO>7D!\^N~_LӟH֭^w1GsTJ)R۵k?47w9+ܯA{PK.׋ :q6ޮ+i >7 Ko[kw~'zO1i2C~~6!nꌤ$v<"ҒRR.PHgORAzϜ_g驻r1cƌs|>w+AA˖- dz[+؄ e>ЉD ۵Vt?n"e%~*]PKwj*B߹sC!p5!?$yyر|a`+"T\;Ja(C1K4>lx?~<)))UZII|!pn/g|\ Jfc޿A/Xl>#~K<\l| IDAT%XrIoC[;]m|M*s`;=;DzH+֮;w[zLx(Jax2q]_U2j*aܹ3aǢ'=Od@4vj. {x{8H~inB \B9P<+Y7S<1ѿ2{py< ߔl&Qe)ON~Nqd'`ֽ;)^=zT@)ʕ+k{ |)~uԶ@Q (ȋy} .-Jq`zyLYџrvЛ,iAO?}&4-0&8Շ±m\r1vCPJ(/iLk$lݺƉ [ڇaZWc`m-[R]{{6F&Lqs"vGɑm|AwݶfI+rPZnpt9~?k m)x7P;+>^L\X_JaB8# | DL䫯($e{ϲeKG+QJu㼝Qi[Ԃ"3FE8:(9p,d2qH1LۇŢ-hPm \QWx14|>۶cej 4rc *s&~uk0 u8pN0 ߾}xR;~ݺK9$7w˗hѢz:%hhr`$at)$H nCw"xXTrщYݭR;tҔrP#sm1/lޯNRTw jɌ1?~ܪ{ʰ^{#˗/8΃!*.ˮhpZ*2 z=q¸5 1^7 -_ȲH.?i׎s?z1=x<+Vcz5JKiYl?iͿŧט[馹馛 \sŒN^l@VKft[]/lmd`bHGբő%BuWck \PgʿR͆Pgd/~իpAc \ lExgz-cesǷ&y}vEVXVhۊf&u` ;V]L~w?Vve6*2qqUMИWIn1b}V583\WGԘBzhd WzmڊƓ!0Xk}u`m][>?>g[oŝct[ԼD Q%`Rrmj>v7otԉ+˲P5X *7wqOl_wU߶#SS=7׻mJ 4{ J D3jdi}[kzzW4իJa͊+yLK8-Z\QڻqWwۦ\ ҬY?m=2Ɯqۂ Vq9*{`eQAJJλ2ML@)E=-(@Yavr NNf|n.*9_ƏGZ/̦MXf __7gJ9k;.Rmǩ[0"KyS438 фs7" ~c_4}Ws}PJ1u8m~]CXe>,aټy+Ri#ۍUGaqA2zda-ؿis G*B`zM@_!C8?/3+p,+$"3-0~)ض8OX=EplO1zepgd#ldbڵ }΁mm@OvYM1S? XӔ+j'@v3s wN]h&G;vLq~BL+~z)P>\n$o) s Y6*wc&'ӱcGKi0vovQ?wG+-[,]$M)9@gm˗/cѢӄ i?`ܹ~cO(.((ވڦ(]x Aߵ&O9{#%eY8e U䥎-CjLc.c-`f$1\nvwvTPv22xܱS]ӱ#ϣe޶ȎCַbTy 7g۶Ga-ʽ~X)S&2eJ5zo`pRΥSLrʕ U66<'VZE#r)O=~˲F+I"=x̉'L$y BaBW_y{Qf)uN۠>Off&ND❟Iya!mclɝ:U~ CA\i8d6G?QCu;$PԸ!鬬|jm-Z!R-QKɗ \uv-Guɯ.PLBV4 O;f{̞)--o6ѳ'mϵjN U/ެ,&wu啨jW0^6_\6ۍR}֗^F)8ѫc̱mt&+AUzl0ΐs ~vq40]T),_~KO}ٔ)_[jծF(s#'_}} 4~86MX^h!puJJ:mi92;֨+*|0ҭopٜ ?x }bgxbC9p`\`/.pȵ DzسvZMRv3E_2}*@S7oBɖ-y-O~80O6+V&~Y8Q-?'3@mÇׯBm޴^#/9@y'uک+iQysL?;:^Wntj'<{wf=O.Zp ÷>ZIIvib^q%E|&cezAbcdSOҾ_ƾt?n:2 ǧ8jR HIr,-LY ,| 8fl86:.G^ O+:3 iSmqɦaV[E(¶W\.XkV*1x?Mi(Э!R?PIRA 9L-HQi H-a{=9II~%~_}$cH'o'PXؠ:y7rMpank;n[cL̀Tu2-Y\}}58UV6 O?sk0t5w  ߿oƴiڥ$Vj]=J)RSS9y_UЂy@z}j??{#fj ӛr)߻jR elmYWrr&7R=ݡ~t/Q\ZFêa؅)zB]va… ~ \|{Ç /j +W Ork9Ô)^jUi~[%?q `D1wiSOضmXeYtҕY+^8xؔ- > 0##guթrr]q.2{R:*D^w2zL4k{q%lw4bwTH#^42ܑn]T~ ϪU+g$VM2y5sV֣֘MB*_,:*.ЧOcϞAIOʫL0* x9 V$uZ s2Ǻ ìkqN=T~}W |̅:Ƴs7εp%'3x1.'.*ǡO~BJNw}`Q1qI< @^>_}i7`̄E۫||kmAiiiYJϞ=e0v̐~Az|-9f  W^t_}wVZ)ýWmUZ:0])w{i۷1Ub8 =-+px:iS {8ѭr1zhVXQzjqY\gi'ah޳f :문f[\q}JJjY2ϘgaEb$%5~nCd~7wpYYۭ;(aLӨ)1tH}ǡՌRܩ 6F뿢RB/\rCjl6+F\1:ycƌaތmÏ8Y43 Xzg,옝sGWA@ŒKԩSp/w$.~Ҁ 8={Ɲ7id \٦T Axnӧ؍߱P\X 8voNt:qr==H_[,ƍcuv3^a̔dV2< q%%L2XճPPPthl<:G__~Z+8&M8yʔ2e)S&>LVr _OXlढ़;w O<*g]'%yU%%Г w$@l >c9県do P˲*׾VضM0d…̙3gǦM6:\e}W5Ԯ]t(@ (OokޭQ;'+#nӦ&# v7Qm{mRtz"izX[K0plg'=r:k&fJa),[oaGeZ?v3|0 B999,^|;fe9s0_\t'n\zuN8 UTmY+W^=d8D4@|Aۆ%:t0ܒ۽KU^D_GmaÆK/{}8sCs{ Xyk0 5g+58v(DAvuʮ#Ə=Ψ@G_1 һw3gAH7?=t(ayJͻgC-`nӧqUWl4 3%]|#lU'LkRȡ/Υx`M$m6]{`q(:-s;KA.}TSno8rŔRaÆu[n]7۶YW޹k;{\U)zpz:в^RdN3x\-[ży=zvYo |trl}0܌J&u`+=L?1 -{H]QNoR80KStܱlL֭"Vޏ>&GOR{䴊K1mr@)ʽ^}1q"[R}{c_b4zߚ5k;9"tӢ9yyyB!gԩ$@F9b۶Fq ZI]vI;dffz&9ôi8wLqD7t㛁:k:~<zMgyBq+^rO>!܆|v87+sOA{ =, @~>|M?O.pd#D)'S'vYRWoT2 5.uǽ%O0~{|8s@&77ze˖:, | ^+-v|xݢԣ{@c(޾n?WF~ecJJ(z;ӟZu뾸Xjժ^.e[L2#thN8W^4^B[>S`do ={$ۥpxo@`zNm3uTNhpuAOɩ{ IDATILuem Q9n*2@DzHՋ>g2M ;j| vSu+x Dz6#)ix| D?fժ5U[L|>U5RXjMąÇw0u2ړMYT :Hм:KsQ8Nc`@)ENN]O: #fdx;d4b_}M`_ͺK̚5J׿ixA.lL2y0 ѕ+Wܟ8~>_}Z:u67n;WQ +@3N|ӓLӅRJ@@tEc-\pz/y2{PZNﻏa;]M/眃//3f ;@mLӧi7o¿{n0;zkIӇ. JPGA&WOz|2(lvyyVi_}pY<I]ڹO?[ǖm)*Obẽyp,v}0hYY9V@>lp\hdԎ"IOOhXLDuSǨɤ$ RUM㒥yKEm۠iŹ9?3f;Xnw| x<TWW茩q`=ɓnG%I[w. 4c|ݷ;0w֭ <ѿhjᷤ`[4\oCܻߪv ݃4U vݷu5bbo I_a`]/܏P%dlCrc20u}-HĦ?b+f:[>Ú^"wd w6ܫ'=O> a*HCl~uXԁQ<#Zp;nGN#y3u HS| _wҍY{dYx{t5LP~}0&Jc!XVƸ[0MٳgU"00%?}5Xw^~u^]H{1&MxɓO/ceLIᥱc pXqLg&Ԕ.z"uy>S׷ Spef0K("@,HSI %׭4Mh6=X{睷9QR(r k_9: qIeerGx‘0i:uev֭'5 z ft&ne|CiZ/Z<Fedggsuլ_8oo_Bt=+s=uۼ(˳,µ5ەS-d ڵ;e$9b8ӦG4_뉅c/q$%ܻ7C~ixm4 ]4 t4L ӎi $$ת {B ~3: 7-cU41t2Ym71M Ӵ(--f| s G>,aD;h@݊m>oNXr?y9DpVBeeŨ3,WTɢg-,ob$I"PRfaE&ȑ! p$oݺѐ4X';!ݺQ ?sL Zt'pM̙S՜9s[\\ɓ>~$R!8pܹY]tQJ0ͿuhY_ED@$ 8p Hm 7t뮽.MQV?5MLKX5ήOہFLϽ bAfdM$j.;ls3Pn<ԔN}=VEC4^CYM**zJ{wVVMM#o_{6Shq vbJ}Wz:)t@P [%`Hmj3K1 m9쳈Wet׿s~ֲ(...{j`_qqqɓ.a{үkIsͻ ;w?4]7l~e-q5)R$vlX1vec`K]EtzADWVer-Zi̜9}D{7#վπ޻zP~qٌz$EIHgW\{-j/GyڮA}tݻ qNg0y҉'IQL/co ZjdFw/y _"4]W\¿]O&arކ(~}Pd{<3' *?!U+5O<ѯJZ?o;CBUU^~3EQڐeٵܓzuΖ.Z2 ,tRjYcINNNvbk' 2_~<-qӤzHYٖaFVfݒ!`Z[V2?oZCU?UaÆ D=bDy.iïw߅;m,4>lZmkB휏$4X|ve{ ?Τ$&MJܠlH6?$$rKM"l ?F7[X@RQN1|,]ǕIOÓG%aS[~3#}~H팸\<*% SZVƲe+ilXBNM]Ǜ͐?Ora!~\ӽ{Q\H$xw[FT ~~5yؗeY'vv V[{i VBoEQT iZ^xa,Dw9(g&?p?N'>/y7k>:c@y͝265ʿ^^egs0"? xssxt:Pee*+/b߰M|C+6r9]Br߾HTp2k {QtFm\ bC@vXrU6I0 K2W]m;ڢׂɢ{cnGӟHz\ؖАXִe#,uᆛjy'|"? ӫەf|5 y>!MKD ,"0%%uF<#ҿ(flTR;3<#=/7Ӊvp8D/a⻘#F"Ȋb+ e^ČfTlذ=t}#0vYGv820@m7,pM out}$Ig"̘-TǃocͫP"Lm׮%$ilR[ffSOoH.lz'Oƕ!;DjjX;Im Ġ+g1|8wiC@RU6<U'$z]6dPe%6 \s͟ k]wݽG < ?fȯ馛, n>Wl.\YdPױ׋BQd@u"0p]רe…M_M.B)CDۛݙp>#ү GfFiHi efo"HhFmm H,Rmc4 "r]w5!BLuM}Ov[LN.`g9aS8~N'Ҵagbܹԭ\١9 >,1u#2DA, "RWڧfX-I(ls6==IU:M Ox[wͤy:$UM^Z?q/o~E ,XOgF+/o߽,To쩧8u$VDح[Ky3?tԨŚ7_馛Ooω |gKEeb6뺎áGFF:ɾmUZ):IF%B054aÆo޴9HH"+^Ż~NS; Hˤ'=h1$NH ƍB!L \paiCCջ­f7瘣ѣ=JLଳ|_DZo@4YIN&@%l|=|IGT~Ag)"]7l`P5Kw8[F4J |9ىFvS~a"B(AXbw٨^o4DlHB၇5 0"|=3#R:9VT|L,_tݺu{ppĈiYnyN3PguV '㐿O>dgabbԗ [$% P+WP[_˚5?Ğ~򿕚TDkZy|q<ԣ$Be"I2UAD D7ta?o$*K1tW^~-Gx5GŘo•ˮ, 正ᇟ4̸17܀-|ٳZgIo0Eŕ dYQkV?k֢XI1 |aÝr풢`:~M/v9832py(b(6lb;lI"q$z_%]81(  sMt^v'-{/ʊ%zݍ_}^'OtV$t "ô, j`Gv3J((LCC#_dÏT].(T]pcxѣGwO>Z ۼy$˗ocUTTTEX //0bFdk׬3nH$4L݈<.wI.*b̙Gݬߋ|umsvuVx}Q|0ǣtoWΖwf'55v(.EKα(;Y}T)^X) 4tRgW9b(B,Cf@wXȒe2V$k*$1w>5 :f: ~G}3~&Cڶ+ۛe Cp ُ,$'' k>'h_|H|igsk3e*&>4##C~g1!$Ȓ0\.}/DNv [!)k֭[Yr% x L>5`%XtqM7mk*@[iA{#f: eab~Dj8OCuѸ315Mlt;ުKŒFbU;gׄW(832w޹8$[<3x-\ĪOUH8?& OCIÀci"jG_y=e)7h?\$`{f$7'ƌTURKsNUU%֯gM457kL^~~TIuFz:EGY'O }v )z18=wsڎ$_x3߳=:|6ӧ=dT=2v-+) _~ɜ33pi+*Tؼ+ IDATMXu}TΛt|f,Fr߾ q)c"HICX4d^Bm I"yc y o%3 M}P=|8Y,o[Us4N~ )))=yOQVV _0[H dI'xH$ȑ#ۧ/.[ ,A O? =`gq&.N [_hZ}fɒe`j¯Q-_Xѭ>O$M%~y 4/ ա+`5.p$JjZI^{Err)((K P׭[J*"Ճ_y%Sgj uic _xv0gń0);Oz\.fӸn=%Y6~<)={]tgJ ݦI樑4X١URb 1 ˖:x,ϒGGq:h\F$PZ%аl[}Gr%]ɉ8T-FMaM#н;X2S$k;P /k {!3UUmgK`Uʇ~,Sرc(YFdEAdEr˧^z el,c}h4!~ޒfL٫+fEQawLCx雷lߟAZFnX$Z=R[[vMnvyy a$'%o"+;;o(BZxj;@/Dv3u䴽#)P/]Ar8pf?T2 @v805CmKJ_GY ԯ^EiP= MevX׭O8wn.Kc o,غ#cPTis=ç_Ry*˘sQ$칭3/P\.~/fcZb|ȝtH( 裈Ҵ$ѿU2BM!7 o>SxrsIIIsC=DC}=|*iiEljl1->& iA/<}" 0 0M222)T{ϫCݿGBO!ı8g4Uw݁u\PZ<=.0_~f\F)Sdf XrZߑPO?ֳǐ*E'v cˆe`ݟǟi4,4,]F{z= )0P=n M#QJ6(OLnklb;iZqlmIU(}M>C] _r2K>@0M,c3 ICt]gp4`:ДP(LJr aPT>#ƌX(UQp8T r,Iـ-;HUj&ޤ$zɇ}nqyJGrJnD7!+ԭG*.K-$\SGXgj*N= 3gr8pd qD ˇv$U凗_y) >QZ1b8a7ހ{v$YFRNJ+:vBHDc‹/vBsUUPwGG!p aL? ު*JޕuߞE'2IN/ۉ}zqefeHITt]H>DŽ hF##s (( q{ʢ ?O>D Yy4553e$4u܃NwJNv6NSlІ-IOOô,!DH8B,kabF'-:S!)xIBK"==KcBJ7t.7n<琊(+Y4iǾ:uskRRklls\ށrҥzM?KЂA`9+DSaa:NG8ǎv0~ܱLz5z8g S*iטw,JKc''}P!WnՅLc%{ f,Fѩ'ﰪuKDO#œ͑/ceY$`Foі3ץk1zְ.: -w>B!77h 1MBZ4i(.,N'9,^DTǍ\'{GNClO<#)KmIzR6v -@Ƕu<;<ވiێ$N$Qݙ j!A05 bUW2W?.ղ*Zs3+fgKwߣIח>̈ē'B C͂9TVw?F4* .lzabEBh1):]Քb'2C-w'r =kagүob1H8B$&Fu}o[Re ,tC4MCD0I)Da$ɗLrR2> 4Z8#Fo`.dY/擗蚆i躆k1aR˲m$;$&,b^ lj +!?uu7|e[4`];=)2DySޣyӦcf=,PE%.#Zs0p$'QxT2G5l1X,BU;+SU4IݛѸbe%K,)ɤ (am)yAу?睝iM<WZ*eP~ഉMֽHJMNŴeUUygݻ7nl=r\h(ĴLFSsZ{54 "M4GAIIV&>jvw*E`yOͲems3gj6Ý)yxWJ2sf\JaC$"X3<&< [=L1!`Kn{z?59DASב$~KG'}:NXW^ek!sH,ZAkol麨lHF4~瞋;+^mWѝ OX.K$ MkdJEUU$5[qږơ:,a84fFH-a(PRR%Y蚆:(YY r/nZR `Xe"i`/~?f?~x-f~HM<@sN|i L˲l eE}QN&zM?/e0qNxܸMm+F8?ost] rEGMg3*Q~iRk~^];J$HgJ |#4ÆiY^/r"p˲0"XL\u4%IM'JĈE;>!\fhhn7a:Xh$J4#EѢQQ:F0̖)xI(4tt]@Ì_xrsoglYII,XgǟƈŐ;a:ygi9$.s#e ziZAccHXT(hHDlHp8D8!D0n CE*  ׆01 6!2H21ߵw_Pȵ50DX̲P4%  Ŧn{@&6o#́fj!B HXX eY=86f!NC8{: A]׭} ,@%GDb [ph4"8A,#bb1bZLLݮcxgI²,a⯄p:<~-2|%Ő$n7EͿf3MM"P[[C$?TPH$b?<Z,F  ;++n-ɦM1bУ z%p @`1-qFc]3N4m*ܲЃ!ޝry$w+g&2Ccf,r! "}V|qzlb#W_QG0y" ղi-^C/^{8M\S]m Ӂk"Qb-GD"a"hp$7"шH:Q[[/-C4tM' b!qukH{1tZ ? Ń`& E477.@ (́@+oGH$B8"(@jz齝R`$&PZZB0F/j&Mb}hqxh>{c$E=ZWripuHS=|޹}#"ٰLK(<zN\A)r]6LIa0ϐ>t(F8AIbuv9wh v,6JIɦe `8Dv(ѰXHTlі@H:U5UhF^5{b14M# H]$^eKlݭ5i!UUDDO ৱ`0H E?   k^ H@cRvĜp8-o9h<}]n&cnS>G Ǎ#wv•@ss’eѰv-k_}ucGO,8X( B&yĉ 0;;n025.YY0c1^v)|,{WN;q*+++C ™UED#&HnB!BpjbQAb1h4%`jcs,"U0m W`'755G= xx<֬YeEXHLàJ8@È-k޲Uꨫc[,Xg~DҎ&?;*?j',29/~GkkX^P+%O/ ֶ%FP/ izt;:x/v DQ|ikvCcLhR;7WW?ж!0Q=zvOϓ| dglm,ҭg"oeZiB^[1MMYN> p$X|9E GBH;'6z׻Ua#G w$'QPXoCrr2j]55,[UWhb*++eۍi|< Q^^N0` urmw׆ap v._" 0V4e7 qyIKMe-ȒDuM`9@]][6o&++ ˲F8|>IIIxp\?1"MMMP%Iwg[|E;~Ud/h FOt{IBq8X;>1K=/'9~Ǡ3 , __z~ KazB侖BUl5 !mAHܱ,(S&36ܲ'-3G grml;[n!TNpdɒzv kS]LJMM\6ٷEmnRoE͒| NYy9TUUƍE?/C㛿iXigu&B1p떭wޞ݀ f|\e$[7 a&MMMԚVVVRXX'h,8NN'm ״<,hp(DUU\r1$ n:^1 ]^` $$Yfܝwl+_ ڿ5D; IDATې$Oq &{/S̽;=@=hM 2ST|2oaIzl{L0pgem$GD#eLIEzC|{ǝ̽jV%ǣ_~|Ǭ\UVhX0ꄩVj6- ;y, ?' t:ųbmkÎ$tVY B~vY" RWWGA^476;=z Ipnnn?T؂+M7ZCMM,89lRHMM%Dvv'zB;NTUEWJJ UUUqhsSMMTTUqEu0ux5G.q8\iix2ۖ‘Spmۍ{emhdIQrs 3LIas3Oܷ/~?ʫ n݊::w K)<>àg ;t?8{E$EekË/q̞=O?}g'>.Pdɒ[h466;M7\OEeu"`$UW7 Z8_-]שn=`,,‘`'sB['t}{`rX D"k׮ӎ<_cS^UU>|8k׭#5%Ҳ2d9rrl$ h.VeT3<^xi d)) 9_n#,־ѦzqE;,$Fj/os\Z߾67$KqedHуEЃj% IQWT7֒q0T0$ 0d#(w~Bx{>; Y[yT}'{[wY '$F/ BMgnkp](l}"_}iDc23E$ dC1kQǏgժUۯ_wX<z聇 -F())! *-\UU)ݖ5]e!+RD0 3k?3D} @ ^.Z~C; OߏŲ,LL(+/GV!2ओ~CmI5T Ͻ~*}2sC!~ou?/U?OqFw3f#)O.Pee 'L`Wz ]v9^֘1:Dew`4^M 7Ҹ~=y%._Qn|I?.\~Gt.I8nz#\.+޲tqǢNߌa\xWKs(Ȝ{zL.;xgӝh%1]4\B5ۊVe>s*2gOLFfY2FV5ロZjtʮ"v'koetY 'z Dލ5x/?RWN߅?s6ź >d鍊LPl6$o}KX(e/Xi4 4 HFL =2yQ]QGݛ>幗Ν>s *ƀ~wԿ:^w]F.5j֤M7q]̙0qǘ:uʮ`T9Eh}o;m+9Z%w^{ 0$KZV^xO (M5=}aW(DIzmNNT?^)M#Gհa@s!8rrMHsikBBkޣD5kJ;}*} h$c_ {b_4W^l߾9ssf͚zY@˗'T/pȑ#YMz4uJ~~ w:V"""<ƿ8 ,, ZX,[r9~}[gff*J%Dn/\h'Njлo_>k6Y#Jb'dE"v-M7O>{" hߍ `GISF`>Z|41LNQlh ҺAآ%FN6- W7m#{596Վv&R>TŒ^lxh:OȩY8QuCX(cG^^-+7t}/pTUMIt: \lƞ鯐z9:Tك֯Z斿WDIl|~_b>nL&MO<{/|;6A( U߳W!CoOH$,]+zs]wW-l&!!łWNXL4 6U/+pw;AĐfCV 0:tݻw $ןh$,ZzjծE e |?-Ӧ$"w%-pCBmDXsQMpO2 ;N'aDԯGLf%{+BLQ_S_"$WͿk~uNDg~>L ۥK>C7o^_߿M*pEn\Z6m[ C#Ǥv{(T^L^^k֬Qv)nAS1,7ek獿!#Fȑ#Û4i(nQ' I~ (@sLb"b:ΖP-JYo۶ ]P! pj6{H߯z6VS'A@I5~!4CDԫ|51* ~wŞd0 lԿs&=pu|%@9'L=7q> &\<%lAk|v30_~T||<`4!2[n%''gj߾=[,̸$:w, m'LJN-ZA xGQo^@zz|闁'@Y>{@Qխ۵24ٓÇyw#AdS^Ӈ|ޢ$qx2~?CKx:%lqf.0n STqη>*d$%a =\mLF2}$}Y@*r ˗/G<3g%I޼7*Z,4vUGGG k(HDTTkNd2ѨQ#DQl'ȠN8qZ{5)##?O>5jHhҤtA( aZ J>l?N>8cb8o.}>.P (x?;'3hdFW bպ8h?gv.BAUhs[^l9W1EyyCBn#t~:S_ h#HOOgԨ-c?[[NA & ٠"PebccA !!!k[h 3ƅt/Z֮<̖gn֬kԥC*Z*D23Y2jЊGLUqxhǞMJb[Y}Xћz~fy׭+}n̂KME[j.(=_ün9_~`̛7rvl>̿k@i *8\޽ر#۷e9qB_|qUddd\:u }@!Pq?J*y 55`D S+~Ef@*J?6\~J-3#F5TN:9GSlyt+oL0SN1`@lٲÛ*i y @IM~ܬY3 YrK+/'\W?~ɒ%3wԩ3|NhVklrj6<0Nw'ر [N^Bg߁wZ,Ct,A2Ͻ ?|A8Žk{sl,`?0tٯ q>]O#N2X5A@\pw~ \rCԩÊ+/0ʃT<~' *GÜ<џjIN,TZU2d.,,l{>}yUWxPÇ_}՗111vGj{_/@EN<_^s*`7KK(61v>C֭ QCv89- iM':1g)*Ǝ =hzQ]2ɩlE>wV>B_cpB2H۶ O?C#~Eɓ'/Ww#44ܒKQ pvM^z/шd*psM&;INNfǎ/^YӾbC=dɒ"##u&cKsV+v I۶mS8phCy xԭOZVBv $aas+B'\_ Imkző_UEyyG^#DH=;0sÆ iӦMݸq5kM&,t:=<`ٲe $R6@h2'2RRHG-ЙLZ*AOݛQW/Ҷ-jsɤ̛n4DՓ&lc ר3f}>(:2o~ Hm.肂8v-KFJ֭}뭷5kVi/III6ϥ-F6M9$..@ }~쾹E05jd:u}5jHNNޢ*/ҥ9B?pE.SSSjժu;wv=!::cvg~^힮iiiu~|X:^8L~oD嫎!}!2>^\hZ|ar3뀥's? >w$G8x16.s8Tھ{ٹ,W!JΊ{eCu_~~)A Z$LY,i{ P@J"#"=w$'7lD2i͈rOV'@qcKQPB8xd@UL&/Ymst2/_>'O$ T0,77΅ Pnx?p?( FӴiә/х\J\@vv!==?x-иFn@7p+e|ٱcvUUk_Ӿ'z.?^z_  *lӼ97n / ttyUOu@>OTfҺIׯA$rN`wQeN7g^p űcxJ̧i%ķ@kצm޼YZȲ\$R\RJ{):t`Ç vxذa.ex}{_|^`_p-.o ==%KkH.mc@KNf;Yy}8.(ZZNG1]4]pW^iyD\r}(rf.Y$Ʉ!4h8/zt\ d"y,~Nn?ͬYo Y{ _kTj,駟8s指K9h;%ȑ#R =RⲋzkϜ9sVRR]w&W{ɲ칹 r,N:ő#Ge˖ `"6/Nyh":xse2QӹȖ3z@|߾޾kzzCj֤G7BcY}x~e CBK?^6ǎ%o(3MM%e\g!yZ{,jKvjCBBpl6{JK ܍-#z듞~d:~%O?4*H4\vW{}!vڞ wo)7pxnvBZZOfǎJRRR (]r"xM<(&UidpM?OC>@ p g}!K_&'v.} Pn-A8 gawߑ;%ܙ6 ^=ZT'IB2go޽{00ȲL.]?|mF)M/45i$W^bj.Pg0hx {eYaڵ;Ng 6d_RGxgVW^H_qyA", Gرc/jRR&:[ʇL` pВ@:źǟ`w{V-p-P*ܵs/Lku]{wiS0I?kkuF#O~uԬY9hĞ˂K5ki@?4N̜+lܞ=iێ]}G8|p23g,h+޽{ٳٿ?yyyڙRυ 4`РA-FN:z. IDAT5u٤TU5lܸq7|M!!!;R;NΝ;ǡCHIIQ!??:Z>ҝcƌ!)){۷;0V"TR#1b[q--PJ&q:2^ d CH(w (."'NܮfNԽy.ĉuY8hP) p.9fհU7]pAz6NyMSHl¸q*peùs9r$>3iJ bKJJk6հ0!$$@J;\Ӊ^ G`08{O)eqUOKK-_|ҥK?٣]:u">! \%ѣt:χIX,N8#GضmsN'y #F`|Mu! ~`7Ey@*rj ;T|BUtFfdq,w'׭+v)2ћ7:e.UEXzں禃(H'7n K? Mر|+U?YXϝ hxbb"mڴ!881cЮ] hO>ۓduJE>|M6Y&tL}! ;\D4~oѢExfs(9BCB#"2Ir^>#mzjj3 . `>uwGot0:1mΞ9˖m[ /I8p#Gb ̙3;S\b߈#竣F  >t-~Kc?H ,qiP_~m@O"W/-}MVpdJ>H6oj-W`6{vQ1d/8-ErcС8 s2ba˴X0ٓdYFV+_=wq4kgڴiSSiy! ذ1P.;i}xx p:b'**fZO MD=6&&Åf͚q GY tM&$Ij#+3G{.}6'':J UUﻩ_s`q]tz=zbfqv&D0gϞ%%%uʕxxy=pш( B82eh@eA*p -5wD'~}5<$yݺm:q<]_{4(!fb}>Zݺ8:? De>3n-QDqb̔ $˗iԀV$Ѷm[7o^lqUUU/b9ζl߿?kEz07_7!;;s$S_4oyA*?럿[:j*^vl(""cPzł5ߊ`訡lڴ3B裏u8>tzVpUɳ8=ʮ]ߕ_Uv8aC֭Gth&cБ$)蘈Fԍi@L#?`V^6m+vFCĠ7DQc=w#GektH|ޚGQ$ƾ=k0zzG1"ʆgCg6g'7m$F QÖ{ed+__]wbaɒ%eA91dr=5#) $2M3g}?iS:Ęp8ySW@3]zެI&*&*OQ^:$-"D+k޳g7GĽ+,<ӡ7D JcXV8YrZϥ?P`4/ M  o]c<sO"<,V %ł*aw ZTo9 $(Z?(uE+_L&I^!5kPCG"4~3;=>4, =/yzI/ E dpK (/5>T pm>Y3 ^ ү;lf1m 0L|~۷oTj.]0qbp5 JVػ75Ct%s%<:dP`0 N| 9degEff&dfdy֡ME>*`ҥ˽#Fh BL80mڴOd @.66m&6k֌0@k-ܯo_rsr[H)(ٌ`jbͷbZ2cƍaCHWƩSLt <]t8"+Þ={XhYYYP'@͐G?>bɝzkǘ6my5Etl*8t␝W7NcES:$ڿb5[z][{ZD/N'q7٤:tˉ9};u fӢ,#w8UJ5Ih\7l (:J#~ Zo ]PMǑU>]dyOqlؚ֖N矓u0׏tj˸D2?}e$yRO :-[кuksݛ(݋DEz=&M"w|w3gN Ν׻7O$&ҫfMA`oF5cd"N p`w=-ڵvVVՌܳEI:n(;edPM6)֭C^\ >)SmѢ.!!A",,0իMyyQq f6oޜPBJ(8@vtΜ9KjU 4GKٳX̔$&bj `Bitm޾Ç}N=;MS^Ј%@MQNTŇ3'6 nj&鳢6 9K7bʺAoKK{lcڴiVވwXV>|%W;~8~{iĿb!6{i]P'$|۶Y=mW_e˟` "8lV#`Z.8qاO^Ç7֬Y*UPJ!::Lxxx-[N9y{MUϸ, S NÁ(%:NSIIo p86 S<5 Zخر_%y9Rn]}LL 5kԄt:dY&,,͛Ѱ0jTݮ?awZ̵nWrWKM+/_իi:q}H X3O[Q8e=;cdOQj~{l'i/=?j;F]-2p"d:Ī&o`zŗ_~IBBBFƌC߾} `Br.R[Vh6{J( =ѫvf퓪UҸIc6mJ: 5Ć@U'lR +2L)DFFYDDč˖-^Oll޼y۵mFT4д!\@AU:.{ Peٳ8,?@/})"OE1::{nXBBYfTZUUHBt:tp]\"FxNdxAbIT'Q'ZCkA?DyW3dO=s +}z=yÆ"ЙLyϱ1-ݻw@'l|s@cW|7TL&? _F ^ufϞFtt%oڴпAܢǎev߾4 0 @4᠎̈uwoԇ[naBF33Yz 3ޟMl@݈(VRE*N 88:uо}{>gϞ5Q * tNJ&5 @F+&&F` [ 4^ S=@ PpG4ǀ'BZćmcke>V[ݫ' 7CE,gΐu0,0~]]L8m6TSLKpyynD胃5b^@^$Q}p0'7mfciBLo;4äh޼yʎ LRkxE Ԭ Ng}(G~[kj`0ЩS icԩwa7&5ic-ZP'<\3Xu(l3ZԻjdl1C^6o=KեP;5 "۷'??ؾ}{.]NQ DTusWTURSS+\nrpM99+:8 5]wu3ZhҶm[BBBl6tzW)` `8}(p3g>̊f={Qd0`('a*@ pb&O`ZwOɍ߳W@_|A """ѹs mѣ33F~FI֭}73tNpf/.\?k/f3V)"`9֭1P"I]kƭY,@/?vr߱/sZR %}}v??EDDиqcڷo:CBB;.'@$v9[s)J(y.|(<& 2FQL<:ujZvm~z^(LD) wni пB@oĖI|\PU{_tNq"xqD*` huc}њ!20}<%=?!J" o],hfŒ1cJ}G^NHN^H?}%((>}pM7a0KQQTаPMy`t|||넄]&M Hsw"vtzX0Pk] 7ʃ?hV'{pRGU,ZY!}ijyi,*D4,~e'Do6_R;wIRժU瞣UVrСbgOZZo&͚5; ::<o,^_.~CHIL }U-Ȍ( 0yy6væ bRth2=H\\

xAN+(sz*ȲLVfH. *u I~^~A5 K]aP62[a<Ҽyj#.. IDATʟ7{#^%* (E/6EMwSh܀;ƒ}5Ya_zydxaqqчXTY!Kи86UEo6?nͮ? <3gҨQ#, н{wHtt4v^III<̝;S%p1Gqu1h 6nHYwVn__[헇* 3vڷ2j vgd M>45n܍V} |/ZCzhܸq 4!"":2Ȋ"kȊ|>`+Bvv # ?BGB+L:XӦMڵkSG{.>,+E 9 ?Y Gc m$"  rQphd]2h'H :OvBng3ϲ[V-^}U֭[@y݋#44ri6mٳg1P9 Xl6l`Ĉt֭6^{wy`TݺѾ=ڊ<~/ F#yy};7M%4;~wi`,&dYM69r$|Ϟ=OCe+Rbp;.b9E@UռLI.pEfp3mڴ뉎./,/.~,;edYFhxAUEQ^8/ L/%svewkᵲATU%61kFFplZfY%qCBmwzCB8g?t3f 3gĝr, z3bzߧNb_ϳo߾ Ǐd2K/!XLiْO=]D ؁t2HfrQŎэC[$%nwq@I2ԯ_VZE!(3"N'S3<؛*p"jI JA%@`aÆڵl(\?fnCVd:}q@AԌ (΢<\PɦV]t hN?OgAm٢5׸@۩ݣ{XÇ=G嗟itm.</Iٟlz҃,6ٳ~[.giUUl6Ӯ];$IB3p@^y:w(%T^u{*P 2ڵk'P;8z$x];B$\5SrslO 6ZM'zuop0EUV4l0ъ $$$De-(NUsTUV=#f˹"b z3x.! 94k,nݺֿƿIzJ]"B?\AZD ĉ1c~)q>!a?l:tYd*{$Z_c"f#8&/NeUxH4zoFЋv>CG*NOpu/ mʂ~8/~3{|TZӑ4m۶qg~8^_ eϧutؑ ҲJ|3GǎT|$mg̙üMZW ]e'nG 7~g)領nݺ4i$_yf,w}7@QdWjޕ , WK`6lޢEQ.\Iy$_)w_eZ%$@AKHg6h޼9}!==u`̙|P]K tWml}rQˣ+W^(nGDBx-gӀ>[J.SK@ElYY&M0eVʦNe˖>%~֭3<ۙ7oiii" ȑ# ?ӧN?.7;tIt/,=vgla \>Rax <̘1؈Nqr]EiӦݻ7b_eN!!9uzO4sSS+X 'p,33S 6N+((^w{e<{}\\n\85X(R E]I@^:(P \<TU:ˍ6D 0 lL:ӸqؖOKΉ_^Wg6'w"3uTtB^1u%AQZlITTTYLDDwy'=z`ܹXV7/~!vZMիh+:0NE vy|ƪ z='xyFJNƩvSK#]T>꺟;w.9SqZ着#(2رcC;fk| d B;<2{jH=$@,4AQQT^׺uu]EDe]{YZP\XEл$63xNn&w&3}yf-3yyQ*k ?EndY{YxފW_ 0(hFJJ  lRR߲Đ<$uEAulnt__t$/pJ+k>@Ȯ3~;III^eYѣtޝy{Fq={p޻7~/~|a|8\j5c>(E,l* Yv?y@4&NȆ ;v,kC١C̻N9Il1O4E!Yþ>`ՔWТt?9W춨W]؜1ٛHKKc V…~ hhn5kùKXbE˗_RR MNN~$_/(W_%bpϘ z :UM&SR $($X8K4jQ8p "4L+fΜɓ 9,\ahz>6lPWU:z+YW^Ɋ^bqbaܲeϝ,{q<WDۥпkÁfѢElٲ<4 k֬['&X׮ߥDiZJv>ڼWfOV"hO^rʱx >a#O ƍF0S}g8:t ++-[t\lʊIIkfSt?7ڻ\.SpVT~T~! iӆmxjV T7]nxYu$W5!CqQj(IǏ̛7n!(o#6|/e&0|L![k'G{l,׭aGd%IseĈAKEEE|wϔU4dzSϪСݻwwZbvr w$:~=i|-?Fl}?±"ĉwW]U]0Vh}U7=<\veKW^S5$*(WU>>#=GuY1%&&z~o`es:HHH|mрp*xd>gJt=+f I% e#Q7ȣ vg/K!ǻgfϞͪUPYIHH{H[oѨQ# –-[m[V\}5KZ'zCn7c.%ytRUT0PLsS  ~.E3!M p[Vd0Wk6gflW$Sa~_2&>u=oH͌$aI$@; !ɬ,~Ȍ$Q^^Nll,:+V`ܸqQ5Vw8bRSOk ]5vpdEE^[pd]Żv)-%.-2i9`m=&펚r&'oY4I*#(ex#Fe_ Xh~m ׯgΝٓn)_8p\ L2۱#Ix1ۏf4dӑ#L\} 7Ӆcnh`[5iNfb.leVRaf^ظX׿I4~RG y DK#`ths wQy`,@o,N@MLCk SK7NCI{p8u"EY)**"++3g駟G93_z]J챱dKGّd g5MQUUBבN =}?YYYK4nY T5jȑ#ٸq#k֬uv;~~nݻy'>}:MbcykWG~@L U~9$ktD}ρp df6nK{SbR? aCBm ތ v{jm82fc`~}PQ}&M㢏xJp8@k0}cn2Bc޼] (^dIBqxO@|abb"wuI1\.҂:Fhgaь7!qXì{M.xeo/8Q.j},h.]0n8RSS TH^zҥK9x`P7b `L0'ߴCns8 ߽X򤈸III<ߟ҈I#{饗RXXҥK)**qp8uٳgpBZGII &MH YYՋ))ѯ߷* ol_Vط[?sv@_E#M|>7!@Z4l؀ǎU#Mg^`լ0_IxQYHTtD]B f #bL*߰r߼B t̯\m*7eOs)?KjՊ#FsÇٷoNBON.]ҥ 2bуs{EdPvΜY3s%J%˰9<1OF<"ϟOii)N2t:dʔ)<,_UUIr8xkWуNG3pPTVk~=GD~<-g."!djuDlqWK"rq۪dМ͖ElllD'8Rt=`7!..m>0⯭ ƾ^IME&1NG@mL@P+}$$$D=o_mkÆ l߾={Ҷm۠CuJKK꫙0aBD:+&L`si~@-WNBoFiRRcǎ%//ʨqTU%33 //Yf?(J )((`$eb"Ow:a}=J89q-㳝;a$BkD|a-"b}cn``C4Bq5@FF:II ɲǗ 663D hd2eOEi IDAT8Kj,zhx9.UTLB45og?"Rm-(JMR$I#H^ q޽ӧIرn͆(,\M6ѻwo7nleYflܸ^xݾ(aVŅ^&Y l=.#ֱp|Ӧ4 葦i$~袋Yn;vPPPQlnnFLӇ-ZMúÇyh"~i7G4?Up}k.B@=tڞd;uj.˒_ V`mL'>>>"@$JJJGz>ꊳ8qBQjOtLL 6Z*cuтr2(P H!躏 >V8 P1%"Å$I\2d%ᠤsҲeKHLL IDYYZ>cΜ9(|hr]p!o^O=%~Ig$ ngƱ"ڶaÆ t1i#]iР:uYZZ?0=_RL^;|RSE?ά΂xpB6rR7DH}": 0HVq!QFqݘ0KV_S~@u]`eMHHH(뀺5s믱EY]2kYs璝0=zԈ3˫JyYv[o/'+11_fݻi 5'Np)Bw g@"&# -ׇ6P5| QuW dYBnk C 0Ў"%!!!ѣGǩgSn \ӫUhZUDee%v=d&0dFV'MJ5t`szHɄHG6mڔQFEe)L/999SXXȪU()) i%IbƍܹnݺѶm[dYʍ{cȑL0e˖;4~ɓhҽjes`Hpm_e]Vk[4:qqqӧm۶1i$yݛ;waG?_\׬OLj;xqD}3{ ߲f>.]0]i֬۷ogݺu"dhz,^-[ЫW/6m44vILLdԩ\G$+ڻ׎A1)hA;g-t_ m"2={G(ܹsIOOW^."&&={/X_~oVҷ/Wi#V6OjZw7oҷ$;)*Dp l LY$ XEN@ǎ4nҘ#GsxQmeY2V@(6;Ʋ@[ZQI ^g~߾}YvP5uxB V7C4~!i Bc|l9,E+JwBv+bv9wa4Mt9êU(,, k߾}۷:йsghrJʫʬY`m=e]gdXvE4bt"D<713i>{>YoKY#`ƵHIIab \.WH~ صk`fb3f _=/"ׯ;z\.<^ 'O"}{3S5GmۧO}QYf$6uu+Veh޼9P;kpp{>cr8xsy"7&{޶X PUR &fH@qj{L)t9 Z_ս{wn Rq"ji 禱ZǼ.T- Ieu]cxO $ %؊IIIy*R 6d@&큻7b(U+l6$]G2U&==/-[~ݎeѢEl޼={^QQQAӦMyw矙8q"|Y͛~}Wqqg|a[L U&Ha"..g} . 6lHff&7nd4v;dddЫW/RRR,3֭[裏Xx1-x[7n! E[͛yqjD~;)E!"?ކ1D" gWI qqhIUM،e&{V1{^"kH<] ("ɪe8b1]hXIJJbu?k 3i^Uɲ2p#D.?-IǗ^śʶnGwmn8IU4fFVUlVq;vHVVk׮e۶mAgͣe˖ӟ.ٓ3gYV8tg-&Ç8R.mȘ1cTVVgM6\Xz5{qf͚E|{yv{֭En_ףKMZqė0DHX?!K31/Ka~~ crbccu ]>[#_5#II|`c?cҼtRp&;dgg70d: Y*%5%"%%" z@020*M] fD2ố#h=gggb :T+?`:5+_~~)s,{a<}~'y v;G }uHbcc?~<[5M_p9r+WrѐfcCǎMnݚwgfb,4b pQ"M{S"{}~Y@}GoF8Hl[VV ݘJO*:ρ)#84s/++o\W4G@!`?Pjjs5^ǰeUl$<ԔN3c`ЁƩxSlcf6{Y9H7ȚoN[nsND<0x`8+(-- :4oܸ]vKv^/111~K/N{8(0r+K$fdފIhqgD 61cƠ*!}Ҹqc.vڵk.,vYr%o6c$б#OuN8TV WO_A,~1 2aYnA_~@ 2ۗ<ors`q0G `( a^Ip,݁B:X %%:HU=HLLXf` Td6Z_Y!LSa`{z8M|%бcLj#q 8t |1~~ǎ;na՗|<:NĢ^%*>D[Ƶ`lڴ[v`4`xcΝԩS#>l9_^ԟ7&'E(Ƚ}2:8vd ԜXI&DzLvѲeK6mĦMv;ǎcʕ^ N'v]s2l8rk/ 

/U)]2V)ITEQj.䈅z躎,8@7ĥz3I&~jWU @mHLLZ׊pȑj mBAEh L)RvwҠAz7IН־cgV:qԷhle-p7LEV5'1GOi9+bEsijP#!lCXll6ɡSNA@?#F0i$.]Qnd{ym6TQKHNl⧟am֡Cz!rrrvK{=E<׳'l O}3vٕ+tAԥݣtc_[>WTݷӨQ0ɞh `e EU4l|0` P4F IR(w&HA 6$Il6\.^] *++9t:Heu &y]֭\uSKQT-[ꫯcj7bg!{ƢaT4kD?/Hٺ OJ&ǻwق~iGljĕՆ`>UUINNK.a޽\icܹ]Ҿ}{?!55)SrJ&Lp޽|{4Φ5#h6jihR$!H́ŋY5y G £gIw͍7//l6̘1>̟];Mda﾿e O._g_iFh s 2[|;R/trD W)+HHՄw+' 0kMPs]#O5j1P*Wjxu2o" 1N@0OSUU+5MvC, 3}IIx䑓N)xIU).A۠/I[1r#ּ8ǟyi/h>k.Ifff&-Z`ӦM[۰ndnJ^^Aر#ӦMc[TFPwb6_9$+O݉o&]*"l誊~eT#8n-{g?&]wŨQ7po3m4E!f]|~> 6(勶lQjA,_O KC FVm5Ry:#PMӈ$)Є8 RSS͏jj])**uf c1K9![t)`N\pݻw?)ꄁ Gs)ioT?./B4Y p7 TՓǑn=,y>[(o[ees~ʕ+ٵkW͛ӣG4hnJ kٳ#>W'n֭l&ڱ8q$%Һ5MkR*8|׾}a0f`Lt:y7O8'%-G BF8~8-+cռSqt" $ F9~5OFtza-ۘ@<_R˺ByY?@N[ $@Y)'tƲ" j^ӏ3lTB]T]IMMV xĉZ|U0^*++<Mofi8>N=I>gڵ$Ƴf$$ŋodm>]Nվ=#i^dY)xמ4XS@ߛb=wSx@Ըx0iv;<:u'v:tlv n'`ȑL81"Y@x\%x\%ZG ƤIٳgԌngΜ9|駜.Y|+w#opb,Y—J&;نBD~߾ ;}'Y 4PQQ!f5ĩl]%4;L)VPUUIMMAASӃnIII~aȹSZpMHIIﯨ&pn\T}To};+aе>p7Ӹq:{ѡzj\.| ?olej )h (T7o>bt~q*ޔƬ4K>|%BrqA\$ …^HLLLo\M61sLm&==7|Ӹq㈾ߩ@rr2oFJAeV^ĉu댿g;-l̈s!&~1?_MO?ݻ>#Bg_o0|WO~F"O12I3XIY8߭7( a8ya,Li#do}s_$J]@m'Wu%@II { ypm0ޗUYtnh#ol&pҸ>$͛7SZZ$I~ӧvZ ٣`8Fi,}ֽ͎nsFGIH`sWXH*61<( ͛7gĈt*a͆fɒ%̘1Ç UTTW_}wߍ~s,4Q IDATOF͒%KXhn;d:$HĎ;xQ!3I4lHK}y2ku)gsg`Bp !y-u8)!䞐}P)1(h '873p:}Y$|ow  `]Jx!&#`d}3{_̠AȲ̪UWeTUfΜ9?~(rI&#;J9~ݺ`sQH[FIOd&\躎ngС4l0dϨ^9pfbٲeAu W_}nݺt֍n~a8ߡ:k֬aΜ9TZ$@YYweee? ecĐ<:ٳ) 5l:׬r?툒ំ3'1t%YU:=B# !8V TTV ҥ,0,^CC}*ֱZל* ܮ.j!=ւkBj3fpMӂθB*ld 9_kË3TITh?iZ :[Vvz֭[SXXƍ-uAz~`ߡ9sкuk HBQH= *'^VJq6qd< XTiMݑTU%%%aÆol2nwH͛7{nu9cٺT$}obŊ,Zŋ;[ F֭ݻ7UVlݺիWll(//g4k֌={0cƌ2Hzᦻ^_/f̙,*oʻ74ԈYsDD+ޛ*=HŒťZ&r0ES9 k؏S,2g. HD0VIvݒo(TD ZSb~mxm?Vt{U> b*Z+qZn @FF~&tȃ:&ӣc)z}!''%Kpt88p/]ҹsgT4ɞ$w$i{ub/u2fx^7oε^KAAׯ8/6^%KqFhٲ`7|;\CζbZpu_N|f@DK 03EU@c )G^6$ U*oxoUmq'Fl{t@PAVF 8Ƭ?0> ...6jԨN_&7/3" Aii)6Z4If2N;t@vXv-G jm6kC.lȋZ'''3d))) ɶlyfiݺXWt&7$sw=~?3mv$UCs:t҅.]ʞ={j.--Yf瓚Rc dffҲej, o Y2@GZul6yyy|r:wȲo۹sgq8We?3d`7^{dR; S< :8/>/ub"=p7E|;!^"*'_P( 6ݜՍ6A,xma+ !0GNR oLh T@`U6hR>$F| U ߍZ;׆+t:ի{{(_`֥W!D8]B?XPy_W7D+EYfM1Z Xmuv).ZT,ׂ3& r[#b5[UUÞٰ'h 6Zͦ( H k"g4iu]Wz 6dРA޽M6lXlv(+I%v^yb'N U00f-[,3CΜ96mлwobbbUTM[Px:NΙQ7p4'!UW]Ν;YlV~mh6٩+4MYf\qlݺu(++㧟~"33 >7LϞQxqb'KWgDلIp(GA/':> m0P-MVۅS:*1X-c"s@nx=n^n@df *gL(y33^Q.ƨx=,0JP=twf5+qSi6)Hd/hڦM.25jDee%vįIoi#/clEY6+p{dojPUF߾}k ftt]t~MFAAAԑ8xEB1b?,$j46?Gv}K5dĄU&In-Zpӹsa Ot]s+$+++5k0ydv-Kb+;E!+ͩqv F>o!QWXLݍ?@@߳fTQBJ֖…cnUhL"!ʲ a;Q=qU?0 ( ,SVVJ-c.2dNCjFȑ.]"F$rss߿?6Ǝ>^oE8Uz[Ӛ,YtB* \z 2|'#` [/}$M Pۉ^MõX1u U΂$וٯ93̺.ݺucȑdffʘe_{N88iڴDQQs`ׯ')1.*ПX'꽧_>8@Kp bPD8!R XC )w^%`l5Ђ;j4VR@e jil)9iHK1a2"7UHBY5]Th@s(?RcKǫ3Tt xR;٭*fߞWrQ^Qɴqӹk۷s0l6TU~`לRoϭPޔ?KN n9^2nA:t(III!gf~`<4!5x`_PQQ_ ϞMtVC qU cB|p+DW f*O!AdS~ŋf6i\ uhr$*"` oǃ(WGrFc'Q@ to5a︎[,))5T:"$5a,t 4-@NO8 Va%X ;nu,Y-Wn.*ݢ,2Ц7qvv67|3YYY!@CII _v}:k9,{Ըnʦ18\:2O>fRRR1bwvV$Ilݺӧ}z_h@4222>|8=z@eE᫯BUU>|/;R֪ƣ ZuA$"tZ!:}`g#u4,h Bq1{= ȒZ[ ZևPQ9 `; =3x!s!`%DP4e7]X(ZqJЅZNP}gimiaOq ;2-ne@^o~ΒdK@aj~c~ާOt… 9p@Ⱦ۱ݻ]vѵkWtfCvZP qR~9HI>>)ۓu : ,ta*++iݺ5YYYYׇ0˖-c˖-瓞~ډCZZ?(n?TD-ۥӯW o(p:'CfDqlO@GѿhZ!u <(?:I0ב%CuUd sS=D Cq8} da%VF=A;V6 %%%ֱ0x)AGԵ?]%un#|βT94f$q1S>jAoUɢ5!͚\j9kRUx.2:Ă tZ^7$-[ЧOZlI5jl &_8s^}_dwqOwDB$ǞG:c¼7n7tЁ_{ul6.瓑A^^III6 ?~wq 34_}.f-Ь=< ܁HW2 !޳ꣅ4 !PyZ9_I6P2$3uMDmsH6[L|"7 8NCH }ZU]^!P)n#/.@Nyeeı4:S"5`jѢȔǴ2F?;ZjSuRE|ZlѤ>ja Wpt}Ԍbh!KhݦjAl:PŲɡcǎ,^ 6mi\.f͢]vՐm6 PD4\Y8NQU)鍄$A Q, Q^^Tdž^\W)*T.- I:z3$RHz !3ggzֳ;%rvJ۴U2j A03zhسg.cԩS9s^_Fa[$d?Z],5fͼ5 G߯C9h8/p _ ^?[2'?KP$c'3%V edQؐܘUgϞ7{w(RZZʦMشi[A}r;w.(px;MV@ԁVc~}C8R\EDW<Q a8-WP1&!͖UBL)@i6kGT 8Cu@Oiա]r#C"(EkmQk{ C[Jj,*Wd\+p!O`ޜ8Po{$z.}'ڠؘzyBl,"[r<4H"fP&Ȏ#Gؾ};.N8q}h& {?w!~%BNqz@'nV%ėc/T/aXE!CХKv ^p+WҩS'Z{Byye_Jab7 ،PrJND=Ok=|"wWCK=(}%wB88m \l[6`2 2DPdM@Uon q 9SwlWyսX+[DEEi`!IRX,Zmel"FAIBrTIH(*e+%\{\ ]i4D^a((h1w^G^en2㍔EoɅKzS>ЀZ.11 ?CWJvm۶#((HhDcٲn-!'SӓA=>O@E`CWZJ߉Y?R ɂgM.#VEU 9YPFUB hm]P߸ի)--%55^{ z-dWg5dܸq=*tp!VZEjj*(]hLqb|/S&-M:MiΜeNG_bO/$ ^Bӽ{wƍ^PZZʆ ؼy3FVYygz$s<]F`C5 Yd/4 l2NS'PdZPTt棤i܎FATTKct4@]_xZwNsW/ h4r0g uT hWO=wZSZR h)3qX,*;^݊t4dVU)d5y?+j{̶mۘ>}:ׯx}oGkUu9x 600d21#N{1C-Ғ՟N=U^aOLW2xNU1cOL` ѷ/g%w%2߬&> e䇍-y]yPJuؑGyvyTvZn݊`ByL+4&3bs#K^AW\JEb qk2Qt}m)<w!lPr-tMŅ\wFÉ'X|9ʉ~'l۶$Im/qTp/K;&0*ϋu$xb|>N!(`("(} -J9wPg̘Aaa!_~%$kyjCjh4MbU\UTAp0:;9fh4:I0 `4jh$@0/yŌoBA evh70;]^8)S?# PpzծUJ(Qpo^m!tv܉_MjuO>!11￟X>73 tI㍩F{9Kyia;6*"[ 6.IAݻ7[lŋtO ";;Ν;ӽ{w{ YԐ4OϒtEbX|ٺ;$_?D Y;8.R &s#66'Npa9k.N8Arr2QQQQ,YիG޶Ç[90Vli}!QD(+^O@9RE (K(* +3g2k֬* /I-xúRhj I vc88qw\}UrHS ;'C=`p `(7йKLy; 9xZ&u]m5ꐑIX-r]n]*C:ZOqWqhڄBBB2dxQelO>+7|N sxvccٲe:^xԊ*-׭f,Tw_B3h=z4rU;f8ʞ>ƐGqR"mK}cۏԯ`a%iʣ#0FVI2Ne^5Vvʸqʀ֯_͛)//Gղi&+_GT ِ2`-0k@GSBߏZ/JU(>[YF./D )܆GQVV/\e߶m?SEY8 R ]P$ץʵ 5Bw;އRUUIuA%Mb҃nM7q`{c4$1t lټվ@KƸf؟cǍ(ҿ6I E@yТE }QONVSt۷ogڴil!rb\HrD`r}.`@"@djd, wP]q<ӧ Z駟˳{4F#%Ais;) Hz`E4WV6#c5@># PZ0vX0Wjb ,Yܹs/.[P…췐  $1R0KÕR}+p5װpBΝ;dz>[3<@x5"P8 u.;CVcolݔVeԈN?%GHG<$$ W,ךe)%Ee.]:yLuWO%YVRY$l1-&3бcGfΜc=F-DQbl2y'fÊ%#DF#d]'1V<oO xm^kG1N;ݬ}_&4ݣr=VT3n8"##ZΝc͚5޽Yퟵh9# jmAj=f h4x q- ˲xgJ_mc@$r $իټyfP4MfS8Tu<$[S~@gOa_؏,\8SejZ6F#S* "e+.Y:lAAYT0[x#G\Ų:yKK[{ukuRETL4IVbTP=Mo>ӆxW۷|uΜ9ôiXhGZ')+>"((}ҽ{7t:_r>ׇnEFƛ=bm7L@@qÉ'Xb)))U/94|no`@v&+\#b>%&˗/租~FkF]Y8M38<o@,0CXmۖK.1uz ^. C^-h"@T]G% Oykγj;T SkHRAo_74Z-ꊫX*RT\ĴLUӑ[oIN\ӭR9QEVtp:r% UyJ[W+8}Hqf͚!m6{16mTEEEu]X5XKE>^]Jxma;iWQQQ?~y,4hZ޽UV^)ԁc3bI~;;keA az~3~DQ*ۢ7Wp %+wyBpR wglܸ3gp= >3gθkR!t586IH)^_]ו7ݺoس{oXm6nmk/^Ò%2d`sn5uǫ4qnFߺuZ'Nd2r_@U>̒%KhߡL\dVVfWrz ufWѲ,++tJ*fаP+.~d).Y JΞ=KIk^z gDGGAII/>|֭[47:Ziz(@-[X4nkh4l}$_m \7%I"22Ν;cXG$aA0LCLL ~~~5`Rҹ#w,yEP̥H?OLYBlvd~HJJBՒF"['y< >L|aRPN2<6`6ʱ;2d˗/_]Z#st&M8X`7m&5Mj`X0-f B۶PPWOEWW󽰰jx|/0vr.P_@BB^go~@MV˧|FffQ2HC-ƫo{oa2Z4|IXÏ8ucXEZqߤ{?ʄi332,5Yohm,oT!_L:Aj УG6lƍ1.7PVKii)o]veʔ).S;áͶp߳/_OAq.dLrb>_Kn:,fxrqӷzONNsڵϻ-haʕ$%%ѻwbP(J u_yK'o`_k("i56}sV~ѿ&NV%++ 9|0999x\l>+dvLFN9@`%^sL8_+23gRRV4+r+&9,lJ1 {E@O*t﫟j;8zuHn>yڟal޼_Ƅw!P5[Hs17|LjQÉme4=m;I Ws.. cZ$bbZ 77̳Y mq$$WXN/#jbr (R K$$AvS6N"55UVqw4 qq׳b v풛 21uTnf^n/߉"_С@ lQCrbL|m 7ΠTKH{gȑdggg 8y$iii\{tҥiGo '}fChДiG4Fr[gjul6"##f;v?h"JJJPG=Y3KbZ)6@>d@~ Z/Q\PB0uTyqc=5{)lL4IXU?'25OAY|u̚2W.VCPPp HLXz=\CDLۤâҏ^c /#W瞞$wNWe___~mxFE6mԇ( aJJh&hD 9jCE~;99 QQQdff)J %%KR @I爉ⓡ,]yp6}X&eߟҒOg"Ԋڠ 5lw<@HLL FѽWF^gq=>> jCc(g# dq}<1NfFO?;w""QXXHqqqA~]C-A!M.dW#!y-(ʪ|P+oSO=2P0 0S6/(rMe F@2&c2JUEGO \ClX ':@9D*:[,nN_}DQDӑw BPP0U|||x8xЭd3kj8س{/'OdРt:.Q)++c Ysљ`:vHHLj;7P2Τa6 A8KYieee\tnI_̙3\W?eÆP"^ +N@ð$kvbb`(*{@iI)Ai^mXZn=EEE0lqR>;dU*???4!2<s\@v9v)eeejՊVQJyqA2j!55,/ytpp0:t 44ԩqn*JJJHKKj5/ Xя,PZVL8h,۷#Fdcp(qףhHKKvFdb͜9s:F8ȟ|j$ϾVx:hIA7:m X= \.k#$HrW*G$!!6mPVV˗Jrb43a7ܵ=KivTc~={c{{c"uA4CCC9r$QQQȲNߟ(ҥ =z !!`+(\=vy>[qہL-*Cх@TfQ Lbp& vȿToPАP wU@\NN7mh,'..0jVVh/+M/޳gOlT~@jj f{y`ͧ3(6h^F g h4dPȗ`0] I~~~ <*?@'euSg\@ء'0s[O2E =R h䣏>hjbZy馛صkd޽ر\j>ٳg3t:8r}w/tp'Ccn`dLFb(++s** 2uvW vZzWU@c(uR92DL*٬6$teU7et!&Mŋz(NѱcGfϞݻYb.=IoXn=;wvۿ ֥dnGaI3 d^Sʉt?Vm@`H*f((aQlHmۖG"˲LQ1L_h_d |:~ )SӼr,-l6#1 #Bx)߾̚5tΝKQQ5Kj,^իW3yd߿ݥK(((`0sLzQ16{9O(īMk,9u؏#jj9W* rȲLII g` A V-7@t 1tZ-ܸ " 2FCjjSJFh4eILLez@dbTLvad^ˀk6Wֱq|sZbfƳeo(7%:PG۶m)++#??N8u Gh4VdvBҧ\.[s(ѭ-G߂|_# _!/Z.DƭJhh(;v@ӹ|`˖-[8vX?׏;3ZJ`ժU۞݆ ШHO >hkWأed e|}ϯPZZG@$+`ڷooUpFSWQ\\LFz:VFP`zb@ŵFu(~&[nϏA5P\BҹsgOAAYYYn<֯_Oii):tf8i|0ïG3Ksg; )*naˆKfRj='ٲ' h>}U$t:۷'66|ʖ"00VZaX%ΉO7@cRCeLk/k!,XZ-,y?>@>yα?|h۶-&L //ÇT%2>>>?SPP@_[2~xD+_QxxZ-D@QE_V6~(7%.ιyuI੩P/઩PTe"22$**ŀf3go60<"""'x^zxA@ӱe{9nꩌ+~[?6Zر#>̞RHhI?BlA87/)j-!CjfhP ?%KPTTI bU2)~f6O<`U s#Dp y z7pxGXx1_ϲf͚ZXҘ7o+Hi 4^Q/t٫Y*I}sw'SPe4+42AAAoޣxT@d#Ku ,&32r @zY eb֭\|QF5PpMк5^Nv@˖-3f :}t:l6?uv)S8p&i8^@b@@\\q X-6]P$ uz )L 3UNޙ@P@ll,Ç'!!m)*;w~ Jdd$hZ FI4SiO/<5;v,K,iqZW(((`ɒ%ٳǫ{I>|8vAAA?c%(P 8P:w)+ R6$jkagh4w^.^GW(<+=rJ*žȏ=;l!bJdfÍBV&K:YY`7n$,,̣`00x`&Nʍ78v=X |7ۯ/&c40)//b(FM V p \&/]GllS* 0337rܹFxǵB>J-:9xbzpxW*n23"K2JʄU=gJ p90]aO<ɲe˸[G߾}k8{,nǻ%EX9"Zhk]Q1/K nqjR1Gun(ȲL@@:t <a@ d=QAzY1({oѣ%bzΞ=˺u1bGfCf1aΟwڶxQԸ nĴ".>Eٰ훿Z$/W2F:Q5BnGO;s̙8O=+K6ZIf`ڵk.v$2EEE=,H*9?JPՐP %~# QPPEԩǜp5?@$iժn"ѿ>zTxx8XM\#J]anm:DX%y044$4}sr> 6E=nCk`t!؋Xk/c- #$$I| @ ס UPG?$ ]'O>v=+W`&0k&[?N?"w0&0֮R#vg}Ƅ (//wꢕe￿-.]Ĝ9s<5{hZ+&P3"&K*2#p&N'*v<z N w!",@@j:jjj]S 0DyplڴA^pcCеkWLnn.n-[(--m۶^pD8=L\\,Z)uJh`z#kKaDx DQF+'UyHwΰa߿?'N ''Ǟ }:u 6A\\5U4A+"6aJ_Ë3{᭗!%th|Q!$āфw !3:=z4j'N$))}ӧOg֭?-EԨQ*$U I%JT\ʍFZ--#Z2hPC3l~OԃpDPPm۶: U)BFV[UqC9* ٳ6 Y2YYY,\b kQXX\ؾ};z8C>:㉉d %5CǷ?qޗ)/a>Vw ZӡC! 6֭[sA-"VJV޽{ҩSʹ|'x“T# )oEl\lWA5Mh4Z"# uZ PTTDzzzs46As0hw™1$+; W 6fݱ`,JKܖRn"lhbfvw}Gxx8ݺum-Z`ذaDFFrI<fDEEypr?^Čw/hmt̾W!K4bTC= vu"B?)Nַ`4[x3)\yJRR%Hy\/Ah?7_@షJĚ5kٳ'fjյ\",,gy^z*,P6ő/Ȗ-[:3CsSkZjy$Ień<0N IIbgWB4H̀޾;(7_ڴioO?(X,aļyxWz56o˯!= E޸-EE>[/Uikbh45)SI OP\@ 1 *7Էpo'IpYɒ\PZP'ou4g=jyYY;v/:t୷bzNdb…̙3ÇK~"Z^( %WTc&@$=&3;:?_| 'z+BCNNg_{gUuܙȒ RD"-.hRjEDE6AA*TUD.(VeYT$`eq޹edg293}ӾT3nউТ{;ڈ?A) M *2Fx@ZwMFUn0SP ƪ ^c"DNiѢ]v Jk呖vEQh݆byjV?ͭ`)> &.' "}]x N;4ub7c)•W^b޽~OSUbl?L.]vmU2W*$w1l Qt=#B8XT*F!CHKK~E{giٳGwU+6}3Pּr<GokjWנYrߝh_m_Bv(CQq2+D{CSRR> IDAThߡ~>.@ii)6I'S*:TqKaaLٵQ(;K2͚c&'+oJwA֮?yjՊɓ'6mPRRAοo&M_&(7 y !+ h@h;epUϣ{ʿCYA{/O>^:D/qD<zc7n M7yV v~X"~O x1c+@՚cn+T5bPFp7tތ8ә4iRY1YfѶm[9vEQشifbӦM~wt7tMY9W<lǠ\Pxnq ݊iJ~nݺ`n6RUy9t={lC+/B~(֡=ʎ/PztG۸։t.!CI)@b' U1{uo߫ PeH|bIqU8T/`ɸGZc(K<ʅ,[SN9g}݈>z* .on:4Mtrx3g}{v&'_#J<8.iBRs$w_wX+2#!!#G0sLy|mPTmB1([><%;ák=@++yN4xٹsgfE/qFl&#@]-s~CFy^kBq0Edm[5`x3^vcܦ;jQ8N \`" ]'4vmۗ?0L݉y'KJdҥ,^89ya4}֯T]w]g^9E Gfҥݛmƽ˻KGٯh3ܿ_R7t<@7h #Wg֬YG'fʢwkw3?R1",b{"0n=P]\." iڵ/C?[nscѳgO(8NvܹsyVkdgLJ]oW.4:26<(^'XM/~&qS3y[fʔ)̞=mۚ {mCQ֮]ԩSٶm\geDoc@).F)(C;L V ì0m e(^AFiӦ7Y̌㟘dFa hxy>!&b@XZQ,n 0 #L$g&OAqFzɓ)- +jnݚ￟xN:)>fqFMƇ~跽jWhzAEl=vpvCiYZўIǟXn{i1|Ǝk? Aqq1O<7C95(ٴ)ڨ(?6w1ڜpD8h S A[}뷟ua׮]Z*P[CL>~?{_k^% =0(֝= K.hѢ6,K<222QlOQl,gl6v;vcǎGfyȄ4'w_OЬY3 4 :f͚? ~˶mHNN}t\o /Yh{VgtڕCRRRb?9TU%//7EIL_5-Ad3f?sCa.;]h#Gև6,..CSRIIIRiU3jyY9( -[u5 QuN/((СC$LǍtYh(5WL͌4nz> //ロ]:5.Kyꩧ^ۂ¼\~9\trכ.onԩSyw|8ʣ(E| (އ+FwCмYo-[5sXdd,aQ<gU! W,sUUg6ؘz^ ׍nVbUVn` Kk ƒr3tP9E UU3f -[n;wdΜ9+?&?YqIcm7N䚫٠\c9;`+\pvviJ/`lӦ SLaƌjʯl̘1[z NC\5SQJ{ U'21|X"D<:@ͧj]\ dknO@5Em`^U=xT&cx)y`%X>0ƍܹ3'N 7RRR1c&My~UQ6l`l޼92y%eQ;m42# 6ݻ7-b̘1A Xb .a.8,~uC7oii7 y<5Y]oXsj@:׍(;{M50d z] XQ ,+CiӦ,ZC ΛD x\gZdjm:{ 袋xWСCv[+Yr%Uiod|wر/#FT_LpDƌl3& %sZw'n>ZompF-{ "7;rvq}k.^|EPSNEEcƌu˖-[]c΁Swcjp{_qC&0;4MU$ x8=L4};v Fwtԉz;Ml6>CNʧ~ފs'5'9"-qیL^}W=cxaq;#''/O'55kUU}>itޝ:+H喀)"@;xavy@C(Њ:`/_\ 8˗3l0=T!i /̙37v"OsLBz[Ydn>..K:)m͓idgSLO5@С< 2LѪ`رuԕ~{Xy"GLh~|[k# sx4B f?; uIYs-F$P#>\XYYڵ+[6F9s(p8`<;??ݥLŶ}s_}gp漸Ng$rGg $$$׿ УG.:vħ./Pa]4Yw>^ø.q$7G .3vZpS<֩H"!YdРA\uU6s]6mmƜ9sܹ_fCUU{fΜkHƌ;[$Aa|5鋎3Lm̻ZLz']S:wNVԮ];x'MmP.`J#fzLy yY2Z7/Fa0|B" K[LŭeЂӪU+O^ESN9z &䷐hɓڴYڎ~ߔeӖ^Yµë^4=槃e D3̵gy@nG Fno4Vw>3ƍ^=^W:sYx4@NY$Q}… ILLW_ "Yx1#G 5k?{_|~"kRY O+❏iTKtrv.op_ʫ߇ cƌ Xd1ENSKph<^Uw3bH4^ c݁@!Β*P3׿4V'^.rkӧ:fcذariZQVѣtRIc[m]ua39tj2vTK N*?>$Hn:@ͮF_(=!HT`Y}ÿd.M~}81"VGj@,` g"Z,`$CA{n˨QŊ㎤$ƍٳѣGP;v0m4^uaxkC![/cʸ$F@nYݒm\~Q3:Wƍ U(t⿰DPl-^4ߘۜc7ǁ'dz(*p.) @.؉*o µkҬY3y*t҅ӧ3qDZjWgQs=XYB.z9oZ}rV+Jzu0w\5)G 9f34֐v]EOU_b,I0$24 'mTUo?ͻWiхʴihӦMߟyq7t:)--픖j*Oξ}w6eI]C݀hrMя#&sojoUsr0ۖ{Ĉ Sp?c8Ukx3ic" ,dgg3|p#ҹH*]v ,`СTTTPYYY!`8vcٲeŧn &j % i,dNJkZ"s-su􍀿b s]h(O@-nTEh~,@K -8 ^>hkz7L~~~D:)Zh_W~aKQQQmEt}v&Mkk7i5@c(u9f4\mI+xHC1@w8p4|0 W`MjfQ hjlt xh"'duիiժU|L<|dTUeÆ L0?In5:SO=}@iӘ`z[K͛ ճ܄o;(D@ճk[=6:0 6rfڴitЁ?2= zfܸqW(h۩`ʕ̘1~)ʽeԨQl#J7@^ɮPJאWMi.OYFCBh,24$@~P>@MaKߧ,Vî G&' P.+g\PU!Cxb?RZZZ>􃆲;w.˖- Y~=[nפ(V!QT#T+ =} 0~|* XqoG h@'|tbj_|A>}[V8W͚5kaŜqj(BBB;v;awy}!N cR_ |o 6 0B՗h^%'3~[{=Z[1Jsk9 X>$''c|NIII{eܹ$''SXXXkjEQl$''G'7ׯh:=#ԍv]Yguu_1כg%׿AC5@Xw"44n_#zr` L3e~4={fĉ(RcM޽; JJJJ93yOnN|D\jͪ2r#|Y: Ѐ}"PXW!NDBp.?r#G>|8>nstR*JJJ|TVV2vبg̘1<anhQyW V (y4H=  . 2%ƶbX P-@oTՐ|gӇoc511ѣGb g? رcTk.^uM=D1XvU7n#TZjM%'=Jjay4d_vGXoZYؑU5 Y P(ygܹ3-a'%%q=`ڴi/l](tE3ݦ/oL9m7/f#@CPK% 4t_OL xħY,WoK.go'XZZ<@޽yB҇nݺpB4NѸK!>MM6 nc5M,XPwvS+q(8=-54U{5XVeWk>K=v' GRB/ 6..}kP78@hv9jX9O3h!QXw VnMe9j~h^UIDATpHJ~cto@F(~Gyr-dffFs SrF;Bv̳TCP5+4͓0n= Ac4VM;pu\k@<, ï"b1^Eʭ BzP-vGgoTU4Ыؼy3g'>n!POT8Mj>}CdMsWP@3@00F+ `gՆ)5L}1x\!Y'ϡW\Jg\\={JQQy74MK UU=)Oe4,<1ˆ#_QQ|tWDϩ ''PB`Bݟ=|8_~y7ȰX. Q@UU4.@+`UY@Q\.^S4pS ^\\Liiix< S_c3=18K>QqF رcb Y%0sGU(L9)#@76YyR\\ 9"5NII EEEa iS͌恤T+`/tݼ q,Y&O7|QE)?,R~aZ}"JJJދ/!ˆP3 "M*25Ob( @,*J.`,-BYn] 7z\rJ}@НhLLs{ۮc}C ),,tH3K EP_ uNbtX`>`k(޽K.$uٲe ǏdT&ē:QhJE$)ƂϏN_oe瓟_l- 1jgmaa!yyy!Y%xyj"@ţwbp! W 8ʅ7os[oѸ,NƶmLM닿NP5?{핗Gaa!Y91jguvvvINN߂O0<5.F|S&A5}~2EG{\QQUׯ).x뭷8i.$TCO}LϨxLTFu?''R1j/d1Znw*Ngt>W@d!տ?~Y?`ݺu\(=@M6Ƌ|53 {xc7SCWUB@.QC13%YYYu {O k_s0[w8*xjd`0!k6aA4y6ҁk %j'P944O(ԲQ,=԰ EQرc%#$YSAAAS 4ÅeY]\5Qh4&-e| 8=z0c k#*b1h fϞLrLjvJg0 4ȊP406J!H4 6Z9)E!i/{P}pa*7U 0!"\?B^Jς 8p )))\ve:y=ʂ ԩ3g4TցpÁB~Nވփ9X}SMݳyD^C:m?NnnV\\)3=:8111y1!`^aȾA*cjp(s !Fѫ]}W|Wb֭\r  SO%%%f͚Dqq1:t>>[C' X> ae0=Q,E;*b ikJ MB9Ɨ ?Nzza@qvddd7d߾}ѣ/z2P}Ie3u4n6S"iiidffQ?P@TXXvNNNiZZ0mq%+Uok@_:HZqSWvC Dx# x%vӥ;[ 88ś`̙CAzjÈ]VPP|>Y|!@h\mnnnEzz:jU[i秊7_=*C^Oɜ 7swA~$Dɑ~9sFQ=JNNNEffvP 3ûrrr* #[=ǰXӭ^Xխ^G'N<h\^@u!~G}O}|H |CfEQ ;;{8 t :cvvv#G̝~m/P *Ӱ KV< ̋A 'cn@`1g^\\s^33 t:̍>7\ԍ`ڲ7WR9¯ZqС%NM1#Gl'X,++Zx5 j 5ΉͅQ^6@)G?u2bÙDH,XEZfME|( .LJJJJ> }B;GYtimڴI&lٲ%ﯰmWگq-EQӫWfTLHgȈͅF1m %zQa@_tAkXE~B/StmDENG34{_NQ Ua),,y-?;; rrssn wbԟ[^[ޱcd!Daaamk4f( PVM\&~߻Z'́JWDE!J=|֒΄Y0UT7餖7j\k,/( u| 1kхu::[ރ? C!4B/qZy\󗑏WTNͣ2JKK)++URJb&nzg3\#9nʹׯU6TG8í/#5!ṷ^<)X-<ߗGOb 4J@i{0#:2MQt/+/oht}RGubQ!BuAbΨQbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS&;UUIENDB`klog-0.9.8.1/img/klog_512x512.png0000644000175000017500000031577513532572307015061 0ustar develdevelPNG  IHDRxbKGD pHYs.#.#x?vtIMEZo IDATxw|TeϽ3I'!P#EHGD`YWײ]X *`[ײtuk!bkH !L{<7a$5L&S2Ͻ9s                                                                                         AGB& Hso@ {y]p*; (C+"A8tdl5-==Krrr6>/x<OBB>x׋plq hq۶8b1"D"7U86bX4#H ձXlP抅Z`:A ž  t:w<"##gjjj,233̴O$%h4J4UhX,X,ˢw]ǽmR0 W 00' RV^媬,--5`0!|mY `;(C/"% 8ҡC:о}{3;;i׮N8RppEEWHDE]cŰm[[JcoXE)a(- l0libeY(--5KKK=eee܈29MA 4eF222ctVVVnݺ]us:uDQU8& RJ+?p>nE 0L1LzM'VZZJ 0w ٶ.-TN'A ~p4 2dZΝ{ߟ={: Ni `P(">=d85~W00=i7!!ZQQaܹSZZj xk A8Legg۷q iժ;)++# P(D4ŵ8Ѭ u}@|*6L3jmz|c9&c=^ PZZ ez hߗmDiVm;N h4? HA {0o߾uQ}ƌdggS\TD Lb1Pj7O@ҫ{cU[-X,V{ſveWe'./>oO# Y~ؓ(KA)KAFv4M,W <˩.a0裏aڏ7QJcJ }xub+ o1///'   dB¡.ԣU@o,z?@x<L4M<nq?VU߹6~r6ljZS$ǁ"r6l#GL=z4عS{V%9{^+t]zv8<eeeJU?JK BD,0i*EexPy-P]VkbU@%u fF`A3fLq9رCVax;aA(..: e7giV-7aCQtgrDBӿ.رc{O2qTqq1@@{敏(PJ(((`[a!l۾"b krSQ`FrH]v43:R;z@DBa$pĉϝ1cѦMUXXH`Neݛ7 p8̦M(غByb001lj9#A7=r8I~ӷoߛ&MsTqqWz[l!??M6efBXeAhׯ܇^2p.''3fЪU+cץUz[lalܰ-[jOT.}b {N` @=5B[neY۶w/ ] "ݻ2}!C[*>KO(0Mp85kXf ֭_߹B-A @~7#sIJOO7 UYii>{=-~/,,dլ^N8hB bC:P]zXD~8hР+N=Tbnټ(jkzJ)L$VZŪ+$/h!u6zeA 0Zٶ;t+O;4X,,(0"JZ=j{]O???+Wfj-F_8TBu5p @BBB/4w3g4xhtz5 8U5Wzj"%F_8\B X\P9z3k,eYXP`4b35aglAZخ^|N~FO͝6@oWdrBk"n$Pz # 2p#N 4_z?Cc^e;ڣ^(w Ǯqɗ'];cU)}uD``B7)` q kGkC0F Rй+LWN%"frtAm1u2}́ߝ ?C\x]¡' ]f0îґW K/G#/2""Cw3[^\tVk ^׶Xl$^#ɥG+E 4Aڢמ^~C谱W%2RM1 z!tm!ׅ (AILh-CG[vq [r4k|i$$(Ht@ Qˁ2""Ǘ@"?;: Rp{ΓSEtxԒ::/&Ϡk B"ϒܝvM@P^F%rE~.쎹[=q]wŬ+ɥn͠JR͙-rmek +LRBɡ >~f7JT? ȓC0,?q@sqg`_w MI& rWhל U}K[ر k@+ʀn/m5ly'yr^neWgGGcD؂ !Yu$kegp ӞҫC]c߀aݞ ࿷߾`m/u2u J T9r/"pz4d|' B#Ð!hDwػ<Ӏ-{ߢ8VJџLxysAx0idڝR}ky8_od9a )0>O/Bvf`m()p$n 8ԽP :ov[)4<oܹW6oynKUTD͝{+Fjrmj% mX}S60J'J -9E̎g`)q.sEA裇0{l"H(0X|y_"=v\ne+`%^sW_ RۉбtE$  h߁=~x؂.6'Noݺ_beRU$ݎC#YP^M11t'89"C@r ;t>W4h=lٳ'Za.|ǩ*~{$ķqF;e6ٺURZ9$H4WTvm(eW`oݚ4d2p, ;%RVFhvŰ˰ӿ?mB_C'iPJ{{ȁ_YP hB Hw = \&Q3Hob~Ko-Ctf5 ii=hϘA}HxvsqlhHi)Wlx)g F]c=ڵk+,5q"j4QJk׶/pncz+;C)@.4 K ~3֙s5Wih ;ű$ ò8j ӟ>9ssÇeYo͝yp 7נwbJM"v \^#\kӿ=Y$7@M2zdmap ƪh6@, "cϏONNvm{^Ӷmy!׼y:8va[Ͽukn![g&W<<,u5H)D:cFB2tn+-tԏZqϋ Ĩ)Q# 򩧪 ͛7SO؀&MMII^sqkgff.pgR$9fFPJ=y猰;[s . Ъ10kC"036awD]߂zRmbVc;X8RRUMG8Y%ݺ}h ?¯jȻ)e8v6o&nͻ5캰ٹs%Wڢsi)5p/z S ԓMos,ZFJA7ةW#?c~[ Z"eF:,[VMٓc8k&_e77# ;h1 ɹ->܀Ҫ ̭k]vZ8 މ4 <tRt-+Qv혱yF̙2b/{aXec N ۳4΁Գ߾\d0 (ȁFzrD30a1q{@I&ܨL_Y>u:OI1.}(CUnE"CS}3g64}VVSe}'6Cثt۶˿N^bYjC҉nSBAa8BnWilЁuw-$]δݛ}t`x-!`}VYY˼~ 욻“@(z}E]DGPc`%2 㾛o<;<ˎͽ̯Ѝ@r,{Ͽ5^ϮptOl(tnNc|qChZ\(eb-~jؚ%עvMNf1cv4ډV)k%vzl޼B"(a`(!(ś7DP/]d/ԑ#GTOH#RXye}82d*h :` ;F0n$ax6Tߌ>ƿnj}O=<DzH;--[,PGjܷ 3?qknjO2dp5o1[lq俗pw T;lBPlwA%Ipa ""z=ƿuiYs&=IONֿ IDATq܏wz,c`G:_Zmvm.*X(DF>L{ir~NHܹnŋad t%S[_ ^@Ac pĐ."Z9 m~X`ϝn^rkBΙ>ӨQ:+7Mqhu`J6/}t8S}qn 6U'&GGaZ.ʬwl(sxHNFwI!ɇ[|vOGn3 pyQJǎ>{,P}!'X.v4tRZ?vmV4c<?`&}WM!譮m'0 ?@U$:7ϟ7T)F9N(VJ-wܹeZ[tr JTYTAE/1npvÀf>ޓǁ:5<\tG_žUP ڸ 3%v(ӳ{d-"haѿnÆ:atؑ#GҧOoRSSH$իU؆+msp8 w'*7[ss._`sis-0%VH "tϭ"X\qu,fI:hʹyQ#qw~-ɯ`{ ˀCGR+i c¡f$),wk8y]P'La7HƊFJ9&]z8bYDM|Ă}RMsͷ~99m^n\Dih@桬9xFE8͂E? >ƿzM̞+Y "#+XGg4t;7onc+G{GCRUS}0֮ף;6WDVrsϒԦM]?l_a{'F|v$7% 078jTC>%mz{&opz=W列G_۰>xoa8dKhA߹a? ֵ97P/mF~;C^ɯXӤҥ$TF"ڹs5 a%|rǝ֮mۖ ˲Po|MnZpym;G&'~o^H<Oݿ@@;suT6W#l7%ℇX @ѪՍCCP՚ 9U!97>f))uN;Юslron{2 #7w}5fj8xM> &ȰvJoie}G+;e=lZ&M}=O(^z7ܱmeVy ,l_3_B_2<=uޝ]V+5zYh1<_9sVv8X+@jO[/AdExʩGzY~-(BNjNxэ{>d{ëڹ3#o 'hiR^^@b۶>bTpY/fzy˲{4lI:35z'|~ eߊYJIs~QK$h7\=wu1=b]+ס8dWDZ#dO6%%mqbt҅fsK1&U'}ը&ZYe{^/J)v^} OLO>ZŶu?ӣW"oEl08矇o}\C7o>5 nb|La_3///G79;xc}z1BO}8M͝II3Nnf7_i à}ǎj^9݄dGC~8 >JF>M_EvUk_em'l[BBz:ݺ{A:pFcʪꥍɄ 9S~}C>Kף⡇ B/#&NآEsvFtsuh]n_}5qA0h@ߨkVѻzh\dgرC88.bibFv1jH xM{Q'oϙd~?>V0Xa7lܹ,jJ~AՌVlpj.P*Ef&Ӟ7ӟ}V={6&yF>GBZ?=,y'z}'dĈU97qss>U,8ks{dI V[ ꫹v\W9O?{C$o8@N A޽zH8qbzRbr5eyVFR$''sSU%0 mw =@j]_Ԫw/>$GL,*ɗ7R}{mjQ eZmY'17Rmjk3=|ʫI4Z5?/X8DIuОٳgJ)Bpi(` :,^83MP֘c[,//g?@؈+c'Lɧ=cضeYXEh轼)SD"C/_{N֙m3g_i {ȑaRZqƿ)o;xl}^4w#MIijaOh￞Dz)ݺa4K ]:vh_u=A0b˯n x !DzQMDY(]0{餥WX|ЗxSAA$/oI0'gTv[>P/ml! tD 33oJPysݻ۶8lkJ]"rƙuоT94iV{<LĶmjƍY) ц7o-0I'tKۏKre}Njl[6^{FBmr-|r5Z[ަ@q"7o0 駟y<^PZ ) RZ79)''> Y9))kN @ E2ʻkv(o vr ۊgyf/&q5W'+h <*C"́%1i3kf5cO֎pꩧ?ᆱpg4:46 4E|m]_ILd71r\<~_(㫼'@.'DRv'v|HI۰"CMoAM/#I, )|/p4·~7+g͔U-%uBC RpvHԉm_/'עcѻwj^AA!zͷ )99>'> ŋַ9Oz6)ZRT.ѻo^{=+ &@޽{>~?11*?돿y<<CeѢE%K؎LE/FU> ]O)1Н(A=w:3_Bsi4IneUgTBidr>\7?`#V^^loc߱(-~iTk d¤ _eq1s&gW\79YWFmpt븿 %uW?Gyذa=m3xxu00J0 "3~1m2uMxc_)*UZjE۶m# ,O4.~7R|Ĭ֜fMNn4~4Y}'z-DJJP )U708i" oË.foBo][ڞ0R$vH!yQJaE"ر8D:oWFc^&)y׿8YY}6a7e]ہi۷o9^ő `'^Spd sG; 1ky6Y),>aÆmtO8 >Dw﫳ә޽q"RR]2 Vfσ9eKDx|>OͰᔮ^Cp{i+/g}%ɝ;ݩ- 8E\p~>x0x$dd{E)IH)d|'.PTT|Xk{Z0_~ >Oo/}w߽[ )j=nܘ99'3~rN'0UNŋ`Wlra4uN8_|t2 ><·$//TZZN.L'2ׁ~?.KK'F,jk͛mD"fϞ7Yf8Mu{(C{A=+ntn˗7֥f—ɑW_EljrPz;G)߸nuddm'@ ~EJ׮?cl8CG/t:3)q;#qWE^/ 5*VQQsoooY`\]s_7o>s6n^dIczz?+[%r׬E/N@;D4j.nmݺqmڷTEm3p@^}Vmpն'5x~SE7g?pM7`36x7,:[oGRS@הo_"ftN1/"3큯n#6*Oxo?,XOn*L8-)^>/݋1Y Q~} qD|LLJ"O=Φ7ެvEɝ4iMٸ˖Zpg}l.V~y;9jе@G!R곁v\|yG۶i+opݶoW|W:| BC+@򌓦6e{^,3g2tMBY`9u!W_͸{ߺu C翷u=Wuxe]jZ֐PO4@)X ӄ }kRaCP}9I9YXuB I_~W@)*~B=z᪫l=AwuNĉ9 6g4] /0r$7NyAq䪫u/ui{܆v,?3.3NUۊ, pa!C5ꍯuf'iA\$HiءmӇᆪbx%䦥u݇w 'ܙ.<ה>MܡCcOF?eYdfdO&}E蜂(CpH^;}㪭ǯǯ۶M֭ٸqcW\n7jgĜuiMǰ(/w܋WbUQAz zӡ` Y#ZvRRzکt?L*?`"(xMIi4ICOB|Dt:s9rd;'sssw/8CRnY`|<99yR k ׶$P[oO ,F7 $8[@h^TwvAӧOG ~ |מ[snS&3hsQM̫th=x0={Prb ^s7<"k_Hٚd > oJ/ F&cȞq"P\O4,II&wor9зsjBg(޻>?OZ~eÆYDKK):֜yRG-_?𜼼^e ]1u7vqw.Y'hF/]|}&G"ݼD]f'{eX7]o@pX0Sv'̌xomL0 &l)))Y\D@v]_Ƙ?!W^1s*5meҵ+> e|v4p!Rak~Dz8#!|3Rak4|Y4~JJLπ#Izzqx^~^_ÉvBQJ 6y2&O&~;sHM>^?_[[3B5R[̙O ݻg_KZOZER菠 " kyo2hǮŞUJ)y/rMAl걬㔓9gS';]QAEI ); q:' 5k%w IDAT&/d˯oݚ=ַ\p, _F&O#sQX(h \E~}ef6)!`$$&vڐĆ /)+/b[!N<#awdb[gi{Q}=1uj/?^?G^ד |g0'/+hf>suZ)Rm\z[6oG@NowLӃRZ ~ ސegg[gކN\H Qdg3닱#7^V owM2 XQǶ1^:MHQ]ChVmn7MX-GevNRvup,]z[ ,߭l6&rҏ<k] >$O|roDIN";PӦ΃cYwNg̤𫯱"ׯ_I~awslNn5CÇ4sRܥK]vYJ\3PT)q{bX_1i)E4".Nر}­ںMV:aԨQ?>S`~#~ǣOϋ &QҺtn־6mx󈖗} c$iM 6 nݗASO!k7v|@`?}ŪpA!%_/4FW ߻˹h7h}vm˵9$~ /@aa1ioVvjVʸ{޼}+Odƍy޽{{*ES\m _7O?/rNv8"wܽ1GSj_ӋjӦ .,}B_?xнR61ᯏ3c=uoO>K0blX~vÎ%_?zD7~Dv|=V8_eֳ~BH}b&&wuDǶ1^ڍMS(_ҕtAC ibB,>"ktYsԵ jV0D__HjuKzSܕW=B.ԥN:iǏ;)''gVNi99ǞpBNyE c}Tԅ 3gNR- à]vU+@'& _0x֩'wTƿL+# EPE%SFc$(vc,;* PMR>s,Ex;{ۜs[nS_s_k˲ubsBND(#8x4]tQeLIѣ r±cw ).,;DYȣ͙;9]̠QxȪuwIŋYy}n.$Y&wM_Aam/ew-@9f]7nu uA.r]'L8ݹs?  6mtaÜ}KCW %9){-]^gs:oww=ajˇe`ժUiӦ5"&vsbHI_C'z~vYe^;jV7rD&Μ1\T~k}LCț8ӮW\aQ(QFp+-w]wf60ozS#W^yt:ϮRWW'n9aNUs_^p7u svŗTŁa蘆iaxk2eʔr=:àb4BЧh8{r־-DzGgۜ[Ι”i5ARnt=dTkP[T-l5 -$T>n&7 (?r쉯:B;B$y(4/{M()قiS[sga -m_ /vaUVV*s'`c;-MQQ96 f8]wɲl|a„,+,I dgb@g͝;3 Y|)'O|>uL@7 L0Li`V$%%!ɸ֬^?^-ݔѪeev@,ML4-JKK{׏_ y >"{zp>,c:înnV:nsL'a6@q9ɟ0C%m;ᲲT|)Ջ+.WXaɢ9-,X$I"XRַfab"ȑۓLV(D; IMK#x9'/l| ',..NegS>[n}~gϝ;s8a@:|$svBr pȼy.䒔P8οeh"# IEo. ?b,ptȺ 3x 7ܘ(j ŸDMta?YYL=ojE(zxtn.9D.r饂$I,_7Ӫ3Pn&Μ+5e~Zx}дv:dmUYUS{^:mj)zNݒm,(%K)}=\to m$@ -"з/|Fz> r -N{g:<򑢬4 00i,P~;m* x#[ćEJ.?βP>bʊV7wY=- t9D)4[/`ڂ%[ Oj~8:i5jN=-KJHyKR{[Pϗ$Eg蕖j 'L1cwliSJ$I(}gϞ X ͝;l„35aΝ2 X ͯl{lg팫&'HXıi "dݭ^[ $JK_yܢ®@ib7kYi2cƌ:;jӧ@=)s@N=Q܌(m#drͷ]Ѻ '+OGDeEeGsPNg; ø矣i&~V'd&_|S/`o У?4 Gr2#|1<{7noˮ`M7i3938/bgdAE9[HJMeғOr֣iFF{ H/BSScy_GhCeW';NUU;҅L,I-e*N5_/[X@Rq>̤gˣ~21mo~@NFEOg^eeXF sOo:ޜl$Rͷ?ɵ;v,]'ā$Iw}fوn1T&L ?,둹sw˺jÆ ';֛$7sL`?z+RX'N@MFH-`AD/~CFn]&{xr}׋,+3k_A-@޶Aްтcee_\`~ [b:ᔽ)g0&]&M"\Yٹ ˯X6mDx펍ܫf41ź'b_ۣ|h~]J{>deӯ&LB@ 1nX$hoj=L< }v'ք,k_ze,u[k:٥}W^?ԓp$Q^ 00K74< 5 ,5F#l6lx @_隄P7~ιt:=xnEKD" hYQl?@$]1bӦM S;!ǂ>țȀÈB|"RSÛpI95ꧣ $U(-oY+T}S۳s;?/ 66v* *f<ζٳ7/lzLϩSqeYhM #Re~42N $Ue#S;:~{ dpe% +[!55뮻vi{};zlp?TC[oNxi oo;ԓW5l.\YePױ׋BQd@uH]רeM_0T[[Ehٙo_'p9cү GfFiHiZ dˎ9])+2Q[[GCC=$T _DP;sffM}Ov/7/gr]p>5Gt"+*M6q,ϛG:S㰿S1bNCIJP\.uu>k6i=ʖ$X wN6=7'*x<-[ƪ{g߸IU|--;?rOǛ/ tR ڲwi$=(z]5}﮵ezT~-eO?͙ƣ n^O<7Y~'1|y `vv'|s^zb21tcڎu]P###d_Ҏ.-A$#pJ شiS|nB_B _zt9ࠃ;22),(<$a0E)@8 ̈́aL B]tqiCC5?y9; b''Q7BG~Q*)2U-k:|>N|M|bJr2-c{9Sɥz܌&{LH룣6mbͿj(qXԾ}7}9ف Pv){}>Z!R̅b^o Dg[LdEMdh_. y.^ZԊ*rXi,|׼{{vEEEѣ 64- x뭷}I l>N9N'={$#=]װ Kln0B,,IKBU0Vu뾏Tjf">+X9@ϜǓO?VPݛ$jl-Iq &o& do%@$(+/ ^yBK~dGCfǨnŕ˷]Y[ǟ@߷Ӯ`-(/gۜO<{6UKd=C>$Ltr=O:WJJGVĿn=˲45~ӧڧ7F$!.) ϰWcv tgF}/cm HBpf*fCh6$D1G K[$q#K&4E0o޼6"].O?m?IVVVi>lWϓгGNaaY"Cdea #mglo؂%l444_aI>huBv#}u`X׮]\O-%&a%G `S&֯`r-htih>Dj'$3v F E;WvTr ,nڟxyy88 ;±cQn@B3/YU1umfOojl?@Q\.O<^ttf⳹" kk ò0 >}pUd*Z:$b;dիZFD,I[9fAPx3k0=ߦɲ!vvxe۹[Zp0DeU%~YINN&//A\v|H "oVgΫy4[`/322^|H4p,#K\._~@aQ!)kYz5 z)L2=" \Wzv:Ũic6 -x׏>h(cR|t?x阚&k0cQa;?&V_i Zz +,9#$IB?c9:j^Eu(g k:UUlڸ-[oDeZJJO?tBӁ'>{Rwgѯz[v$O_vF/?n'mdvG#Xƞc%E/ltm}:PEEFlaR9Ӯ3q{7#K"I(.'|3%RYپ̅i"2<^'D%o.!ow-dgOEUU66BkF:/HIIz2`7?ȒL]}O>$hÇӫg/\Y@SS#| %%|=\\N]bhZ{fٲA`jZ[7__XX(*(:$Qc>%:T_Dc.rDcߗ^$7/PN/p̬ uÆњ ,HtW]ć35SQkӭHͶh8L=q3g5P0z4 4ͮPnu6Rl5cI-4@u))M9i\]UR 1 +V:?,ϒMSNFq:h\§A IDAT=F4ڦ@sa $R[t]UeN it"_?y&$Ѱ~}{J}C z_ p ݺu싪v%JC??yIGMbzQ,# "zq\S_K/H~AB6lч>P,느Yxt5]]ӯnŅ]0 oݶߞCZFnH|و[Dv;EUrw&7;ܼ< 0LΟ7?^1=!k ݏ? W#)WMd%wBcn;B3$o_dS5_R¿ޙxg /Pv 'OFx04s iq_Q]N9wn.˖bD"mv,ܾ#c`Te;r9£''PR^,cFTΛO_ԭێɈ \|?ja╕|(( cҴ*&XB_,xIGM4ѓOJJjs%fΜIC}=g~&iiE}#|L$'ҿ? $##-% ?dwuw= ny(ݻtG J(o{.IIɸ\n Z, ~$)6?i lhl4MUt[obȠI dT^^a@q:1g4UCnލuZP>w>g>]8nǿ2O.'$fv#9s7ldc#;TtC72-['i8&ʊ ;G!b455"-+2 -9w}IGMmU@h 7| gJ;±c8g(;SÈT>2bֳܳ'}>#QZ@SWxVϯWPt+Ҵ[dU!w 9PY9E+^[RQ0q/r<|]I޽bD;3.DR.4]@޶o > TW( J-Jv8Dӻ'.?%,[0Hx6:}ρ{tJݚ!@DW/?~|autv,>_9eeuQ<Z8{Bvdt%,4EUp=dff'гWORSLԔT6laCa}=fo] =ܳrsr]Y8]MdDcQ: g޻cQ77-}gRNZ>|bMMnJOgݩ̖a~1իVW+DDٍ}k֐6`y, wOr CӚ5H W٨>/ڇFN'eSVVwj+t 0DF(~MڵmX @4!NN:ggHE +lLN9T,J>K² 9 ~ MM`Tv8]osIvWL8qnƁ n'G?"%i8>QF*CAUա"Kb 6`_QR4&%ѽk7>C$$tCOS>S(((t#QjsD8Wrel&?nu37c3Xӧ5x0gI-ܩq)W_~֭u}"L3'cP>,Ct Kk۳#2PW,b"`Z$IƽEMIz?pw_@ҥGh u$ٻPZ!|tr9YvX[e<N{B=]YR/]?&1nA,#e. YXrJH(v( q{ʢ ?9jAnVMM~&N<2@0ٺm+ieD5t֖6L HSJd’l=i%rHOOg򥘦P ˍ㦠hOܕ''Y<~<':wNqJ 7⍍nw!L]1M)biZ($ ÁݵqL;b:n{$2 t"x=+hsL-~ַf3bnJ4 rm޲Mp62TZf1EŲ,RS0t#Gx?qйV7r`_$t44Cgٓp8' BH# 0!%M3 Y`tҥ˄Laz$:Ӟ?84˶NPq:ۙ8;wlzݞțoB #i͓kcvAKxXDw#d5}mI!\ *ƿ*9cǴݹZCEY5o,z>u~ruȱɽ{1Gv=xDY CzY85 #@9_x|L1j$g\M|d&]xa[szT!laлWqh$J4!Eu}S% Ӳm! !2d\IRSSYbiK&9)4bpxEt!2<,$4]G44MC54]Ck HXe7L? l$5'A6e-g;F="PWW/-\ǎi~;9wz:}n',5 ->/\|nǽs*=w% d{߲e﷿mLwnd][c:>l5 GrL"sp_Gj _?94YCj>:ZIJt9$TUhnq_mo‘LZ~B?k0HПN_׮tYt`jMM#pR`> g8݃<򈔢.Rjr*mUU瞥G.[MN8{lEQ1 PH{kbZ&Z\$:f{/A4D=1LH4aheCUX0QTd(@S7YeUE4EQRQCF(" @`XXm㡮4 MLL8RUUu=1 vwСRS;G(ҭ~yjV-v5N35 OVfÝ!uxWJ2MN!so~5sibM2>q>?`G76(\[kj'D /@MNn7Qu$IS4X?}W6hN'F N,YQHMMK5 Uu1 ;{)(Ռ-jAAB @P0 @@_A?@($쩁;ăldhݮW6,F!D;Icҋ8|N-DDw.śݪ6- K ?[0*#o>Wޚs5 0yWV~iRk=%IF43%oco2 AqRezK?bB䪽(IBF>y2G?t[@Ԭ!94CC34tCЉĢ1b8XX<בHX,a6M#D4MZ&yw Nie2B,ӯ9( i5 BA l0 Z  4o #9$vI0mgS JY7}w'iH5{srsŻ%&EsٽfeJm}Auw(m:w<#Cglӯ`kYx~?'O|1;IBDHٓ{QOnn[jR5ɧr?0qdWox0Fmot*?۲9۽{ (%%[b%R+-- ,E,[FFcGĚatMGuj4m5k8hll$.IXÊ+Cl;:ך HK, J4*f4`0@cc#PP3 ߇Z| (H("SW["qB4pNĜH$mf hE:x_^y>.LQ'ocƐ;|^Eaݔ6KZEn;kb}@0\7^##05DAUY?YpTjV_#!w/F?0#f܋;+kx~W\9;9 UeţRvm[veceeeQs6pPܥXZ`X~,%v8&&A-G" g6"R%1xX, 8ow_(xXn@@; Ayy9~aiDӖ5[|o٪ uuq '$,44ϴsdy~8^uÇQ嗢#8|{"jyVޠ/jS+%O%FohWկ1#zs هJVUCbEB??~*~kvIOLUXR;7aweUO<׽iƈݺ$I>n4s.\Dfzh1"!j!})ji:۶mM)_lެljbƍvi"/|_xi!h_\ZUYtq@4L$+;Q]U--iRUY R^QAEElݺ۷vq ,B 6mc&o=QQQ+/ZF f]O;쮮TP.-A^(|V79袋ZV%6i1#|@h X?de-*qJPM:<2zXCBq ,;5b8'o_~GOdy'_}/;ԯ.bӬ{o:u]?4,u䤔/ xwHNNFQU[mug`a=PS[ÊU+Yv5K.YhprzM߾}hh#7/O6뀦sfVW' x\^RSٺm$Q]S#X6c֭deeaYX Á#))r<.G Ԅ *I u;؍Ы&k_ HQu!CuIq$<4\q(N>B@o9=){3\KDk 4^öYP<G9'x<L@Θ nBh۶H6~^mcoNj]|,[5p~կ_Te}-ZDZjF Vm$Xp! |NYy9TUU͛E?/C4L&6n9睋(P ܾm{g7 Wn޶u[dÓ-RG`%XISSͽ&%!2NIFF%%%d5K<#SUUe],#(lذzk Cׁ Is?9׃̶%O>ժ!si{UZP\NV<$[>(1T {!x"7$|5s>[X@R;V;;+)ǒܻ7u!) F,eEA{w5ԭZGG޽Yz5k֬fY#@RӴp9tϛde۷9p)kv$˖ȲL8&۪].P: 0moldkYGuݺvE$jk?tEl^W[o*7/*$YqJ0l[Ōv:,ˉQS&*pٺH`:X,颞:XWZ'#9eZںrRFUh^._n翷X/LIawq3&W/L./EW]ChvdbS0a{w}\lYw.6&M[n:¡PB07)PS IDATQSS͚kHMMMfWd*(-/GukkчE$,>Yx҈K\mz`d4_~vqz|СCYa)ɔ$ˉ@UU. ˅f̜N'pƢ\qdU,ƦzyȲkmdv&LI /Z2\kĚv]nv1$!H˛Dʕn֫cS}8vtWF=>][=j[Ͽ$!) Z2jss%,De96 QIyW^_+[=zp$U|AioX16ᾤ$IDv(o"Hd, v _GĠ7Yq88NaߝNbY)$%= .<]@ UU ԽOY@pwK|o}ӧѫO )NGK bIAa7p=i"{`o_}>oABdxvL@yWYUwؾ}AedG2 #K$ޟM_(z%Ea;ɧ:8XWf8JR$8,9YS#ΝBcYfMp{:<5S=Pnh {X,JII `p8LVlપ(6tYp,F}zsɥ`UdegrUו#f Rc2pƍчz^˲0`qMY[̃vz`D ,חN GqDsv- Mu܋ҾcfY]Ⱦg}"v_kXAwA[HJbŗluq~տi%c&YFS UN~iҸv-]N:G$ Tƍ(yE㩧vi|wݤcIrsc|oT9r#N'x"a0w\t]'c&.+\mn7,c)2>G1Nd%$+;K/NG]Of@#Bz76Ox-u ˅R\D@UŨdK w*/m. fMnpXmZf,r33ܳz$Jpf`6P\NyoM9ƍj:͛7srޢ ?!p mڵu*b x㎟/<DZS&:B߶N]$B{,}AMm^~{eYk3auPb}ŋcZ@Pt [n"Ԓ,:p>TW,_рq(?fo5Ӵ.Y׷*vN,w~Lq3 _gvPZ @rnwjR ,2Dѓ:_r). ڑX{ Xx1/]tiuAzG[nt?T,[ x,,:(٤%O^D"a‘ O={KcciYd`M(˲<W_ym+bGV]>(Hĵ8XҸᆛjåpX>-",A}ƆFrtO(:b\DEޮ҇gn}99 c_'&s>e ~0uWM/٥"J_ϼs)JKxnݺw駟2l؞Iu˭m!&Bym:c啥$ 0/UU/6[.5}8yn]Cvz<1 fl t\ĵ8G %==˅O bѸl.bn/}y'z4z. Z^GGw$3u P'#XwQ]lͦZ M:^ AD^} ^7,E"(R:!l]6m pKv)<>>Y,E:*Fy-JEq'Z ";(JhT7LWКLز55VQ;={fi8~=_\&2FMĉ}%Kpwx$J@%#t;hV/ N^]U (b2l673ig2֭+ \,8`uTnUԽ{I 6$""lVR@V`ȑ#ݻ75@tqmCMR)^Vz*O@ bI6`(r_b. 'LߘMc«Zz8ISHvA4ODź+yH20wf甩d:FQt}~5nDjq\ȧ]v壏>Eۿ%qzգ۶kcǏ` (RF L&yyyYFlgl6iT(J@BB¬cǎ oڴ)(EyNA ?.DZnZ Y_s{6~3۶bXEn5^^MyYA:aGa>}`5n(8g 4z=J{oP8gOǖ[qz?_<%}mFm|v3`<0h4hn/ j???$Ib֭@ݭ[UٓÇT hX6bdӇ\oQ>n}>{(u:v?zjF=;Iֿ"h}ibﯿy+^Ǐ ;H4yazLAtC*sSRCZb0Xx1k.c9|+dK+4m0W` Yiժp-4loWJ.7|soQ-H$ KONWZSWssرj[*zX٥37Hp[F9v~AƯ})ډևB>NF~~o|e [N6~?kN E{^۶Dsz:KcW|@zz:wYe쇼s MFT@Gx$I"22R8pe˖ Q@e>7onumQ36ffΑjܪ*!tb9S칹,sdǞOJbw3u~hM&V{'׭+Iy3nK^juapPVf}Ân9sgDžtR,X9ۣGzduE *9\޽ԩ:tfw^y?CCCcԩS@>vQJWCXy}hM~TIYhqԪ#Oe;,LXEԆ Wt,MHvURAm__ݧǏ̙3ekyS%mR4Qs8p`Ce 4U*?vٲeԩ uSeC%2jd3[ڪ>@1cr%MEk*;w#~;G-Cc4|ABJ ;Lۛ"#aCWu4:r!?yT=*P cυ2S_~%z?P\ɼ<,!Ԓ@$IDEE C mӧ3 `J^rQ166_UnnnlDD6MX,ž "OV֯_/yWoQd|<_x6m|$]3?T>JmK(eŘݱm[=(zfSs\ɩd$= Z?=TǠF'm66<<ǎ}"&MW_%\zx9zѭ[7F%} Fc+h4st:رcҥKPiu t=p S;eOۉ VKȪ˶Hj4XsKw2g0EE  ~5=V{)q}oŞ_*"<K"Y8$*H ;$>s}r37jԈm^c?[m2x_uԉi߾XϞaF ,Q͙3J,saÆ6npZDш$I8{Y>{ngŊsi?f%j`Bʏ?"Dlh*w@{"meVLʂ^wk jX#^t1:J[zѹ) z+"۵ TqbZyi[4fΜ9u+WyIJJ8mdlzر111JwWwgQ q3gKFF=9:Vω'ZooJU#9/Yx-ZDRrC[ yw?|J͚5!OpYNj0Ć _zWhd8?Yf0 qիWwgw3FaΝu. *lqV?+ƌ!#%_U@Ya6SwE3iQsNIuPN]Pߟsz݇_D'OIh6fe0J*"ǑV}x~Ν;wyJ*^~}e33R2ZbĈs=gƍנ \atܾ}gիW7*I˲,_?p ]!{CNס4e칹Rv,I47PKgƦ˟}y]rbw`_y0á(F{~n׮ ly1NۗӧO\c믿:3)*+!ZZtRwtEϞs$QzuH??#G]TTro5?7:..VnXag۱Z)/&;;I.߯4;=C"I$ϙâ q;0o7w5j4>iNo؈ƨ6#=u;[MƎ)GAI+"iĪ ekF.9:p|Ui|z=_~%5|)9OIo%#rss]x1iiiK?V==F``4klv~ @x$U2$;;[~'|hRfM (/I{2I'??;vk׮Q~: x˅t:%Æs Uej%E Fn@Ǘ_.3z>ϭhK/Fph9uGP7;v,ϟ}+'N`ƌmL%5u֮]yfb IROqI!]F tؑ6laÆU7"x߾}Ӿ#"" XoDa/JFF,[LINN^ rm]^=`  ɬ{/|SUja6h䝌g7 GN)pXn'n_cG$ܿfsw{ݤ̞A@ף51/U͕˛Fh$y~c7=Μ9so /mJx5SRRϜ;wΝ98o+$ˈ#bR S\+t@xٳ$%%[.Flzng_VVgΜرcʊ+20k/r"dT:|f*^广Ȗ[oXӋ|P?ҕeʕ%aD. ͯL%i2f %t}D@nj*)Xs{g}?T]Nb-?zV=`l)A¬2Xا6W =_|t޽œ$Itڕ+FQJwJ"MuM6 իXzu "\tÞ$g֮]pt߰aC8J8v6???_[F"%~ecmFjjUC.]?^wر6Zj$nK,xˡC8v|ܹ]|q_BBpB;)#> \l_p/2>JK\,q>_/06=KL^˻VتU}o0l(7&Z{ۅ5n̐Kp ?CY(7ooA$NΡŋ}IϞ= A$AbpM71zhbcc۷mb6{TϹ>QN 5 BD;yybcb֪UAV¯խtڈÇ7oNppJQ&M@j1h4Z+YY<,m 9993ITp0;p{߾~\::^ljr9v%BPϟ'%%eժUnx㈑CȲ6 P(;)XJt) A $5tK/ܠܥhdA^iyM3 ?- Jo룏J>_|An7#;Z-?H~nZ֢ @Ed #ѕ+4yOVF]vhѢ㊢Pvm^yk~~zuuz =99dggs!ҹc/[h YOt/ 4HرPvOShEA f,V;CʦM&Q^Qg<䓷=p8 m+ꎳv?ݻ믿~M*6r0,a {LLLpz h(:r, , jcl_V͝Èka=К/2qX,lxE&qzFjDv8)jXX~Q~x׸馛(/nlٲ+A9ht=U%)A@ѐi=GN5vݏ?`8\͛6Š׫BtEA@pe7FYULWxh޳gϷ&>lCkZtQbu{ΤqA, ìZJNKKKBu^  ڠeRa~䍽ogFq_Xhbl`6c66_^|h SORoP4u_)/7$/J6VMjtDhÆsn20xRL(rYЭG] ՗Dlu奦NJ'ٶU>Hږ-tϙM@X.d hs{tE/{7ߐN+vʄ yZ,Zn/k?Z- %̿_xV2xDA~"33 232.ev/(1=d9u[[Nݾ\gѲ%$c;rjFn؀_x)_%~~4w,ٳEw 'T[I 妄#P+K4z=gϰb$ϝVʔQJbb"mڴq-<<޽{q8NGw|7o%ϻ]wo&ӫV-A`Fǚq!h4W'Ieߴ۱mjv bB' 0'-5-;00h>nݺcbbרQ}o۷F5[~_ WByyyA[nl4 & HGEaٰrhZ5kWþV7niݸ 00_x1LCB;,ElڴI^n$}pK&Oܮe˖ڸ8!,, _1՞ݢE  +$pq%Q;wөj3P+Z $9h)ZE"TFm6}7go'r)Sh8"gfDDMQ $FFyQbE\HNf;b$۰eeU> 胃7>n}z >PV-UFjՄpL&[j5)''ɓ'$gϞYYY 5"Z5v;QKQ<u%mo guVASw=j((e;Z]A?z"""U&T"IAAAhdlOQFMl6պR]#fV1vV??henZqtJ^M iW AX2.G_nEN^aBl=cG_vkVPcyZSc5X*ǽRD#GG׷vz⫯"..,^OFŭފ5?^x >2U>/nMZZ)!G^bۙ3z(owsDEEѤi5kF:qYbCFIZR PFbbb BCC<$$+V m3Pm+>ܾ]۶Ұ L (vw蕾>jɂ !<Rӓr ED%_ _k޼9QQQ(RRu:IpOd|AbW68Q q,Z>DM"l{Y̟OPLMHCa phFױ-۷cZ7BBmX7P13'_fMx Ν[&)iӦ2Ȥ-9;f so&AAPFa v;uL&޽Q b|23Yz 3?K/NVu@/bj4SN:tÇst t:s̒={.&j4*sBUoZ ժUW޽{/*pQ+o&%^k駟iݺ5:@@@z"s>NpP-<SUyP{F"I,`ʊ1c8U1 JV+՚7c?2}:j>ȑܽu q}5vxzv2CC1yHw?*Ɗc+z=`Al} r\W_}Ő!CtRQzR &wLթ/e$ZF)??ݻv#ba :h> 5j >>^2dHN:m I( 5]-Pq[.O,DGGOBQISkU@F.E!$8̌z+u\K&L><<\GZrx*T@ `1[ \o;pT6zeY֭2h7%$dUW\$Ærӈ+WpXJjդСtLv{ū]j֬Ol; ӻ75tW "wa߷D~ՠA}Y4ho%1d;ux8ϵjEBzVUq_Eټ<ڼy!`p?jW2Ev {N]kZ PF 4={l<%%g2^g)ps8'0 G(fO.? P",˲Ov+4͇#GGVdr5/@!5%\tfL.GTe 9l=FG'btA1;Gѣس@EOpzCBpX(zMKW<$[J7~tjb%:˔)t:'9i3kzJ%bAFVVEņ*ddd0yb-[ҵV-p8GhOOM:г=Ǿ{Yf]H\/λѼysN8իWΝ;B F<>#ͥBNw$Y N$^E$˲+q:Q{cl߾=~~~TVv`X8] ZXFa'9>mР3f 22ł^sΕvM2N%G6婖-*hy8'&F3U=`Diaqr1{DQC:tpɲ|%#e;_6( @jj[ Ԓ#=p1yBQ 't&΄\c[̖-[k׎ ]QV+Z#{.Cۧ z[|yѣ{P%-1HX.G8q`#*Pa>87g/ <|嗄`K.rz?~QF1sϠJ6XfvJUAn3K9ZKPl6jͥhWYFC6mhذQF_C Lp4yia/wVx(JNuQ$弘~F?ޔE ޽{7mڔjժPs ,˪e{XPp O zuHvaۍ|JX9z~݇od@D%od8,JNV;pI:uXt) ؝ְVm۶hJ5=nJ^e޼yDq׮X_iA]A5ڽYf ʰ; yBž볫}CQ_HHM4CA  @hg P@VdWw dYμq"== HhPcy{:w,::ZӠA"## o,cY DpBq\y% (sBQ|={¡~CQ%9Zr ¾W;ujddX];{XEAc芕֍S^h޽;v6m"##MJh4bŴhт۳f:FEk߾>lX-+`ѐ%I<}&&rbap/5 2)ԾQlX; [՞߹(4lؐm|||Kr&p5 DQ \DZZFxcNwj;H;qP5iڴi@VZ }ZV:mFJA(|v5/{KXb`/tpލ&rv;njMX td>SK'<Պ(Z-,OE+Y߶mېn sy~$j 4 rM`ŵ/EAV.ʫ"嵳~`7kXU6X`Ec(NI IDATYdReBg?0r;ݻQcǫ(8o?t5jgr,It:7 !!Njff͚K/āO<Ƀ>hdԩ ["{8~ӇXqOy V+]o;&l.6 >N%)i1hiР[GmCpTPP@vJޭ?{(B~~U),$9YYYEؒ܍LFtyF۷oV؞ʿp[Ʃ(XmV$YBD@A=dG<\P5ztէ:>E6ר lD^֯'ыSu:Z?BFtΟNrM$Տ/Iѣ{/ztDMU@tϞW^>H_Z񏈤+SHX'=>f 4@PahؖN_~y,8|_gP*ܿn ܃!=VzѴi``ܥdKwȲZ,q*Ŋ)™,_ U 躹:e׏?ԨQ-[k,\YE,ymJ{۠EӇtիǢE7o~OW3jZ>ްFI{-|@gU;yx$ q{#*,g|)L'|/TI1OM6L6A ܹst:yΞ961,0AA'Ȃ͙Cٝ-_wT?{@=[Ǘ: &::5k7bC-tֿ$@nn*p9vpytz7(O(+!!!ӪUf(S2 _%tB@qb 0Ȩd9mKӰabj2e.\H&M|akVM/Cq!9уF^3?@PY,<U y)l7!~4,wK/С}ݺu+3lmg_^ѣ;+// &xw^&L@dd$ӦM#@ysgǍ㓛o*˝׊ 9+۷SoϺue ndsUgy@@i\$d BmB$jkdRT0 U%' ##ոV%pK;&!_ ȅz);[~~~$]&DDD #00F^^j&FS,DI^]Jus%YFոǸ^+pN)x Z<oM0,,ǗjDQ$++`Ν˪Ux(;}uPH_R!鮖BCᇬ>;Q{wGl>U7,qjF69N{]g̸Wk2ϧw}J2gʔ)tڕbKYiժaaa|!!!{уcXhѢxCrڵL6իW08:vdh:*Ɗ:xuFNNơ(n)@x%Q3c wsBeYE!""Beyȉ'w_?{^.j[TIw#"N:5Uvݜ-@< (ȊLpp0L |~Ԯ]Űb)WRy7Zɒ&ND( mF7/ tI_J*̸q ,5*"ϟu|W|>uFԮ];3hN>ͮ]ؾ}w~Թ 8^hhDHpEC<=ɁCvצܫbU,- xvt\~UtN";;gtIuW)nG79'EꝨDiԨI˲Lff&G&!!ӧf͚Ib{q`<6Zݺ:$QS'-5O<JK A>ԕQNF[neo111DGG鈢Fsrr裏x뭷ܞ Bq5)kӱi^JLd]j* {+?\pfPrSb0Vҹsg:v,۷?cǎͨߝCCCN"2pQ=e9@{ʀk24h5k$''GIڗQw8((h 7!XiW lFez-ԩS9Q^䥥 Ё.M' :e_gT= o{4tp&VSUGtZeFѵkWDQ$11{OݺuKM7tElj'6mfp2uk&lIѨf_LپNp 5AJ<v7 **>}M伬뾬$)]JjRzu m֭[;mٲeevv>` ` R^0%8yUddee3& S2 bߟ"m"S%\s bhAg_p(Ja[FW~@ڵ駟_xw\Lȏ{hD4:u_6H798 bb)D,ӳgOY:ʆ HNN]vJ_ܹ'qLlْ7W=Q\~|*c=PI{UylrSAhF6mE15o 3Aƍ_>M@$IBt6|s"+%w*< f+pCD@v*PN֭f+Z5P^/igf! ڭՠEiwTV*^rBBB?~|u5 )鍞 B % MEQE`Qu]ź낈} ,(v@z "RfRfdrg2Cɓdf2=y)… 6}<-;oTdD.8shv[foiܽ{D5:60kUaAܹ3Çg(**oJO($&&ҽ{oӭ[7~z5n̗^o~(nHiӸYR`'Z| @=Ё͜h1ppVwPFoV>~/Mjj*W\q(@ȊX%$I#yȕ>{<o93z&6 Ir:`X W>W3 ykԨQ4n8-y 2eeew}̞=={Ųg]uiH)mr3tZ=) `ڏsfӰałCQq8s[n͌3xIMM :ϰݿ?c͚5H(-wB뭷ޢ~ ڜת o2}G&9riGVXƪ|f?о/I $&%zi~\%E-c|^=z4>>2+)#+z[O;`ll,.|j#_;x 8}nKd6m:t3 @YYѼZ{#GB(ٷFŠy9t($nMߩSpq|ZNmF|tB|tOkbBv"쉉k{0rycꟿ#޺ وPP/m hPE4Z0=v `4pA|w`NK*RTTD6m3gӧO_Ksw_]߇*+nkt4i}-VQ@H,k4ݎT^7cp_zz6mxhРά }*gĈl޼uvՊ槟~b߾}p deeݻG}3g0:tݱj/2a=ʼnt=`v3 MU|UHOoJyyY}p3cjdLoRix<$ AD[v#)U|8|7)YYDUj w,tP^^n̘@:@CMu NmPU94&{@߾} /?l"*Nz >W G=HDTt}&Ex߃Ȧ.>nr7 jb̘1-߇}+:x4n҈zR8udѴ?o|7d,7W;);[ 6TUkkdT+4k0~ߟ})$3-A Q~ C~(}SќLW->|FuqVo|^GҏD BYv?{Эk/Zp]UR3 ؾm2[)Ƌ谴OΧ@AQaQ[lUÁ2 5I`Fib A$ P@t(E@MJ@`ۉ8oZ_mkӦMܹ=zЪUCUUN'GfذaL81,[aTU'I4袰%h#WOJoԄ}Yrss&Ae۷/^z)sG*VC%y|܅]facE~Ul|׭cF>an 6\\ݻwSOͫJYi)woOM7UW&>>_b{i;ͅ\fӻ< M IDAThhA`0xhfc\ FEUQx@B`=5G|@\\\%'NP}J1$?3OHHVOk Q{19Q*ͦnD#5jĨQf,TQD%'&&ү_?9š5k()) A`޽]ҪU+DQ4EƵpw3b&NȊ+B6K|)iح+rDfgOznRRW]uW\qEm111ݻ;v`ɼ;lW/ya~}>a/[Gntk_yz4ֿb9Ձѻ*&M4pԧ8Rzo_?NH6Mʼ7gfff8op2Ɔ F+2}}Gc?V! I/q=e6ZopE'q$$$U$E82rPq6mJ&Mعs'6lJ,2Głaҥl۶={ҨQԠ">>W^yիW3a„l048 ''*)E n~~|weQѣݻwG$,X@jj*={$999$3PVTT=zyhK}pm˖65~Qģ(uRu+k߆&I9OO4 ހ{)h4ڤ, ,ޢ' ;;N ((8N"k˭wׁ|>oq`WX\\ c*?Ӈ 7TXn7QQQt7bkLf́q,Ⱥ{uO0/uGᅴ? 7C߾} BrǤ-Jqǎ!fYYYlْ׳sΐ| t֍cl9s&}oFXixw#ŏ=ƞ znF߿?^fq ͛G۶mڵ+QQQ=z ::3f0~x T^Æ|JKz# -NVTp/=L}g}.0u}E^oqߋQo&W/ӧR(q())!664ό0$/xd% O >o51w%,b?UD_PҶKrKu\ TPN^^ڵc͚59r$;hm^oߞ;zA(+k+W_eܹaLmPZ3o˞}#fѳgO:vfLݻٻw/999dffbX0|7yg)..Flyy_펬qva)\oGc_4zd7T`>suù{hب!ǏP\\TD`{{; ̀!>>N~HgܞnOΦ EZUٴKAAA5! `FIzoo ^us4CS\CuaeJS5Me46oߎ0\$%%1`9ªUp8A6mbϞ=^}0eƍȑ#yٸqcp}7;e2mۢMm6N`Op觟zn޽y)..fݺuzKl*Vb۶mҴiSϠ8|0~-~[Fߪ0[ZZwj$x*zt |&<k/yގݦMop1RЗ0"g3&p,_ ffga)}@`z@y@yd̪Up:3O͛7grrrhݺu@}!**ʫ4حvooԼ\ ħmǀ Pkn5 2q!2A }ҠA.2)//7=/(rXz5o6bnhQXi)׮?zA4Z߀8ο%~߅hnjW7VZ`i< jzҤR-',PEܡcא$0>v[Ь8 ))Ov݋ &tTJ@p|| 2߸Cci墳*vf pWF/ y'1:M֭[Ӽysl–-[[VN<իv҅Gt!L?̦&_χzy!Ms#g+_!Z{D:&+﯍@R_w AбZVөeUTC`jB6mN LOx衑LY hۍf͆ւUAWq8ލ&Z?@AGeTS6)eYG"1EGGswGbq?r$O'|]2>'1B: Qx\T ՂbzRr<CbcߡCڴiúuصkW:jEѬY3wNRRR@ PVVƀ0`|IX,ɖ?bgONY@Ul&brlaԨQr-ޚiSN>K.nݚ7|r/_NAAmxkWnn^ gok͟խ4L1MO[TZϝCPts^*KHYF滄bf6 6(b%栻~">&\74l^pTdE6؟x<%gI(((0~ 61*DE)0(HԤ[o%%%MPT/@ot{ewdͫf^y+VQڬ1zɈe'D!i_}G_u-7i(6+bɆ>w޴oߞ+Vp@bp!=JVV:t06Ç3yd/_:MrD`hh \͂ z( w`Op|־}{~"v^KRSyG.iх}wի٤ :_t|c*1:]GުתR;`uԓ=gZ_$YBQz@Ό6 PQbbb!` %%%J~p, Y5`?pK;v,`h{zrUp{c+CcIVG]W6lX䀉 jP3f z<ʒ0pʛGO ig$m_;)Sݺǟ qkMhӒ6>|,e]ƁXz5eeeFƍٽ{7]tm۶Ur$''3uTV^ĉò.9p랟o/_ǎo~hg4BaNjLOOYflٲ 6اvYl۷o'77Meeedgg駟2sLz-*h+ܱgIi׎9]H"uFlڼ YFeUQͦD㦢$7E܎XnQFՊ]6~O?IXxS'GŢE[,yǁeY&999,@i cuׄp˰sߍ<))zEEE:t(7RʺbT`ipV رciРADƴkp8ꫯ駟p`+z<IH5,9 QڐuD+xa,{u_~%qۈ n|/Hh%Ia!܈3=ؠ썠[-!x%%%߿?,'ǘVm_U[,j{ @ƍ=ztijAغu+NA.|3gd̺떰ęьşdžϠZ ->G1HHqqlzab!D V !.Ihڴ)ÇK.5ułbٲe̞=Ǐ$_|ߎZĜ(ݛ1cưl2,Y Z ڵl&60z) lG&_ǀYt (tr%ǎ6mn;瀞h&==`ͯ 4ѢKІo S6U|`¾)uA:|5g00j!GPNgXlQ$IBEUi-.fbFC=tF2ŦMAEM6gq,K oZV~ ,c)/;hő+{$}M$$jf#9 "[9(tЁ뮻-ZBՅ pBʰlEFQF1w\,H:0f:wbgfϞͦM#kZi'hݢע(,.sѬY "20}.,`sa!WլWgA_A̓\lSh=v:!pC+W\|gQ&"|諧nHxMCxp‹6(R=g/h ŋZrhgff1{o߿y3$4_"y%`nנCe\`#}?(ηv$KE#T4+*_?(hnTj孷"###GyfSZ]hxnCqq1'##<48q$:E\v9sR'ŝQ-g'{ IDAT)Y+7Dt/8e$ ¾}Xb.+֭[ٻw/]v]vKA^YYY8VZŒ%KXtiB2EFFzbРAhт۷vڠ- eee4i҄=z?n8??G^[ f~8?Zʀ9sX|V08^^?n݊KQ'4.iv<(?Щ~b:0稣pzS(j`CFg.@zp@+iZMRy֨ɜ).æt\Y0ԫ=u8+G!##4ҼL.,]Hl'6zMVV˖-ѣA_fqa>stBǎY(1饓HJZ m~GzTiӦ\qFӶPxXl7o&77͛ ppAٳgeeePTTTI* vxHOO'33-[522mҲeK֭[t|N8W_}E6mҥ3;uTmcCgUwqpTkQ?9WϜ#jeGq1/[Ɨ>Z+2^e~ @qNz"=o3%:_P8rkW4vʌqS| `FfmݾK {JBo#7NrbbbBzG4g0F p:X,*5RØBQT* 4nܘo߾=[f8q"`жX`X߿I69NLLdZ}. AV+mỦjb:uDVV˗/g5 ;N~4iB^^A= t7o^@EMloDVv{78 *\Xr%ǎ ۱cG233lލWE?3x@W^{DTSS1Ͽ>>##>4k7;vAS^Z?:W>ZסnuP5hQ+ZټPӗ(HC:684_h[VʔZ3KG|/,,4JkW,E.J=P3K/TvzI^H# Y$ ;agc ߵ^K^^^+@AWPTTd)6+ɛ6`+);d9`:أh.>KQ08\r C !11F}(;vylٲjҡMۍrQ^^Nii)\.JKK)++ry 8p 8k׮嫯nwevmÜa %%&<5]r09z< hʺTZ=#nG8ij ekV̀e迚J(2 8ٲ,SVVrf:Hl-&IZ@WTuym5\Z 6OSWd޽lٲhbUض2W>NiGwc`j m۶-h1rΜ9lْ^z}-Ky^ӦjԌ#m+b'u'kcKO`H7-{inh}:7YEvh22"#м FC4/-{9cfx\1z · p`{5{Y Lx: @D<hyUjX h?ۧa,AUJtJ7+RcɹKB[lW\AjuC" 47[PZfe b\n dYbЧOzk :b9t~)UJGþ1襗h&"R|,]-f~ևd7V E$䨨ArѬY3FIǎk02+WzlQUvq5ЦM׭[ǔ)SسF׮}n^:óFk^B48ϊB營 /~l-2UZ y+ZYvk/({E,>G>/ךeIE3 M/XǸ()[**F02ߩSp999haׁXzu.[кY9Qv^KPUx&|V}0%, ퟄ+AK+Ξ+oeM^p[1.@u}coo6GuhQ /Geɨ \;$N+-9Mظ3\{Kr&ƱKMM믧O>΁bAe{͛Gqqq{n#i6zt/婍XMOq`nKJJjTUE44@ )uS0C]KVb%Ƴ vh ,[ȍギ*\Z[LmLƎK6mTU%**K~5mVZ|2}+~ 9&SZ-4t1GeC,l:yi0@QHJJb\pXv }vfΜΝ;k}~":t(ݻwGE$I/@eMsA+kY;[pl^n4x4փh>CSgZFyxD $sfՒ$ 7X{VaQЦTR5ƝI+"~qk>b _^MULLLXZ_. |/I| w"8Y6YfZ6ˍiP/7KS-RYH]ኋNq*ج*_,jN:uŋ9|pй8p={ХK:ubAtbݷum'}BOrwG@h;GBEWЭ ڴiúuظqcCb mF^^u.TU,7n=CEE/<1Grw^֩\3WnPNfG+":XWyz4YgP|XQ|\Q#yBj T Y \ .l~7AWa-VF=60{m č#q{%>UEV}]ᄁb}.+5.- UnMޑRA3Z7+m KdhE^Gi$2\q;v v{!v|mF޽i޼9;`𗣣h?-w^}f_a=qw7P FE?w GGG!xm\.rrrh߾=+@`ѢEKBBBXF7w#w\寶Q7_ʒx ͳl=h;:Ƣe=RF7{~B3Q[X~6^]*{t `t`l?HgJSs`s|[.JJJ²WDУւ _Obt>uv[,HES+M⾛pqU Qf.jHBLd7BUE nU΅9;5lؐQFm x~*_$Ev5'=7In@WP6EAZ :NxVJ'COhq 2pQΝ˪Uj5W^_~][3+b㢙rϕhsZ?оmZ'Bi1k4qk-pYuSOd4C)XV5h`pAyEE\QDKNП/:Ga_xs1xOƉ{ŵ?B>_հo>hMPYA_|gHGQmd6/gO8UbV5 =YYYdggtR6mpp8̝;֭[[VXh/@VSoN\W~F[2MFh-8$&&rW{nV\IyyyqoΞ={ucXxw믹(3y$|n^B3Do3@)S h59T橋U'KsSo7@w;ed>X@{jM[x:ji# (P%0Y}[% a{[enPijEQHJJ:- UU'T7tJP\ l}TR,})})홷ri&OkFI^KaE2|ӐPߒ,l65\-s3 ̚5ݻw{$Wo)SH޶קa?UH$a{ M7-*(%5l F֭C2r:|w|wAك^k֬aɈo'}z.Ȣ "Rmg}֠#wIhÅʁWhz&}XQ@(c:6΅U'"ۣWELim52۫}g@Mmh'se %}}A-P3eeeDUU7TȪ嫪*g4f+.Fgzo/[[+?X,2>Br#dtyQ1Y*8$''s7ϒ%Kxl6|[ҳgOٍEQ.ŗ=ÇlS$mE7)m(Gى*8Ioi<!GOi^'k( 233)t }dײeKzABBI7k_EҶ͡rrbkw$o^GyT,.b gF3qfHLL䪫b߾}\Q#ضmw{m۶Fߚ;'#:AtRJAQDKpU4J^N38/DogSU.m84BRmɁse rl: Z9@ @J,;F@5 ut ESVnP.++ kKMM'}vVX0"kJ5$TAwU05"MkWm(<3<:t_?7Wh6nSHk 7DEYHoTK3b{ͰZԐϥO>|$&&/` ˴iBoɴoc'o!}Va.Zh4<Ġxqa(aޘFgɰaø꫽TaiXX~=gf׮]XD DO!%D8IiF:VDYE:<Ό?FWFMTn7PXtܙaÆ[,N'~-=azTU+ʖyOwxe-e74zBދ4&RŎ"H `bRHS){O !RIf|%A$s]{)<}s}@qF&Op((9 ,2 XxwE "C*•<`]/z",,ݮG0cjhS[wD; ,_%pmt:>> ߿rpSsuu*Kc^ H2VNc䨧y+lLhY.kYa ذag]`vɓټy{o[oM4'DÁ$^ $&R}K5F" L’!|S4'/xST,s la@FA]ǜRhd׮]lذRԻ^߶pe@W:QdFCf4n3?rz[~ h7r4% TQ;w 888ud TVZÇ+ oΝsJL<8v*$ A.M?HɋA0Z)H/k(d${~HBVo|+?NzUlA*O| )ϒLnHOw/fU2|ŝn-% 3oUwR󭧧8^vyE7ة=>"Eڊ7R}jgGдY `4.eC͘S6M`…=i^˙2e Ǐw{0~ Ѷ'X@՘Јf&"S=IAT[C?9 lMׯȑ#S[%.JE^^7ndΝhZ;GԐ-9Q+o/$vDQ6ңg\o&CGJMpH ~~~ۗ{ZmrvrgϲrJm駟k.D~+B IDATq|pσ=pgH HI*6Z|RO{tj#" ˹5l޾XԎwR)Sobo;j&`4IԿq,QsV8 ft:o15X,hŨՕ:y|Qs׿Utgh˳R!_:fͨp؃0| Pe-7!䒛:)111{:mO;w.W^wc{/o/LVp}0MLx 2Kj(~^s<A@Tڵk9t]ɉXJMk4Uϣ8<фCö[س;G~FQQTnv9DEE1`ڶmk*aXطok׮%33%Kv G8qZR' +/92kW t u)O._D-B O[ohdΜ92W^yŝ["Ӫd22X,`k 8,l6ԫ_èUq~Aki(eT^bCڥ\]v+oP.,з_%{W]o:5O8hNB@ W$It%x^p7xmArx}4FHv"H+Ϛ0,gbەOFr9o߾w){~@l̙1QR{ڶf/?ծ%rrl  B,J%bq <خ X͛7}vQ(l۶!oa[W m$/#`*.-]FTJ-ԕ9Rb-@5I8"">"^Ra]vb wL) hfr6MP (9 k5((g}ɓ'Sn]ާL&cL0-[<ɉ!y?G}h߶)aW}.tl 2r mQq6mڔ B`0{n֯_Off&Jtr ݍ`%a,*%`Bf1Of2@(I_lAH ;2p@0\wS(j*,YS%A6ХK1n,zs"uxmT5`RC]wz*Ǐ/^gرXIaLFi XT]sA&[KyTeV2`2? aQQ~>nߵrLt:`*ߟHGRU:R Pn$N6jd3%HE:3X-f$f#:Ki~2Z4 >Kody̎3uT{9L&h4l2&MTs;j2iIg`'ƒeL\.cɦ0B5F1oy F/sހ OtcǎttTo$@5ʔZ,vUW[]yj[l㯛J%zpw pXl\} H&sZ*aa:l& R+6YXyF͢b&V/qGcU0TrhHB.p5#Ҹh(oߞ3f0h T*Ӑ-? 77?s˔1$ 3kRhnEeM!a#Wxk-)l(s 6`t:Ynf3fOOElD gM 3vq.&ǃs`tN8+Wdo*b)WoO_ 3?3ˍR[+ niO>9r]vѻwo疙믿E e&i~//%}eurrKf3a  Mn5@PP`PobvQT䖚융 vG9CeC^mV5+[)`H0 tiI'1Q=}0E9 :0`3f̠}.A@PԩSf+ >n>m[xCqB5gJҒJ<@^ragΜa,1/ᙞ.0 jt4G>E%^]QcСŕc6-ZtKrOүA~RƊߺA"x );$))7ҢE k̙TXݭJL&}X,70sܭڒ96,iԨq7I9-g2SVg+CPp-Z 9S*[WV$‘؄M¾c`1;WJP2`ɓ|jG)5<3ytYe8CCC5jSLN:n3 wf̘1lݺBƸ@? "?ޚWJE.B?W1t:y衇h۶S/$0ٳu֑nAɌF DFNLJqd ڌoyB7F; 2pL&k֬q *j @Y۵8uW!5 |d#F //+VPf''N_u z0[SU$2@ѹO~dڻ>ZmqsevbT-α/Jf(;V)%3J#G(egg;}{C=yEVfthzD֊R'lNA]w3y<7!O fKe[^O >|=]`~~>[n~ V! :Ο@YX?'S; n1P 0'OT+eYznG \%¯n] L<?P b0awlA$U;LiĭtYnVeTK!t.7 7*ŸQڅ *DÆ ?ܖC䇇G9BK*F Z n+VE@Ҷ눞KFtlEoD*G2|L*FӍcW9rJ_3ر#3gdРAN|{wy x<6c9\=T~XNd6h:t d2z*֭ch2C|ȑwU.o'-hŀ\.÷t zITWؿ'F^ k4|3wܛZv-۷ow$I;&`6K9Teu܅,r^~ْ@G ُ(^K+5WFEErJ+) Lf\.#--?`<^fztׇ3gлwRNVEwWlh"l[Np1%=,$?9f3 sh]wHH2mQ6Đbb6EyM0x̜9mۺWҥKL0 MT雒UӶm[6mRD^B1\3PA!j4_~ZlٳgYjsZp;sv?KF":<3 wH*5t ʕ+Y~-Ct gDȼgL+T) A`Pvm/^LVVƍ[VPP`o#)VE ..Z;t.\W_ޑtl R% uNUx Bg%m/k7ˋACDŽ'PXX0T*ILLdY4h]M*Y޿;1K`K::U{ F=L "+~-[{/e\I5S<Kbe.T[T҄nm [S)КxΝ'QH̀7k֭[tÇ%Gq%W#iIVE9f;zcq8/+NѼ_Rl6s`R`~}X|YYʃ%Kѵ[9~;,[ŽDQc{Z]όɧ|ѣG ==={;s੧/a yf3oX]4ӧS<;\R**1|g-8vZϠ>l"&i,ggKMd,Z &8mTjFso{~EQI^ /dҨYĴw)(Crwؑf͚en݊`pP((,,d4nܘQF9-,i# xc*|S4 ҭMղH2Ud(Y4^]{l},]Æ`20-DD`+/A{ȨHbb1R'n gKD/=xk Ja,,f䂝pUtXf  rA4kbZdԉQt:*v͗5|m_dϑnV(9^Q._r΍lFˑ먹:2t"ICde-CCCG={ذa ,zw!"ăji@c -(e%{|ƍcҤIDEEcbOnH*am~ρ pSJ1%ǷjKJȗiS^gv0m2֭+9_2"jDR}4CVg(ʫ ``Uz3n4\eOOO?|75M>}U Lf/lٲ¢j֊AAPO-b?IKKFrrrZ7l/bL>$#7H|2 ~_BWRMD)P*x.]ŋS?=SsU"::/17S•t Q9tڇ;B|Z>>tԉt:kVF<|pdF-[1x%ď~ZpFڷoﴫN?wLJJ"33\KӢaw7i:O z]6EQ$88Xf3hEGa0HHH ==z+LFˉo;'aQ*2Nb Ipb0;GD׮]]v45j׮gΜۛƍӴiS7nLڵ2&@<<ʭ|4_aŖk\J-hJ@!)e`rNlšH=cZϯ:n|7.Y;o֩[(FFр`(Wr (,(ǗZjR\kFL&K //ree]g}_ٖၗrE/̉'o-;\rŋRTTD5˜BÃ,\3oΘUaoϏz\~GTAA/^d2燧' 8@aQarA )1!8]v!zEtttԣ"8H7(Q0lt:ar.ms{(nr9/^l6;r9z۷s%իZv2w=ә,Z͡&wBWK%ͻ5f)4kq[nVZSnk>}NGttt<_ ٷsSXi3O 4kFA{c0!@Ν+hлwo믿ER7aaaҨQ#5kFLL ~~~j2 -@*^U=??ds:BJ2@%6{')u裏XbvXff&Æ Х\VN÷ԩMTt&zӦlEE}U-tTe _ KBBK}=U+WM\Xe^^ٵ^ϵn-pGM 6 3n"**޽{; B [k[ۧƶmE`@ rLL IDAT.C,7Yd2v*}8\r妥)1l F#3bR:Ill7P*f} 1:vVVVb߾}҃ٓC^7NEܓ̓}ÇO婁thVĹD/>)=&N%t2kVNFPʁ~ې}jӦ 5ة`| x]KGGρGsgٽxi3Z ۶h"~4SlLbbbg޽pرRRd'J G`,HKe˖ 9M<lEq,\"t|G9r ޕdd2ѣG9x {!##rw}L>nݺUٻq ڴiN` w=_ڽ{w:vn^@"Z,vI&n]ø<0 .ߵ˗/WFOuu-%e=\t ل/d `!a4.obbڢONKKҥK p j(Ycg$x\:W E66G2|r, #w!ίhܹ3nlfDEEfGҾ'%kٺ[ϴQ9(<ȹDoɕ ߬b@r0_KHHRtfxRSSãb+XD:׬@T qɉ`6AG?ΤH?:uZ6gP(iӦ )0%I>|;vN6mh۶-d̘19#GR~}h޼9?3Svc=xxx ߺms jGЉ'P(toG!x/{ݼy}&3<Hr9F(wDGGӵkWr9 tرDbccvz|J T#&ELSk{ұE>z~_&U̢ aԫY߄ ͏fmzvQQQԮ]"_^ l:nVɓ'tHN|KjXGN!f qr6#IKBE<~ :wN BJ7" ' ={T*^B@EvSJh4ڵkC=ă>Hxxxk֬wqY?nM,m ؓv-RuNi"*2 ///j~% -~LQ_Y ORb"&__T*dVu_^W $^J6`Νxyyѹsu@.jK6^LsW\`Hj呌}2 (*ѻBgÆ С٤Jt2ټy3ԫWmCnorIϲTy 4F"!ٓBqE=ÎMHRIݺusu>>ԨQшb!a,OEi@@V'QQ( \呐N2 $QDDZ- vpԩ̚5goJRU l df[hԃB3"is8}"̋/kFtt[YaRɎ;8q";wt/O֏ W`ׯO%W33bꅿkwS'JKng2h4ۗ]P(0 .e2K,!//O/`(Trjt/>7²5 w+⇟!G'²aҿGO?Dhh(yyy./믿?~<֭t>c\mR /dU5=}XJO*1bgEXDJǝpUc]V7Ɉv2wv )bAJ2ZEހXNO 1rpЧO[rj"yyKC!j~jDAWͷ9nAt zPPw}7\pN6?СC>|pBCC]6^th\.c32*FSI5|wŸJW}s]U5 Qqi69{,ԬYN[,<8‚ϿB'ga"IN-] & z{쏇=z஻b -رcڵ0n[y3KJJ'p'D6пŚnFEEhʄ.bT*R/U&鎺 8 8c$EQR)d6 mg0^iPeIyHҝϧW^zVM=Szs!K!,M͚5"CUaFȑ#6bРAd9)Hx}ZUҮ'1rS<ߡoqGϻdРAh%l/pYOΒ%KN v.eQAL/gk7<5 pd7G-f޽;# ^҃Q*>}%K[uNDشa A=='Cؾ?@ЩӍ@AȽW_~,^mے:DQLJWk_s_UVj1C%vj򍹶ļ\g@YY37gx5HHwmL[UZqUuZ5n5kФIwЛOf@ $_3k!l9@9X>A}wXhBBlu q ?Գh4̚5ӧT*-Qte歶0U! ͛x( l,h)緉-\_M-?PDE%z[[\Mb7W+4avܽ{7۶msh4["U C}YK!oMаa{!eR#DN/rEiܸ1]t!##+WiرBj׮]%V~In2)c4ҩE!H^FEQџ&oJӦMѣ:tٳk]ٲe DEE@5 w߇j)&(mnxu scf!P.C13 ק:66M||< ^0l0n 1ydvjl^k$jt[-,nrYӇaѣG sȊu^~+)ssXCJO}ؗi/$\ ,ė_? ^\2A8~݋vvZ͛7FƍQjI#g ԭ]zoBxqmGF GS6O> G zqJZMn݈M6ݶa\x;U  #"2Y%,U9*DjF%+i\ UDf xNm ^^( b lHI JF'gn+r|֬YÆ Suֽ'ݒw9\϶P ]QR-" .ẘWL9>?Fgf>|$۵|] W8,l.2vX^{5BCCKe;e2۷oW_eǎ.R)0vD$,D/KiX,"?,'W6Ҽr,<(R(ֹjժ;Ø1cd.r9z?7xCJha/"|.bn[B> aRHCZ{xfZs%1ѥxt(T\ZFҟ]Z],e; 3ARV%% +> @E8ḫ3g믿G.@.vN(zPk!4XΓCӧ7k|A.2tzU-&Ϲ{:-s Pիٳ1b*%T*̟?3fpk%Yqudb uo*/)= &q*x/^{|;v>Gպ<<B!pLf_J#+Lv6Fc -^_;222\^Ϗkã(>|϶HH 4Q@TĂ*XPTDl"XHCD ** ARe|̖ M׵μ3x`.*;Ul6&0; pj{FQfSc71~Lsg2e~ks5?=o6RJΝСO6F1P7nFt3깽P>Znނ2ZHzd' 5CQ#?묳ػwoU|A2D`~?gҳWg`6ԙx8= c09tҥE=11[Jc&0xBJW8=Yd:֞5hd?Xt^DƢE8Sx ycaS>-f1֙pyj\ s\>,QlViz7ܹ3seĈ*e- VիW3}tvU5OynsShU&DG61~SsyK/^zj2e wTXm>pHm@Eֽb6k9Gj-K.nƇ!Hݏ.@u'UssJ~zMg](ǖ 8w+^p8,EB d〮hy5&33￟=ziӦ|ϷұSۙ{+Hbs'8t7Dq,ξ%JU^{'3N3ӿoh.r^~e pBϟi_Y9v֬cM9 -n~Χ_>DUeC<8kϨ[sXpŰaXp!ݺu;v>s[Ve4/%Zpq .1|?tFQbڠ"Po\w{\NZai5:{Sv3w6RSLiU_S ZP12BbU!P-kQ9<O^RUUP~+ђ|c 0pC#),/db(uc$o t`3}!)a-|? /駟^ma9s&k֬VxE=:0>OӮ߭mX,+gf4sZHc՗b0aMF˖- {eCQ>Cx vw'PƏjq䕠 ax4e7K:'MDfffUSh{.vKЊU]C y?B4`mC2/*whEFFչ;+UeV]x9֘͛7s3~xKϟ穇b1 "\|,L$"8'yUjF 7ofҤIlڴ6Fq*35J1&m-7)Kh>Ͽ?3={6FrWl%KghV M 3N 78`h5, QWŽ~cv/%sn+,oBZZM(:t@TTTv .srrHMMC1h;j;vȀ(**r?V=L&999l޼t:uDNVXzj^<<e0iQPzeJhw݀!CpxqǕQZUP@QhՌrꌀsz^^G 2K j#ҐDCT“R$6@Edc~@NN?0;vEk1=80&H&a>\ښXl#}W+p饗V[6Yp! ,Q&KZ3nd3b[8&O"nB\׶'.\ş9gel9VZgX,Nwj0oO<~QC)8Z&me> eJCTDFYGl۶niŠLFAuqn.aU䙭i?=|*r\;YŭlewX/a.WU#Gп @bbbԚ>9TQ??c̓i$Tpfd9b9{N;JYaEQ0ݻӧ;PPPu;nhƂq<89o~Èiz]$o/n%6gdqn ShTIq4X&LɓiѢEy.G}ɓپ}'fAi<$Cu/X5CA0=oyG;=4k1eQUg^Y6z28 B.0Ry`WC4*h `ؿ:> o޼3nܸj3OjɺZ2ƨ#kdρJʧ~9s;ʿnMb]IuDgKRRǻPe}x9(Z?73$FmٻT<h ;< ,W^yMt:ʌ߷)?:+/ܺkG7304l6W^,\!C"5J- EEEZSo_AO`ƁޢJYBT=DԌRVhDna=,OI5?cѢEׯK?̜9_ݫң;JIM!!,Byy_err2gϮIZ`tϝn/p*G{_obh)Re`M!-- ř%M`p0$@EQ&%95;+X^A?UVѧOtu4]+S9=¸ZřhnOZ(ҥ ĉ9rē,Zяh$//~#GбcG4[hrdV-cvmJ|<.`ԭT2LՋ.dRRRL4dggs{c4 empgxĈUOq`,\|̯CuŝjJIL!6Ⱦru-? \Xe=`lz`)ж'9rK..{$*ee_%wYiYJ&nlRxpx4#hB=aaa3ke˖qJPWȮ]سg禛nʴ9$&a ˟Nrl^ġ#6~cezFTg/p@1UQ1ЪU+&NȾ}Xz5 2rȀYm;vY{Tq+*^P3*/ px(ݚ||Mںu+mڴfѢE?\!x) tlkfؠHƍhΌ'X6{FeřD650m۶̘1;v[oQPPPiXȕi&~GnUn(0s|,wmFJZ)];[hn`>B f:5Ȩh K;^ʈȲyMZDW8CeWH"xW@Ud -Eŋ1L,[, pE_", >} 60il *aGyь\xn~vɞ>}xb xܚfV++Wdʔ)U^=/F}"?ɧ[g ;7O /"իm5o;5yiCH^Ϗ0R 㮻bΜ9t҅/6mlXV&NXF4J. PWP PĿw.!To>C"j"QFjYCZU<[%T~/0{I9r .뮻luQ0&i8{&ج Jl*r "$ٹrM,,Ւ-?YY2뽛6mi߾=UJIL&~7L_?b4 SP*>3,<˔{v \OYTUV<?^h&! c{]/]UexuswE%!b| /D.җjk2 Tݟ;`|}=qƍhтz.i%3dyon6Nhε3t>Ġ+= wlʧC#O>آ=S1ccǎ%::J!!Ʉ|?ᆱ#5/fV\wyS<ۊxgQ<._3,JJTsEV)@ \^'F;HBwلj_¸!CuyjT@f+!DSs{Wgwv0Ѡ0he³\wO '8ۥik?ZMt=]Ct:`2dHx\SN? 烍Ū6Yѯ{|M!wmF/\xc" Mk #GJ#( bp9Mu!So#Q6O'Ԁ,K~աp3J] IT(:#GeV+~;ݻw64S!)3N3 t?]h Oǹ7_Kofayۚ<:gӾKgHeff2cƌL9!7'ZV Uh!QfO Ƈ*号p[^3<`ˉ <>7pΙd}0jhÇ4c ¥4=0tFř\[Lj8p s.nWWDjj*saѢE9Ͻ́m,S[b+d {|Y߫%(aAW7@^ 5unI_ ˺?e\@< x" GU~]2|pĴyd*i.}CeƋ'xfI/͊Q~{!ps9~BKfԨQ̘1=zPRRRm~ݻ8q"|A.)W^܄Ҹ$N9θpipRJvQ`p;|Ui'Y :oP(Wxmu$)|Ypͫ4brm$=JߛIKsͰT otZd '팝~۷g„ ?-[bZ+  F#_~%?0۶ms|kMkM"V<6EZ!_d͑zDrb@]b"gߊ~ ԇӧOO.fM6uOFɈdd2c20MMf3& ;kasXhnĘV\ 7P_%K0RX% ;lvໟT~=*·e>rssiҤI)$$$0j(t_ۀ3dmaC(,(ff+VRFii)R[۵X+LzUHhPq7رc-𱊩!z Յէx TfT};ˠg - :ӧ liO&d\xc"];ٰ qD1u^+aFV˃SY2Dgd⪫bΜ9 0@T =. }Y-ZDNNhvƎ[ad9AﭜJz"A>7J_ a$@ōƅ{ I RIF:Dӄ1 ]t{!77.0!'bYx"=?O) /~Sga4oK瘍[ <&K'**YfѣG mX,vͣ>rV?pu9 TYC{N0 ^yQˮOyz4<8St[³LkjUVѢE:hm#e[L1k Ѡ`jK\ݖV!! ۵ky駉W_}رcB=zW^y&Ų`4pDjWv-8p(r'@UҖ vAg4DZ_ WIDATr`ҤI$$$_f;*\CǦpPwE<#0nZ:櫭$;ټmݮ]2k,Fd2Qh4RZZʲe˘=9ovZ/:* Tk2"tFciΏ?Hݹ{4qmkg .R&;p4%(XڶUf%a燏f1bK[oeuYUj(BXX{ᡇ/[awYD0=ӽt:*0sZZa]~ŀdC\9+X_O|7^Nm-/oʄg֬'3LmP ܒHֿ@TIЮ3>>{3gG~~~RՊ`0 C={6U&MgtzVFm?399h^zէ zs H18jlLO٘0azj@ z#oiҷrY)7Gqj{3}Ϡ{(>Gd&a /1|N[ <2ûU駟άY7nP\\\#*:uwyEEELRmhB=h4:}PUS@轉 ~C,h}+W&T(?- Pǀv˜F$&&2x`.2^}UuVg=yhD4(h2y\=Cy;>r_lRP|%лwo6lg}bq{v;F C9rdu,Z U'[I[(# un4n?߼?=KS[@Bol$uVw<@FFmPFAa 'Xn+/'x\&?Q|e\S^~㷚Qΰax饗ٳ[K.M6cڵU!%ĂƬɤm>)u%~P7@-,)PLj KZDmcGeu]_]f:u$Px h,d^{sQ\\w%ל>hK =vC4mf˴Gb/t.|S=<#̙3ؚ$[nC>6ЬmQW˖S;ʨ:Dy p̿=nDES VD?r˷\Ajչ\v㱸'|W_}%Kp],*HTM6ƛ ZT0Rʪ6hښ(<@&?vs ؍~*#q75wF8tnϡܡv?: t{@Ɗˢj RjI,[V\l[3hrT UW]Ů]B?]!Qʝ"6o+I§[ͻ8xncW]mԋ́P/=F]X#Uǧ7$@E=EGZW[.eRfsExHos9{w SamaKu С#I8TxlO`Ve9̕W1; P+(o׏BY1FG2^M&h EoЩS'y3#Zs۔Oaf~9w>eP7 նix(aW1M(M@*'Gw\ U9v-$&s\0@E倪;b4 hzQYPP?YgźuVZj^#s{sNh!enCޗV1ڼ -q?f4԰DK_Q$\@Er@0M2!r-9*`O':7̕W^ݻr}2iCΖݸ-[e˖)! #(*ZC8^eh>sY1Xf.E@7h*`>lٲ^zq}i~@S$o?.S-6ÇWwJjB7L:ytUS, o+8Y@- 7^jy wk(`2쁥l6@G;It.NW7pMfh@S\=.-[駟μy((fԛ4zh:$MWh + E3UGV*'Xv=wG._Ԉ9hѴ_fmr-F,Bs|uL4s9 6sYjoVuMGk,4&9jxy*PqJk;oC6"q"xkY^XA(6-jE/E@}C E"#$!`8x fs=6;2|@5AmVheU^^^8Y\U55]x`Ak!A&~nf⊚쨃ζm۸3XJ[P+ d08JE$)tC/3777+1瓓SѲ}/J=I35hq_D_Nܲe ^x!cƌ!%%$رc^ziM &!  )vN'Tͥ8C~~>hU9 1*gUfffQVV$6Z @յ- Ζ/ xPcGÇR/_NϞ=7o+)$X~=]tQM x^A83Y*)GgTQ ӼE: dYYYdffK\NRPB.9`wl { $?Xn]пڵk6lvC3\vycu ?bUw?z}UW]Ŋ+0{lvʎ;jtiΝ,cG>l6is@/*2`-CFJJuwF TTTUvv>ש}Pt9 4Am ??ѣGυ^ȤIS+@JJ s̡m۶L2ŕe]V`0<ҠQ n;wʙ@󬪨$k}oj=~8jaa74P="3W3ƥ\w @RN+W*1$ab4ռjF?3?3h4riqWлwo:wL||<DGGSXXHvv6Goa֭l߾׏71s|a2;l8wFGG)ުV5Ǐ|x1{j*BƆV 7P_tYCtvkpwXŻ%p W*cONN&33$//s0;vfgg&''([(QT<l↑W~Lo"MIt4Pj0ݹϗ09*^h^ȫBVVViZZnPYA pر}YYYvP(n?jE-W }v\דh g4j4A.h}օ% ];QN}g}/<Jffرczl4*骣GiKLLt+{Z<enπRJǀg6zNo:)]H5Z3i @Mu v԰011'N=zDI`.JLL l񄇇6KJJI|37\Z> V82~k\ uz b$?Æurz9Q\XXm<; 0E|( V4;ϹoOb'e7c6I&٬Y3:Tj0L~RE^RRtӫ%,%@~ii) @`ܹ3jӮ}[ǶqYݫ5%S ~d-=j5[4\UT85*2"'Id.]p;bb *#gCѳgO%lwC$ʫGKUweJ ˀ PGфN_+WTUv;[ڟѢy\:e,bݻwӹsgp^ui\~wm%E^ˏ^O uk]-1V̓Ei>eX(S8TMիҤ3ΝI^-ݽ0ϺVUٌb!bd`1Y1LOCW~OK X-BM_jA Y`+!/?)))ZTLx&qV[X䟈P g\xE=m֒af&e6&),lWTg+ ZAUbKQf~ŠKlVÁ:,ˆQkXnuɝ\sA=C                                                                                                                                                 PDkVIENDB`klog-0.9.8.1/README-DEVEL0000644000175000017500000002143113532572307013330 0ustar develdevelThis is a file to read if you want to join the KLog development team. This document will explain the KLog architecture, requirements, tips and important to know things to take into account when joining the KLog development team. CONTENT: 1 - BEFORE CODING 2 - KLOG ARCHITECTURE 3 - BEFORE CODING 4 - CODING 5 - AFTER CODING 6 - GUI 7 - DOCUMENTATION 8 - TRANSLATIONS 9 - DEPLOYING 0 - MISSION AND OBJECTIVE The objective of KLog is to provide a free software that runs in Linux, macOS and Windows. KLog will provide hamradio contest and DX logging support. 0.1 - REQUIREMENTS - Able to run in Linux, macOS and Windows. - Easy to use. - Able to localize to any language. - Any data can be exportable into ADIF (http://www.adif.org). - Can import standard ADIF. - Can export to Cabrillo (http://www.kkn.net/~trey/cabrillo/). - Provides a user manual / documentation. 1 - BEFORE CODING: Read this document. Join the KLog mailing list and send a "Hello that's me and I am here" message: http//MAILINGLIST Interesting links: http://www.qtcentre.org/wiki/index.php?title=Keeping_the_GUI_Responsive Packer: http://upx.sourceforge.net/ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 2 - KLOG ARCHITECTURE KLog is intended to be a MODULAR software with the requirement to be modular ;-) so it is easy to add new features (mainly contests and awards support). 2.1 IMPORTANT THINGS TO HAVE IN MIND DEPRECATED - KLog version number is using the following system: Release versions: The Decimal part of the version number will always use even numbers like 0, 1.2, 2.20, ... while the decimal part of the development or Release Candidate versions will always be an odd number ie 0.1, 1.3, ... The release number is defined in the "main.cpp" file. - KLog should manage several logs. The "log" table of the DB has a column called "lognumber". ALL QSO has a lognumber id that identifies the log it belongs to. Each lognumber will have associated a Name and/or ID (TBD) so the user is able to "open" just that log. It is important that all the QSO operations are aware of this lognumber id. - The log table has a "marked" column. This column is to allow mass operations. Changing this column has to be done with care and leave it "unmarked" once the desired operation is finished. KLog should unmark(N) all QSO when starts and exits. Mark = 'X', unmark='N' or other. Marked column should not be saved. - Any change to the DB architecture must be communicated and agreed with the development team before commiting to the SVN and following the 2.4 DB UPDATES area in this document. 2.2 CONTEST SUPPORT The "Contest" class (in contest.h) is a base class and all the contest should inherit it. The "Contest" class has several virtual functions that should re-implemented in all derived classes. 2.2.1 ADDING A NEW CONTEST To add a new contest, a new class, inheriting the "Contest" class should be created. The new contest file should be named: "contest_nameofthecontest.h" and "contest_nameofthecontest.cpp" and should be included in the mainwindow.h All the calls to the contest class should be implemented in the virtual class. A new contest must include the implementation of all the functions of the virtual class. 2.3 AWARD SUPPORT 2.4 DB UPDATES A DB update consist on: - All the intended changes. - Update the softwarecontrol TABLE on the DB To update the DB structure there are several things to have in mind: - The current version of the DB is defined in database.h const float DBVersionf = 0.003; - All the actions to update the DB to the new structure are done here: DataBase::updateIfNeeded - After making any update = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 3 - BEFORE CODING Update your sources from the SVN: Remember that other developer may has done a commit. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 4 - CODING - The development language is English. - All Strings to be shown to the user must be translatable. i.e. tr("String") 4.1 - STYLE 4.2 - ADIF SUPPORT KLog is using some application defined ADIF fields: APP_{PROGRAMID}_{FIELDNAME} Header fields: APP_KLOG_LOG_DATE_EXPORT: The date and time (in UTC) when the log was exported. APP_KLOG_QSOS: The number of QSOs in the log. DEPRECATED: APP_KLOG_RELEASE: Release of KLog used to export the log file. CHANGED TO PROGRAMVERSION (ADIF standard) QSO fields: APP_KLOG_POINTS: Points given by the QSO. APP_KLOG_MULTIPLIER: Information about the multiplier status of the QSO. APP_KLOG_LOGN: Lognumber if the ADIF file contains several logs. KLog is also importing other application defined ADIF fields: APP_N1MM_POINTS: That is imported into the points column in the log table. KLog should not export any ADIF header that comming from other application without renaming it to APP_KLOG_ 4.3 SHORTCUTS Before adding or modifying any shortcut: - It should be agreed in the devel mailing list. - It should be as standard as possible, reuse the same shortcuts of main/popular contest software. - It should be checked and added to a list below. 4.4 DATA BASE - The DB version has to be checked and modified after a DB schema modification. - Any modification to the DB has to be provided with the code to update from any previous version. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 5 - AFTER CODING Test that your code compiles and does not break the previous code. Document your changes and close/update the tasks/bugs you have worked on. Remember to commit your code to the SVN. Try to do "atomic" commits. That is to commit updates that may be disabled as a block. i.e. A new function or a modification to a function. Don't commit several things at once if you can avoid it. This is just a recommendation to avoid big commits that, in case of a problem are difficult to trace. Document your commits: ALWAYS add a clear comment to the commits so it is easy to know what is it about. 5.1 TEST CHECKLIST Here is the list of tests to be done before releasing new software: - Install in a new installation of Windows/macOS - Upgrade from a previous version - Create a new log - Add a new QSO - Check that the DXCC & IOTA continent make sense - Check if QSO/worked DXCC, ... count changes - Edit a QSO from log - Modify at least one field in each tab - Edit a QSO from the search box - Remove a QSO - Update the DXCC status tab - Connect to the DXCluster - Click on a spot on the DXCluster - Export an ADIF file - Import an ADIF file - Remove KLog in Windows = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 6 - GUI 6.1 CONTEST GUI - The GUI should only have the data fields that are needed for that contest, keeping the GUI simple and easy to use. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 7 - DOCUMENTATION - One feature will not be considered completed until it is not added to the user manual. Please document in the klog-handbook.xml your feature so the user knows how to use it. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 9 - TRANSLATIONS 9.1 ADDING TRANSLATIONS To add a new translation add the new language file to the klog.pro file following the sintax: TRANSLATIONS = KLog_es.ts \ klog_fr.ts Being es, fr, the ISO codes naming the language. After a translation is added, you also need to update the aboutdialog.cpp to include a new Translator line. 9.2 TRANSLATING Translators should work in the *.ts files. 9.2 UPDATING TRANSLATIONS Update translations: Run: lupdate -verbose klog.pro in the klog directory to update the language files = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 9 - DEPLOYING Before deploying, translations should be updated. 9.1 DEPLOYING ON LINUX 9.2 DEPLOYING ON macOS Build KLog with QTCreator Run the following command from the build directory: mv klog.app KLog.app create new folder in KLog.app/Contents/PlugIns/sqldrivers copy $QT_DIR/plugins/sqldrivers/libqsqlite.dylib to the new folder (/Developer/Applications/Qt/plugins/) create new folder: KLog.app/Contents/MacOs/translations copy the *.qm (translation) files into KLog.app/Contents/MacOS/translations macdeployqt KLog.app/ -dmg mv KLog.dmg KLog-[VERSION].dmg 9.3 DEPLOYING ON WINDOWS Currently using an Open Source Licence of: BitRock InstallBuilder 9.4 ICON Follow this link for all the OS: http://doc.qt.io/qt-5/appicon.html Installer: http://en.wikipedia.org/wiki/List_of_installation_software klog-0.9.8.1/translations/0000755000175000017500000000000013532577071014336 5ustar develdevelklog-0.9.8.1/translations/klog_de.ts0000644000175000017500000073256513532572307016331 0ustar develdevel AboutDialog About KLog Über KLog By von KLog is a free logbook for hamradio operators. KLog ist ein freies Programm für Amateurradio-Operatoren. Please know that this is an BETA release and it may contain many bugs.<br>Backup your data before using this software! Beachten Sie, dass dies eine Beta-Version ist und Fehler enthalten kann.<br>Sichern Sie Ihre Daten ehe Sie diese Software verwenden. KLog has been fully rewritten from the 0.6.2 to be able to provide a cross-platform application that runs in the main operating systems (Linux, macOS & Windows) and provide new functionalities that KLog was not providing. Beachten Sie, dass dies eine Beta-Version ist und Fehler enthalten kann.<br>Sichern Sie Ihre Daten ehe Sie diese Software verwenden. Please provide your review in KLog's eHam review page: Bitte geben Sie Ihre Bewertung auf der eHam-Seite für KLog an: Find more information and the latest release at Weitere Informationen und die neueste Version auf Author Autor today 2018 Main developer Hauptentwickler KLog is developed by a very small team and you are invited to join! KLog wird von einer kleinen Gruppe entwickelt, machen Sie mit. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Ist KLog nicht in Ihre Sprache übersetzt und Sie möchten mithelfen, abonnieren Sie die <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">Entwicklermailingliste für KLog</a>. You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. .Senden Sie Fehlerberichte oder kleine Korrekturen des Quelltextes, Ideen oder alles, was KLog verbessern könnte. If you want to provide support you are welcome to join the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Senden Sie Fehlerberichte oder kleine Korrekturen des Quelltextes, Ideen oder alles, was KLog verbessern könnte. Authors Autoren Translators bring KLog into your language. They are really an important part of the KLog development team. Übersetzer bringen KLog in Ihre Sprache. Sie sind wirklich ein wichtiger Bestandteil. des KLog-Entwicklungsteams. Translators Übersetzer Privacy advisory Hinweis zur Privatsphäre KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account user's needs KLog-Entwickler haben eine Funktion integriert, die einige Benutzerdaten an den KLog-Server sendet, um die Anzahl der installierten Versionen zu identifizieren, und um die Entwicklung entsprechend den Bedürfnissen der Benutzer weiterzuentwickeln. At present, the data that is provided is the following: Zurzeit werden folgende Daten übertragen: Callsign Rufzeichen KLog version KLog-Version Operating system Betriebssystem Be aware that you can enable/disable this feature from the Misc tab in the Setup page Diese Funktion können Sie im Einrichtungsdialog auf der Seite Verschiedenes ein- oder ausschalten. KLog KLog Privacy Privatsphäre CTYPage Country data download Länderdaten herunterladen KLog needs country data... KLog benötigt Länderdaten ... &Download &Herunterladen &Ignore &Ignorieren Country data needed Länderdaten erforderlich KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC information. KLog verwendet die Datei „cty.csv“ von http://www.country-files.com/, um DXCC-Informationen zu erhalten.. You need to download the cty.csv file if you want KLog to show you the countries, locator, ... of the QSOs you do. Sie müssen die Datei „cty.csv“ herunterladen, wenn Klog das Land, Locator, usw. des QSO-Eintrags anzeigen soll, den Sie bearbeiten. Click on Download to download now. Klicken Sie zum Starten auf Herunterladen. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Der Rechner wurde nicht gefunden. Bitte überprüfen Sie Ihr Netzwerk und versuchen Sie es erneut Möchten Sie es erneut versuchen? DXCCStatusWidget Update Aktualisieren ID Kennung Entity Eintrag Pref: CQ: ITU: Beam: Entity not worked in this band. Eintrag in diesem Band nicht bearbeitet. DXClusterWidget Click on Connect to connect to the DX-Cluster server Klicken Sie auf „Verbinden“, um die Verbindung zum DX-Clusterserver herzustellen Connect Verbinden Clear Löschen Click on connect to connect to the DX-Cluster Klicken Sie auf „Verbinden“, um die Verbindung zum DX-Clusterserver herzustellen Trying to connect to the server Es wird versucht, mit dem Server zu verbinden KLog DXCluster KLog-DX-Cluster The host was not found. Please check: Der Rechner wurde nicht gefunden, bitte überprüfen Sie: - your network connection; - the host name and port settings. - ihre Netzwerkverbindung - den Rechnernamen und Port-Einstellungen. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Die Verbindung ist von der Gegenstelle abgelehnt worden. Überprüfen Sie, dass der DX-Clusterserver erreichbar ist und dass der Rechnername und Port korrekt sind. The following error occurred: %1. Der folgende Fehler ist aufgetreten: %1. Connected to server Mit Server verbunden KLog message KLog-Nachricht Enter your callsign to connect to the cluster: Geben Sie Ihr Rufzeichen für die Verbindung zum DX-Cluster ein: Enter your password to connect to the cluster: (Just hit enter for no password) Geben Sie Ihr Passwort für die Verbindung zum Cluster ein: Oder drücken Sie die Eingabetaste für ein leeres Passwort Disconnect Verbindung trennen Not logged on, you may need to enter your callsign again. Sie sind nicht angemeldet, bitte geben Sie Ihr Rufzeichen nochmal ein. Enter here the commands to be sent to the DX-Cluster server. Geben Sie hier die Befehle ein, die an den DX-Cluster-Server gesendet werden. Connection closed by the server Verbindung durch den Server beendet Click on Connect to connect to the DX-Cluster server. Klicken Sie auf „Verbinden“, um die Verbindung zum DX-Clusterserver herzustellen. Send Senden DataProxy_SQLite Software version in DB is null Keine Softwareversion für die Datenbank vorhanden No query failed Alle Abfragen erfolgreich Aircraft Scatter Common term in hamradio, do not translate if not sure Reflexion an Flugzeugen Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Erde-Mond-Erde Sporadic E Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Streuung durch Meteore Terrestrial or atmospheric repeater or transponder Terrestrische oder atmosphärische Reklektion oder Transponder Rain scatter Common term in hamradio, do not translate if not sure Streuung durch Regen Satellite Satellit Bureau Common term in hamradio, do not translate if not sure Büro Manager Common term in hamradio, do not translate if not sure Manager All QSOs have been updated with a DXCC and the Continent. Field Aligned Irregularities Common term in hamradio, do not translate if not sure F2 Reflection Common term in hamradio, do not translate if not sure F2-Reflexion Trans-equatorial Common term in hamradio, do not translate if not sure Tropospheric ducting Common term in hamradio, do not translate if not sure Yes Ja No Nein Requested Angefordert Ignore/Invalid Ignoriert/Ungültig Validated Geprüft Queued Eingereiht Uploaded Hochgeladen Do not upload Nicht hochladen Modified Geändert Direct Direkt Electronic Elektronik KLog DXCC KLog-DXCC DownLoadCTY Download of cty.csv failed with the following error code: Das Herunterladen von cty.csv ist mit folgendem Fehler fehlgeschlagen: Download of cty.csv done. Das Herunterladen von cty.csv ist abgeschlossen. There is already a cty.csv file in the folder but it will be replaced with the new one. Es gibt bereits eine Datei cty.file im Ordner, sie wird durch die neue Datei ersetzt. Could not open %1 for writing %1 lässt sich nicht zum Schreiben öffnen FileManager The log that you have selected contains more than just one station callsign. Das ausgewählte Protokoll enthält mehrere Stations-Rufzeichen. Please select the station callsign you want to export the log from: Bitte wählen Sie das Stations-Rufzeichen, dessen Protokoll Sie exportieren möchten: Station Callsign: Stations-Rufzeichen: Define Station Callsign Stations-Rufzeichen eingeben You have selected no callsign. KLog will export QSOs without a station callsign defined and those with the call you are entering here. Sie haben kein Rufzeichen ausgewählt. Es werden QSOs ohne definiertes Stations-Rufzeichen und QSOs mit dem hier eingegebenen Rufzeichen exportiert. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Geben Sie das Stations-Rufzeichen für dieses Protokoll ein oder lassen das Rufzeichen weg für QSOs ohne Stations-Rufzeichen: No station callsign has been selected and therefore no log will be exported Es wurde kein Stations-Rufzeichen ausgewählt, daher wird kein Protokoll exportiert Writing ADIF file... ADIF-Datei wird geschrieben ... Abort writing Schreiben abbrechen Exporting LoTW ADIF file... ADIF-Datei für LoTW wird exportiert ... QSO: QSO: Writing ADIF file... QSO: ADIF-Datei wird geschrieben ... QSO: You have canceled the file export. The file will be removed and no data will be exported. Sie haben der Export der Datei abgebrochen. Die Datei wird entfernt und es werden keine Daten exportiert. Do you still want to cancel? Möchten Sie immer noch abbrechen? Writing Cabrillo file... Cabrillo-Datei wird geschrieben ... KLog: Cabrillo Log Export not implemented KLog: Der Export in eine Cabrillo-Datei ist nicht implementiert I am sorry but the Cabrillo Export To File feature has still not been implemented. Leider wurde die Funktion zum Export in eine Cabrillo-Datei bisher noch nicht implementiert. Reading LoTW file... LoTW-Datei wird gelesen ... Abort reading Lesen abbrechen There is more than one log in this logfile. Es gibt mehrere Protokolle in dieser Protokolldatei. All logs will be imported into the current log. Alle Protokolle werden in die aktuelle Protokolldatei importiert. Do you want to continue? Möchten Sie fortfahren? Reading ADIF file... ADIF-Datei wird gelesen ... Importing ADIF file... ADIF-Datei wird importiert ... It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Offensichtlich gibt es einige doppelte QSOs in der ADIF-Datei, die Sie importieren möchten. Möchten Sie fortfahren? (Duplikate von QSOs werden nicht importiert) You have cancelled the file import. The file will be removed and no data will be imported. Sie haben der Import der Datei abgebrochen. Die Datei wird entfernt und es werden keine Daten exportiert. This QSO is not including the minimum data to consider a QSO as valid!. In diesem QS=-Eintrag fehlen Daten, er ist ungültig. Please edit the ADIF file and make sure that it include at least: Bearbeiten Sie die ADIF-Datei und überprüfen Sie, ob sie mindesten Folgendes enthält: and und This QSO had: In diesem QSO-Eintrag: - The band missing and the following call: - Das Band fehlt bei dem folgenden Rufzeichen: - The call missing but was done at this time: - Das Rufzeichen fehlt bei dem folgenden Datum: - The mode missing and the following call: - Der Modus fehlt bei dem folgenden Rufzeichen: - The date missing and the following call: - Das Datum fehlt bei dem folgenden Rufzeichen: - The time missing and the following call: - Die Zeit fehlt bei dem folgenden Rufzeichen: Do you want to continue with the current file? Möchten Sie mit der aktuellen Datei fortfahren? KLog: Not all required data found! KLog: Es wurden nicht alle benötigten Daten gefunden This log seems to lack of RST-TX information. In diesem Protokoll fehlen RST-TX-Informationen. Click on Yes to add a default 59 to all QSO with a similar problem. Klicken Sie auf „Ja“, um den Vorgabewert 59 zu allen QSOs mit dem gleichen Problem hinzuzufügen. If you select NO, the QSO may not be imported. Wenn Sie Nein auswählen, werden die QSO-Daten nicht importiert. KLog: No RST TX found! KLog: Es wurden keine RST-TX-Daten gefunden This log seems to lack of RST-RX information. In diesem Protokoll fehlen RST-RX-Informationen. KLog: No RST RX found! KLog: Es wurden keine RST-RX-Daten gefunden InfoWidget 10M 10 m 15M 15 m 20M 20 m 40M 40 m 80M 80 m 160M 160 m 2M 2 m 6M 6 m 12M 12 m 17M 17 m 30M 30 m 70CM 70 cm Continent Kontinent Prefix Präfix CQ CQ ITU ITU Short Path Kurzer Weg Long Path Langer Weg Deg Grad Miles Meilen Km km IntroPage Welcome to KLog! Willkommen bei KLog Welcome to KLog! - brought to you under the terms of the GPL! Willkommen bei KLog - veröffentlicht unter den Bedingungen der GPL Welcome to KLog Willkommen bei KLog This looks like it's the first time you've run KLog on this computer. Anscheinend führen Sie KLog zum ersten Mal auf diesem Rechner aus. KLog is a free hamradio logging program that can run on Linux macOS and Windows. KLog ist ein freies Programm für Amateurradio-Protokolle für Linux, macOS und Windows. It is designed to provide general purpose, DX and contest logging. Entwickelt für den allgemeinen Gebrauch, DX und Contest-Protokolle. It supports QSL management, import and export of ADIF Es unterstützt die Verwaltung von QSLs und Import sowie Export von ADIF-Dateien and Cabrillo file formats and many other features... Export in das Cabrillo-Dateiformat und viele weitere Funktionen ... Before you can start using KLog, you will be asked to: Ehe Sie KLog verwenden können, müssen Sie folgendes eingeben: Acknowledge to the terms of the license. Den Lizenzbedingungen zustimmen. Download the DX entities information. Informationen über DX-Einträge herunterladen. Enter your callsign, CQ zone, etc. and main configuration. Rufzeichen, CQ-Zone usw. eingeben und die wichtigsten Einstellungen vornehmen. Enjoy KLog and contact the development team if you have any suggestions! Viel Spaß mit KLog und kontaktieren Sie das Entwicklungsteam, wenn Sie Vorschläge zur Verbesserung haben. LicPage KLog License information Lizenz-Information für KLog Welcome to KLog!- brought to you under the terms of the GPL! Willkommen bei KLog - veröffentlicht unter den Bedingungen der GPL Acknowledge Zustimmen Be aware that KLog is free software. KLog ist freie Software. LogModel Date Datum Time Zeit QRZ QRZ Band Band Mode Modus RSTtx RSTrx Comment Kommentar LogWindow QSL Send QSL gesendet QSL Rcvd QSL empfangen &Delete &Löschen Delete a QSO QSO löschen &Edit QSO OSO b&earbeiten Edit this QSO Diese QSO bearbeiten Via &bureau Über &Büro Send this QSL via bureau Diesen QSL-Eintrag über das Büro senden D&irect D&irekt Send this QSL via direct Diesen QSL-Eintrag direkt senden Via bureau Über Büro QSL &received via bureau Empfangene QSL über Büro Direct Direkt QSL received via direc&t Direk&t empfangene QSL You have requested to delete this QSO. Sie haben das Löschen dieser QSO angefordert. Are you sure? Sind Sie sicher? MainWindow Recalculate Neu berechnen Starting KLog KLog wird gestartet &Add &Hinzufügen &Clear &Löschen Status bar... Statusleiste ... DX Entity DX-Eintrag &Log Window &Protokollfenster &Score Window Bewertung&sfenster Watts Watt MHz MHz KLog KLog Annual Ready Bereit An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Es ist ein unerwarteter Fehler beim Hinzufügen der QSO-Daten zu Ihrer Protokolldatei aufgetreten. Bitte senden Sie einen Fehlerbericht an die Entwickler zur Analyse, falls das Problem weiterhin besteht. You have selected an entity: Sie haben folgenden Eintrag ausgewählt: that is different from the KLog proposed entity: Dieser Eintrag unterscheidet sich von dem durch KLog vorgeschlagenen Eintrag: Click on the prefix of the correct entity or Cancel to edit the QSO again. Klicken Sie auf das Präfix, um den Eintrag zu korrigieren oder drücken Sie Abbrechen, um den QSO-Eintrag erneut zu bearbeiten. Click on the prefix of the right entity or Cancel to correct. Klicken Sie auf das Präfix rechts vom Eintrag oder drücken Sie „Abbrechen“ zur Korrektur. Input Eingabe RSTrx RSTtx QRZ QRZ STX SRX NEW MULT Invalid characters used in the QRZ Ungültige Zeichen in der QRZ Ready... Bereit ... &File &Datei &New... &Neu ... &Open... Öff&nen ... &Import from ADIF... &Importieren aus ADIF ... Import an ADIF file into the current log. Importiert eine ADIF-Datei in das aktuelle Protokoll. &Save As... Speichern &unter ... Export to ADIF... Exportieren zu ADIF ... Export the current log to an ADIF logfile. Exportiert das aktuelle Protokoll in eine ADIF-Protokolldatei. Export all logs to ADIF... Alle Protokolle zu ADIF exportieren ... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exportiert alle QSOs in eine ADIF-Datei, dabei werden QSOs aus allen Protokollen zusammengeführt. Export Requested QSL to ADIF... Angeforderte QSL in ADIF exportieren ... Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a QSL tag printing program). Exportiert alle für QSLs angeforderten QSLs in eine ADIF-Datei, um sie zum Beispiel in ein Programm zum Drucken von QSL-Markierungen zu exportieren. Export ADIF for LoTW... ADIF für LoTW exportieren ... Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before uploading to LoTW! Exportiert eine ADIF-Datei zum Versenden zu LoTW. Signieren Sie die Datei mit TQSL, bevor Sie sie zu LoTW hochladen. &Print Log... &Protokoll drucken ... Print your log. Druckt ein Protokoll. KLog folder KLog-Ordner Opens the data folder of KLog. Öffnen den Datenordner von KLog. E&xit &Beenden &Tools E&xtras Fill in QSO data QSO-Daten ausfüllen Go through the log reusing previous QSOs to fill missing information in other QSOs. Im Protokoll Daten früherer QSO-Einträge zum Ausfüllen fehlender Informationen in anderen QSO-Einträgen verwenden. Fill in DXCC data DXCC-Daten ausfüllen Go through the log filling QSOs without a DXCC defined. QSOs im Protokoll ohne definierten DXCC-Eintrag ausfüllen. QSL tools... QSL-Werkzeuge ... &Find QSO to QSL &QSO-Einträge zu QSLs suchen Shows QSOs for which you should send your QSL and request the DX QSL. Anzeige von QSO-Einträgen, für die Sie Ihre QSLs versenden und die DX-QSL anfordern sollten. Find My-QSLs pending to send Ausstehende DX-QSLs zum Senden suchen Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Zeigt die QSL-Einträge mit ausstehenden Anforderungen zum Senden von QSLs. Diese Warteschlange sollten Sie bearbeiten. &Find DX-QSLs pending to receive &Ausstehende DX-QSLs zum Empfang suchen Shows the DX-QSL that has been requested or QSLs has been sent with no answer. Zeigt die DX-QSL-Einträge, die angefordert wurden oder QSL-Einträge die ohne Antwort versendet wurden. &Find requested pending to receive &Ausstehende Einträge, auf deren Empfang gewartet wird Shows the DX-QSL that has been requested. Zeigt die angeforderten DX-QSL-Einträge. LoTW tools... LoTW-Werkzeuge ... Queue all QSL to be sent of this log Alle QSL-Einträge in diesem Protokoll in die Sende-Warteschlange einreihen Mark all non sent QSOs in this log as queued to be uploaded. Alle nicht gesendeten QSO-Einträge in diesem Protokoll als eingereiht zum Hochladen markieren. Queue all QSL to be sent Alle QSL-Einträge in die Sende-Warteschlange einreihen Mark all non sent QSOs as queued to be uploaded. Alle nicht gesendeten QSO-Einträge als eingereiht zum Hochladen markieren. Mark as sent all queued QSO of this log Alle eingereihten QSO-Einträge in diesem Protokoll als gesendet markieren Mark all queued QSOs in this log as sent to LoTW. Alle eingereihten QSO-Einträge in diesem Protokoll als versendet zu LoTW markieren. Mark all queued QSO as sent Alle eingereihten QSO-Einträge als versendet markieren Mark all queued QSOs as sent to LoTW. Alle eingereihten QSO-Einträge als versendet zu LoTW markieren. &Update cty.csv cty.csv &aktualisieren For updated DX-Entity data, update cty.csv. Zur Aktualisierung der DX-Einträge laden Sie bitte die Datei „cty.csv“ erneut herunter. &Update Satellite Data &Satellitendaten aktualisieren Stats Statistik Show the statistics of your radio activity. Zeigt eine Statistik Ihrer Funkaktivitäten. &Setup &Einstellungen &Setup... &Einstellungen ... &Help &Hilfe Check updates... Nach Aktualisierungen suchen ... &About... &Über... About Qt... Über Qt ... KLog LoTW KLog-LoTW All pending QSO of this log has been marked as queued for LoTW! Alle ausstehenden QSO-Einträge in diesem Protokoll wurden für die Warteschlange zu LoTW markiert. Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. Jetzt können Sie im Menü „Datei“ die ADIF-Datei zu LoTW exportieren und hochladen. There was a problem to mark all pending QSO of this log as queued for LoTW! Beim Markieren aller ausstehenden QSO-Einträge in diesem Protokoll für die Warteschlange zu LoTW ist ein Problem aufgetreten. All pending QSO has been marked as queued for LoTW! Alle ausstehenden QSO-Einträge wurden für die Warteschlange zu LoTW markiert. The log that you have selected contains more than just one station callsign. Das ausgewählte Protokoll enthält mehrere Stations-Rufzeichen. Please select the station callsign you want to mark as sent to LoTW: Bitte wählen Sie das Stations-Rufzeichen, dass Sie als versendet zu LoTW markieren möchten: Station Callsign: Stations-Rufzeichen: Define Station Callsign Stations-Rufzeichen eingeben You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the call you are entering here. Sie haben kein Rufzeichen ausgewählt. Es werden QSOs ohne definiertes Stations-Rufzeichen und QSOs mit dem hier eingegebenen Rufzeichen markiert. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Geben Sie das Stations-Rufzeichen für dieses Protokoll ein oder lassen das Rufzeichen weg für QSOs ohne Stations-Rufzeichen: No station callsign has been selected and therefore no log will be marked Es wurde kein Stations-Rufzeichen ausgewählt, daher wird kein Protokoll markiert All queued QSO of this log has been marked as sent for LoTW! Alle eingereihten QSO-Einträge wurden als versendet zu LoTW markiert. There was a problem to mark all queued QSO of this log as sent for LoTW! Beim Markieren aller eingereihten QSO-Einträge in diesem Protokoll für das Senden zu LoTW ist ein Problem aufgetreten. All queued QSO has been marked as sent to LoTW! Alle eingereihten QSO-Einträge wurden als versendet zu LoTW markiert. There was a problem to mark all queued QSO of this log as sent to LoTW! Beim Markieren aller eingereihten QSO-Einträge in diesem Protokoll für das Senden zu LoTW ist ein Problem aufgetreten. About... Über ... KLog update checking result Überprüfung der KLog-Version Congratulations! Glückwunsch You already have the latest version. Sie haben bereits die neueste Version. Nothing has been saved. You have to select a valid file type. Es wurden noch keine Daten gespeichert. Sie müssen einen gültigen Dateityp wählen. Save File Datei speichern ADIF file ADIF-Datei Cabrillo files Cabrillo-Dateien Any file Beliebige Datei You can find the KLog data folder here: Hier finden Sie den KLog-Datenordner: DUPE Duplikat start Starten stop Anhalten It seems that there are no QSO in the database. Anscheinend gibt es keine QSO-Daten in der Datenbank. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Enthält die Datenbank tatsächlich QSOs, sie werden aber nicht gefunden, nehmen Sie mit den KLog.Entwicklern Kontakt auf, siehe Über KLog. TX Frequency in MHz. TX-Frequenz in MHz. RX Frequency in MHz. RX-Frequenz in MHz. Power used by the DX. Leistung für den DX-Eintrag. Logging operator's callsign. Rufzeichen des Protokoll-Operators Callsign used over the air. My QTH locator. Mein QTH-Locator Name of the DX. Name des DX-Eintrags. QTH of the DX. QTH des DX-Eintrags. Locator of the DX. Locator des DX-Eintrags. Filling DXCC in QSOs... QSO: TX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. Frequency is not in a hamradio band! QSO logged from WSJT-X: Protokollierte QSO von WSJT-X: QRZ of the QSO. QRZ des QSO-Eintrags. Click to recalculate the award status. Klicken Sie, um den Diplom-Status neu zu berechnen. TX RST. RX RST. TX Exchange. RX Exchange. Band of the QSO. Band des QSO-Eintrags. Mode of the QSO. Modus des QSO-Eintrags. Date of the QSO. Datum des QSO-Eintrags. Time of the QSO. Zeit des QSO-Eintrags. Add the QSO to the log. QSO zum Protokoll hinzufügen Clear the box. Feld löschen. The logfile has been modified. Die Protokolldatei wurde verändert. Do you want to save your changes? Möchten Sie Ihre Änderungen speichern? UDP Server error The UDP server failed to %1. start or stop UDP-Serverfehler Der UDP-Server kann %1 nicht ausführen. Clears the QSO entry. Löscht den QSO-Eintrag. Number of confirmed DXCC entities. Anzahl der bestätigten DXCC-Einträge. Number of worked DXCC entities. Anzahl der bearbeiteten DXCC-Einträge. Number of confirmed WAZ zones. Anzahl der bestätigten WAZ-Zonen. Number of worked WAZ zones. Anzahl der bearbeiteten WAZ-Zonen. Number of confirmed local references. Anzahl der bestätigten lokalen Referenzen. Number of worked local references. Anzahl der bearbeiteten lokalen Referenzen. Number of confirmed QSOs. Anzahl der bestätigten QSOs. Number of worked QSOs. Anzahl der bearbeiteten QSOs. Number of QSOs worked on the selected year. Anzahl der im ausgewählten Jahr bearbeiteten QSOs. Number of DXCC worked on the selected year. Anzahl der im ausgewählten Jahr bearbeiteten DXCC. Number of CQ Zones worked on the selected year. Anzahl der im ausgewählten Jahr bearbeiteten CQ-Zonen. Score for the DXMarathon on the selected year. Bewertung für den DX-Marathon im ausgewählten Jahr. Select the year you want to check. Wählen Sie das Jahr, das Sie überprüfen möchten. Status of the DX entity. Status des DX-Eintrags. Name of the DX entity. Name des DX-Eintrags. Name Name QTH QTH Locator Locator Power(rx) Leistung (RX) RST(tx) RST(rx) Freq TX TX-Frequenz Freq RX RX-Frequenz QSO QSO QSL QSL eQSL eQSL Comment Kommentar Others Sonstige My Data Meine Daten Satellite Satellit QSOs QSOs DXCC DXCC CQ CQ Score Bewertung DX-Marathon DX-Marathon Info Information Award Diplom Confirmed Bestätigt Worked Bearbeitet WAZ WAZ Local Lokal Awards Diplome Search Suchen Log Protokoll DX-Cluster DX-Cluster Save ADIF File ADIF-Datei speichern LoTW logfile has been properly exported! Die LoTW-Protokolldatei wurde erfolgreich exportiert. Remember to: Bedenken Sie: Before uploading: sign the LoTW log; and Vor dem Hochladen: Signieren Sie das LoTW-Protokoll und After uploading: mark as sent all the queued QSO (LoTW Tools). Nach dem Hochladen: Markieren Sie alle eingereihten QSOs im Menü Extras->LoTW als versendet. There was no QSO to be exported. Kein QSO zum Export vorhanden If you think that some QSO should have been exported, please look for them and ensure that the eQSL LoTW QSL sent box is marked as: Wenn einige QSO-Einträge exportiert werden sollten, suchen Sie sie und überprüfen Sie, ob das Feld „eQSL/QSL an LoTW versendet“ wie folgt markiert ist: Q - Queued E - Eingereiht There was an error while exporting the LoTW. The log has not been exported! Fehler beim Exportieren zu LoTW. Das Protokoll wurde nicht exportiert. Save Cabrillo File Cabrillo-Datei speichern Open File Datei öffnen &Modify &Bearbeiten - Needed for DXMarathon - Erforderlich für den DX-Marathon Filling QSOs... QSOs werden ausgefüllt ... Abort filling Ausfüllen abbrechen Number Anzahl Date Datum Time Zeit Band Band Mode Modus Print Log Protokoll drucken Printing the log... Das Protokoll wird gedruckt ... Abort printing Drucken abbrechen Printing the log... QSO: Das Protokoll wird gedruckt ... QSO: KLog QSO received QSO-Daten empfangen The following QSO data has been received from WSJT-X to be logged: Die folgenden QSO-Daten wurden von WSJT-X zum protokollieren empfangen: Call Ruf Freq Frequenz Time On Time Off RST TX RST RX DX-Grid Comments Kommentare TX Pwr Operator Operator Local-Grid A new mode not supported by KLog has been received from an external software: Ein neuer Modus, der von KLog nicht unterstützt wird, wurde von einer externen Software empfangen: Do you want to keep receiving this alerts? (disabling this alerts will prevent that non-valid modes are detected) Möchten Sie diese Meldungen weiter angezeigt bekommen? Werden diese Meldungen abgeschaltet, verhindert das die Erkennung ungültiger Modi. If the received mode is correct, please contact KLog development team and request support for that mode Wenn der Empfangsmodus korrekt ist, nehmen Sie bitte Kontakt mit den KLog-Entwicklern auf und bitten Sie um Unterstützung für diesen Modus. A new mode not supported by KLog has been received from an external software or radio: A duplicated satellite has been detected in the file and will not be imported. In der Datei wurde ein doppelter Satellit gefunden, er wird nicht importiert. Please check the satellite information file and ensure it is properly populated. Bitte überprüfen Sie die Datei mit den Informationen über Satelliten. Now you will see a more detailed error that can be used for debugging... Jetzt wird eine ausführlichere Fehlermeldung angezeigt, die für die Fehlersuche verwendet werden kann .. An unexpected error ocurred!! Es ist ein unerwarteter Fehler aufgetreten. If the problem persists, please contact the developers Bitte senden Sie einen Fehlerbericht, falls das Problem weiterhin besteht for analysis: für die Analyse: Error in function Fehler in Funktion Error code Fehlernummer Error text Fehlertext Failed query Abfrage fehlgeschlagen Recomendation: Export, periodically, your data to ADIF to prevent a potential data loss. Do you want to keep showing errors? Möchten Sie Fehler weiter anzeigen? MainWindowInputComment Add a comment for this QSO. Fügen Sie einen Kommentar für diesen QSO-Eintrag hinzu MainWindowInputEQSL Date of the ClubLog upload. Datum des Hochladens zu Club Log. Date of the eQSL sending. eQSL-Sendedatum Date of the eQSL reception. eQSL-Empfangsdatum Date of the LoTW sending. LoTW-Sendedatum Date of the LoTW reception. LoTW-Empfangsdatum Status on ClubLog. Status auf Club Log. Status of the eQSL sending. Status des eQSL-Versands. Status of the eQSL reception. Status des eQSL-Empfangs. Status of the LoTW sending. Status des LoTW-Versands. Status of the LoTW reception. Status des LoTW-Empfangs. ClubLog Club Log eQSL Sent eQSL gesendet eQSL Rec eQSL empfangen LoTW Sent LoTW versendet LoTW Rec LoTW empfangen MainWindowInputOthers Primary Div Secondary Div IOTA IOTA Entity Eintrag Propagation mode Select the primary division for this QSO. Select the secondary division for this QSO. Select the entity for this QSO. Wählen Sie den Eintrag für diese QSO. Select the propagation mode for this QSO. Select the IOTA continent for this QSO. Wählen Sie den IOTA-Kontinent für diese QSO. Select the IOTA reference number for this QSO. Wählen Sie den IOTA-Referenznummer für diese QSO. Not Identified Nicht identifiziert Not - Not Identified Nicht - Nicht identifiziert MainWindowInputQSL QSL Sent QSL gesendet QSL Rec QSL empfangen QSL Via QSL über QSL Msg QSL-Nachricht Status of the QSL sending. Status des QSL-Versands. Status of the QSL reception. Status des QSL-Empfangs. QSL sending information. QSL-Sendeinformation QSL reception information. QSL-Empfangsinformation Date of the QSL sending. QSL-Sendedatum Date of the QSL reception. QSL-Empfangsdatum Message of the QSL. QSL-Nachricht QSL via information. QSL-Information über den Versand. MainWindowMyDataTab Watt Watt Keep this data Diese Daten behalten Data entered in this tab will be copied into the next QSO. Die auf dieser Karteikarte eingegebenen Daten werden in den nächsten QSO-Eintrag kopiert. Power used for the QSO in watts. Leistung für den QSO-Eintrag in Watt Logging operator's callsign. Rufzeichen des Protokoll-Operators Callsign used over the air. My QTH locator. Mein QTH-Locator Power Leistung Operator Operator Station Callsign Stations-Rufzeichen My Locator Mein Locator MainWindowSatTab Keep this data Diese Daten behalten Other - Sat not in the list Sonstige - Satellit nicht in der Liste Data entered in this tab will be copied into the next QSO. Die auf dieser Karteikarte eingegebenen Daten werden in den nächsten QSO-Eintrag kopiert. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Name des Satelliten, der nicht in der Liste vorhanden ist. Wählen Sie „%1“, um dieses Feld zu aktivieren. Verwenden Sie ein Format wie AO-51. Satellite mode used. Der Satellitenmodus wird verwendet. Select the satellite you are using. Wählen Sie einen Satelliten aus. UpLink band. DownLink band. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. UpLink DownLink Satellite Satellit Mode Modus DX Locator DX-Locator Other Sonstige MHz MHz Not Sat QSO Kein Satellit zum QSO-Eintrag KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog hat einen unbekannten Satellitennamen gefunden. Wenn stattdessen ein bekannter Satellitenname verwendet werden soll, wählen Sie ihn aus der Liste. Nehmen Sie alternativ Kontakt mit den Entwicklern auf, damit der neue Satellitenname in KLog aufgenommen werden kann. The satellite you have in your QSO is: Der Satellit in Ihren QSO-Daten: Please know that the satellite name will not be saved if it is not in the list so that information may be lost! Beachten Sie, dass der Satellitenname nicht gespeichert wird, wenn er nicht in der Liste enthalten ist, daher können Informationen verloren gehen. QObject New One, work it! Neu, wird bearbeitet. Needed, work it! Benötigt, wird bearbeitet. Worked but not confirmed Bearbeitet aber nicht bestätigt Confirmed Bestätigt Not identified Nicht identifiziert Database Error Datenbankfehler KLog DB needs to be upgraded. Die KLog-Datenbank muss aktualisiert werden. Do you want to upgrade it now? Möchten Sie sie jetzt aktualisieren? If DB is not upgraded KLog may not work properly. Wenn die Datenbank nicht aktualisiert wird, kann KLog nicht richtig funktionieren. KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. Es wurden vorherige Protokolle in der Datenbank gefunden. Alle Daten werden in den neu erstellten DX-Protokolltyp migriert. KLog: Enter Station callsign KLog: Stations-Rufzeichen eingeben Enter the station callsign used in this log Geben Sie das Stations-Rufzeichen ein, das in diesem Protokoll verwendet wird Station Callsign Stations-Rufzeichen All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is OK. Alle Daten wurden richtig migriert. Überprüfen Sie jetzt auf der Seite Einstellungen->Protokolle, dass alle Daten in Ordnung sind. Updating mode information... Modusinformation wird aktualisiert ... Abort updating Aktualisierung abbrechen QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Das Abbrechen dieser Aktualisierung führt zu inkonsistenten Daten und möglicherweise zu Datenverlust. Möchten Sie immer noch abbrechen? Updating bands information... Bandinformation wird aktualisiert ... Updating bands information in %1 status... Band-Information im Status %1 wird aktualisiert ... Progress: Fortschritt: Updating mode information in %1 status... Modus-Information im Status %1 wird aktualisiert ... Updating DXCC award information... DXCC-Diplom-Informationen werden aktualisiert ... Updating DXCC Award information... DXCC-Diplom-Informationen werden aktualisiert ... Updating WAZ award information... WAZ-Diplom-Informationen werden aktualisiert ... Updating WAZ Award information... WAZ-Diplom-Informationen werden aktualisiert ... Updating DXCC and Continent information... DXCC- und Kontinent-Informationen werden aktualisiert ... Install wizard was canceled before completing... Der Installationsassistent wurde abgebrochen, bevor die Installation abgeschlossen wurde ... Do you want to remove the KLog dir from your disk? Möchten Sie den KLog-Ordner von Ihrer Festplatte löschen? Your KLog dir has been removed Ihr KLog-Ordner wurde gelöscht Thank you for running KLog! Vielen Dank für die Nutzung von KLog. I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Ihr KLog-Ordner kann nicht entfernt werden. Sie müssen diesen Ordner manuell löschen. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Ihr KLog-Ordner kann nicht entfernt werden. Sie müssen diesen Ordner manuell löschen. Remember that your KLog dir is on your system... Ihr KLog-Ordner ist immer noch auf Ihren System vorhanden ... SearchWidget &Clear &Löschen &Export Highlighted Hervorgehobene &Exportieren &Select All &Alles auswählen &Search &Suchen All Alle Clear the searches. Suchen löschen Export the search result to an ADIF file. Exportiert alle Suchergebnisse in eine ADIF-Datei. Select/Unselect all the QSOs shown. Alle angezeigten QSO-Daten aus- oder abwählen.- Search in the log. Suchen im Protokoll. Search in all logs. Suchen in allen Protokollen. Enter the QRZ to search for. Geben Sie die QRZ für die Suche ein. Search results. Suchergebnisse. QRZ QRZ Date/Time Datum/Zeit Band Band Mode Modus QSL Sent QSL gesendet QSL Rcvd QSL empfangen Station Callsign Stations-Rufzeichen ID Kennung &Clear selection &Auswahl aufheben Save File Datei speichern QSL Send QSL gesendet &Delete &Löschen Delete a QSO QSO löschen &Edit QSO OSO b&earbeiten Edit this QSO Diese QSO bearbeiten Via &bureau Über &Büro Send this QSL via bureau Diesen QSL-Eintrag über das Büro senden D&irect D&irekt Send this QSL via direct Diesen QSL-Eintrag direkt senden &Request my QSL Meine QSL anfo&rdern Mark my QSL as requested Meine QSL als angefordert markieren Via Direct && mark DX QSL as requested Direkt && DX-QSLs als angefordert markieren Send this QSL via direct & mark DX QSL as requested Diese QSL direkt versenden & als angeforderte DX-QSL markieren. Via Bureau && mark DX QSL as requested Über Büro && DX-QSLs als angefordert markieren Send this QSL via bureau & mark DX QSL as requested Diese QSL über Büro versenden & als angeforderte DX-QSL markieren. &Request the QSL QSL anfo&rdern Mark the QSL as requested QSL als angefordert markieren Via bureau && mark my QSL as requested Über Büro && DX-QSLs als angefordert markieren QSL received via bureau & mark my QSL as requested QSL über Büro empfangen & meine QSL als angefordert markieren Via bureau Über Büro QSL received via bureau Empfangene QSL über Büro Direc&t && mark as my QSL requested Direkt && mein QSL als angefordert markieren QSL received via direct & mark my QSL as requested QSL direkt empfangen & meine QSL als angefordert markieren Direc&t D&irekt QSL received via direct Direkt empfangene QSL You have requested to delete the QSO with: %1 Sie haben das Löschen dieser QSO mit %1angefordert Are you sure? Sind Sie sicher? Needed QSO to send the QSL Um die QSL zu senden, sind die QSO-Daten nötig. My QSL requested to be sent Meine QSL, die gesendet werden sollen DX QSL pending to be received Zum Empfang ausstehende DX-QSL SetupDialog My Data Meine Daten Bands/Modes Bänder/Modi DX-Cluster DX-Cluster Colors Farben Misc Verschiedenes World Editor World-Editor Logs Protokolle Satellites Satelliten HamLib Cancel Abbrechen OK OK Config Dialog Einstellungsdialog User data Benutzerdaten D&X-Cluster D&X-Cluster ClubLog Club Log WSJT-X WSJT-X You need to enter at least one log in the Logs tab. Sie müssen mindestens ein Protokoll auf der Karteikarte Protokolle eingeben. World Welt DB has not been moved to new path Die Datenbank wurde zu einem neuen Pfad verschoben Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Wählen Sie auf der Karteikarte Verschiedenes „Datenbank verschieben„ oder die Datenbank wird nicht an den neuen Ort verschoben. Go to the User tab and enter valid QRZ. Geben Sie auf der Karteikarten „Benutzerdaten“ einen gültigen QRZ-Eintrag ein. You need to enter at least a valid QRZ. Sie müssen mindestens einen gültigen QRZ-Eintrag eingeben. You have not selected the kind of log you want. Sie haben die Art des Protokolls nicht ausgewählt. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Sie werden zur Karteikarte Protokolle weitergeleitet. Geben Sie die Art des Protokolls an oder wählen Sie ein Protokoll aus. SetupEntityDialog Entity Eintrag CQ CQ ITU ITU Latitude Breitengrad Longitude Längengrad UTC UTC Main prefix Haupt-Präfix ARRL ID ARRL-Kennung Prefixes Präfixe Comma separated possible prefixes, e.g. EA1, EA2, ... Durch Komma getrennte mögliche Präfixe wie zum Beispiel EA1, EA2, ... Name of the Entity. Name des Eintrags. CQ zone. CQ-Zone ITU zone. ITU-Zone Longitude of the Entity. Längengrad des Eintrags. Local time difference to UTC. Lokale Zeitdifferenz zu UTC. Main prefix of the entity. Haupt-Präfix des Eintrags. ARRL ID. ARRL-Kennung. Date of the deletion. Datum der Löschung. Deleted Gelöscht Cancel Abbrechen OK OK Entity Dialog Eintragsdialog SetupPageBandMode Bands Bänder Modes Modi SetupPageClubLog &Callsign &Rufzeichen ClubLog &password &Passwort für Club Log ClubLog &email &E-Mail-Adresse von Club Log Enter the email you used to register in ClubLog. Geben Sie Ihr Passwort ein, das Sie für die Registrierung bei Club Log verwendet haben. Enter the callsign you used to register in ClubLog. Geben Sie Ihr Rufzeichen ein, das Sie für die Registrierung bei Club Log verwendet haben. Enter your password in ClubLog. Geben Sie Ihr Passwort für Club Log ein. &Send QSOs in real time QSOs &sofort senden &Activate ClubLog Club Log &aktivieren Use QSO Station &Callsign &QSO-Stations-Rufzeichen verwenden Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Sendet jeden QSO-Eintrag direkt zu Club Log, wenn sie in KLog hinzugefügt oder geändert werden. Starts the ClubLog support in KLog. Startet die Unterstützung für Club Log in KLog. Use the Station Callsign defined in each QSO instead of the one defined here. Verwendet das in jedem QSO-Eintrag definierte Stations-Rufzeichen anstatt des hier definierten. SetupPageColors New One Neu Needed in this band In diesem Band erforderlich Worked in this band In diesem Band bearbeitet Confirmed in this band In diesem Band bestätigt Default Standard Choose a color Wählen Sie eine Farbe SetupPageDxCluster Add Hinzufügen Delete Löschen Show &HF spots &HF-Spots anzeigen Show V/&UHF spots V/&UHF-Spots anzeigen Show W&ARC spots W&ARC-Spots anzeigen Show &worked spots &Bearbeitete Spots anzeigen Show &confirmed spots Bestätigte &Spots anzeigen Show ANN/&FULL messages Show WW&V messages WW&V-Meldungen anzeigen Show WC&Y messages WC&Y-Meldungen anzeigen DX Spots DX-Spots Messages Meldungen KLog: Add a DXCluster server KLog: DX-Clusterserver hinzufügen Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Geben Sie URL und Port an Beispiel: dxfun.com:8000 Ist kein Port angegeben, wird der Vorgabewert 41112 benutzt: SetupPageHamLib Activate HamLib Activates the hamlib support that will enable the connection to a radio. Radio Select your rig. Defines the interval to pool the radio in msecs. Pool interval Port Select the serial port. Only the serial ports that are detected are shown. Scan Click to identify the serial ports available in your computer. Bauds Select the serial port speed. 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None Hardware Software XON/XOFF Flow control Select the serial flow control No parity Even Odd Space Mark Parity Select the serial parity. 1 bit 1.5 bits 2 bits Stop bits Select the serial stop bits. SetupPageLogs &New &Neu &Edit &Bearbeiten &Remove &Entfernen Add a new log. Fügt ein neues Protokoll hinzu. Edit the selected log. Bearbeitet das ausgewählte Protokoll. Remove the selected log. Entfernt das ausgewählte Protokoll. Select the log you want to open. Wählen Sie das gewünschte Protokoll, das Sie öffnen möchten. KLog KLog Do you really want to remove this log? Möchten Sie dieses Protokoll wirklich entfernen? All the QSOs from this log will be also deleted... Alle QSOs aus diesem Protokoll werden ebenfalls gelöscht ... Log has not been removed. (#3) Das Protokoll wurde nicht entfernt. (#3) Log has not been removed. (#2) Das Protokoll wurde nicht entfernt. (#2) Log has not been removed. (#1) Das Protokoll wurde nicht entfernt. (#1) ID Kennung Date Datum Station Callsign Stations-Rufzeichen Operators Operatoren Comments Kommentare Type Typ An error has occurred showing the following error code: Es ist ein Fehler mit folgendem Fehlercode aufgetreten: KLog - SetupPageLogs KLog - Einrichtung der Protokolle SetupPageLogsNew &Date &Datum &Station Callsign &Stations-Rufzeichen &Operators &Operatoren Comm&ent Komm&entar &Ok &OK &Cancel &Abbrechen Select categories Kategorien auswählen Callsign used for this log. Rufzeichen für dieses Protokoll. Comma separated list of operators: callsign1, callsign2. Durch Komma getrennte Liste von Operatoren: rufzeichen1, rufzeichen2. Start date of this log. Anfangsdatum dieses Protokolls. Add a comment about this log. Kommentar über dieses Protokoll hinzufügen. Select the kind of operation for this log. Wählen Sie die Operation für diese Protokoll aus. Select the mode category. Wählen Sie eine Kategorie für den Modus aus. Select the operators category. Wählen Sie eine Kategorie für den Operator aus. Select the assisted category. Select the power category. Wählen Sie eine Kategorie für die Leistung aus. Select the bands category. Wählen Sie eine Kategorie für das Band aus. Select the Overlay category. &Type of Operation &Art der Operation &Mode Category &Modus-Kategorie O&perators Category O&perator-Kategorie &Assisted Category Po&wer Category &Leistungs-Kategorie &Bands Category &Band-Kategorie O&verlay Categories not OK Kategorien sind fehlerhaft You need to enter a valid QRZ in the Station Callsign box. The log will not be opened. Sie müssen mindestens gültigen QRZ-Eintrag für das Stations-Rufzeichen eingeben. Das Protokoll wird nicht geöffnet. You selected an invalid combination. The log will not be opened. Sie haben eine ungültige Kombination ausgewählt, Das Protokoll wird nicht geöffnet. Categories OK Kategorien sind in Ordnung SetupPageMisc &Imperial system &Imperiales System &Log in real time Sofort protoko&llieren &Time in UTC &Zeit in UTC &Save ADIF on exit ADIF-Datei beim Beenden &speichern Use this &default filename &Standard-Dateinamen verwenden Mark &QSO to send QSL when QSL is received &QSO zum Senden der QSL markieren, wenn die QSL empfangen wird Complete QSO with previous data QSO mit vorherigen Daten vervollständigen Show the Station &Callsign used in the search box Stations-Rufzeichen für das Suchfeld anzeigen &Reset to My Data for all QSOs Auf „Meine Daten“ für alle QSOs zu&rücksetzen &Check for new versions automatically Automatisch nach neuen Versionen su&chen &Provide Info for statistics &Statistik-Informationen bereitstellen Manage DX-Marathon Browse Durchsuchen Move DB Datenbank verschieben QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. Die QSO-Einträge werden markiert, um eine QSL zu senden, wenn Sie eine DX-QSL empfangen und Ihre Daten nicht gesendet haben. The search box will show also the callsign on the air to do the QSO. All the data from the My Data tab will be used or data from the previous QSO will be maintained. Alle Daten von der Karteikarte „Meine Daten“ wird oder Daten des vorherigen QSO-Eintrags werden verwendet. Check if there is a new release of KLog available every time you start KLog. Überprüft beim Programmstart, ob eine neue Version von KLog veröffentlicht wurde. If new version checking is selected, KLog will send the developer your callsign, KLog version & Operating system to help in improving KLog. Wenn die Überprüfung auf eine neue Version aktiviert ist, werden Ihr Rufzeichen, die KLog-Version und das Betriebssystem an die Entwickler gesendet, um mit diesen Daten das Programm zu verbessern. Check it for Imperial system (Miles instead of Kilometers). Aktivieren Sie diese Einstellung, um das imperiale Maßsystem (Meilen statt Kilometer) zu verwenden. Select to use real time. Aktivieren Sie diese Einstellung, um die lokale Zeit zu benutzen. Select to use UTC time. Aktivieren Sie diese Einstellung, um die UTC-Zeit zu benutzen. Select if you want to save to ADIF on exit. Wählen Sie dies aus, wenn Sie die ADIF-Datei beim Beenden speichern möchten. Select to use the following name for the logfile without being asked for it again. Ist dies aktiviert, wird der Standard-Dateiname ohne weitere Nachfrage für die Protokolldatei verwendet. Complete the current QSO with previous QSO data. Der aktuelle QSO-Eintrag wird mit vorherigen QSO-Daten vervollständigt Select if you want to manage DX-Marathon. This is the default file where ADIF data will be saved. Dies ist die Standarddatei, in der ADIF-Daten gespeichert werden. This is the directory where the database (logbook.dat) will be saved. Dies ist der Ordner, in dem die Datenbank „logbook.dat“ gespeichert wird. Click to change the default ADIF file. Klicken Sie, um die Standard-ADIF-Datei zu ändern. Click to change the path of the database. Klicken Sie, um den Pfad zur Datenbank zu ändern. Click to move the DB to the new directory. Klicken Sie, um die Datenbank in den neuen Ordner zu verschieben. Open File Datei öffnen Select Directory Ordner auswählen This is the directory where DB (logbook.dat) will be saved. Dies ist der Ordner, in dem die Datenbank „logbook.dat“ gespeichert wird. Please specify an existing directory where the database (logbook.dat) will be saved. Geben Sie bitte einen existierenden Ordner an, in dem die Datenbank „logbook.dat“ gespeichert wird. File moved Datei verschoben File copied Datei kopiert File NOT copied Datei nicht kopiert The target directory does not exist. Please select an existing directory. Der Zielordner existiert nicht, bitte wählen Sie einen existierenden Ordner. SetupPageSats &New &Neu &Edit &Bearbeiten &Remove &Entfernen &Import &Importieren E&xport E&xportieren Add a new satellite. Fügt einen neuen Satelliten hinzu. Edit the selected satellite. Bearbeitet den ausgewählten Satelliten. Remove the selected satellite. Entfernt den ausgewählten Satelliten. Import a satellites file. It will replace the satellites you have now configured. Importiert eine Satellitendatei. Die eingerichteten Satellitendaten werden dadurch ersetzt. Export your current satellites to a file. Exportiert die aktuellen Satellitendaten in eine Datei. Select the sat you want to open. Wählen Sie die Satellitendaten, den Sie öffnen möchten. KLog KLog Do you really want to remove this satellite? Möchten Sie diese Satellitendaten wirklich entfernen? This satellite will not be longer available to be selected ... Dieser Satellit kann nicht mehr ausgewählt werden... Sat has not been removed. (#3) Die Satellitendaten wurde nicht entfernt. (#3) Sat has not been removed. (#2) Die Satellitendaten wurde nicht entfernt. (#2) Sat has not been removed. (#1) Die Satellitendaten wurde nicht entfernt. (#1) ID Kennung Short Kurz Name Name Uplink Downlink Modes Modi An error has occurred showing the following error code: Es ist ein Fehler mit folgendem Fehlercode aufgetreten: KLog - SetupPageSats KLog - Einrichtungsseite Satelliten Open Satellites File Satellitendatei öffnen KLog warning KLog-Warnung An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Please check the format or contact the developer for analysis with the error code: Save Satellites File Satellitendatei speichern SetupPageSatsNew Short name Kurzname Sat name Satellitenname UpLink DownLink Modes Modi &Ok &OK &Cancel &Abbrechen Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Enter the name of the satellite. Geben Sie den Namen des Satelliten ein. Enter the uplink frequencies in this format: 144.300 Enter the downlink frequencies in this format: 144.300 Enter the modes in this format: USB Geben Sie die Modi in diesem Format ein: USB Some of the data you have entered is not correct, the satellite can't be added. SetupPageUDP Start UDP Server UDP-Server starten Log automatically QSOs from WSJT-X QSOs von WSJT-X automatisch protokollieren Allow WSJT-X to send logged QSO to KLog QSOs von WSJT-X in KLog übernehmen QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected QSOs von WSJT-X müssen vor der Übernahme in KLog angenommen werden, wenn Sie nicht „%1“ ausgewählt haben. KLog will log automatically any QSO coming from WSJT-X without any manual confirmation. KLog protokolliert automatisch alle QSO von WSJT-X ohne weitere Bestätigung. Receive and Update QSO data to KLog QSO-Daten in KLog empfangen und aktualisieren KLog will automatically show and update data coming from WSJT-X (DX callsign, locator, RPT, ...) In KLog werden Daten von WSJT-X wie DX-Rufzeichen, Locator, RPT usw. automatisch aktualisiert und angezeigt. Make sure it is the same port where the other programs are sending the data to. Default port is 2237. Wählen Sie den Port, den die anderen Programme zum Versand der Daten verwenden. Als Standard ist Port 2237 eingestellt. UDP port number where the UDP Server will listen for packets. UDP-Portnummer, auf der der UDP-Server auf Pakete lauscht. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. Der UDP-Server empfängt QSOs, die von anderen Programmen wie WSJT-X, die in KLog automatisch protokolliert werden können. UDP Port UDP-Port QSO notification timeout (milisecs) QSO-Benachrichtigungszeit in Millisekunden Milliseconds that the notification of QSO received from WSJTX will be shown. SetupPageUserDataPage &Personal data &Persönliche Daten Station &data Stations&daten Enter your name. Geben Sie ihren Namen ein. Enter your address - 1st line. Geben Sie ihre Adresse ein - 1. Zeile. Enter your address - 2nd line. Geben Sie ihre Adresse ein - 2. Zeile. Enter your address - 3rd line. Geben Sie ihre Adresse ein - 3. Zeile. Enter your address - 4th line. Geben Sie ihre Adresse ein - 4. Zeile. Enter your city. Geben Sie ihre Stadt ein. Enter your zip code. Geben Sie ihre Postleitzahl ein. Enter your province or state. Geben Sie das Bundesland oder den Staat ein. Enter your country. Geben Sie ihr Land ein. &Name &Name &Address &Adresse Cit&y &Stadt &Zip Code &Postleitzahl Pro&v/State &Bundesland/Staat Countr&y &Land Enter your information for rig Geben Sie Ihre Informationen über die Anlage (Rig) ein Enter your information for antenna Geben Sie Ihre Informationen über die Antenne ein Enter your power information. Geben Informationen über die Leistung ein. Enter the station callsign that will be used for logging. Geben Sie das Stations-Rufzeichen ein, das in den Protokollen verwendet wird. &Rig 1 &Rig 1 R&ig 2 R&ig 2 Ri&g 3 Ri&g 3 Antenna &1 Antenne &1 Antenna &2 Antenne &2 Antenna &3 Antenne &3 Po&wer &Leistung Enter the operators (comma separated if more than one). Geben Sie die Operatoren ein und verwenden Sie das Komma als Trennzeichen bei mehreren Operatoren. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Geben Sie den Locator für Ihre Station ein. Alternativ kann in KLog ein geschätzter Locator auf der Basis Ihres Rufzeichens verwendet werden. &QRZ &QRZ &Operators &Operatoren &CQ Zone &CQ-Zone &ITU Zone &ITU-Zone &Locator &Locator &Locator (not valid) &Locator (ungültig) SetupPageWorldEditor Add Hinzufügen Delete Löschen Edit Bearbeiten Export World Import World Still not implemented. Noch nicht implementiert. Import a new cty.csv file Eine neue datei cty.csv importieren An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Eine Datei „cty.csv“ mit Einträgen wurde in Ihrem KLog-Ordner gefunden. No entities information file (cty.csv) has been detected in your KLog folder. Es wurde keine Datei „cty.csv“ mit Einträgen in Ihrem KLog-Ordner gefunden. KLog will not be able to show entities information. KLog kann keine Informationen über Einträge anzeigen. Prefix Präfix Entity Eintrag ARRL ID ARRL-Kennung Continent Kontinent CQ Zone CQ-Zone ITU Zone ITU-Zone UTC UTC Latitude Breitengrad Longitude Längengrad Deleted Gelöscht Since Date Seit Datum To Date Bis Datum Open File Datei öffnen BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Die Informationen über Einträge wurden aktualisiert. Entities information has not been updated. Die Informationen über Einträge wurden nicht aktualisiert. ShowErrorDialog KLog Message KLog-Nachricht SoftwareUpdateDialog Ok OK KLog update KLog-Aktualisierung Congratulations! Glückwunsch Your KLog has been updated. Ihr KLog ist aktualisiert worden. You already have the latest version. Sie haben bereits die neueste Version. StartWizard KLog - The free hamradio logging program KLog - das freie Programm für Amateurradio-Protokolle Quit Setup Einstellungen beenden Setup is not complete yet. Are you sure you want to quit setup? Die Einrichtung ist nicht vollständig. Möchten Sie wirklich abbrechen? StatisticsWidget QSO per year QSO pro Jahr DXCC per year DXCC pro Jahr CQ zones per year CQ-Zonen pro Jahr QSO per band QSO pro Band QSO per mode QSO pro Modus QSO per DXCC QSO pro DXCC QSO per Continent QSOs je Kontinent QSO per hour QSO pro Stunde QSO per month QSO pro Monat Worked / Confirmed status Status Bearbeitet / Bestätigt Worked / Sent status Status Bearbeitet / Bestätigt Sent / Confirmed status Status Versendet / Bestätigt StatsCQZPerYearBarChartWidget CQ Zones per year CQ-Zonen pro Jahr Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen CQ zones CQ-Zonen CQ zones per year CQ-Zonen pro Jahr Reading data ... Daten werden gelesen ... Years: %1/%2 Jahre: %1/%2 StatsEntitiesPerYearBarChartWidget Chart title Diagrammtitel Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen DXCC Entities DXCC-Einträge DXCC Entities per year DXCC-Einträge pro Jahr Reading data ... Daten werden gelesen ... Entities: Einträge: StatsQSOsPerBandBarChartWidget QSOs per band QSOs pro Band Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Bands Bänder QSO per band distribution QSO pro Frequenzbandverteilung Reading data ... Daten werden gelesen ... Bands: Bänder: StatsQSOsPerContinentBarChartWidget QSOs per continent QSOs je Kontinent Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Continents Kontinente Reading data ... Daten werden gelesen ... Hours: Stunden: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSOs pro DXCC Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Reading data... Daten werden gelesen ... Entity: Eintrag: DXCC DXCC Top ten DXCC per QSO Erste zehn DXCC pro QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSOs pro Stunde Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Hours Stunden QSOs at hour QSOs je Stunde Reading data ... Daten werden gelesen ... Hours: Stunden: StatsQSOsPerModeBarChartWidget QSOs per mode QSOs pro Modus Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Modes Modi QSO per mode distribution QSO pro Modusverteilung Reading data ... Daten werden gelesen ... Modes: Modi: StatsQSOsPerMonthBarChartWidget QSOs per month QSOs je Monat Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Jan Jan. Feb Feb. Mar März Apr Apr. May Mai Jun Jun. Jul Jul. Sep Sep. Oct Okt. Nov Nov. Dec Dez. Aug Aug. Months Monate QSOs at Month QSOs je Monat Reading data ... Daten werden gelesen ... Months: Monate: StatsQSOsPerYearBarChartWidget Chart title Diagrammtitel Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen QSOs QSOs QSOs per year QSOs pro Jahr Reading data ... Daten werden gelesen ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Versendet - %1 Confirmed - %2 Bestätigt - %2 StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Bearbeitet, nicht bestätigt - %1 Confirmed - %2 Bestätigt - %2 StatsWorkedSentPieChartWidget Worked - %1 Bearbeitet - %1 Sent - %2 Versendet - %2 UpdateSatsData Reading Satellites data file... Datei mit Satellitendaten wird gelesen ... Abort reading Lesen abbrechen The Satellites information has been updated. Die Informationen über Satelliten wurden aktualisiert. Open File Datei öffnen Sat Data Satellitendaten World Entity Eintrag Continent Kontinent Reading cty.csv... Die Datei „“cty.csv wird gelesen ... Abort reading Lesen abbrechen eLogClubLog Host not found! Rechner nicht gefunden Timeout error! Zeitüberschreitung It seems to be a PASSWORD ERROR; check your password. Es ist ein Passwortfehler aufgetreten, bitte überprüfen Sie Ihr Passwort. KLog - ClubLog KLog - Club Log It seems that your ClubLog password is not correct. Ihr Passwort für Club Log ist anscheinend falsch. Please check your password in the setup. ClubLog uploads will be disabled. Bitte überprüfen Sie Ihr Passwort in den Einstellungen, Das Hochladen zu Club Log wird deaktiviert. Undefined error... Undefinierter Fehler ... Callsign missing Rufzeichen fehlt Invalid callsign Ungültiges Rufzeichen Skipping SWL callsign SWL-Rufzeichen wird übersprungen Callsign is your own call Dies ist Ihr eigenes Rufzeichen Invalid callsign with no DXCC mapping Ungültiges Rufzeichen, Zuordnung zu DXCC fehlt Updated QSO QSO aktualisiert Invalid ADIF record Ungültiger ADIF-Eintrag Missing ADIF record Fehlender ADIF-Eintrag Test mode - parameters ok, no action taken Testmodus - Parameter sind korrekt, es wird keine Aktion ausgeführt Excessive API Usage Excessive API-Benutzung Internal Error Interner Fehler Rejected Abgelehnt QSO Duplicate QSO-Duplikat QSO Modified QSO geändert Missing Login Anmeldung fehlt QSO OK QSO in Ordnung Upload denied Hochladen abgelehnt No callsign selected Kein Rufzeichen ausgewählt No match found Keine Übereinstimmungen gefunden Dropped QSO QSO verworfenen OK OK Login rejected Anmeldung abgelehnt Rejected: Callsign is your own call Abgelehnt: Dies ist Ihr eigenes Rufzeichen klog-0.9.8.1/translations/klog.pot0000644000175000017500000033704313532572307016025 0ustar develdevelmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Qt-Contexts: true\n" #: ../aboutdialog.cpp:28 msgctxt "AboutDialog|" msgid "About KLog" msgstr "" #: ../aboutdialog.cpp:35 msgctxt "AboutDialog|" msgid "By" msgstr "" #: ../aboutdialog.cpp:37 msgctxt "AboutDialog|" msgid "KLog is a free logbook for hamradio operators." msgstr "" #: ../aboutdialog.cpp:38 msgctxt "AboutDialog|" msgid "" "Please know that this is an BETA release and it may contain many " "bugs.
Backup your data before using this software!" msgstr "" #: ../aboutdialog.cpp:40 msgctxt "AboutDialog|" msgid "" "KLog has been fully rewritten from the 0.6.2 to be able to provide a " "cross-platform application that runs in the main operating systems (Linux, " "macOS & Windows) and provide new functionalities that KLog was not providing." msgstr "" #: ../aboutdialog.cpp:42 msgctxt "AboutDialog|" msgid "Please provide your review in KLog's eHam review page:" msgstr "" #: ../aboutdialog.cpp:45 msgctxt "AboutDialog|" msgid "Find more information and the latest release at" msgstr "" #: ../aboutdialog.cpp:46 msgctxt "AboutDialog|" msgid "Author" msgstr "" #: ../aboutdialog.cpp:69 msgctxt "AboutDialog|" msgid "today" msgstr "" #: ../aboutdialog.cpp:69 msgctxt "AboutDialog|" msgid "Main developer" msgstr "" #: ../aboutdialog.cpp:73 msgctxt "AboutDialog|" msgid "KLog is developed by a very small team and you are invited to join!" msgstr "" #: ../aboutdialog.cpp:73 msgctxt "AboutDialog|" msgid "" "If you want to provide support you are welcome to join the KLog " "development mailing list!" msgstr "" #: ../aboutdialog.cpp:73 msgctxt "AboutDialog|" msgid "" "You can also help us by sending bug reports or small code contributions, " "ideas or whatever you think may improve KLog." msgstr "" #: ../aboutdialog.cpp:74 ../aboutdialog.cpp:145 msgctxt "AboutDialog|" msgid "Authors" msgstr "" #: ../aboutdialog.cpp:89 msgctxt "AboutDialog|" msgid "" "Translators bring KLog into your language. They are really an important part " "of the KLog development team." msgstr "" #: ../aboutdialog.cpp:89 msgctxt "AboutDialog|" msgid "" "If KLog is still not in your language and you want to help us, you are " "welcome to contact us through the KLog " "development mailing list!" msgstr "" #: ../aboutdialog.cpp:90 ../aboutdialog.cpp:146 msgctxt "AboutDialog|" msgid "Translators" msgstr "" #: ../aboutdialog.cpp:102 msgctxt "AboutDialog|" msgid "Privacy advisory" msgstr "" #: ../aboutdialog.cpp:103 msgctxt "AboutDialog|" msgid "" "KLog developers have included a feature that reports some user data to the " "KLog server with the sole purpose of identifying the number of installed " "versions, to focus development in one direction or another taking into " "account user's needs" msgstr "" #: ../aboutdialog.cpp:104 msgctxt "AboutDialog|" msgid "At present, the data that is provided is the following:" msgstr "" #: ../aboutdialog.cpp:105 msgctxt "AboutDialog|" msgid "Callsign" msgstr "" #: ../aboutdialog.cpp:105 msgctxt "AboutDialog|" msgid "KLog version" msgstr "" #: ../aboutdialog.cpp:105 msgctxt "AboutDialog|" msgid "Operating system" msgstr "" #: ../aboutdialog.cpp:106 msgctxt "AboutDialog|" msgid "" "Be aware that you can enable/disable this feature from the Misc tab in the " "Setup page" msgstr "" #: ../aboutdialog.cpp:144 msgctxt "AboutDialog|" msgid "KLog" msgstr "" #: ../aboutdialog.cpp:147 msgctxt "AboutDialog|" msgid "Privacy" msgstr "" #: ../startwizard.cpp:914 msgctxt "CTYPage|" msgid "Country data download" msgstr "" #: ../startwizard.cpp:917 msgctxt "CTYPage|" msgid "KLog needs country data..." msgstr "" #: ../startwizard.cpp:922 msgctxt "CTYPage|" msgid "&Download" msgstr "" #: ../startwizard.cpp:923 msgctxt "CTYPage|" msgid "&Ignore" msgstr "" #: ../startwizard.cpp:942 msgctxt "CTYPage|" msgid "Country data needed" msgstr "" #: ../startwizard.cpp:945 msgctxt "CTYPage|" msgid "" "KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC " "information." msgstr "" #: ../startwizard.cpp:947 msgctxt "CTYPage|" msgid "" "You need to download the cty.csv file if you want KLog to show you the " "countries, locator, ... of the QSOs you do." msgstr "" #: ../startwizard.cpp:949 msgctxt "CTYPage|" msgid "Click on Download to download now." msgstr "" #: ../startwizard.cpp:1025 msgctxt "CTYPage|" msgid "KLog" msgstr "" #: ../startwizard.cpp:1026 msgctxt "CTYPage|" msgid "" "I can't find the host. Please check your network and try again\n" "Do you want to try again?" msgstr "" #: ../dxccstatuswidget.cpp:48 msgctxt "DXCCStatusWidget|" msgid "Update" msgstr "" #: ../dxccstatuswidget.cpp:286 msgctxt "DXCCStatusWidget|" msgid "ID" msgstr "" #: ../dxccstatuswidget.cpp:286 msgctxt "DXCCStatusWidget|" msgid "Entity" msgstr "" #: ../dxccstatuswidget.cpp:372 msgctxt "DXCCStatusWidget|" msgid "Entity not worked in this band." msgstr "" #: ../dxcluster.cpp:70 msgctxt "DXClusterWidget|" msgid "Click on Connect to connect to the DX-Cluster server" msgstr "" #: ../dxcluster.cpp:74 ../dxcluster.cpp:533 msgctxt "DXClusterWidget|" msgid "Connect" msgstr "" #: ../dxcluster.cpp:75 ../dxcluster.cpp:512 ../dxcluster.cpp:591 #: ../dxcluster.cpp:596 msgctxt "DXClusterWidget|" msgid "Clear" msgstr "" #: ../dxcluster.cpp:151 msgctxt "DXClusterWidget|" msgid "Click on connect to connect to the DX-Cluster" msgstr "" #: ../dxcluster.cpp:210 msgctxt "DXClusterWidget|" msgid "Trying to connect to the server" msgstr "" #: ../dxcluster.cpp:221 ../dxcluster.cpp:227 ../dxcluster.cpp:234 msgctxt "DXClusterWidget|" msgid "KLog DXCluster" msgstr "" #: ../dxcluster.cpp:222 msgctxt "DXClusterWidget|" msgid "The host was not found. Please check:" msgstr "" #: ../dxcluster.cpp:223 msgctxt "DXClusterWidget|" msgid "" "- your network connection;\n" "- the host name and port settings." msgstr "" #: ../dxcluster.cpp:228 msgctxt "DXClusterWidget|" msgid "" "The connection was refused by the peer. Make sure the DXCluster server is " "running, and check that the host name and port settings are correct." msgstr "" #: ../dxcluster.cpp:235 #, qt-format msgctxt "DXClusterWidget|" msgid "The following error occurred: %1." msgstr "" #: ../dxcluster.cpp:485 msgctxt "DXClusterWidget|" msgid "Connected to server" msgstr "" #: ../dxcluster.cpp:498 ../dxcluster.cpp:502 ../dxcluster.cpp:506 msgctxt "DXClusterWidget|" msgid "KLog message" msgstr "" #: ../dxcluster.cpp:498 ../dxcluster.cpp:502 msgctxt "DXClusterWidget|" msgid "Enter your callsign to connect to the cluster:" msgstr "" #: ../dxcluster.cpp:506 msgctxt "DXClusterWidget|" msgid "" "Enter your password to connect to the cluster:\n" "(Just hit enter for no password)" msgstr "" #: ../dxcluster.cpp:511 ../dxcluster.cpp:590 msgctxt "DXClusterWidget|" msgid "Disconnect" msgstr "" #: ../dxcluster.cpp:515 msgctxt "DXClusterWidget|" msgid "Not logged on, you may need to enter your callsign again." msgstr "" #: ../dxcluster.cpp:519 msgctxt "DXClusterWidget|" msgid "Enter here the commands to be sent to the DX-Cluster server." msgstr "" #: ../dxcluster.cpp:529 msgctxt "DXClusterWidget|" msgid "Connection closed by the server" msgstr "" #: ../dxcluster.cpp:535 msgctxt "DXClusterWidget|" msgid "Click on Connect to connect to the DX-Cluster server." msgstr "" #: ../dxcluster.cpp:595 msgctxt "DXClusterWidget|" msgid "Send" msgstr "" #: ../dataproxy_sqlite.cpp:74 msgctxt "DataProxy_SQLite|" msgid "Software version in DB is null" msgstr "" #: ../dataproxy_sqlite.cpp:74 msgctxt "DataProxy_SQLite|" msgid "No query failed" msgstr "" #: ../dataproxy_sqlite.cpp:3027 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Aircraft Scatter" msgstr "" #: ../dataproxy_sqlite.cpp:3031 msgctxt "DataProxy_SQLite|" msgid "Aurora" msgstr "" #: ../dataproxy_sqlite.cpp:3035 msgctxt "DataProxy_SQLite|" msgid "Aurora-E" msgstr "" #: ../dataproxy_sqlite.cpp:3039 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Back scatter" msgstr "" #: ../dataproxy_sqlite.cpp:3043 msgctxt "DataProxy_SQLite|" msgid "Earth-Moon-Earth" msgstr "" #: ../dataproxy_sqlite.cpp:3047 msgctxt "DataProxy_SQLite|" msgid "Sporadic E" msgstr "" #: ../dataproxy_sqlite.cpp:3051 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Field Aligned Irregularities" msgstr "" #: ../dataproxy_sqlite.cpp:3055 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "F2 Reflection" msgstr "" #: ../dataproxy_sqlite.cpp:3059 msgctxt "DataProxy_SQLite|" msgid "Internet-assisted" msgstr "" #: ../dataproxy_sqlite.cpp:3063 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Ionoscatter" msgstr "" #: ../dataproxy_sqlite.cpp:3067 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Meteor scatter" msgstr "" #: ../dataproxy_sqlite.cpp:3071 msgctxt "DataProxy_SQLite|" msgid "Terrestrial or atmospheric repeater or transponder" msgstr "" #: ../dataproxy_sqlite.cpp:3075 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Rain scatter" msgstr "" #: ../dataproxy_sqlite.cpp:3079 msgctxt "DataProxy_SQLite|" msgid "Satellite" msgstr "" #: ../dataproxy_sqlite.cpp:3083 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Trans-equatorial" msgstr "" #: ../dataproxy_sqlite.cpp:3087 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Tropospheric ducting" msgstr "" #: ../dataproxy_sqlite.cpp:3639 ../dataproxy_sqlite.cpp:3706 msgctxt "DataProxy_SQLite|" msgid "Yes" msgstr "" #: ../dataproxy_sqlite.cpp:3643 ../dataproxy_sqlite.cpp:3710 msgctxt "DataProxy_SQLite|" msgid "No" msgstr "" #: ../dataproxy_sqlite.cpp:3647 ../dataproxy_sqlite.cpp:3714 msgctxt "DataProxy_SQLite|" msgid "Requested" msgstr "" #: ../dataproxy_sqlite.cpp:3651 ../dataproxy_sqlite.cpp:3722 msgctxt "DataProxy_SQLite|" msgid "Ignore/Invalid" msgstr "" #: ../dataproxy_sqlite.cpp:3655 msgctxt "DataProxy_SQLite|" msgid "Validated" msgstr "" #: ../dataproxy_sqlite.cpp:3718 msgctxt "DataProxy_SQLite|" msgid "Queued" msgstr "" #: ../dataproxy_sqlite.cpp:3770 msgctxt "DataProxy_SQLite|" msgid "Uploaded" msgstr "" #: ../dataproxy_sqlite.cpp:3774 msgctxt "DataProxy_SQLite|" msgid "Do not upload" msgstr "" #: ../dataproxy_sqlite.cpp:3778 msgctxt "DataProxy_SQLite|" msgid "Modified" msgstr "" #: ../dataproxy_sqlite.cpp:3828 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Bureau" msgstr "" #: ../dataproxy_sqlite.cpp:3832 msgctxt "DataProxy_SQLite|" msgid "Direct" msgstr "" #: ../dataproxy_sqlite.cpp:3836 msgctxt "DataProxy_SQLite|" msgid "Electronic" msgstr "" #: ../dataproxy_sqlite.cpp:3840 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Manager" msgstr "" #: ../dataproxy_sqlite.cpp:4862 msgctxt "DataProxy_SQLite|" msgid "KLog DXCC" msgstr "" #: ../dataproxy_sqlite.cpp:4863 msgctxt "DataProxy_SQLite|" msgid "All QSOs have been updated with a DXCC and the Continent." msgstr "" #: ../downloadcty.cpp:64 msgctxt "DownLoadCTY|" msgid "Download of cty.csv failed with the following error code: " msgstr "" #: ../downloadcty.cpp:76 msgctxt "DownLoadCTY|" msgid "Download of cty.csv done." msgstr "" #: ../downloadcty.cpp:147 msgctxt "DownLoadCTY|" msgid "" "There is already a cty.csv file in the folder but it will be replaced with " "the new one." msgstr "" #: ../downloadcty.cpp:177 #, qt-format msgctxt "DownLoadCTY|" msgid "Could not open %1 for writing" msgstr "" #: ../filemanager.cpp:199 msgctxt "FileManager|" msgid "" "The log that you have selected contains more than just one station callsign." msgstr "" #: ../filemanager.cpp:199 msgctxt "FileManager|" msgid "Please select the station callsign you want to export the log from:" msgstr "" #: ../filemanager.cpp:202 msgctxt "FileManager|" msgid "Station Callsign:" msgstr "" #: ../filemanager.cpp:211 msgctxt "FileManager|" msgid "Define Station Callsign" msgstr "" #: ../filemanager.cpp:212 msgctxt "FileManager|" msgid "" "You have selected no callsign. KLog will export QSOs without a station " "callsign defined and those with the call you are entering here." msgstr "" #: ../filemanager.cpp:212 msgctxt "FileManager|" msgid "" "Enter the station callsign to use for this log or leave it empty for QSO " "without station callsign defined:" msgstr "" #: ../filemanager.cpp:224 msgctxt "FileManager|" msgid "" "No station callsign has been selected and therefore no log will be exported" msgstr "" #: ../filemanager.cpp:249 ../filemanager.cpp:570 msgctxt "FileManager|" msgid "Writing ADIF file..." msgstr "" #: ../filemanager.cpp:249 ../filemanager.cpp:570 ../filemanager.cpp:2783 msgctxt "FileManager|" msgid "Abort writing" msgstr "" #: ../filemanager.cpp:441 msgctxt "FileManager|" msgid "Exporting LoTW ADIF file..." msgstr "" #: ../filemanager.cpp:441 ../filemanager.cpp:3589 msgctxt "FileManager|" msgid " QSO: " msgstr "" #: ../filemanager.cpp:2626 msgctxt "FileManager|" msgid "" "Writing ADIF file...\n" " QSO: " msgstr "" #: ../filemanager.cpp:2634 msgctxt "FileManager|" msgid "" "You have canceled the file export. The file will be removed and no data will " "be exported." msgstr "" #: ../filemanager.cpp:2634 ../filemanager.cpp:3755 msgctxt "FileManager|" msgid "Do you still want to cancel?" msgstr "" #: ../filemanager.cpp:2783 msgctxt "FileManager|" msgid "Writing Cabrillo file..." msgstr "" #: ../filemanager.cpp:2967 msgctxt "FileManager|" msgid "KLog: Cabrillo Log Export not implemented" msgstr "" #: ../filemanager.cpp:2968 msgctxt "FileManager|" msgid "" "I am sorry but the Cabrillo Export To File feature has still not been " "implemented." msgstr "" #: ../filemanager.cpp:3100 msgctxt "FileManager|" msgid "Reading LoTW file..." msgstr "" #: ../filemanager.cpp:3100 ../filemanager.cpp:3383 msgctxt "FileManager|" msgid "Abort reading" msgstr "" #: ../filemanager.cpp:3336 msgctxt "FileManager|" msgid "There is more than one log in this logfile." msgstr "" #: ../filemanager.cpp:3336 msgctxt "FileManager|" msgid "All logs will be imported into the current log." msgstr "" #: ../filemanager.cpp:3336 msgctxt "FileManager|" msgid "Do you want to continue?" msgstr "" #: ../filemanager.cpp:3383 msgctxt "FileManager|" msgid "Reading ADIF file..." msgstr "" #: ../filemanager.cpp:3589 msgctxt "FileManager|" msgid "Importing ADIF file..." msgstr "" #: ../filemanager.cpp:3616 msgctxt "FileManager|" msgid "" "It seems that there are some duplicated QSOs in the ADIF file you are " "importing. Do you want to continue? (Duped QSOs will not be imported)" msgstr "" #: ../filemanager.cpp:3755 msgctxt "FileManager|" msgid "" "You have cancelled the file import. The file will be removed and no data " "will be imported." msgstr "" #: ../filemanager.cpp:4773 msgctxt "FileManager|" msgid "This QSO is not including the minimum data to consider a QSO as valid!." msgstr "" #: ../filemanager.cpp:4773 msgctxt "FileManager|" msgid "Please edit the ADIF file and make sure that it include at least:" msgstr "" #: ../filemanager.cpp:4773 msgctxt "FileManager|" msgid "and" msgstr "" #: ../filemanager.cpp:4773 msgctxt "FileManager|" msgid "This QSO had:" msgstr "" #: ../filemanager.cpp:4777 msgctxt "FileManager|" msgid " - The band missing and the following call: " msgstr "" #: ../filemanager.cpp:4782 msgctxt "FileManager|" msgid " - The call missing but was done at this time: " msgstr "" #: ../filemanager.cpp:4787 msgctxt "FileManager|" msgid " - The mode missing and the following call: " msgstr "" #: ../filemanager.cpp:4792 msgctxt "FileManager|" msgid " - The date missing and the following call: " msgstr "" #: ../filemanager.cpp:4797 msgctxt "FileManager|" msgid " - The time missing and the following call: " msgstr "" #: ../filemanager.cpp:4802 msgctxt "FileManager|" msgid "Do you want to continue with the current file?" msgstr "" #: ../filemanager.cpp:4806 msgctxt "FileManager|" msgid "KLog: Not all required data found!" msgstr "" #: ../filemanager.cpp:4830 msgctxt "FileManager|" msgid "This log seems to lack of RST-TX information." msgstr "" #: ../filemanager.cpp:4830 ../filemanager.cpp:4852 msgctxt "FileManager|" msgid "Click on Yes to add a default 59 to all QSO with a similar problem." msgstr "" #: ../filemanager.cpp:4830 ../filemanager.cpp:4852 msgctxt "FileManager|" msgid "If you select NO, the QSO may not be imported." msgstr "" #: ../filemanager.cpp:4831 msgctxt "FileManager|" msgid "KLog: No RST TX found!" msgstr "" #: ../filemanager.cpp:4852 msgctxt "FileManager|" msgid "This log seems to lack of RST-RX information." msgstr "" #: ../filemanager.cpp:4854 msgctxt "FileManager|" msgid "KLog: No RST RX found!" msgstr "" #: ../infowidget.cpp:48 msgctxt "InfoWidget|" msgid "10M" msgstr "" #: ../infowidget.cpp:49 msgctxt "InfoWidget|" msgid "15M" msgstr "" #: ../infowidget.cpp:50 msgctxt "InfoWidget|" msgid "20M" msgstr "" #: ../infowidget.cpp:51 msgctxt "InfoWidget|" msgid "40M" msgstr "" #: ../infowidget.cpp:52 msgctxt "InfoWidget|" msgid "80M" msgstr "" #: ../infowidget.cpp:53 msgctxt "InfoWidget|" msgid "160M" msgstr "" #: ../infowidget.cpp:54 msgctxt "InfoWidget|" msgid "2M" msgstr "" #: ../infowidget.cpp:55 msgctxt "InfoWidget|" msgid "6M" msgstr "" #: ../infowidget.cpp:56 msgctxt "InfoWidget|" msgid "12M" msgstr "" #: ../infowidget.cpp:57 msgctxt "InfoWidget|" msgid "17M" msgstr "" #: ../infowidget.cpp:58 msgctxt "InfoWidget|" msgid "30M" msgstr "" #: ../infowidget.cpp:59 msgctxt "InfoWidget|" msgid "70CM" msgstr "" #: ../infowidget.cpp:74 msgctxt "InfoWidget|" msgid "Continent" msgstr "" #: ../infowidget.cpp:78 msgctxt "InfoWidget|" msgid "Prefix" msgstr "" #: ../infowidget.cpp:82 msgctxt "InfoWidget|" msgid "CQ" msgstr "" #: ../infowidget.cpp:86 msgctxt "InfoWidget|" msgid "ITU" msgstr "" #: ../infowidget.cpp:90 msgctxt "InfoWidget|" msgid "Short Path" msgstr "" #: ../infowidget.cpp:93 msgctxt "InfoWidget|" msgid "Long Path" msgstr "" #: ../infowidget.cpp:96 ../infowidget.cpp:101 msgctxt "InfoWidget|" msgid "Deg" msgstr "" #: ../infowidget.cpp:314 ../infowidget.cpp:315 msgctxt "InfoWidget|" msgid "Miles" msgstr "" #: ../infowidget.cpp:321 ../infowidget.cpp:322 msgctxt "InfoWidget|" msgid "Km" msgstr "" #: ../startwizard.cpp:141 msgctxt "IntroPage|" msgid "Welcome to KLog!" msgstr "" #: ../startwizard.cpp:143 msgctxt "IntroPage|" msgid "Welcome to KLog! - brought to you under the terms of the GPL!" msgstr "" #: ../startwizard.cpp:151 msgctxt "IntroPage|" msgid "Welcome to KLog" msgstr "" #: ../startwizard.cpp:152 msgctxt "IntroPage|" msgid "This looks like it's the first time you've run KLog on this computer." msgstr "" #: ../startwizard.cpp:153 msgctxt "IntroPage|" msgid "" "KLog is a free hamradio logging program that can run on Linux macOS and " "Windows." msgstr "" #: ../startwizard.cpp:154 msgctxt "IntroPage|" msgid "It is designed to provide general purpose, DX and contest logging." msgstr "" #: ../startwizard.cpp:155 msgctxt "IntroPage|" msgid "It supports QSL management, import and export of ADIF " msgstr "" #: ../startwizard.cpp:156 msgctxt "IntroPage|" msgid "and Cabrillo file formats and many other features..." msgstr "" #: ../startwizard.cpp:157 msgctxt "IntroPage|" msgid "Before you can start using KLog, you will be asked to:" msgstr "" #: ../startwizard.cpp:158 msgctxt "IntroPage|" msgid "Acknowledge to the terms of the license." msgstr "" #: ../startwizard.cpp:159 msgctxt "IntroPage|" msgid "Download the DX entities information." msgstr "" #: ../startwizard.cpp:160 msgctxt "IntroPage|" msgid "Enter your callsign, CQ zone, etc. and main configuration." msgstr "" #: ../startwizard.cpp:161 msgctxt "IntroPage|" msgid "" "Enjoy KLog and contact the development team if you have any suggestions!" msgstr "" #: ../startwizard.cpp:182 msgctxt "LicPage|" msgid "KLog License information" msgstr "" #: ../startwizard.cpp:185 msgctxt "LicPage|" msgid "Welcome to KLog!- brought to you under the terms of the GPL!" msgstr "" #: ../startwizard.cpp:826 msgctxt "LicPage|" msgid "Acknowledge" msgstr "" #: ../startwizard.cpp:827 msgctxt "LicPage|" msgid "Be aware that KLog is free software." msgstr "" #: ../logmodel.cpp:105 msgctxt "LogModel|" msgid "Date" msgstr "" #: ../logmodel.cpp:108 msgctxt "LogModel|" msgid "Time" msgstr "" #: ../logmodel.cpp:111 msgctxt "LogModel|" msgid "QRZ" msgstr "" #: ../logmodel.cpp:114 msgctxt "LogModel|" msgid "Band" msgstr "" #: ../logmodel.cpp:117 msgctxt "LogModel|" msgid "Mode" msgstr "" #: ../logmodel.cpp:120 msgctxt "LogModel|" msgid "RSTtx" msgstr "" #: ../logmodel.cpp:123 msgctxt "LogModel|" msgid "RSTrx" msgstr "" #: ../logmodel.cpp:126 msgctxt "LogModel|" msgid "Comment" msgstr "" #: ../logwindow.cpp:209 msgctxt "LogWindow|" msgid "QSL Send" msgstr "" #: ../logwindow.cpp:221 msgctxt "LogWindow|" msgid "QSL Rcvd" msgstr "" #: ../logwindow.cpp:278 msgctxt "LogWindow|" msgid "&Delete" msgstr "" #: ../logwindow.cpp:280 msgctxt "LogWindow|" msgid "Delete a QSO" msgstr "" #: ../logwindow.cpp:283 msgctxt "LogWindow|" msgid "&Edit QSO" msgstr "" #: ../logwindow.cpp:285 msgctxt "LogWindow|" msgid "Edit this QSO" msgstr "" #: ../logwindow.cpp:288 msgctxt "LogWindow|" msgid "Via &bureau" msgstr "" #: ../logwindow.cpp:290 msgctxt "LogWindow|" msgid "Send this QSL via bureau" msgstr "" #: ../logwindow.cpp:293 msgctxt "LogWindow|" msgid "D&irect" msgstr "" #: ../logwindow.cpp:295 msgctxt "LogWindow|" msgid "Send this QSL via direct" msgstr "" #: ../logwindow.cpp:298 msgctxt "LogWindow|" msgid "Via bureau" msgstr "" #: ../logwindow.cpp:300 msgctxt "LogWindow|" msgid "QSL &received via bureau" msgstr "" #: ../logwindow.cpp:303 msgctxt "LogWindow|" msgid "Direct" msgstr "" #: ../logwindow.cpp:305 msgctxt "LogWindow|" msgid "QSL received via direc&t" msgstr "" #: ../logwindow.cpp:386 msgctxt "LogWindow|" msgid "You have requested to delete this QSO." msgstr "" #: ../logwindow.cpp:387 msgctxt "LogWindow|" msgid "Are you sure?" msgstr "" #: ../mainwindow.cpp:183 msgctxt "MainWindow|" msgid "Recalculate" msgstr "" #: ../mainwindow.cpp:184 msgctxt "MainWindow|" msgid "Click to recalculate the award status." msgstr "" #: ../mainwindow.cpp:210 msgctxt "MainWindow|" msgid "Starting KLog" msgstr "" #: ../mainwindow.cpp:314 ../mainwindow.cpp:909 ../mainwindow.cpp:3171 #: ../mainwindow.cpp:3234 msgctxt "MainWindow|" msgid "&Add" msgstr "" #: ../mainwindow.cpp:317 msgctxt "MainWindow|" msgid "&Clear" msgstr "" #: ../mainwindow.cpp:320 msgctxt "MainWindow|" msgid "Status bar..." msgstr "" #: ../mainwindow.cpp:321 msgctxt "MainWindow|" msgid "DX Entity" msgstr "" #: ../mainwindow.cpp:323 msgctxt "MainWindow|" msgid "&Log Window" msgstr "" #: ../mainwindow.cpp:324 msgctxt "MainWindow|" msgid "&Score Window" msgstr "" #: ../mainwindow.cpp:334 msgctxt "MainWindow|" msgid "Watts" msgstr "" #: ../mainwindow.cpp:339 ../mainwindow.cpp:344 msgctxt "MainWindow|" msgid "MHz" msgstr "" #: ../mainwindow.cpp:428 ../mainwindow.cpp:4135 msgctxt "MainWindow|" msgid "KLog" msgstr "" #: ../mainwindow.cpp:480 ../mainwindow.cpp:4476 ../mainwindow.cpp:7813 msgctxt "MainWindow|" msgid "DX-Marathon" msgstr "" #: ../mainwindow.cpp:487 ../mainwindow.cpp:4482 ../mainwindow.cpp:7822 msgctxt "MainWindow|" msgid "Annual" msgstr "" #: ../mainwindow.cpp:663 msgctxt "MainWindow|" msgid "Ready" msgstr "" #: ../mainwindow.cpp:875 msgctxt "MainWindow|" msgid "" "An unexpected error ocurred when trying to add the QSO to your log. If the " "problem persists, please contact the developer for analysis: " msgstr "" #: ../mainwindow.cpp:1067 ../mainwindow.cpp:1770 msgctxt "MainWindow|" msgid "You have selected an entity:" msgstr "" #: ../mainwindow.cpp:1067 ../mainwindow.cpp:1770 msgctxt "MainWindow|" msgid "that is different from the KLog proposed entity:" msgstr "" #: ../mainwindow.cpp:1068 msgctxt "MainWindow|" msgid "" "Click on the prefix of the correct entity or Cancel to edit the QSO again." msgstr "" #: ../mainwindow.cpp:1771 msgctxt "MainWindow|" msgid "Click on the prefix of the right entity or Cancel to correct." msgstr "" #: ../mainwindow.cpp:2438 ../mainwindow.cpp:5087 msgctxt "MainWindow|" msgid "QRZ of the QSO." msgstr "" #: ../mainwindow.cpp:2439 ../mainwindow.cpp:5088 msgctxt "MainWindow|" msgid "TX RST." msgstr "" #: ../mainwindow.cpp:2440 ../mainwindow.cpp:5089 msgctxt "MainWindow|" msgid "RX RST." msgstr "" #: ../mainwindow.cpp:2441 ../mainwindow.cpp:5090 msgctxt "MainWindow|" msgid "TX Exchange." msgstr "" #: ../mainwindow.cpp:2442 ../mainwindow.cpp:5091 msgctxt "MainWindow|" msgid "RX Exchange." msgstr "" #: ../mainwindow.cpp:2443 ../mainwindow.cpp:5092 msgctxt "MainWindow|" msgid "Band of the QSO." msgstr "" #: ../mainwindow.cpp:2444 ../mainwindow.cpp:5093 msgctxt "MainWindow|" msgid "Mode of the QSO." msgstr "" #: ../mainwindow.cpp:2445 ../mainwindow.cpp:5094 msgctxt "MainWindow|" msgid "Date of the QSO." msgstr "" #: ../mainwindow.cpp:2446 ../mainwindow.cpp:5095 msgctxt "MainWindow|" msgid "Time of the QSO." msgstr "" #: ../mainwindow.cpp:2449 ../mainwindow.cpp:5098 msgctxt "MainWindow|" msgid "Add the QSO to the log." msgstr "" #: ../mainwindow.cpp:2451 msgctxt "MainWindow|" msgid "Clear the box." msgstr "" #: ../mainwindow.cpp:2453 msgctxt "MainWindow|" msgid "Input" msgstr "" #: ../mainwindow.cpp:2466 ../mainwindow.cpp:6664 msgctxt "MainWindow|" msgid "RSTrx" msgstr "" #: ../mainwindow.cpp:2473 ../mainwindow.cpp:6662 msgctxt "MainWindow|" msgid "RSTtx" msgstr "" #: ../mainwindow.cpp:2482 ../mainwindow.cpp:3291 ../mainwindow.cpp:3297 #: ../mainwindow.cpp:4215 ../mainwindow.cpp:5287 ../mainwindow.cpp:6660 msgctxt "MainWindow|" msgid "QRZ" msgstr "" #: ../mainwindow.cpp:2489 msgctxt "MainWindow|" msgid "STX" msgstr "" #: ../mainwindow.cpp:2496 msgctxt "MainWindow|" msgid "SRX" msgstr "" #: ../mainwindow.cpp:2803 msgctxt "MainWindow|" msgid "NEW MULT" msgstr "" #: ../mainwindow.cpp:2909 msgctxt "MainWindow|" msgid "Invalid characters used in the QRZ" msgstr "" #: ../mainwindow.cpp:3061 msgctxt "MainWindow|" msgid "Ready..." msgstr "" #: ../mainwindow.cpp:3401 msgctxt "MainWindow|" msgid "The logfile has been modified." msgstr "" #: ../mainwindow.cpp:3401 msgctxt "MainWindow|" msgid "Do you want to save your changes?" msgstr "" #: ../mainwindow.cpp:3435 msgctxt "MainWindow|" msgid "&File" msgstr "" #: ../mainwindow.cpp:3437 msgctxt "MainWindow|" msgid "&New..." msgstr "" #: ../mainwindow.cpp:3442 msgctxt "MainWindow|" msgid "&Open..." msgstr "" #: ../mainwindow.cpp:3447 msgctxt "MainWindow|" msgid "&Import from ADIF..." msgstr "" #: ../mainwindow.cpp:3450 msgctxt "MainWindow|" msgid "Import an ADIF file into the current log." msgstr "" #: ../mainwindow.cpp:3459 msgctxt "MainWindow|" msgid "&Save As..." msgstr "" #: ../mainwindow.cpp:3466 msgctxt "MainWindow|" msgid "Export to ADIF..." msgstr "" #: ../mainwindow.cpp:3470 msgctxt "MainWindow|" msgid "Export the current log to an ADIF logfile." msgstr "" #: ../mainwindow.cpp:3472 msgctxt "MainWindow|" msgid "Export all logs to ADIF..." msgstr "" #: ../mainwindow.cpp:3476 msgctxt "MainWindow|" msgid "Export ALL the QSOs into one ADIF file, merging QSOs from all the logs." msgstr "" #: ../mainwindow.cpp:3478 msgctxt "MainWindow|" msgid "Export Requested QSL to ADIF..." msgstr "" #: ../mainwindow.cpp:3481 msgctxt "MainWindow|" msgid "" "Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a " "QSL tag printing program)." msgstr "" #: ../mainwindow.cpp:3483 msgctxt "MainWindow|" msgid "Export ADIF for LoTW..." msgstr "" #: ../mainwindow.cpp:3486 msgctxt "MainWindow|" msgid "" "Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before " "uploading to LoTW!" msgstr "" #: ../mainwindow.cpp:3490 msgctxt "MainWindow|" msgid "&Print Log..." msgstr "" #: ../mainwindow.cpp:3493 msgctxt "MainWindow|" msgid "Print your log." msgstr "" #: ../mainwindow.cpp:3498 msgctxt "MainWindow|" msgid "KLog folder" msgstr "" #: ../mainwindow.cpp:3500 msgctxt "MainWindow|" msgid "Opens the data folder of KLog." msgstr "" #: ../mainwindow.cpp:3505 msgctxt "MainWindow|" msgid "E&xit" msgstr "" #: ../mainwindow.cpp:3511 msgctxt "MainWindow|" msgid "&Tools" msgstr "" #: ../mainwindow.cpp:3513 msgctxt "MainWindow|" msgid "Fill in QSO data" msgstr "" #: ../mainwindow.cpp:3517 msgctxt "MainWindow|" msgid "" "Go through the log reusing previous QSOs to fill missing information in " "other QSOs." msgstr "" #: ../mainwindow.cpp:3519 msgctxt "MainWindow|" msgid "Fill in DXCC data" msgstr "" #: ../mainwindow.cpp:3522 msgctxt "MainWindow|" msgid "Go through the log filling QSOs without a DXCC defined." msgstr "" #: ../mainwindow.cpp:3525 msgctxt "MainWindow|" msgid "QSL tools..." msgstr "" #: ../mainwindow.cpp:3532 msgctxt "MainWindow|" msgid "&Find QSO to QSL" msgstr "" #: ../mainwindow.cpp:3535 msgctxt "MainWindow|" msgid "Shows QSOs for which you should send your QSL and request the DX QSL." msgstr "" #: ../mainwindow.cpp:3537 msgctxt "MainWindow|" msgid "Find My-QSLs pending to send" msgstr "" #: ../mainwindow.cpp:3541 msgctxt "MainWindow|" msgid "" "Shows the QSOs with pending requests to send QSLs. You should keep this " "queue empty!" msgstr "" #: ../mainwindow.cpp:3543 msgctxt "MainWindow|" msgid "&Find DX-QSLs pending to receive" msgstr "" #: ../mainwindow.cpp:3546 msgctxt "MainWindow|" msgid "" "Shows the DX-QSL that has been requested or QSLs has been sent with no " "answer." msgstr "" #: ../mainwindow.cpp:3548 msgctxt "MainWindow|" msgid "&Find requested pending to receive" msgstr "" #: ../mainwindow.cpp:3551 msgctxt "MainWindow|" msgid "Shows the DX-QSL that has been requested." msgstr "" #: ../mainwindow.cpp:3554 msgctxt "MainWindow|" msgid "LoTW tools..." msgstr "" #: ../mainwindow.cpp:3556 msgctxt "MainWindow|" msgid "Queue all QSL to be sent of this log" msgstr "" #: ../mainwindow.cpp:3559 msgctxt "MainWindow|" msgid "Mark all non sent QSOs in this log as queued to be uploaded." msgstr "" #: ../mainwindow.cpp:3561 msgctxt "MainWindow|" msgid "Queue all QSL to be sent" msgstr "" #: ../mainwindow.cpp:3564 msgctxt "MainWindow|" msgid "Mark all non sent QSOs as queued to be uploaded." msgstr "" #: ../mainwindow.cpp:3568 msgctxt "MainWindow|" msgid "Mark as sent all queued QSO of this log" msgstr "" #: ../mainwindow.cpp:3571 msgctxt "MainWindow|" msgid "Mark all queued QSOs in this log as sent to LoTW." msgstr "" #: ../mainwindow.cpp:3573 msgctxt "MainWindow|" msgid "Mark all queued QSO as sent" msgstr "" #: ../mainwindow.cpp:3576 msgctxt "MainWindow|" msgid "Mark all queued QSOs as sent to LoTW." msgstr "" #: ../mainwindow.cpp:3581 msgctxt "MainWindow|" msgid "&Update cty.csv" msgstr "" #: ../mainwindow.cpp:3585 ../mainwindow.cpp:3590 msgctxt "MainWindow|" msgid "For updated DX-Entity data, update cty.csv." msgstr "" #: ../mainwindow.cpp:3587 msgctxt "MainWindow|" msgid "&Update Satellite Data" msgstr "" #: ../mainwindow.cpp:3594 msgctxt "MainWindow|" msgid "Stats" msgstr "" #: ../mainwindow.cpp:3598 msgctxt "MainWindow|" msgid "Show the statistics of your radio activity." msgstr "" #: ../mainwindow.cpp:3602 msgctxt "MainWindow|" msgid "&Setup" msgstr "" #: ../mainwindow.cpp:3604 msgctxt "MainWindow|" msgid "&Setup..." msgstr "" #: ../mainwindow.cpp:3610 msgctxt "MainWindow|" msgid "&Help" msgstr "" #: ../mainwindow.cpp:3612 msgctxt "MainWindow|" msgid "Check updates..." msgstr "" #: ../mainwindow.cpp:3617 msgctxt "MainWindow|" msgid "&About..." msgstr "" #: ../mainwindow.cpp:3622 msgctxt "MainWindow|" msgid "About Qt..." msgstr "" #: ../mainwindow.cpp:3665 ../mainwindow.cpp:3674 ../mainwindow.cpp:3688 #: ../mainwindow.cpp:3696 ../mainwindow.cpp:3770 ../mainwindow.cpp:3778 #: ../mainwindow.cpp:3796 ../mainwindow.cpp:3804 msgctxt "MainWindow|" msgid "KLog LoTW" msgstr "" #: ../mainwindow.cpp:3666 msgctxt "MainWindow|" msgid "All pending QSO of this log has been marked as queued for LoTW!" msgstr "" #: ../mainwindow.cpp:3666 ../mainwindow.cpp:3689 msgctxt "MainWindow|" msgid "" "Now you can go to the File menu to export the LoTW ADIF file and upload it " "to LoTW." msgstr "" #: ../mainwindow.cpp:3675 ../mainwindow.cpp:3697 msgctxt "MainWindow|" msgid "" "There was a problem to mark all pending QSO of this log as queued for LoTW!" msgstr "" #: ../mainwindow.cpp:3689 msgctxt "MainWindow|" msgid "All pending QSO has been marked as queued for LoTW!" msgstr "" #: ../mainwindow.cpp:3716 msgctxt "MainWindow|" msgid "" "The log that you have selected contains more than just one station callsign." msgstr "" #: ../mainwindow.cpp:3716 msgctxt "MainWindow|" msgid "Please select the station callsign you want to mark as sent to LoTW:" msgstr "" #: ../mainwindow.cpp:3719 msgctxt "MainWindow|" msgid "Station Callsign:" msgstr "" #: ../mainwindow.cpp:3728 msgctxt "MainWindow|" msgid "Define Station Callsign" msgstr "" #: ../mainwindow.cpp:3729 msgctxt "MainWindow|" msgid "" "You have selected no callsign. KLog will mark QSOs without a station " "callsign defined and those with the call you are entering here." msgstr "" #: ../mainwindow.cpp:3729 msgctxt "MainWindow|" msgid "" "Enter the station callsign to use for this log or leave it empty for QSO " "without station callsign defined:" msgstr "" #: ../mainwindow.cpp:3742 msgctxt "MainWindow|" msgid "" "No station callsign has been selected and therefore no log will be marked" msgstr "" #: ../mainwindow.cpp:3771 msgctxt "MainWindow|" msgid "All queued QSO of this log has been marked as sent for LoTW!" msgstr "" #: ../mainwindow.cpp:3779 msgctxt "MainWindow|" msgid "" "There was a problem to mark all queued QSO of this log as sent for LoTW!" msgstr "" #: ../mainwindow.cpp:3797 msgctxt "MainWindow|" msgid "All queued QSO has been marked as sent to LoTW!" msgstr "" #: ../mainwindow.cpp:3805 msgctxt "MainWindow|" msgid "There was a problem to mark all queued QSO of this log as sent to LoTW!" msgstr "" #: ../mainwindow.cpp:3814 msgctxt "MainWindow|" msgid "About..." msgstr "" #: ../mainwindow.cpp:3870 msgctxt "MainWindow|" msgid "KLog update checking result" msgstr "" #: ../mainwindow.cpp:3871 msgctxt "MainWindow|" msgid "Congratulations!" msgstr "" #: ../mainwindow.cpp:3871 msgctxt "MainWindow|" msgid "You already have the latest version." msgstr "" #: ../mainwindow.cpp:4021 ../mainwindow.cpp:4071 msgctxt "MainWindow|" msgid "Nothing has been saved. You have to select a valid file type." msgstr "" #: ../mainwindow.cpp:4049 msgctxt "MainWindow|" msgid "Save File" msgstr "" #: ../mainwindow.cpp:4051 msgctxt "MainWindow|" msgid "ADIF file" msgstr "" #: ../mainwindow.cpp:4051 msgctxt "MainWindow|" msgid "Cabrillo files" msgstr "" #: ../mainwindow.cpp:4051 msgctxt "MainWindow|" msgid "Any file" msgstr "" #: ../mainwindow.cpp:4128 msgctxt "MainWindow|" msgid "You can find the KLog data folder here: " msgstr "" #: ../mainwindow.cpp:4211 msgctxt "MainWindow|" msgid "DUPE" msgstr "" #: ../mainwindow.cpp:4328 msgctxt "MainWindow|" msgid "start" msgstr "" #: ../mainwindow.cpp:4329 ../mainwindow.cpp:4351 #, qt-format msgctxt "MainWindow|start or stop" msgid "" "UDP Server error\n" "The UDP server failed to %1." msgstr "" #: ../mainwindow.cpp:4350 msgctxt "MainWindow|" msgid "stop" msgstr "" #: ../mainwindow.cpp:4742 msgctxt "MainWindow|" msgid "It seems that there are no QSO in the database." msgstr "" #: ../mainwindow.cpp:4742 msgctxt "MainWindow|" msgid "" "If you are sure that the database contains QSOs and KLog is not able to find " "them, please contact the developers (see About KLog) for help." msgstr "" #: ../mainwindow.cpp:5076 ../mainwindow.cpp:7261 msgctxt "MainWindow|" msgid "TX Frequency in MHz." msgstr "" #: ../mainwindow.cpp:5077 ../mainwindow.cpp:7339 msgctxt "MainWindow|" msgid "RX Frequency in MHz." msgstr "" #: ../mainwindow.cpp:5079 msgctxt "MainWindow|" msgid "Power used by the DX." msgstr "" #: ../mainwindow.cpp:5080 msgctxt "MainWindow|" msgid "Logging operator's callsign." msgstr "" #: ../mainwindow.cpp:5081 msgctxt "MainWindow|" msgid "Callsign used over the air." msgstr "" #: ../mainwindow.cpp:5082 msgctxt "MainWindow|" msgid "My QTH locator." msgstr "" #: ../mainwindow.cpp:5083 msgctxt "MainWindow|" msgid "Name of the DX." msgstr "" #: ../mainwindow.cpp:5084 msgctxt "MainWindow|" msgid "QTH of the DX." msgstr "" #: ../mainwindow.cpp:5085 msgctxt "MainWindow|" msgid "Locator of the DX." msgstr "" #: ../mainwindow.cpp:5100 msgctxt "MainWindow|" msgid "Clears the QSO entry." msgstr "" #: ../mainwindow.cpp:5102 msgctxt "MainWindow|" msgid "Number of confirmed DXCC entities." msgstr "" #: ../mainwindow.cpp:5103 msgctxt "MainWindow|" msgid "Number of worked DXCC entities." msgstr "" #: ../mainwindow.cpp:5104 msgctxt "MainWindow|" msgid "Number of confirmed WAZ zones." msgstr "" #: ../mainwindow.cpp:5105 msgctxt "MainWindow|" msgid "Number of worked WAZ zones." msgstr "" #: ../mainwindow.cpp:5106 msgctxt "MainWindow|" msgid "Number of confirmed local references." msgstr "" #: ../mainwindow.cpp:5107 msgctxt "MainWindow|" msgid "Number of worked local references." msgstr "" #: ../mainwindow.cpp:5108 msgctxt "MainWindow|" msgid "Number of confirmed QSOs." msgstr "" #: ../mainwindow.cpp:5109 msgctxt "MainWindow|" msgid "Number of worked QSOs." msgstr "" #: ../mainwindow.cpp:5110 msgctxt "MainWindow|" msgid "Number of QSOs worked on the selected year." msgstr "" #: ../mainwindow.cpp:5111 msgctxt "MainWindow|" msgid "Number of DXCC worked on the selected year." msgstr "" #: ../mainwindow.cpp:5112 msgctxt "MainWindow|" msgid "Number of CQ Zones worked on the selected year." msgstr "" #: ../mainwindow.cpp:5113 msgctxt "MainWindow|" msgid "Score for the DXMarathon on the selected year." msgstr "" #: ../mainwindow.cpp:5114 msgctxt "MainWindow|" msgid "Select the year you want to check." msgstr "" #: ../mainwindow.cpp:5116 msgctxt "MainWindow|" msgid "Status of the DX entity." msgstr "" #: ../mainwindow.cpp:5117 msgctxt "MainWindow|" msgid "Name of the DX entity." msgstr "" #: ../mainwindow.cpp:5135 ../mainwindow.cpp:7464 msgctxt "MainWindow|" msgid "Name" msgstr "" #: ../mainwindow.cpp:5139 msgctxt "MainWindow|" msgid "QTH" msgstr "" #: ../mainwindow.cpp:5142 msgctxt "MainWindow|" msgid "Locator" msgstr "" #: ../mainwindow.cpp:5145 msgctxt "MainWindow|" msgid "Power(rx)" msgstr "" #: ../mainwindow.cpp:5149 msgctxt "MainWindow|" msgid "RST(tx)" msgstr "" #: ../mainwindow.cpp:5152 msgctxt "MainWindow|" msgid "RST(rx)" msgstr "" #: ../mainwindow.cpp:5185 msgctxt "MainWindow|" msgid "Freq TX" msgstr "" #: ../mainwindow.cpp:5187 msgctxt "MainWindow|" msgid "Freq RX" msgstr "" #: ../mainwindow.cpp:5255 msgctxt "MainWindow|" msgid "QSO" msgstr "" #: ../mainwindow.cpp:5265 msgctxt "MainWindow|" msgid "QSL" msgstr "" #: ../mainwindow.cpp:5266 msgctxt "MainWindow|" msgid "eQSL" msgstr "" #: ../mainwindow.cpp:5267 ../mainwindow.cpp:6670 msgctxt "MainWindow|" msgid "Comment" msgstr "" #: ../mainwindow.cpp:5270 msgctxt "MainWindow|" msgid "Others" msgstr "" #: ../mainwindow.cpp:5272 msgctxt "MainWindow|" msgid "My Data" msgstr "" #: ../mainwindow.cpp:5273 msgctxt "MainWindow|" msgid "Satellite" msgstr "" #: ../mainwindow.cpp:5323 ../mainwindow.cpp:5355 msgctxt "MainWindow|" msgid "QSOs" msgstr "" #: ../mainwindow.cpp:5324 ../mainwindow.cpp:5346 ../mainwindow.cpp:5409 msgctxt "MainWindow|" msgid "DXCC" msgstr "" #: ../mainwindow.cpp:5325 msgctxt "MainWindow|" msgid "CQ" msgstr "" #: ../mainwindow.cpp:5327 msgctxt "MainWindow|" msgid "Score" msgstr "" #: ../mainwindow.cpp:5333 msgctxt "MainWindow|" msgid "Info" msgstr "" #: ../mainwindow.cpp:5337 msgctxt "MainWindow|" msgid "Award" msgstr "" #: ../mainwindow.cpp:5340 msgctxt "MainWindow|" msgid "Confirmed" msgstr "" #: ../mainwindow.cpp:5343 msgctxt "MainWindow|" msgid "Worked" msgstr "" #: ../mainwindow.cpp:5349 msgctxt "MainWindow|" msgid "WAZ" msgstr "" #: ../mainwindow.cpp:5352 msgctxt "MainWindow|" msgid "Local" msgstr "" #: ../mainwindow.cpp:5404 msgctxt "MainWindow|" msgid "Awards" msgstr "" #: ../mainwindow.cpp:5405 msgctxt "MainWindow|" msgid "Search" msgstr "" #: ../mainwindow.cpp:5407 msgctxt "MainWindow|" msgid "Log" msgstr "" #: ../mainwindow.cpp:5408 msgctxt "MainWindow|" msgid "DX-Cluster" msgstr "" #: ../mainwindow.cpp:5504 ../mainwindow.cpp:5515 ../mainwindow.cpp:5589 #: ../mainwindow.cpp:5599 msgctxt "MainWindow|" msgid "Save ADIF File" msgstr "" #: ../mainwindow.cpp:5525 msgctxt "MainWindow|" msgid "LoTW logfile has been properly exported!" msgstr "" #: ../mainwindow.cpp:5525 msgctxt "MainWindow|" msgid "Remember to:" msgstr "" #: ../mainwindow.cpp:5525 msgctxt "MainWindow|" msgid "Before uploading: sign the LoTW log; and" msgstr "" #: ../mainwindow.cpp:5525 msgctxt "MainWindow|" msgid "After uploading: mark as sent all the queued QSO (LoTW Tools)." msgstr "" #: ../mainwindow.cpp:5546 msgctxt "MainWindow|" msgid "There was no QSO to be exported." msgstr "" #: ../mainwindow.cpp:5546 msgctxt "MainWindow|" msgid "" "If you think that some QSO should have been exported, please look for them " "and ensure that the eQSL LoTW QSL sent box is marked as:" msgstr "" #: ../mainwindow.cpp:5546 msgctxt "MainWindow|" msgid "Q - Queued" msgstr "" #: ../mainwindow.cpp:5567 msgctxt "MainWindow|" msgid "" "There was an error while exporting the LoTW. The log has not been exported!" msgstr "" #: ../mainwindow.cpp:5613 msgctxt "MainWindow|" msgid "Save Cabrillo File" msgstr "" #: ../mainwindow.cpp:5624 ../mainwindow.cpp:5648 msgctxt "MainWindow|" msgid "Open File" msgstr "" #: ../mainwindow.cpp:5765 msgctxt "MainWindow|" msgid "&Modify" msgstr "" #: ../mainwindow.cpp:6328 msgctxt "MainWindow|" msgid " - Needed for DXMarathon" msgstr "" #: ../mainwindow.cpp:6447 msgctxt "MainWindow|" msgid "Filling QSOs..." msgstr "" #: ../mainwindow.cpp:6447 msgctxt "MainWindow|" msgid "Abort filling" msgstr "" #: ../mainwindow.cpp:6580 msgctxt "MainWindow|" msgid "" "Filling DXCC in QSOs...\n" " QSO: " msgstr "" #: ../mainwindow.cpp:6654 msgctxt "MainWindow|" msgid "Number" msgstr "" #: ../mainwindow.cpp:6656 msgctxt "MainWindow|" msgid "Date" msgstr "" #: ../mainwindow.cpp:6658 msgctxt "MainWindow|" msgid "Time" msgstr "" #: ../mainwindow.cpp:6666 msgctxt "MainWindow|" msgid "Band" msgstr "" #: ../mainwindow.cpp:6668 ../mainwindow.cpp:7449 msgctxt "MainWindow|" msgid "Mode" msgstr "" #: ../mainwindow.cpp:6683 msgctxt "MainWindow|" msgid "Print Log" msgstr "" #: ../mainwindow.cpp:6688 msgctxt "MainWindow|" msgid "Printing the log..." msgstr "" #: ../mainwindow.cpp:6688 msgctxt "MainWindow|" msgid "Abort printing" msgstr "" #: ../mainwindow.cpp:6703 ../mainwindow.cpp:6718 msgctxt "MainWindow|" msgid "" "Printing the log...\n" " QSO: " msgstr "" #: ../mainwindow.cpp:7279 msgctxt "MainWindow|" msgid "" "TX Frequency in MHz.\n" "Frequency is not in a hamradio band!" msgstr "" #: ../mainwindow.cpp:7352 msgctxt "MainWindow|" msgid "" "RX Frequency in MHz.\n" "Frequency is not in a hamradio band!" msgstr "" #: ../mainwindow.cpp:7435 msgctxt "MainWindow|" msgid "KLog QSO received" msgstr "" #: ../mainwindow.cpp:7440 msgctxt "MainWindow|" msgid "The following QSO data has been received from WSJT-X to be logged:" msgstr "" #: ../mainwindow.cpp:7443 msgctxt "MainWindow|" msgid "Call" msgstr "" #: ../mainwindow.cpp:7446 msgctxt "MainWindow|" msgid "Freq" msgstr "" #: ../mainwindow.cpp:7452 msgctxt "MainWindow|" msgid "Time On" msgstr "" #: ../mainwindow.cpp:7455 msgctxt "MainWindow|" msgid "Time Off" msgstr "" #: ../mainwindow.cpp:7458 msgctxt "MainWindow|" msgid "RST TX" msgstr "" #: ../mainwindow.cpp:7458 msgctxt "MainWindow|" msgid "RST RX" msgstr "" #: ../mainwindow.cpp:7461 msgctxt "MainWindow|" msgid "DX-Grid" msgstr "" #: ../mainwindow.cpp:7467 msgctxt "MainWindow|" msgid "Comments" msgstr "" #: ../mainwindow.cpp:7470 msgctxt "MainWindow|" msgid "TX Pwr" msgstr "" #: ../mainwindow.cpp:7473 msgctxt "MainWindow|" msgid "Operator" msgstr "" #: ../mainwindow.cpp:7476 msgctxt "MainWindow|" msgid "Local-Grid" msgstr "" #: ../mainwindow.cpp:7526 msgctxt "MainWindow|" msgid "QSO logged from WSJT-X:" msgstr "" #: ../mainwindow.cpp:7559 msgctxt "MainWindow|" msgid "" "A new mode not supported by KLog has been received from an external software " "or radio:" msgstr "" #: ../mainwindow.cpp:7559 msgctxt "MainWindow|" msgid "" "If the received mode is correct, please contact KLog development team and " "request support for that mode" msgstr "" #: ../mainwindow.cpp:7559 msgctxt "MainWindow|" msgid "" "Do you want to keep receiving this alerts? (disabling this alerts will " "prevent that non-valid modes are detected)" msgstr "" #: ../mainwindow.cpp:7721 msgctxt "MainWindow|" msgid "" "A duplicated satellite has been detected in the file and will not be " "imported." msgstr "" #: ../mainwindow.cpp:7722 msgctxt "MainWindow|" msgid "" "Please check the satellite information file and ensure it is properly " "populated." msgstr "" #: ../mainwindow.cpp:7722 msgctxt "MainWindow|" msgid "" "Now you will see a more detailed error that can be used for debugging..." msgstr "" #: ../mainwindow.cpp:7729 msgctxt "MainWindow|" msgid "An unexpected error ocurred!!" msgstr "" #: ../mainwindow.cpp:7729 msgctxt "MainWindow|" msgid "If the problem persists, please contact the developers" msgstr "" #: ../mainwindow.cpp:7729 msgctxt "MainWindow|" msgid "for analysis:" msgstr "" #: ../mainwindow.cpp:7731 msgctxt "MainWindow|" msgid "Error in function" msgstr "" #: ../mainwindow.cpp:7732 msgctxt "MainWindow|" msgid "Error code" msgstr "" #: ../mainwindow.cpp:7733 msgctxt "MainWindow|" msgid "Error text" msgstr "" #: ../mainwindow.cpp:7734 msgctxt "MainWindow|" msgid "Failed query" msgstr "" #: ../mainwindow.cpp:7736 msgctxt "MainWindow|" msgid "Recomendation:" msgstr "" #: ../mainwindow.cpp:7736 msgctxt "MainWindow|" msgid "" "Export, periodically, your data to ADIF to prevent a potential data loss." msgstr "" #: ../mainwindow.cpp:7745 msgctxt "MainWindow|" msgid "Do you want to keep showing errors?" msgstr "" #: ../mainwindowinputcomment.cpp:46 msgctxt "MainWindowInputComment|" msgid "Add a comment for this QSO." msgstr "" #: ../mainwindowinputeqsl.cpp:44 msgctxt "MainWindowInputEQSL|" msgid "Date of the ClubLog upload." msgstr "" #: ../mainwindowinputeqsl.cpp:45 msgctxt "MainWindowInputEQSL|" msgid "Date of the eQSL sending." msgstr "" #: ../mainwindowinputeqsl.cpp:46 msgctxt "MainWindowInputEQSL|" msgid "Date of the eQSL reception." msgstr "" #: ../mainwindowinputeqsl.cpp:47 msgctxt "MainWindowInputEQSL|" msgid "Date of the LoTW sending." msgstr "" #: ../mainwindowinputeqsl.cpp:48 msgctxt "MainWindowInputEQSL|" msgid "Date of the LoTW reception." msgstr "" #: ../mainwindowinputeqsl.cpp:50 msgctxt "MainWindowInputEQSL|" msgid "Status on ClubLog." msgstr "" #: ../mainwindowinputeqsl.cpp:51 msgctxt "MainWindowInputEQSL|" msgid "Status of the eQSL sending." msgstr "" #: ../mainwindowinputeqsl.cpp:52 msgctxt "MainWindowInputEQSL|" msgid "Status of the eQSL reception." msgstr "" #: ../mainwindowinputeqsl.cpp:53 msgctxt "MainWindowInputEQSL|" msgid "Status of the LoTW sending." msgstr "" #: ../mainwindowinputeqsl.cpp:54 msgctxt "MainWindowInputEQSL|" msgid "Status of the LoTW reception." msgstr "" #: ../mainwindowinputeqsl.cpp:58 msgctxt "MainWindowInputEQSL|" msgid "ClubLog" msgstr "" #: ../mainwindowinputeqsl.cpp:61 msgctxt "MainWindowInputEQSL|" msgid "eQSL Sent" msgstr "" #: ../mainwindowinputeqsl.cpp:64 msgctxt "MainWindowInputEQSL|" msgid "eQSL Rec" msgstr "" #: ../mainwindowinputeqsl.cpp:67 msgctxt "MainWindowInputEQSL|" msgid "LoTW Sent" msgstr "" #: ../mainwindowinputeqsl.cpp:70 msgctxt "MainWindowInputEQSL|" msgid "LoTW Rec" msgstr "" #: ../mainwindowinputothers.cpp:66 msgctxt "MainWindowInputOthers|" msgid "Primary Div" msgstr "" #: ../mainwindowinputothers.cpp:67 msgctxt "MainWindowInputOthers|" msgid "Secondary Div" msgstr "" #: ../mainwindowinputothers.cpp:68 msgctxt "MainWindowInputOthers|" msgid "IOTA" msgstr "" #: ../mainwindowinputothers.cpp:69 msgctxt "MainWindowInputOthers|" msgid "Entity" msgstr "" #: ../mainwindowinputothers.cpp:70 msgctxt "MainWindowInputOthers|" msgid "Propagation mode" msgstr "" #: ../mainwindowinputothers.cpp:78 msgctxt "MainWindowInputOthers|" msgid "Select the primary division for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:79 msgctxt "MainWindowInputOthers|" msgid "Select the secondary division for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:80 msgctxt "MainWindowInputOthers|" msgid "Select the entity for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:81 msgctxt "MainWindowInputOthers|" msgid "Select the propagation mode for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:82 msgctxt "MainWindowInputOthers|" msgid "Select the IOTA continent for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:83 msgctxt "MainWindowInputOthers|" msgid "Select the IOTA reference number for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:108 ../mainwindowinputothers.cpp:150 msgctxt "MainWindowInputOthers|" msgid "Not Identified" msgstr "" #: ../mainwindowinputothers.cpp:114 msgctxt "MainWindowInputOthers|" msgid "Not - Not Identified" msgstr "" #: ../mainwindowinputqsl.cpp:66 msgctxt "MainWindowInputQSL|" msgid "QSL Sent" msgstr "" #: ../mainwindowinputqsl.cpp:69 msgctxt "MainWindowInputQSL|" msgid "QSL Rec" msgstr "" #: ../mainwindowinputqsl.cpp:72 msgctxt "MainWindowInputQSL|" msgid "QSL Via" msgstr "" #: ../mainwindowinputqsl.cpp:75 msgctxt "MainWindowInputQSL|" msgid "QSL Msg" msgstr "" #: ../mainwindowinputqsl.cpp:78 msgctxt "MainWindowInputQSL|" msgid "Status of the QSL sending." msgstr "" #: ../mainwindowinputqsl.cpp:79 msgctxt "MainWindowInputQSL|" msgid "Status of the QSL reception." msgstr "" #: ../mainwindowinputqsl.cpp:80 msgctxt "MainWindowInputQSL|" msgid "QSL sending information." msgstr "" #: ../mainwindowinputqsl.cpp:81 msgctxt "MainWindowInputQSL|" msgid "QSL reception information." msgstr "" #: ../mainwindowinputqsl.cpp:83 msgctxt "MainWindowInputQSL|" msgid "Date of the QSL sending." msgstr "" #: ../mainwindowinputqsl.cpp:84 msgctxt "MainWindowInputQSL|" msgid "Date of the QSL reception." msgstr "" #: ../mainwindowinputqsl.cpp:85 msgctxt "MainWindowInputQSL|" msgid "Message of the QSL." msgstr "" #: ../mainwindowinputqsl.cpp:86 msgctxt "MainWindowInputQSL|" msgid "QSL via information." msgstr "" #: ../mainwindowmydatatab.cpp:61 msgctxt "MainWindowMyDataTab|" msgid "Watt" msgstr "" #: ../mainwindowmydatatab.cpp:64 msgctxt "MainWindowMyDataTab|" msgid "Keep this data" msgstr "" #: ../mainwindowmydatatab.cpp:66 ../mainwindowmydatatab.cpp:68 msgctxt "MainWindowMyDataTab|" msgid "Data entered in this tab will be copied into the next QSO." msgstr "" #: ../mainwindowmydatatab.cpp:70 msgctxt "MainWindowMyDataTab|" msgid "Power used for the QSO in watts." msgstr "" #: ../mainwindowmydatatab.cpp:71 msgctxt "MainWindowMyDataTab|" msgid "Logging operator's callsign." msgstr "" #: ../mainwindowmydatatab.cpp:72 msgctxt "MainWindowMyDataTab|" msgid "Callsign used over the air." msgstr "" #: ../mainwindowmydatatab.cpp:73 msgctxt "MainWindowMyDataTab|" msgid "My QTH locator." msgstr "" #: ../mainwindowmydatatab.cpp:75 msgctxt "MainWindowMyDataTab|" msgid "Power" msgstr "" #: ../mainwindowmydatatab.cpp:78 msgctxt "MainWindowMyDataTab|" msgid "Operator" msgstr "" #: ../mainwindowmydatatab.cpp:80 msgctxt "MainWindowMyDataTab|" msgid "Station Callsign" msgstr "" #: ../mainwindowmydatatab.cpp:83 msgctxt "MainWindowMyDataTab|" msgid "My Locator" msgstr "" #: ../mainwindowsattab.cpp:80 msgctxt "MainWindowSatTab|" msgid "Keep this data" msgstr "" #: ../mainwindowsattab.cpp:82 ../mainwindowsattab.cpp:84 msgctxt "MainWindowSatTab|" msgid "Data entered in this tab will be copied into the next QSO." msgstr "" #: ../mainwindowsattab.cpp:85 ../mainwindowsattab.cpp:375 msgctxt "MainWindowSatTab|" msgid "Other - Sat not in the list" msgstr "" #: ../mainwindowsattab.cpp:88 #, qt-format msgctxt "MainWindowSatTab|" msgid "" "Name of the Satellite if not in the list. Select: \"%1\" to enable this box. " "(format like AO-51)." msgstr "" #: ../mainwindowsattab.cpp:91 msgctxt "MainWindowSatTab|" msgid "Satellite mode used." msgstr "" #: ../mainwindowsattab.cpp:92 msgctxt "MainWindowSatTab|" msgid "Select the satellite you are using." msgstr "" #: ../mainwindowsattab.cpp:93 msgctxt "MainWindowSatTab|" msgid "UpLink band." msgstr "" #: ../mainwindowsattab.cpp:94 msgctxt "MainWindowSatTab|" msgid "DownLink band." msgstr "" #: ../mainwindowsattab.cpp:95 msgctxt "MainWindowSatTab|" msgid "" "Locator of the DX station. This box is synchronized with the Locator box in " "the QSO tab." msgstr "" #: ../mainwindowsattab.cpp:98 msgctxt "MainWindowSatTab|" msgid "UpLink" msgstr "" #: ../mainwindowsattab.cpp:102 msgctxt "MainWindowSatTab|" msgid "DownLink" msgstr "" #: ../mainwindowsattab.cpp:106 msgctxt "MainWindowSatTab|" msgid "Satellite" msgstr "" #: ../mainwindowsattab.cpp:110 msgctxt "MainWindowSatTab|" msgid "Mode" msgstr "" #: ../mainwindowsattab.cpp:114 msgctxt "MainWindowSatTab|" msgid "DX Locator" msgstr "" #: ../mainwindowsattab.cpp:119 msgctxt "MainWindowSatTab|" msgid "Other" msgstr "" #: ../mainwindowsattab.cpp:125 ../mainwindowsattab.cpp:129 msgctxt "MainWindowSatTab|" msgid "MHz" msgstr "" #: ../mainwindowsattab.cpp:374 msgctxt "MainWindowSatTab|" msgid "Not Sat QSO" msgstr "" #: ../mainwindowsattab.cpp:411 msgctxt "MainWindowSatTab|" msgid "" "KLog has detected a satellite name that it does not recognise. If it should " "use one of the names of known satellites instead, please select it from the " "list. Alternatively, please contact the development team to add the new " "satellite name." msgstr "" #: ../mainwindowsattab.cpp:412 msgctxt "MainWindowSatTab|" msgid "The satellite you have in your QSO is: " msgstr "" #: ../mainwindowsattab.cpp:412 msgctxt "MainWindowSatTab|" msgid "" "Please know that the satellite name will not be saved if it is not in the " "list so that information may be lost!" msgstr "" #: ../awards.cpp:755 msgctxt "QObject|" msgid "New One, work it!" msgstr "" #: ../awards.cpp:759 ../awards.cpp:763 ../awards.cpp:769 ../awards.cpp:772 #: ../awards.cpp:775 ../awards.cpp:778 ../awards.cpp:784 ../awards.cpp:790 msgctxt "QObject|" msgid "Needed, work it!" msgstr "" #: ../awards.cpp:766 ../awards.cpp:781 ../awards.cpp:787 ../awards.cpp:793 msgctxt "QObject|" msgid "Worked but not confirmed" msgstr "" #: ../awards.cpp:796 msgctxt "QObject|" msgid "Confirmed" msgstr "" #: ../awards.cpp:800 msgctxt "QObject|" msgid "Not identified" msgstr "" #: ../database.cpp:271 ../database.cpp:323 msgctxt "QObject|" msgid "Database Error" msgstr "" #: ../database.cpp:1465 msgctxt "QObject|" msgid "KLog DB needs to be upgraded." msgstr "" #: ../database.cpp:1466 msgctxt "QObject|" msgid "Do you want to upgrade it now?" msgstr "" #: ../database.cpp:1466 msgctxt "QObject|" msgid "If DB is not upgraded KLog may not work properly." msgstr "" #: ../database.cpp:2072 msgctxt "QObject|" msgid "" "KLog has detected a previous log in the DB. All data will be migrated to a " "newly created DX type log for you." msgstr "" #: ../database.cpp:2090 msgctxt "QObject|" msgid "KLog: Enter Station callsign" msgstr "" #: ../database.cpp:2091 msgctxt "QObject|" msgid "Enter the station callsign used in this log" msgstr "" #: ../database.cpp:2092 msgctxt "QObject|" msgid "Station Callsign" msgstr "" #: ../database.cpp:2143 msgctxt "QObject|" msgid "" "All the data was migrated correctly. You should now go to " "Setup->Preferences->Logs to check that everything is OK." msgstr "" #: ../database.cpp:3572 ../database.cpp:3593 msgctxt "QObject|" msgid "Updating mode information..." msgstr "" #: ../database.cpp:3572 ../database.cpp:3757 ../database.cpp:3954 #: ../database.cpp:4155 ../database.cpp:7199 ../database.cpp:7422 #: ../dataproxy_sqlite.cpp:4801 msgctxt "QObject|" msgid "Abort updating" msgstr "" #: ../database.cpp:3593 ../database.cpp:3776 ../database.cpp:7291 #: ../database.cpp:7514 ../dataproxy_sqlite.cpp:4844 msgctxt "QObject|" msgid "QSO: " msgstr "" #: ../database.cpp:3668 ../database.cpp:3845 ../database.cpp:4046 #: ../database.cpp:4254 msgctxt "QObject|" msgid "" "Canceling this update will cause data inconsistencies and possibly data " "loss. Do you still want to cancel?" msgstr "" #: ../database.cpp:3757 ../database.cpp:3776 ../database.cpp:3976 #: ../database.cpp:4178 msgctxt "QObject|" msgid "Updating bands information..." msgstr "" #: ../database.cpp:3952 #, qt-format msgctxt "QObject|" msgid "Updating bands information in %1 status..." msgstr "" #: ../database.cpp:3976 ../database.cpp:4178 msgctxt "QObject|" msgid "Progress: " msgstr "" #: ../database.cpp:4153 #, qt-format msgctxt "QObject|" msgid "Updating mode information in %1 status..." msgstr "" #: ../database.cpp:7199 msgctxt "QObject|" msgid "Updating DXCC award information..." msgstr "" #: ../database.cpp:7291 msgctxt "QObject|" msgid "Updating DXCC Award information..." msgstr "" #: ../database.cpp:7422 msgctxt "QObject|" msgid "Updating WAZ award information..." msgstr "" #: ../database.cpp:7514 msgctxt "QObject|" msgid "Updating WAZ Award information..." msgstr "" #: ../dataproxy_sqlite.cpp:4801 ../dataproxy_sqlite.cpp:4844 msgctxt "QObject|" msgid "Updating DXCC and Continent information..." msgstr "" #: ../main.cpp:267 msgctxt "QObject|" msgid "Install wizard was canceled before completing..." msgstr "" #: ../main.cpp:268 msgctxt "QObject|" msgid "Do you want to remove the KLog dir from your disk?" msgstr "" #: ../main.cpp:281 msgctxt "QObject|" msgid "Your KLog dir has been removed" msgstr "" #: ../main.cpp:281 ../main.cpp:287 ../main.cpp:294 ../main.cpp:300 msgctxt "QObject|" msgid "Thank you for running KLog!" msgstr "" #: ../main.cpp:287 msgctxt "QObject|" msgid "" "I could not remove your KLog dir. You should do it manually if you want it " "removed from your hard disk." msgstr "" #: ../main.cpp:294 msgctxt "QObject|" msgid "" "Your KLog dir could not be removed. You should do it manually if you want it " "removed from your hard disk." msgstr "" #: ../main.cpp:300 msgctxt "QObject|" msgid "Remember that your KLog dir is on your system..." msgstr "" #: ../searchwidget.cpp:26 msgctxt "SearchWidget|" msgid "&Clear" msgstr "" #: ../searchwidget.cpp:27 msgctxt "SearchWidget|" msgid "&Export Highlighted" msgstr "" #: ../searchwidget.cpp:28 ../searchwidget.cpp:577 ../searchwidget.cpp:609 msgctxt "SearchWidget|" msgid "&Select All" msgstr "" #: ../searchwidget.cpp:29 msgctxt "SearchWidget|" msgid "&Search" msgstr "" #: ../searchwidget.cpp:30 msgctxt "SearchWidget|" msgid "All" msgstr "" #: ../searchwidget.cpp:69 msgctxt "SearchWidget|" msgid "Clear the searches." msgstr "" #: ../searchwidget.cpp:70 msgctxt "SearchWidget|" msgid "Export the search result to an ADIF file." msgstr "" #: ../searchwidget.cpp:71 msgctxt "SearchWidget|" msgid "Select/Unselect all the QSOs shown." msgstr "" #: ../searchwidget.cpp:72 msgctxt "SearchWidget|" msgid "Search in the log." msgstr "" #: ../searchwidget.cpp:73 msgctxt "SearchWidget|" msgid "Search in all logs." msgstr "" #: ../searchwidget.cpp:74 msgctxt "SearchWidget|" msgid "Enter the QRZ to search for." msgstr "" #: ../searchwidget.cpp:75 msgctxt "SearchWidget|" msgid "Search results." msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "QRZ" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "Date/Time" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "Band" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "Mode" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "QSL Sent" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 ../searchwidget.cpp:787 msgctxt "SearchWidget|" msgid "QSL Rcvd" msgstr "" #: ../searchwidget.cpp:81 msgctxt "SearchWidget|" msgid "Station Callsign" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "ID" msgstr "" #: ../searchwidget.cpp:585 ../searchwidget.cpp:604 msgctxt "SearchWidget|" msgid "&Clear selection" msgstr "" #: ../searchwidget.cpp:679 msgctxt "SearchWidget|" msgid "Save File" msgstr "" #: ../searchwidget.cpp:762 msgctxt "SearchWidget|" msgid "QSL Send" msgstr "" #: ../searchwidget.cpp:821 msgctxt "SearchWidget|" msgid "&Delete" msgstr "" #: ../searchwidget.cpp:823 msgctxt "SearchWidget|" msgid "Delete a QSO" msgstr "" #: ../searchwidget.cpp:826 msgctxt "SearchWidget|" msgid "&Edit QSO" msgstr "" #: ../searchwidget.cpp:828 msgctxt "SearchWidget|" msgid "Edit this QSO" msgstr "" #: ../searchwidget.cpp:831 msgctxt "SearchWidget|" msgid "Via &bureau" msgstr "" #: ../searchwidget.cpp:833 msgctxt "SearchWidget|" msgid "Send this QSL via bureau" msgstr "" #: ../searchwidget.cpp:836 msgctxt "SearchWidget|" msgid "D&irect" msgstr "" #: ../searchwidget.cpp:838 msgctxt "SearchWidget|" msgid "Send this QSL via direct" msgstr "" #: ../searchwidget.cpp:841 msgctxt "SearchWidget|" msgid "&Request my QSL" msgstr "" #: ../searchwidget.cpp:843 msgctxt "SearchWidget|" msgid "Mark my QSL as requested" msgstr "" #: ../searchwidget.cpp:846 msgctxt "SearchWidget|" msgid "Via Direct && mark DX QSL as requested" msgstr "" #: ../searchwidget.cpp:847 msgctxt "SearchWidget|" msgid "Send this QSL via direct & mark DX QSL as requested" msgstr "" #: ../searchwidget.cpp:850 msgctxt "SearchWidget|" msgid "Via Bureau && mark DX QSL as requested" msgstr "" #: ../searchwidget.cpp:851 msgctxt "SearchWidget|" msgid "Send this QSL via bureau & mark DX QSL as requested" msgstr "" #: ../searchwidget.cpp:855 msgctxt "SearchWidget|" msgid "&Request the QSL" msgstr "" #: ../searchwidget.cpp:857 msgctxt "SearchWidget|" msgid "Mark the QSL as requested" msgstr "" #: ../searchwidget.cpp:861 msgctxt "SearchWidget|" msgid "Via bureau && mark my QSL as requested" msgstr "" #: ../searchwidget.cpp:862 msgctxt "SearchWidget|" msgid "QSL received via bureau & mark my QSL as requested" msgstr "" #: ../searchwidget.cpp:865 msgctxt "SearchWidget|" msgid "Via bureau" msgstr "" #: ../searchwidget.cpp:866 msgctxt "SearchWidget|" msgid "QSL received via bureau" msgstr "" #: ../searchwidget.cpp:870 msgctxt "SearchWidget|" msgid "Direc&t && mark as my QSL requested" msgstr "" #: ../searchwidget.cpp:871 msgctxt "SearchWidget|" msgid "QSL received via direct & mark my QSL as requested" msgstr "" #: ../searchwidget.cpp:874 msgctxt "SearchWidget|" msgid "Direc&t" msgstr "" #: ../searchwidget.cpp:875 msgctxt "SearchWidget|" msgid "QSL received via direct" msgstr "" #: ../searchwidget.cpp:1108 #, qt-format msgctxt "SearchWidget|" msgid "You have requested to delete the QSO with: %1" msgstr "" #: ../searchwidget.cpp:1113 msgctxt "SearchWidget|" msgid "Are you sure?" msgstr "" #: ../searchwidget.cpp:1176 msgctxt "SearchWidget|" msgid "Needed QSO to send the QSL" msgstr "" #: ../searchwidget.cpp:1184 msgctxt "SearchWidget|" msgid "My QSL requested to be sent" msgstr "" #: ../searchwidget.cpp:1189 ../searchwidget.cpp:1194 msgctxt "SearchWidget|" msgid "DX QSL pending to be received" msgstr "" #: ../setupdialog.cpp:90 msgctxt "SetupDialog|" msgid "My Data" msgstr "" #: ../setupdialog.cpp:91 ../setupdialog.cpp:172 ../setupdialog.cpp:327 msgctxt "SetupDialog|" msgid "Bands/Modes" msgstr "" #: ../setupdialog.cpp:92 ../setupdialog.cpp:333 msgctxt "SetupDialog|" msgid "DX-Cluster" msgstr "" #: ../setupdialog.cpp:93 ../setupdialog.cpp:174 ../setupdialog.cpp:339 msgctxt "SetupDialog|" msgid "Colors" msgstr "" #: ../setupdialog.cpp:94 ../setupdialog.cpp:175 ../setupdialog.cpp:345 msgctxt "SetupDialog|" msgid "Misc" msgstr "" #: ../setupdialog.cpp:95 ../setupdialog.cpp:176 msgctxt "SetupDialog|" msgid "World Editor" msgstr "" #: ../setupdialog.cpp:96 ../setupdialog.cpp:177 ../setupdialog.cpp:321 msgctxt "SetupDialog|" msgid "Logs" msgstr "" #: ../setupdialog.cpp:99 ../setupdialog.cpp:180 msgctxt "SetupDialog|" msgid "Satellites" msgstr "" #: ../setupdialog.cpp:100 ../setupdialog.cpp:181 msgctxt "SetupDialog|" msgid "HamLib" msgstr "" #: ../setupdialog.cpp:103 ../setupdialog.cpp:185 msgctxt "SetupDialog|" msgid "Cancel" msgstr "" #: ../setupdialog.cpp:104 ../setupdialog.cpp:186 msgctxt "SetupDialog|" msgid "OK" msgstr "" #: ../setupdialog.cpp:127 ../setupdialog.cpp:204 msgctxt "SetupDialog|" msgid "Config Dialog" msgstr "" #: ../setupdialog.cpp:171 ../setupdialog.cpp:315 msgctxt "SetupDialog|" msgid "User data" msgstr "" #: ../setupdialog.cpp:173 msgctxt "SetupDialog|" msgid "D&X-Cluster" msgstr "" #: ../setupdialog.cpp:178 msgctxt "SetupDialog|" msgid "ClubLog" msgstr "" #: ../setupdialog.cpp:179 msgctxt "SetupDialog|" msgid "WSJT-X" msgstr "" #: ../setupdialog.cpp:299 msgctxt "SetupDialog|" msgid "You need to enter at least one log in the Logs tab." msgstr "" #: ../setupdialog.cpp:351 msgctxt "SetupDialog|" msgid "World" msgstr "" #: ../setupdialog.cpp:380 msgctxt "SetupDialog|" msgid "DB has not been moved to new path" msgstr "" #: ../setupdialog.cpp:381 msgctxt "SetupDialog|" msgid "" "Go to the Misc tab and click on Move DB\n" " or the DB will not be moved to the new location." msgstr "" #: ../setupdialog.cpp:389 msgctxt "SetupDialog|" msgid "You need to enter at least a valid QRZ." msgstr "" #: ../setupdialog.cpp:390 msgctxt "SetupDialog|" msgid "Go to the User tab and enter valid QRZ." msgstr "" #: ../setupdialog.cpp:401 msgctxt "SetupDialog|" msgid "You have not selected the kind of log you want." msgstr "" #: ../setupdialog.cpp:402 msgctxt "SetupDialog|" msgid "" "You will be redirected to the Log tab.\n" "Please add and select the kind of log you want to use." msgstr "" #: ../setupentitydialog.cpp:69 msgctxt "SetupEntityDialog|" msgid "Entity" msgstr "" #: ../setupentitydialog.cpp:71 msgctxt "SetupEntityDialog|" msgid "Name of the Entity." msgstr "" #: ../setupentitydialog.cpp:73 msgctxt "SetupEntityDialog|" msgid "CQ" msgstr "" #: ../setupentitydialog.cpp:75 msgctxt "SetupEntityDialog|" msgid "CQ zone." msgstr "" #: ../setupentitydialog.cpp:77 msgctxt "SetupEntityDialog|" msgid "ITU" msgstr "" #: ../setupentitydialog.cpp:79 msgctxt "SetupEntityDialog|" msgid "ITU zone." msgstr "" #: ../setupentitydialog.cpp:85 msgctxt "SetupEntityDialog|" msgid "Latitude" msgstr "" #: ../setupentitydialog.cpp:87 ../setupentitydialog.cpp:91 msgctxt "SetupEntityDialog|" msgid "Longitude of the Entity." msgstr "" #: ../setupentitydialog.cpp:89 msgctxt "SetupEntityDialog|" msgid "Longitude" msgstr "" #: ../setupentitydialog.cpp:93 msgctxt "SetupEntityDialog|" msgid "UTC" msgstr "" #: ../setupentitydialog.cpp:95 msgctxt "SetupEntityDialog|" msgid "Local time difference to UTC." msgstr "" #: ../setupentitydialog.cpp:97 msgctxt "SetupEntityDialog|" msgid "Main prefix" msgstr "" #: ../setupentitydialog.cpp:99 msgctxt "SetupEntityDialog|" msgid "Main prefix of the entity." msgstr "" #: ../setupentitydialog.cpp:103 msgctxt "SetupEntityDialog|" msgid "ARRL ID" msgstr "" #: ../setupentitydialog.cpp:105 msgctxt "SetupEntityDialog|" msgid "ARRL ID." msgstr "" #: ../setupentitydialog.cpp:111 msgctxt "SetupEntityDialog|" msgid "Prefixes" msgstr "" #: ../setupentitydialog.cpp:113 msgctxt "SetupEntityDialog|" msgid "Comma separated possible prefixes, e.g. EA1, EA2, ..." msgstr "" #: ../setupentitydialog.cpp:116 msgctxt "SetupEntityDialog|" msgid "Date of the deletion." msgstr "" #: ../setupentitydialog.cpp:118 msgctxt "SetupEntityDialog|" msgid "Deleted" msgstr "" #: ../setupentitydialog.cpp:120 msgctxt "SetupEntityDialog|" msgid "Cancel" msgstr "" #: ../setupentitydialog.cpp:121 msgctxt "SetupEntityDialog|" msgid "OK" msgstr "" #: ../setupentitydialog.cpp:209 msgctxt "SetupEntityDialog|" msgid "Entity Dialog" msgstr "" #: ../setuppagebandmode.cpp:16 msgctxt "SetupPageBandMode|" msgid "Bands" msgstr "" #: ../setuppagebandmode.cpp:20 msgctxt "SetupPageBandMode|" msgid "Modes" msgstr "" #: ../setuppageclublog.cpp:45 msgctxt "SetupPageClubLog|" msgid "&Callsign" msgstr "" #: ../setuppageclublog.cpp:46 msgctxt "SetupPageClubLog|" msgid "ClubLog &password" msgstr "" #: ../setuppageclublog.cpp:47 msgctxt "SetupPageClubLog|" msgid "ClubLog &email" msgstr "" #: ../setuppageclublog.cpp:53 msgctxt "SetupPageClubLog|" msgid "Enter the email you used to register in ClubLog." msgstr "" #: ../setuppageclublog.cpp:54 msgctxt "SetupPageClubLog|" msgid "Enter the callsign you used to register in ClubLog." msgstr "" #: ../setuppageclublog.cpp:55 msgctxt "SetupPageClubLog|" msgid "Enter your password in ClubLog." msgstr "" #: ../setuppageclublog.cpp:60 msgctxt "SetupPageClubLog|" msgid "&Send QSOs in real time" msgstr "" #: ../setuppageclublog.cpp:61 msgctxt "SetupPageClubLog|" msgid "&Activate ClubLog" msgstr "" #: ../setuppageclublog.cpp:62 msgctxt "SetupPageClubLog|" msgid "Use QSO Station &Callsign" msgstr "" #: ../setuppageclublog.cpp:63 msgctxt "SetupPageClubLog|" msgid "" "Send each QSO to ClubLog in real time, as they are added (or modified) in " "KLog." msgstr "" #: ../setuppageclublog.cpp:64 msgctxt "SetupPageClubLog|" msgid "Starts the ClubLog support in KLog." msgstr "" #: ../setuppageclublog.cpp:65 msgctxt "SetupPageClubLog|" msgid "" "Use the Station Callsign defined in each QSO instead of the one defined here." msgstr "" #: ../setuppagecolors.cpp:42 msgctxt "SetupPageColors|" msgid "New One" msgstr "" #: ../setuppagecolors.cpp:43 msgctxt "SetupPageColors|" msgid "Needed in this band" msgstr "" #: ../setuppagecolors.cpp:44 msgctxt "SetupPageColors|" msgid "Worked in this band" msgstr "" #: ../setuppagecolors.cpp:45 msgctxt "SetupPageColors|" msgid "Confirmed in this band" msgstr "" #: ../setuppagecolors.cpp:46 msgctxt "SetupPageColors|" msgid "Default" msgstr "" #: ../setuppagecolors.cpp:131 msgctxt "SetupPageColors|" msgid "Choose a color" msgstr "" #: ../setuppagedxcluster.cpp:74 msgctxt "SetupPageDxCluster|" msgid "Add" msgstr "" #: ../setuppagedxcluster.cpp:75 msgctxt "SetupPageDxCluster|" msgid "Delete" msgstr "" #: ../setuppagedxcluster.cpp:77 msgctxt "SetupPageDxCluster|" msgid "Show &HF spots" msgstr "" #: ../setuppagedxcluster.cpp:78 msgctxt "SetupPageDxCluster|" msgid "Show V/&UHF spots" msgstr "" #: ../setuppagedxcluster.cpp:79 msgctxt "SetupPageDxCluster|" msgid "Show W&ARC spots" msgstr "" #: ../setuppagedxcluster.cpp:80 msgctxt "SetupPageDxCluster|" msgid "Show &worked spots" msgstr "" #: ../setuppagedxcluster.cpp:81 msgctxt "SetupPageDxCluster|" msgid "Show &confirmed spots" msgstr "" #: ../setuppagedxcluster.cpp:82 msgctxt "SetupPageDxCluster|" msgid "Show ANN/&FULL messages" msgstr "" #: ../setuppagedxcluster.cpp:83 msgctxt "SetupPageDxCluster|" msgid "Show WW&V messages" msgstr "" #: ../setuppagedxcluster.cpp:84 msgctxt "SetupPageDxCluster|" msgid "Show WC&Y messages" msgstr "" #: ../setuppagedxcluster.cpp:86 msgctxt "SetupPageDxCluster|" msgid "DX Spots" msgstr "" #: ../setuppagedxcluster.cpp:98 msgctxt "SetupPageDxCluster|" msgid "Messages" msgstr "" #: ../setuppagedxcluster.cpp:156 msgctxt "SetupPageDxCluster|" msgid "KLog: Add a DXCluster server" msgstr "" #: ../setuppagedxcluster.cpp:157 msgctxt "SetupPageDxCluster|" msgid "" "Add the address followed by the :port\n" "Example: dxfun.com:8000\n" "If no port is specified, 41112 will be used by default:" msgstr "" #: ../setuppagehamlib.cpp:50 msgctxt "SetupPageHamLib|" msgid "Activate HamLib" msgstr "" #: ../setuppagehamlib.cpp:51 msgctxt "SetupPageHamLib|" msgid "" "Activates the hamlib support that will enable the connection to a radio." msgstr "" #: ../setuppagehamlib.cpp:53 msgctxt "SetupPageHamLib|" msgid "RTS on" msgstr "" #: ../setuppagehamlib.cpp:54 msgctxt "SetupPageHamLib|" msgid "Setting RTS may be needed for some serial ports." msgstr "" #: ../setuppagehamlib.cpp:55 msgctxt "SetupPageHamLib|" msgid "DTR on" msgstr "" #: ../setuppagehamlib.cpp:56 msgctxt "SetupPageHamLib|" msgid "Setting DTR may be needed for some serial ports." msgstr "" #: ../setuppagehamlib.cpp:66 msgctxt "SetupPageHamLib|" msgid "Radio" msgstr "" #: ../setuppagehamlib.cpp:68 msgctxt "SetupPageHamLib|" msgid "Select your rig." msgstr "" #: ../setuppagehamlib.cpp:72 msgctxt "SetupPageHamLib|" msgid "Defines the interval to pool the radio in msecs." msgstr "" #: ../setuppagehamlib.cpp:78 msgctxt "SetupPageHamLib|" msgid "Pool interval" msgstr "" #: ../setuppagehamlib.cpp:90 msgctxt "SetupPageHamLib|" msgid "Port" msgstr "" #: ../setuppagehamlib.cpp:92 msgctxt "SetupPageHamLib|" msgid "" "Select the serial port. Only the serial ports that are detected are shown." msgstr "" #: ../setuppagehamlib.cpp:96 msgctxt "SetupPageHamLib|" msgid "Scan" msgstr "" #: ../setuppagehamlib.cpp:97 msgctxt "SetupPageHamLib|" msgid "Click to identify the serial ports available in your computer." msgstr "" #: ../setuppagehamlib.cpp:102 msgctxt "SetupPageHamLib|" msgid "Bauds" msgstr "" #: ../setuppagehamlib.cpp:104 msgctxt "SetupPageHamLib|" msgid "Select the serial port speed." msgstr "" #: ../setuppagehamlib.cpp:111 msgctxt "SetupPageHamLib|" msgid "5 bits" msgstr "" #: ../setuppagehamlib.cpp:111 msgctxt "SetupPageHamLib|" msgid "6 bits" msgstr "" #: ../setuppagehamlib.cpp:111 msgctxt "SetupPageHamLib|" msgid "7 bits" msgstr "" #: ../setuppagehamlib.cpp:111 msgctxt "SetupPageHamLib|" msgid "8 bits" msgstr "" #: ../setuppagehamlib.cpp:113 msgctxt "SetupPageHamLib|" msgid "Data bits" msgstr "" #: ../setuppagehamlib.cpp:115 msgctxt "SetupPageHamLib|" msgid "Select the serial data bits." msgstr "" #: ../setuppagehamlib.cpp:121 msgctxt "SetupPageHamLib|" msgid "None" msgstr "" #: ../setuppagehamlib.cpp:121 msgctxt "SetupPageHamLib|" msgid "Hardware" msgstr "" #: ../setuppagehamlib.cpp:121 msgctxt "SetupPageHamLib|" msgid "Software XON/XOFF" msgstr "" #: ../setuppagehamlib.cpp:123 msgctxt "SetupPageHamLib|" msgid "Flow control" msgstr "" #: ../setuppagehamlib.cpp:125 msgctxt "SetupPageHamLib|" msgid "Select the serial flow control" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "No parity" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "Even" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "Odd" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "Space" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "Mark" msgstr "" #: ../setuppagehamlib.cpp:133 msgctxt "SetupPageHamLib|" msgid "Parity" msgstr "" #: ../setuppagehamlib.cpp:135 msgctxt "SetupPageHamLib|" msgid "Select the serial parity." msgstr "" #: ../setuppagehamlib.cpp:142 msgctxt "SetupPageHamLib|" msgid "1 bit" msgstr "" #: ../setuppagehamlib.cpp:142 msgctxt "SetupPageHamLib|" msgid "1.5 bits" msgstr "" #: ../setuppagehamlib.cpp:142 msgctxt "SetupPageHamLib|" msgid "2 bits" msgstr "" #: ../setuppagehamlib.cpp:144 msgctxt "SetupPageHamLib|" msgid "Stop bits" msgstr "" #: ../setuppagehamlib.cpp:146 msgctxt "SetupPageHamLib|" msgid "Select the serial stop bits." msgstr "" #: ../setuppagelogs.cpp:70 msgctxt "SetupPageLogs|" msgid "&New" msgstr "" #: ../setuppagelogs.cpp:71 msgctxt "SetupPageLogs|" msgid "&Edit" msgstr "" #: ../setuppagelogs.cpp:72 msgctxt "SetupPageLogs|" msgid "&Remove" msgstr "" #: ../setuppagelogs.cpp:75 msgctxt "SetupPageLogs|" msgid "Add a new log." msgstr "" #: ../setuppagelogs.cpp:79 msgctxt "SetupPageLogs|" msgid "Edit the selected log." msgstr "" #: ../setuppagelogs.cpp:80 msgctxt "SetupPageLogs|" msgid "Remove the selected log." msgstr "" #: ../setuppagelogs.cpp:82 msgctxt "SetupPageLogs|" msgid "Select the log you want to open." msgstr "" #: ../setuppagelogs.cpp:219 msgctxt "SetupPageLogs|" msgid "KLog" msgstr "" #: ../setuppagelogs.cpp:220 msgctxt "SetupPageLogs|" msgid "Do you really want to remove this log?" msgstr "" #: ../setuppagelogs.cpp:221 msgctxt "SetupPageLogs|" msgid "All the QSOs from this log will be also deleted..." msgstr "" #: ../setuppagelogs.cpp:253 msgctxt "SetupPageLogs|" msgid "Log has not been removed. (#3)" msgstr "" #: ../setuppagelogs.cpp:260 msgctxt "SetupPageLogs|" msgid "Log has not been removed. (#2)" msgstr "" #: ../setuppagelogs.cpp:267 msgctxt "SetupPageLogs|" msgid "Log has not been removed. (#1)" msgstr "" #: ../setuppagelogs.cpp:327 msgctxt "SetupPageLogs|" msgid "ID" msgstr "" #: ../setuppagelogs.cpp:330 msgctxt "SetupPageLogs|" msgid "Date" msgstr "" #: ../setuppagelogs.cpp:333 msgctxt "SetupPageLogs|" msgid "Station Callsign" msgstr "" #: ../setuppagelogs.cpp:336 msgctxt "SetupPageLogs|" msgid "Operators" msgstr "" #: ../setuppagelogs.cpp:339 msgctxt "SetupPageLogs|" msgid "Comments" msgstr "" #: ../setuppagelogs.cpp:342 msgctxt "SetupPageLogs|" msgid "Type" msgstr "" #: ../setuppagelogs.cpp:649 msgctxt "SetupPageLogs|" msgid "An error has occurred showing the following error code:" msgstr "" #: ../setuppagelogs.cpp:652 msgctxt "SetupPageLogs|" msgid "KLog - SetupPageLogs" msgstr "" #: ../setuppagelogsnew.cpp:92 msgctxt "SetupPageLogsNew|" msgid "&Date" msgstr "" #: ../setuppagelogsnew.cpp:93 msgctxt "SetupPageLogsNew|" msgid "&Station Callsign" msgstr "" #: ../setuppagelogsnew.cpp:94 msgctxt "SetupPageLogsNew|" msgid "&Operators" msgstr "" #: ../setuppagelogsnew.cpp:95 msgctxt "SetupPageLogsNew|" msgid "Comm&ent" msgstr "" #: ../setuppagelogsnew.cpp:97 msgctxt "SetupPageLogsNew|" msgid "&Ok" msgstr "" #: ../setuppagelogsnew.cpp:98 msgctxt "SetupPageLogsNew|" msgid "&Cancel" msgstr "" #: ../setuppagelogsnew.cpp:155 msgctxt "SetupPageLogsNew|" msgid "Select categories" msgstr "" #: ../setuppagelogsnew.cpp:159 msgctxt "SetupPageLogsNew|" msgid "Callsign used for this log." msgstr "" #: ../setuppagelogsnew.cpp:160 msgctxt "SetupPageLogsNew|" msgid "Comma separated list of operators: callsign1, callsign2." msgstr "" #: ../setuppagelogsnew.cpp:162 msgctxt "SetupPageLogsNew|" msgid "Start date of this log." msgstr "" #: ../setuppagelogsnew.cpp:163 msgctxt "SetupPageLogsNew|" msgid "Add a comment about this log." msgstr "" #: ../setuppagelogsnew.cpp:165 msgctxt "SetupPageLogsNew|" msgid "&Type of Operation" msgstr "" #: ../setuppagelogsnew.cpp:172 msgctxt "SetupPageLogsNew|" msgid "Select the kind of operation for this log." msgstr "" #: ../setuppagelogsnew.cpp:179 msgctxt "SetupPageLogsNew|" msgid "&Mode Category" msgstr "" #: ../setuppagelogsnew.cpp:181 msgctxt "SetupPageLogsNew|" msgid "Select the mode category." msgstr "" #: ../setuppagelogsnew.cpp:187 msgctxt "SetupPageLogsNew|" msgid "O&perators Category" msgstr "" #: ../setuppagelogsnew.cpp:189 msgctxt "SetupPageLogsNew|" msgid "Select the operators category." msgstr "" #: ../setuppagelogsnew.cpp:194 msgctxt "SetupPageLogsNew|" msgid "&Assisted Category" msgstr "" #: ../setuppagelogsnew.cpp:196 msgctxt "SetupPageLogsNew|" msgid "Select the assisted category." msgstr "" #: ../setuppagelogsnew.cpp:202 msgctxt "SetupPageLogsNew|" msgid "Po&wer Category" msgstr "" #: ../setuppagelogsnew.cpp:204 msgctxt "SetupPageLogsNew|" msgid "Select the power category." msgstr "" #: ../setuppagelogsnew.cpp:210 msgctxt "SetupPageLogsNew|" msgid "&Bands Category" msgstr "" #: ../setuppagelogsnew.cpp:212 msgctxt "SetupPageLogsNew|" msgid "Select the bands category." msgstr "" #: ../setuppagelogsnew.cpp:217 msgctxt "SetupPageLogsNew|" msgid "O&verlay" msgstr "" #: ../setuppagelogsnew.cpp:219 msgctxt "SetupPageLogsNew|" msgid "Select the Overlay category." msgstr "" #: ../setuppagelogsnew.cpp:380 ../setuppagelogsnew.cpp:933 msgctxt "SetupPageLogsNew|" msgid "Categories not OK" msgstr "" #: ../setuppagelogsnew.cpp:577 msgctxt "SetupPageLogsNew|" msgid "" "You need to enter a valid QRZ in the Station Callsign box.\n" "The log will not be opened." msgstr "" #: ../setuppagelogsnew.cpp:688 msgctxt "SetupPageLogsNew|" msgid "" "You selected an invalid combination.\n" "The log will not be opened." msgstr "" #: ../setuppagelogsnew.cpp:925 msgctxt "SetupPageLogsNew|" msgid "Categories OK" msgstr "" #: ../setuppagemisc.cpp:38 msgctxt "SetupPageMisc|" msgid "&Imperial system" msgstr "" #: ../setuppagemisc.cpp:39 msgctxt "SetupPageMisc|" msgid "&Log in real time" msgstr "" #: ../setuppagemisc.cpp:40 msgctxt "SetupPageMisc|" msgid "&Time in UTC" msgstr "" #: ../setuppagemisc.cpp:41 msgctxt "SetupPageMisc|" msgid "&Save ADIF on exit" msgstr "" #: ../setuppagemisc.cpp:42 msgctxt "SetupPageMisc|" msgid "Use this &default filename" msgstr "" #: ../setuppagemisc.cpp:43 msgctxt "SetupPageMisc|" msgid "Mark &QSO to send QSL when QSL is received" msgstr "" #: ../setuppagemisc.cpp:44 msgctxt "SetupPageMisc|" msgid "Complete QSO with previous data" msgstr "" #: ../setuppagemisc.cpp:45 msgctxt "SetupPageMisc|" msgid "Show the Station &Callsign used in the search box" msgstr "" #: ../setuppagemisc.cpp:46 msgctxt "SetupPageMisc|" msgid "&Reset to My Data for all QSOs" msgstr "" #: ../setuppagemisc.cpp:47 msgctxt "SetupPageMisc|" msgid "&Check for new versions automatically" msgstr "" #: ../setuppagemisc.cpp:48 msgctxt "SetupPageMisc|" msgid "&Provide Info for statistics" msgstr "" #: ../setuppagemisc.cpp:49 msgctxt "SetupPageMisc|" msgid "Manage DX-Marathon" msgstr "" #: ../setuppagemisc.cpp:54 ../setuppagemisc.cpp:55 msgctxt "SetupPageMisc|" msgid "Browse" msgstr "" #: ../setuppagemisc.cpp:56 msgctxt "SetupPageMisc|" msgid "Move DB" msgstr "" #: ../setuppagemisc.cpp:116 msgctxt "SetupPageMisc|" msgid "" "QSOs will be marked as pending to send a QSL if you receive the DX QSL and " "have not sent yours." msgstr "" #: ../setuppagemisc.cpp:117 msgctxt "SetupPageMisc|" msgid "The search box will show also the callsign on the air to do the QSO." msgstr "" #: ../setuppagemisc.cpp:118 msgctxt "SetupPageMisc|" msgid "" "All the data from the My Data tab will be used or data from the previous QSO " "will be maintained." msgstr "" #: ../setuppagemisc.cpp:119 msgctxt "SetupPageMisc|" msgid "" "Check if there is a new release of KLog available every time you start KLog." msgstr "" #: ../setuppagemisc.cpp:120 msgctxt "SetupPageMisc|" msgid "" "If new version checking is selected, KLog will send the developer your " "callsign, KLog version & Operating system to help in improving KLog." msgstr "" #: ../setuppagemisc.cpp:121 msgctxt "SetupPageMisc|" msgid "Check it for Imperial system (Miles instead of Kilometers)." msgstr "" #: ../setuppagemisc.cpp:122 msgctxt "SetupPageMisc|" msgid "Select to use real time." msgstr "" #: ../setuppagemisc.cpp:123 msgctxt "SetupPageMisc|" msgid "Select to use UTC time." msgstr "" #: ../setuppagemisc.cpp:124 msgctxt "SetupPageMisc|" msgid "Select if you want to save to ADIF on exit." msgstr "" #: ../setuppagemisc.cpp:125 msgctxt "SetupPageMisc|" msgid "" "Select to use the following name for the logfile without being asked for it " "again." msgstr "" #: ../setuppagemisc.cpp:126 msgctxt "SetupPageMisc|" msgid "Complete the current QSO with previous QSO data." msgstr "" #: ../setuppagemisc.cpp:127 msgctxt "SetupPageMisc|" msgid "Select if you want to manage DX-Marathon." msgstr "" #: ../setuppagemisc.cpp:128 msgctxt "SetupPageMisc|" msgid "This is the default file where ADIF data will be saved." msgstr "" #: ../setuppagemisc.cpp:129 msgctxt "SetupPageMisc|" msgid "This is the directory where the database (logbook.dat) will be saved." msgstr "" #: ../setuppagemisc.cpp:130 msgctxt "SetupPageMisc|" msgid "Click to change the default ADIF file." msgstr "" #: ../setuppagemisc.cpp:131 msgctxt "SetupPageMisc|" msgid "Click to change the path of the database." msgstr "" #: ../setuppagemisc.cpp:132 msgctxt "SetupPageMisc|" msgid "Click to move the DB to the new directory." msgstr "" #: ../setuppagemisc.cpp:274 msgctxt "SetupPageMisc|" msgid "Open File" msgstr "" #: ../setuppagemisc.cpp:602 msgctxt "SetupPageMisc|" msgid "Select Directory" msgstr "" #: ../setuppagemisc.cpp:633 msgctxt "SetupPageMisc|" msgid "This is the directory where DB (logbook.dat) will be saved." msgstr "" #: ../setuppagemisc.cpp:639 msgctxt "SetupPageMisc|" msgid "" "Please specify an existing directory where the database (logbook.dat) will " "be saved." msgstr "" #: ../setuppagemisc.cpp:674 msgctxt "SetupPageMisc|" msgid "File moved" msgstr "" #: ../setuppagemisc.cpp:684 msgctxt "SetupPageMisc|" msgid "File copied" msgstr "" #: ../setuppagemisc.cpp:694 msgctxt "SetupPageMisc|" msgid "File NOT copied" msgstr "" #: ../setuppagemisc.cpp:707 msgctxt "SetupPageMisc|" msgid "" "The target directory does not exist. Please select an existing directory." msgstr "" #: ../setuppagesats.cpp:64 msgctxt "SetupPageSats|" msgid "&New" msgstr "" #: ../setuppagesats.cpp:65 msgctxt "SetupPageSats|" msgid "&Edit" msgstr "" #: ../setuppagesats.cpp:66 msgctxt "SetupPageSats|" msgid "&Remove" msgstr "" #: ../setuppagesats.cpp:67 msgctxt "SetupPageSats|" msgid "&Import" msgstr "" #: ../setuppagesats.cpp:68 msgctxt "SetupPageSats|" msgid "E&xport" msgstr "" #: ../setuppagesats.cpp:70 msgctxt "SetupPageSats|" msgid "Add a new satellite." msgstr "" #: ../setuppagesats.cpp:71 msgctxt "SetupPageSats|" msgid "Edit the selected satellite." msgstr "" #: ../setuppagesats.cpp:72 msgctxt "SetupPageSats|" msgid "Remove the selected satellite." msgstr "" #: ../setuppagesats.cpp:73 msgctxt "SetupPageSats|" msgid "" "Import a satellites file. It will replace the satellites you have now " "configured." msgstr "" #: ../setuppagesats.cpp:74 msgctxt "SetupPageSats|" msgid "Export your current satellites to a file." msgstr "" #: ../setuppagesats.cpp:76 msgctxt "SetupPageSats|" msgid "Select the sat you want to open." msgstr "" #: ../setuppagesats.cpp:210 msgctxt "SetupPageSats|" msgid "KLog" msgstr "" #: ../setuppagesats.cpp:211 msgctxt "SetupPageSats|" msgid "Do you really want to remove this satellite?" msgstr "" #: ../setuppagesats.cpp:212 msgctxt "SetupPageSats|" msgid "This satellite will not be longer available to be selected ..." msgstr "" #: ../setuppagesats.cpp:244 msgctxt "SetupPageSats|" msgid "Sat has not been removed. (#3)" msgstr "" #: ../setuppagesats.cpp:251 msgctxt "SetupPageSats|" msgid "Sat has not been removed. (#2)" msgstr "" #: ../setuppagesats.cpp:258 msgctxt "SetupPageSats|" msgid "Sat has not been removed. (#1)" msgstr "" #: ../setuppagesats.cpp:318 msgctxt "SetupPageSats|" msgid "ID" msgstr "" #: ../setuppagesats.cpp:321 msgctxt "SetupPageSats|" msgid "Short" msgstr "" #: ../setuppagesats.cpp:324 msgctxt "SetupPageSats|" msgid "Name" msgstr "" #: ../setuppagesats.cpp:327 msgctxt "SetupPageSats|" msgid "Uplink" msgstr "" #: ../setuppagesats.cpp:330 msgctxt "SetupPageSats|" msgid "Downlink" msgstr "" #: ../setuppagesats.cpp:333 msgctxt "SetupPageSats|" msgid "Modes" msgstr "" #: ../setuppagesats.cpp:571 msgctxt "SetupPageSats|" msgid "An error has occurred showing the following error code:" msgstr "" #: ../setuppagesats.cpp:574 msgctxt "SetupPageSats|" msgid "KLog - SetupPageSats" msgstr "" #: ../setuppagesats.cpp:584 msgctxt "SetupPageSats|" msgid "Open Satellites File" msgstr "" #: ../setuppagesats.cpp:603 msgctxt "SetupPageSats|" msgid "KLog warning" msgstr "" #: ../setuppagesats.cpp:605 msgctxt "SetupPageSats|" msgid "" "An unexpected error ocurred while importing the satellite data.\n" "\n" "It may be caused because the file you are trying to import does not have the " "right format." msgstr "" #: ../setuppagesats.cpp:608 msgctxt "SetupPageSats|" msgid "" "Please check the format or contact the developer for analysis with the error " "code: " msgstr "" #: ../setuppagesats.cpp:675 msgctxt "SetupPageSats|" msgid "Save Satellites File" msgstr "" #: ../setuppagesatsnew.cpp:46 msgctxt "SetupPageSatsNew|" msgid "Short name" msgstr "" #: ../setuppagesatsnew.cpp:47 msgctxt "SetupPageSatsNew|" msgid "Sat name" msgstr "" #: ../setuppagesatsnew.cpp:48 msgctxt "SetupPageSatsNew|" msgid "UpLink" msgstr "" #: ../setuppagesatsnew.cpp:49 msgctxt "SetupPageSatsNew|" msgid "DownLink" msgstr "" #: ../setuppagesatsnew.cpp:50 msgctxt "SetupPageSatsNew|" msgid "Modes" msgstr "" #: ../setuppagesatsnew.cpp:56 msgctxt "SetupPageSatsNew|" msgid "&Ok" msgstr "" #: ../setuppagesatsnew.cpp:57 msgctxt "SetupPageSatsNew|" msgid "&Cancel" msgstr "" #: ../setuppagesatsnew.cpp:103 msgctxt "SetupPageSatsNew|" msgid "" "Enter the short name. Try to use the LoTW short name so you can upload your " "QSO to LoTW afterwards." msgstr "" #: ../setuppagesatsnew.cpp:104 msgctxt "SetupPageSatsNew|" msgid "Enter the name of the satellite." msgstr "" #: ../setuppagesatsnew.cpp:105 msgctxt "SetupPageSatsNew|" msgid "Enter the uplink frequencies in this format: 144.300" msgstr "" #: ../setuppagesatsnew.cpp:106 msgctxt "SetupPageSatsNew|" msgid "Enter the downlink frequencies in this format: 144.300" msgstr "" #: ../setuppagesatsnew.cpp:107 msgctxt "SetupPageSatsNew|" msgid "Enter the modes in this format: USB" msgstr "" #: ../setuppagesatsnew.cpp:385 msgctxt "SetupPageSatsNew|" msgid "" "Some of the data you have entered is not correct, the satellite can't be " "added." msgstr "" #: ../setuppageudp.cpp:10 msgctxt "SetupPageUDP|" msgid "Start UDP Server" msgstr "" #: ../setuppageudp.cpp:33 msgctxt "SetupPageUDP|" msgid "Log automatically QSOs from WSJT-X" msgstr "" #: ../setuppageudp.cpp:34 msgctxt "SetupPageUDP|" msgid "Allow WSJT-X to send logged QSO to KLog" msgstr "" #: ../setuppageudp.cpp:35 #, qt-format msgctxt "SetupPageUDP|" msgid "" "QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging " "into KLog unless \"%1\" is selected" msgstr "" #: ../setuppageudp.cpp:38 msgctxt "SetupPageUDP|" msgid "" "KLog will log automatically any QSO coming from WSJT-X without any manual " "confirmation." msgstr "" #: ../setuppageudp.cpp:41 msgctxt "SetupPageUDP|" msgid "Receive and Update QSO data to KLog" msgstr "" #: ../setuppageudp.cpp:42 msgctxt "SetupPageUDP|" msgid "" "KLog will automatically show and update data coming from WSJT-X (DX " "callsign, locator, RPT, ...)" msgstr "" #: ../setuppageudp.cpp:58 msgctxt "SetupPageUDP|" msgid "UDP port number where the UDP Server will listen for packets." msgstr "" #: ../setuppageudp.cpp:58 msgctxt "SetupPageUDP|" msgid "" "Make sure it is the same port where the other programs are sending the data " "to. Default port is 2237." msgstr "" #: ../setuppageudp.cpp:59 msgctxt "SetupPageUDP|" msgid "" "UDP Server will receive QSOs sent from other programs like WSJT-X allowing " "you to log in KLog automatically from those programs." msgstr "" #: ../setuppageudp.cpp:65 msgctxt "SetupPageUDP|" msgid "UDP Port" msgstr "" #: ../setuppageudp.cpp:78 msgctxt "SetupPageUDP|" msgid "QSO notification timeout (milisecs)" msgstr "" #: ../setuppageudp.cpp:79 msgctxt "SetupPageUDP|" msgid "" "Milliseconds that the notification of QSO received from WSJTX will be shown." msgstr "" #: ../setuppageuserdata.cpp:40 msgctxt "SetupPageUserDataPage|" msgid "&Personal data" msgstr "" #: ../setuppageuserdata.cpp:41 msgctxt "SetupPageUserDataPage|" msgid "Station &data" msgstr "" #: ../setuppageuserdata.cpp:70 msgctxt "SetupPageUserDataPage|" msgid "Enter your name." msgstr "" #: ../setuppageuserdata.cpp:71 msgctxt "SetupPageUserDataPage|" msgid "Enter your address - 1st line." msgstr "" #: ../setuppageuserdata.cpp:72 msgctxt "SetupPageUserDataPage|" msgid "Enter your address - 2nd line." msgstr "" #: ../setuppageuserdata.cpp:73 msgctxt "SetupPageUserDataPage|" msgid "Enter your address - 3rd line." msgstr "" #: ../setuppageuserdata.cpp:74 msgctxt "SetupPageUserDataPage|" msgid "Enter your address - 4th line." msgstr "" #: ../setuppageuserdata.cpp:75 msgctxt "SetupPageUserDataPage|" msgid "Enter your city." msgstr "" #: ../setuppageuserdata.cpp:76 msgctxt "SetupPageUserDataPage|" msgid "Enter your zip code." msgstr "" #: ../setuppageuserdata.cpp:77 msgctxt "SetupPageUserDataPage|" msgid "Enter your province or state." msgstr "" #: ../setuppageuserdata.cpp:78 msgctxt "SetupPageUserDataPage|" msgid "Enter your country." msgstr "" #: ../setuppageuserdata.cpp:80 msgctxt "SetupPageUserDataPage|" msgid "&Name" msgstr "" #: ../setuppageuserdata.cpp:81 msgctxt "SetupPageUserDataPage|" msgid "&Address" msgstr "" #: ../setuppageuserdata.cpp:82 msgctxt "SetupPageUserDataPage|" msgid "Cit&y" msgstr "" #: ../setuppageuserdata.cpp:83 msgctxt "SetupPageUserDataPage|" msgid "&Zip Code" msgstr "" #: ../setuppageuserdata.cpp:84 msgctxt "SetupPageUserDataPage|" msgid "Pro&v/State" msgstr "" #: ../setuppageuserdata.cpp:85 msgctxt "SetupPageUserDataPage|" msgid "Countr&y" msgstr "" #: ../setuppageuserdata.cpp:139 ../setuppageuserdata.cpp:140 #: ../setuppageuserdata.cpp:141 msgctxt "SetupPageUserDataPage|" msgid "Enter your information for rig" msgstr "" #: ../setuppageuserdata.cpp:142 ../setuppageuserdata.cpp:143 #: ../setuppageuserdata.cpp:144 msgctxt "SetupPageUserDataPage|" msgid "Enter your information for antenna" msgstr "" #: ../setuppageuserdata.cpp:145 msgctxt "SetupPageUserDataPage|" msgid "Enter your power information." msgstr "" #: ../setuppageuserdata.cpp:147 msgctxt "SetupPageUserDataPage|" msgid "&Rig 1" msgstr "" #: ../setuppageuserdata.cpp:148 msgctxt "SetupPageUserDataPage|" msgid "R&ig 2" msgstr "" #: ../setuppageuserdata.cpp:149 msgctxt "SetupPageUserDataPage|" msgid "Ri&g 3" msgstr "" #: ../setuppageuserdata.cpp:150 msgctxt "SetupPageUserDataPage|" msgid "Antenna &1" msgstr "" #: ../setuppageuserdata.cpp:151 msgctxt "SetupPageUserDataPage|" msgid "Antenna &2" msgstr "" #: ../setuppageuserdata.cpp:152 msgctxt "SetupPageUserDataPage|" msgid "Antenna &3" msgstr "" #: ../setuppageuserdata.cpp:153 msgctxt "SetupPageUserDataPage|" msgid "Po&wer" msgstr "" #: ../setuppageuserdata.cpp:186 msgctxt "SetupPageUserDataPage|" msgid "Enter the station callsign that will be used for logging." msgstr "" #: ../setuppageuserdata.cpp:187 msgctxt "SetupPageUserDataPage|" msgid "Enter the operators (comma separated if more than one)." msgstr "" #: ../setuppageuserdata.cpp:188 msgctxt "SetupPageUserDataPage|" msgid "" "Enter the locator of your station. Alternatively, KLog can use an " "approximate locator based on your callsign." msgstr "" #: ../setuppageuserdata.cpp:191 msgctxt "SetupPageUserDataPage|" msgid "&QRZ" msgstr "" #: ../setuppageuserdata.cpp:192 msgctxt "SetupPageUserDataPage|" msgid "&Operators" msgstr "" #: ../setuppageuserdata.cpp:193 msgctxt "SetupPageUserDataPage|" msgid "&CQ Zone" msgstr "" #: ../setuppageuserdata.cpp:194 msgctxt "SetupPageUserDataPage|" msgid "&ITU Zone" msgstr "" #: ../setuppageuserdata.cpp:195 ../setuppageuserdata.cpp:374 msgctxt "SetupPageUserDataPage|" msgid "&Locator" msgstr "" #: ../setuppageuserdata.cpp:370 msgctxt "SetupPageUserDataPage|" msgid "&Locator (not valid)" msgstr "" #: ../setuppageworldeditor.cpp:32 msgctxt "SetupPageWorldEditor|" msgid "Add" msgstr "" #: ../setuppageworldeditor.cpp:33 msgctxt "SetupPageWorldEditor|" msgid "Delete" msgstr "" #: ../setuppageworldeditor.cpp:34 msgctxt "SetupPageWorldEditor|" msgid "Edit" msgstr "" #: ../setuppageworldeditor.cpp:36 msgctxt "SetupPageWorldEditor|" msgid "Export World" msgstr "" #: ../setuppageworldeditor.cpp:37 msgctxt "SetupPageWorldEditor|" msgid "Import World" msgstr "" #: ../setuppageworldeditor.cpp:43 ../setuppageworldeditor.cpp:44 #: ../setuppageworldeditor.cpp:45 ../setuppageworldeditor.cpp:49 msgctxt "SetupPageWorldEditor|" msgid "Still not implemented." msgstr "" #: ../setuppageworldeditor.cpp:50 msgctxt "SetupPageWorldEditor|" msgid "Import a new cty.csv file" msgstr "" #: ../setuppageworldeditor.cpp:88 msgctxt "SetupPageWorldEditor|" msgid "" "An entities information file (cty.csv) has been detected in your KLog folder " "and will be loaded." msgstr "" #: ../setuppageworldeditor.cpp:97 msgctxt "SetupPageWorldEditor|" msgid "" "No entities information file (cty.csv) has been detected in your KLog folder." msgstr "" #: ../setuppageworldeditor.cpp:98 msgctxt "SetupPageWorldEditor|" msgid "KLog will not be able to show entities information." msgstr "" #: ../setuppageworldeditor.cpp:184 msgctxt "SetupPageWorldEditor|" msgid "Prefix" msgstr "" #: ../setuppageworldeditor.cpp:186 msgctxt "SetupPageWorldEditor|" msgid "Entity" msgstr "" #: ../setuppageworldeditor.cpp:188 msgctxt "SetupPageWorldEditor|" msgid "ARRL ID" msgstr "" #: ../setuppageworldeditor.cpp:190 msgctxt "SetupPageWorldEditor|" msgid "Continent" msgstr "" #: ../setuppageworldeditor.cpp:192 msgctxt "SetupPageWorldEditor|" msgid "CQ Zone" msgstr "" #: ../setuppageworldeditor.cpp:194 msgctxt "SetupPageWorldEditor|" msgid "ITU Zone" msgstr "" #: ../setuppageworldeditor.cpp:196 msgctxt "SetupPageWorldEditor|" msgid "UTC" msgstr "" #: ../setuppageworldeditor.cpp:198 msgctxt "SetupPageWorldEditor|" msgid "Latitude" msgstr "" #: ../setuppageworldeditor.cpp:200 msgctxt "SetupPageWorldEditor|" msgid "Longitude" msgstr "" #: ../setuppageworldeditor.cpp:203 msgctxt "SetupPageWorldEditor|" msgid "Deleted" msgstr "" #: ../setuppageworldeditor.cpp:206 msgctxt "SetupPageWorldEditor|" msgid "Since Date" msgstr "" #: ../setuppageworldeditor.cpp:208 msgctxt "SetupPageWorldEditor|" msgid "To Date" msgstr "" #: ../setuppageworldeditor.cpp:302 msgctxt "SetupPageWorldEditor|" msgid "Open File" msgstr "" #: ../setuppageworldeditor.cpp:302 msgctxt "SetupPageWorldEditor|" msgid "BigCTY (*.csv)" msgstr "" #: ../setuppageworldeditor.cpp:311 msgctxt "SetupPageWorldEditor|" msgid "Entities information has been updated." msgstr "" #: ../setuppageworldeditor.cpp:317 msgctxt "SetupPageWorldEditor|" msgid "Entities information has not been updated." msgstr "" #: ../showerrordialog.cpp:9 msgctxt "ShowErrorDialog|" msgid "KLog Message" msgstr "" #: ../softwareupdatedialog.cpp:17 msgctxt "SoftwareUpdateDialog|" msgid "Ok" msgstr "" #: ../softwareupdatedialog.cpp:35 msgctxt "SoftwareUpdateDialog|" msgid "KLog update" msgstr "" #: ../softwareupdatedialog.cpp:53 msgctxt "SoftwareUpdateDialog|" msgid "Congratulations!" msgstr "" #: ../softwareupdatedialog.cpp:53 msgctxt "SoftwareUpdateDialog|" msgid "Your KLog has been updated." msgstr "" #: ../softwareupdatedialog.cpp:53 msgctxt "SoftwareUpdateDialog|" msgid "You already have the latest version." msgstr "" #: ../startwizard.cpp:42 msgctxt "StartWizard|" msgid "KLog - The free hamradio logging program" msgstr "" #: ../startwizard.cpp:68 msgctxt "StartWizard|" msgid "Quit Setup" msgstr "" #: ../startwizard.cpp:68 msgctxt "StartWizard|" msgid "Setup is not complete yet. Are you sure you want to quit setup?" msgstr "" #: ../statisticswidget.cpp:79 msgctxt "StatisticsWidget|" msgid "QSO per year" msgstr "" #: ../statisticswidget.cpp:80 msgctxt "StatisticsWidget|" msgid "DXCC per year" msgstr "" #: ../statisticswidget.cpp:81 msgctxt "StatisticsWidget|" msgid "CQ zones per year" msgstr "" #: ../statisticswidget.cpp:82 msgctxt "StatisticsWidget|" msgid "QSO per band" msgstr "" #: ../statisticswidget.cpp:83 msgctxt "StatisticsWidget|" msgid "QSO per mode" msgstr "" #: ../statisticswidget.cpp:84 msgctxt "StatisticsWidget|" msgid "QSO per DXCC" msgstr "" #: ../statisticswidget.cpp:85 msgctxt "StatisticsWidget|" msgid "QSO per Continent" msgstr "" #: ../statisticswidget.cpp:86 msgctxt "StatisticsWidget|" msgid "QSO per hour" msgstr "" #: ../statisticswidget.cpp:87 msgctxt "StatisticsWidget|" msgid "QSO per month" msgstr "" #: ../statisticswidget.cpp:88 msgctxt "StatisticsWidget|" msgid "Worked / Confirmed status" msgstr "" #: ../statisticswidget.cpp:89 msgctxt "StatisticsWidget|" msgid "Worked / Sent status" msgstr "" #: ../statisticswidget.cpp:90 msgctxt "StatisticsWidget|" msgid "Sent / Confirmed status" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:47 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "CQ Zones per year" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:51 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:51 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:56 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "CQ zones" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:57 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "CQ zones per year" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:69 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:69 #, qt-format msgctxt "StatsCQZPerYearBarChartWidget|" msgid "Years: %1/%2" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:47 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Chart title" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:51 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:51 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:57 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "DXCC Entities" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:58 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "DXCC Entities per year" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:66 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:66 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Entities: " msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:47 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "QSOs per band" msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:51 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:51 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:56 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Bands" msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:57 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "QSO per band distribution" msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:67 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:67 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Bands: " msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:47 #: ../charts/statsqsospercontinentbarchartwidget.cpp:61 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "QSOs per continent" msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:51 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:51 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:60 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Continents" msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:70 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:70 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Hours: " msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:47 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "QSOs per DXCC" msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:51 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:51 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:53 #: ../charts/statsqsosperdxccbarchartwidget.cpp:96 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Reading data..." msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:96 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Entity: " msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:119 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "DXCC" msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:120 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Top ten DXCC per QSO" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:47 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "QSOs per hour" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:51 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:51 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:59 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Hours" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:60 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "QSOs at hour" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:70 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:70 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Hours: " msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:47 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "QSOs per mode" msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:51 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:51 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:56 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Modes" msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:57 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "QSO per mode distribution" msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:67 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:67 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Modes: " msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:47 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "QSOs per month" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:51 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:51 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Jan" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Feb" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Mar" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Apr" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "May" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Jun" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Jul" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Aug" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Sep" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Oct" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Nov" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Dec" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:59 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Months" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:60 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "QSOs at Month" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:70 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:70 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Months: " msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:47 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "Chart title" msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:51 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:51 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:56 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "QSOs" msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:57 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "QSOs per year" msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:68 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:68 #, qt-format msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "QSO: %1/%2" msgstr "" #: ../charts/statssentconfirmedpiechartwidget.cpp:39 #, qt-format msgctxt "StatsSentConfirmedPieChartWidget|" msgid "Sent - %1" msgstr "" #: ../charts/statssentconfirmedpiechartwidget.cpp:40 #, qt-format msgctxt "StatsSentConfirmedPieChartWidget|" msgid "Confirmed - %2" msgstr "" #: ../charts/statsworkedconfirmedpiechartwidget.cpp:39 #, qt-format msgctxt "StatsWorkedConfirmedPieChartWidget|" msgid "Worked, not confirmed - %1" msgstr "" #: ../charts/statsworkedconfirmedpiechartwidget.cpp:40 #, qt-format msgctxt "StatsWorkedConfirmedPieChartWidget|" msgid "Confirmed - %2" msgstr "" #: ../charts/statsworkedsentpiechartwidget.cpp:39 #, qt-format msgctxt "StatsWorkedSentPieChartWidget|" msgid "Worked - %1" msgstr "" #: ../charts/statsworkedsentpiechartwidget.cpp:40 #, qt-format msgctxt "StatsWorkedSentPieChartWidget|" msgid "Sent - %2" msgstr "" #: ../updatesatsdata.cpp:59 msgctxt "UpdateSatsData|" msgid "Reading Satellites data file..." msgstr "" #: ../updatesatsdata.cpp:59 msgctxt "UpdateSatsData|" msgid "Abort reading" msgstr "" #: ../updatesatsdata.cpp:213 msgctxt "UpdateSatsData|" msgid "The Satellites information has been updated." msgstr "" #: ../updatesatsdata.cpp:231 msgctxt "UpdateSatsData|" msgid "Open File" msgstr "" #: ../updatesatsdata.cpp:233 msgctxt "UpdateSatsData|" msgid "Sat Data" msgstr "" #: ../world.cpp:171 msgctxt "World|" msgid "Entity" msgstr "" #: ../world.cpp:172 msgctxt "World|" msgid "Continent" msgstr "" #: ../world.cpp:1199 msgctxt "World|" msgid "Reading cty.csv..." msgstr "" #: ../world.cpp:1199 msgctxt "World|" msgid "Abort reading" msgstr "" #: ../elogclublog.cpp:58 ../elogclublog.cpp:118 msgctxt "eLogClubLog|" msgid "Host not found!" msgstr "" #: ../elogclublog.cpp:64 ../elogclublog.cpp:123 msgctxt "eLogClubLog|" msgid "Timeout error!" msgstr "" #: ../elogclublog.cpp:70 msgctxt "eLogClubLog|" msgid "It seems to be a PASSWORD ERROR; check your password." msgstr "" #: ../elogclublog.cpp:72 msgctxt "eLogClubLog|" msgid "KLog - ClubLog" msgstr "" #: ../elogclublog.cpp:73 msgctxt "eLogClubLog|" msgid "It seems that your ClubLog password is not correct." msgstr "" #: ../elogclublog.cpp:74 msgctxt "eLogClubLog|" msgid "" "Please check your password in the setup. ClubLog uploads will be disabled." msgstr "" #: ../elogclublog.cpp:84 ../elogclublog.cpp:128 msgctxt "eLogClubLog|" msgid "Undefined error..." msgstr "" #: ../elogclublog.cpp:391 msgctxt "eLogClubLog|" msgid "Callsign missing" msgstr "" #: ../elogclublog.cpp:395 msgctxt "eLogClubLog|" msgid "Invalid callsign" msgstr "" #: ../elogclublog.cpp:399 msgctxt "eLogClubLog|" msgid "Skipping SWL callsign" msgstr "" #: ../elogclublog.cpp:403 msgctxt "eLogClubLog|" msgid "Callsign is your own call" msgstr "" #: ../elogclublog.cpp:407 msgctxt "eLogClubLog|" msgid "Invalid callsign with no DXCC mapping" msgstr "" #: ../elogclublog.cpp:411 msgctxt "eLogClubLog|" msgid "Updated QSO" msgstr "" #: ../elogclublog.cpp:415 msgctxt "eLogClubLog|" msgid "Invalid ADIF record" msgstr "" #: ../elogclublog.cpp:419 msgctxt "eLogClubLog|" msgid "Missing ADIF record" msgstr "" #: ../elogclublog.cpp:423 msgctxt "eLogClubLog|" msgid "Test mode - parameters ok, no action taken" msgstr "" #: ../elogclublog.cpp:427 msgctxt "eLogClubLog|" msgid "Excessive API Usage" msgstr "" #: ../elogclublog.cpp:431 msgctxt "eLogClubLog|" msgid "Internal Error" msgstr "" #: ../elogclublog.cpp:435 msgctxt "eLogClubLog|" msgid "Rejected" msgstr "" #: ../elogclublog.cpp:439 msgctxt "eLogClubLog|" msgid "QSO Duplicate" msgstr "" #: ../elogclublog.cpp:443 msgctxt "eLogClubLog|" msgid "QSO Modified" msgstr "" #: ../elogclublog.cpp:447 msgctxt "eLogClubLog|" msgid "Missing Login" msgstr "" #: ../elogclublog.cpp:451 msgctxt "eLogClubLog|" msgid "QSO OK" msgstr "" #: ../elogclublog.cpp:455 ../elogclublog.cpp:479 msgctxt "eLogClubLog|" msgid "Upload denied" msgstr "" #: ../elogclublog.cpp:459 msgctxt "eLogClubLog|" msgid "No callsign selected" msgstr "" #: ../elogclublog.cpp:463 msgctxt "eLogClubLog|" msgid "No match found" msgstr "" #: ../elogclublog.cpp:467 msgctxt "eLogClubLog|" msgid "Dropped QSO" msgstr "" #: ../elogclublog.cpp:471 msgctxt "eLogClubLog|" msgid "OK" msgstr "" #: ../elogclublog.cpp:475 msgctxt "eLogClubLog|" msgid "Login rejected" msgstr "" #: ../elogclublog.cpp:483 msgctxt "eLogClubLog|" msgid "Rejected: Callsign is your own call" msgstr "" klog-0.9.8.1/translations/klog_fi.ts0000644000175000017500000072732013532572307016330 0ustar develdevel AboutDialog About KLog Tietoja KLogista By Tekijä KLog is a free logbook for hamradio operators. KLog on ilmainen päiväkirja radioamatööreille. Please know that this is an BETA release and it may contain many bugs.<br>Backup your data before using this software! Huomaa, että tämä on BETA-julkaisu ja saattaa sisältää monia vikoja. <br>Varmuuskopioi omat tiedostot ennen tämän ohjelmiston käyttämistä! KLog has been fully rewritten from the 0.6.2 to be able to provide a cross-platform application that runs in the main operating systems (Linux, macOS & Windows) and provide new functionalities that KLog was not providing. KLog on tehty kokonaan uudelleen versiosta 0.6.2:sta, jotta voisimme tarjota järjestelmäriippumattoman sovelluksen, joka toimii tärkeimmissä käyttöjärjestelmissä (Linux, MacOS ja Windows), sekä uusia toimintoja, joita KLog ei aiemmin tarjonnut. Please provide your review in KLog's eHam review page: Anna arvostelusi KLogin eHam-arvostelusivulla: Find more information and the latest release at Lisätietoja ja viimeisin ohjelmistoversio löytyy osoitteesta Author Tekijä today tänään Main developer Pääkehittäjä KLog is developed by a very small team and you are invited to join! KLogia kehittää erittäin pieni ryhmä ihmisiä ja sinut on kutsuttu mukaan! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Mikäli KLogia ei vielä ole omalla kielelläsi ja haluat auttaa meitä, olet tervetullut ottamaan yhteyttä meihin käyttämällä <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog kehitystiimin postituslistaa</a>! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Voit auttaa meitä myös lähettämällä virheilmoituksia tai ohjelmointiapua, ideoita tai mitä vain, mikä mielestäsi voisi parantaa KLogia. If you want to provide support you are welcome to join the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Jos haluat antaa tukesi, olet tervetullut liittymään <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog kehitystiimin postituslistaan</a>! Authors Tekijät Translators bring KLog into your language. They are really an important part of the KLog development team. Kääntäjät tuovat KLogin kielellesi, ja he ovat todella tärkeä osa KLog-kehitystiimiä. Translators Kääntäjät Privacy advisory Tietosuojakäytäntö KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account user's needs KLog-kehittäjät ovat sisällyttäneet ominaisuuden, joka raportoi joitakin käyttäjätietoja KLog-palvelimelle, jonka ainoana tarkoituksena on tunnistaa asennetut versiot, jotta kehityksessä osataan keskittyä oikeaan suuntaan, käyttäjien tarpeet huomioiden At present, the data that is provided is the following: Tällä hetkellä toimitettavat tiedot ovat seuraavat: Callsign Kutsutunnus KLog version KLog versio Operating system Käyttöjärjestelmä Be aware that you can enable/disable this feature from the Misc tab in the Setup page Huomaa, että voit ottaa tämän ominaisuuden käyttöön tai poistaa sen käytöstä, Sekalaiset-välilehdellä, asetussivulla KLog KLog Privacy Tietosuoja CTYPage Country data download Maakohtaisten tietojen lataus KLog needs country data... KLog tarvitsee maakohtaiset tiedot... &Download &Lataa &Ignore &Ohita Country data needed Maakohtaiset tiedot tarvitaan KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC information. KLog käyttää cty.csv-tiedostoa osoitteesta http://www.country-files.com/ saadakseen DXCC-tiedot. You need to download the cty.csv file if you want KLog to show you the countries, locator, ... of the QSOs you do. Sinun on ladattava cty.csv-tiedosto, jos haluat, että KLog näyttää sinulle maat, lokaattorit, ... tekemillesi QSO:ille. Click on Download to download now. Napsauta Lataa ladataksesi nyt. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? En löydä palvelinta. Tarkista verkko ja yritä uudelleen Haluatko yrittää uudelleen? DXCCStatusWidget Update Päivitä ID ID Entity Yksikkö Pref: CQ: ITU: Beam: Entity not worked in this band. Ei työstetty tällä taajuusalueella DXClusterWidget Click on Connect to connect to the DX-Cluster server Napsauta yhdistä, kun haluat muodostaa yhteyden DX-klusteripalvelimeen Connect Yhdistä Clear Tyhjennä Click on connect to connect to the DX-Cluster Napsauta yhdistä muodostaaksesi yhteyden DX-klusteriin Trying to connect to the server Muodostetaan yhteyttä palvelimeen KLog DXCluster KLog DXKlusteri The host was not found. Please check: Isäntää ei löytynyt. Tarkista: - your network connection; - the host name and port settings. - verkkoyhteytesi; - isäntänimi ja porttiasetukset. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Yhteys vertaisverkkoon evättiin. Varmista, että DX Klusteripalvelin on käynnissä ja tarkista, että isäntänimi ja porttiasetukset ovat oikein. The following error occurred: %1. Tapahtui seuraava virhe: %1. Connected to server Yhdistetty palvelimeen KLog message KLog viesti Enter your callsign to connect to the cluster: Syötä kutsutunnuksesi liittyäksesi klusteriin: Enter your password to connect to the cluster: (Just hit enter for no password) Syötä salasanasi yhteyden muodostamiseksi klusteriin: (Paina enter jättääksesi salasanan tyhjäksi) Disconnect Katkaise yhteys Not logged on, you may need to enter your callsign again. Et ole kirjautunut sisään, sinun on ehkä annettava kutsutunnuksesi uudelleen. Enter here the commands to be sent to the DX-Cluster server. Syötä tähän komennot, jotka lähetetään DX-klusteripalvelimelle Connection closed by the server Palvelin katkaisi yhteyden Click on Connect to connect to the DX-Cluster server. Napsauta yhdistä, muodostaaksesi yhteyden DX-klusteriin Send Lähetä DataProxy_SQLite Software version in DB is null Ohjelmistoversio tietokannassa on tyhjä No query failed Kyselyt onnistuivat Aircraft Scatter Common term in hamradio, do not translate if not sure Lentokone Aurora Revontulet Aurora-E Revontuliheijastukset Back scatter Common term in hamradio, do not translate if not sure Takasironta Earth-Moon-Earth Maa-Kuu-Maa Sporadic E Satunnaisheijastukset Field Aligned Irregularities Common term in hamradio, do not translate if not sure Kenttäsuuntainen hajonta F2 Reflection Common term in hamradio, do not translate if not sure F2 Heijastus Internet-assisted Internet-avusteinen Ionoscatter Common term in hamradio, do not translate if not sure Ionosfäärisironta Meteor scatter Common term in hamradio, do not translate if not sure Meteorisironta Terrestrial or atmospheric repeater or transponder Maanpäällinen tai ilmakehässä oleva toistin tai transponderi Rain scatter Common term in hamradio, do not translate if not sure Sadesironta Satellite Satelliitti Trans-equatorial Common term in hamradio, do not translate if not sure Päiväntasaajan ylittävä Tropospheric ducting Common term in hamradio, do not translate if not sure Troposfäärikanavat Yes Kyllä No Ei Requested Pyydetty Ignore/Invalid Hylkää/Mitätön Validated Vahvistettu Queued Jonossa Uploaded Lähetetty Do not upload Älä lähetä Modified Muokattu Bureau Common term in hamradio, do not translate if not sure Bureau Direct Direct Electronic Elektrooninen Manager Common term in hamradio, do not translate if not sure Hallinta KLog DXCC KLog DXCC All QSOs have been updated with a DXCC and the Continent. Kaikki QSO:t on päivitetty DXCC:llä ja mantereella. DownLoadCTY Download of cty.csv failed with the following error code: cty.csv:n lataus epäonnistui virhekoodilla: Download of cty.csv done. cty.csv:n lataus valmis. There is already a cty.csv file in the folder but it will be replaced with the new one. Kansiossa on jo cty.csv-tiedosto, mutta se korvataan uudella. Could not open %1 for writing Ei voitu avata %1 kirjoittamista varten FileManager The log that you have selected contains more than just one station callsign. Valitsemasi loki sisältää enemmän kuin vain yhden aseman kutsutunnuksen. Please select the station callsign you want to export the log from: Valitse aseman kutsutunnus, jonka lokin haluat viedä: Station Callsign: Aseman kutsutunnus: Define Station Callsign Määritä aseman kutsutunnus You have selected no callsign. KLog will export QSOs without a station callsign defined and those with the call you are entering here. Et ole valinnut kutsutunnusta. KLog vie QSO:t ilman asetettua aseman kutsutunnusta ja ne, kutsulla jonka syötät tähän. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Syötä tässä lokissa käytettävä aseman kutsutunnus, tai jätä se tyhjäksi QSO:lle ilman määritettyä aseman kutsutunnusta: No station callsign has been selected and therefore no log will be exported Aseman kutsutunnusta ei ole valittu, joten lokia ei viedä Writing ADIF file... Kirjoitetaan ADIF-tiedostoa... Abort writing Keskeytä kirjoitus Exporting LoTW ADIF file... LoTW ADIF-tiedoston vienti... QSO: QSO: Writing ADIF file... QSO: Kirjoitetaan ADIF-tiedostoon... QSO: You have canceled the file export. The file will be removed and no data will be exported. Olet peruuttanut tiedoston viennin. Tiedosto poistetaan, eikä tietoja viedä. Do you still want to cancel? Haluatko varmasti peruuttaa? Writing Cabrillo file... Kirjoitetaan Cabrillo-tiedostoa... KLog: Cabrillo Log Export not implemented KLog: Cabrillo-lokin vientiä ei ole toteutettu I am sorry but the Cabrillo Export To File feature has still not been implemented. Olen pahoillani, mutta Cabrillo vienti tiedostoon -ominaisuutta ei ole vieläkään toteutettu. Reading LoTW file... Luetaan LoTW-tiedostoa... Abort reading Keskeytä lukeminen There is more than one log in this logfile. Tässä lokitiedostossa on enemmän kuin yksi loki. All logs will be imported into the current log. Kaikki lokit tuodaan nykyiseen lokiin. Do you want to continue? Haluatko jatkaa? Reading ADIF file... Luetaan ADIF-tiedostoa... Importing ADIF file... Tuodaan ADIF-tiedostoa... It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) ADIF-tiedostossa jota olet tuomassa, on päällekkäisiä QSO:ita. Haluatko jatkaa? (Duplikaatti QSO:ita ei tuoda) You have cancelled the file import. The file will be removed and no data will be imported. Olet peruuttanut tiedoston tuonnin. Tiedosto poistetaan, eikä tietoja tuoda. This QSO is not including the minimum data to consider a QSO as valid!. Tämä QSO ei sisällä vähimmäistietoja, jotta QSO:ta voidaan pitää oikeana! Please edit the ADIF file and make sure that it include at least: Muokkaa ADIF-tiedostoa ja varmista, että se sisältää ainakin: and ja This QSO had: Tässä QSO:ssa oli: - The band missing and the following call: - Taajuusalue puuttuu ja seuraava kutsu: - The call missing but was done at this time: - Kutsu puuttuu mutta toteutettiin tällä kertaa: - The mode missing and the following call: - Tila puuttuu ja seuraava kutsu: - The date missing and the following call: - Päiväys puuttuu ja seuraava kutsu: - The time missing and the following call: - Aika puuttuu ja seuraava kutsu: Do you want to continue with the current file? Haluatko jatkaa nykyisen tiedoston kanssa? KLog: Not all required data found! KLog: kaikkia vaadittavia tietoja ei löydetty! This log seems to lack of RST-TX information. Tästä lokista näyttää puuttuvan RST-TX-tieto. Click on Yes to add a default 59 to all QSO with a similar problem. Napsauta Kyllä, jos haluat lisätä oletusarvon 59 kaikille QSO:ille, joilla on vastaava ongelma. If you select NO, the QSO may not be imported. Jos valitset EI, QSO:ta ei ehkä tuoda. KLog: No RST TX found! KLog: RST TX:ää ei löydy! This log seems to lack of RST-RX information. Tästä lokista näyttää puuttuvan RST-RX-tieto. KLog: No RST RX found! KLog: RST RX:ää ei löydy! InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Manner Prefix Etuliite CQ CQ ITU ITU Short Path Lyhyt reitti Long Path Pitkä reitti Deg Astetta Miles Mailia Km Km IntroPage Welcome to KLog! Tervetuloa KLog:iin! Welcome to KLog! - brought to you under the terms of the GPL! Tervetuloa KLog:iin! - tuotu sinulle GPL:n ehtojen mukaisesti! Welcome to KLog Tervetuloa Klog:iin This looks like it's the first time you've run KLog on this computer. Näyttää siltä, että käynnistit KLog:in ensimmäistä kertaa tällä tietokoneella. KLog is a free hamradio logging program that can run on Linux macOS and Windows. KLog on ilmainen lokikirjaohjelma radioamatööreille, joka toimii Linuxissa, macOSissa ja Windowsissa. It is designed to provide general purpose, DX and contest logging. Se on suunniteltu tarjoamaan yleistä, sekä DX ja kilpailu -lokin pitoa. It supports QSL management, import and export of ADIF Se tarjoaa QSL hallintaa, sekä ADIF tuontia ja vientiä and Cabrillo file formats and many other features... ja Cabrillo-tiedostomuotoja, sekä paljon muita ominaisuuksia... Before you can start using KLog, you will be asked to: Ennen kuin voit aloittaa KLog:in käytön, sinua pyydetään: Acknowledge to the terms of the license. Hyväksymään lisenssin ehdot. Download the DX entities information. Lataamaan DX-yksiköiden tiedot. Enter your callsign, CQ zone, etc. and main configuration. Antamaan kutsutunnuksesi, CQ-vyöhykeesi, jne. sekä pääkokoonpanosi. Enjoy KLog and contact the development team if you have any suggestions! Nauttimaan KLogista ja ottamaan yhteyttä kehitystiimiin, jos sinulla on ehdotuksia! LicPage KLog License information KLogin käyttöoikeustiedot Welcome to KLog!- brought to you under the terms of the GPL! Tervetuloa KLog:iin! - tuotu sinulle GPL:n ehtojen mukaisesti! Acknowledge Hyväksy Be aware that KLog is free software. Huomioi, että KLog on ilmainen ohjelmisto. LogModel Date Päivämäärä Time Aika QRZ QRZ Band Taajuusalue Mode Moodi RSTtx RSTtx RSTrx RSTrx Comment Kommentti LogWindow QSL Send QSL Lähetys QSL Rcvd QSL Vastaanotettu &Delete &Poista Delete a QSO Poista QSO &Edit QSO &Muokkaa QSO:ta Edit this QSO Muokkaa tätä QSO:ta Via &bureau &Bureau:n kautta Send this QSL via bureau Lähetä tämä QSO bureau:n kautta D&irect D&irect Send this QSL via direct Lähetä tämä QSO Direct:in kautta Via bureau Bureau:n kautta QSL &received via bureau QSL &vastaanotettu bureau:n kautta Direct Direct QSL received via direc&t QSL vastaanotettu Direc&t:in kautta You have requested to delete this QSO. Olet pyytänyt poistamaan tämän QSO:n. Are you sure? Oletko varma? MainWindow Recalculate Laske uudelleen Starting KLog Käynnistetään KLog &Add &Lisää &Clear T&yhjennä Status bar... Tilapalkki... DX Entity DX Yksikkö &Log Window &Loki ikkuna &Score Window Pi&steytysikkuna Watts Wattia MHz MHz KLog KLog Annual Vuotuinen Ready Valmis An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Tapahtui odottamaton virhe, kun yritit lisätä QSO:n lokiin. Jos ongelma jatkuu, ota yhteyttä kehittäjään analyysiä varten: You have selected an entity: Olet valinnut yksikön: that is different from the KLog proposed entity: joka eroaa KLog:in ehdotetusta kokoonpanosta: Click on the prefix of the correct entity or Cancel to edit the QSO again. Napsauta oikean yksikön etuliitettä tai Peruuta, jos haluat muokata QSO:ta uudelleen. Click on the prefix of the right entity or Cancel to correct. Napsauta oikean yksikön etuliitettä tai paina Peruuta korjataksesi. Input Syöttö RSTrx RSTrx RSTtx RSTtx QRZ QRZ STX STX SRX SRX NEW MULT NEW MULT Invalid characters used in the QRZ Virheellisiä merkkejä käytetty QRZ:ssa Ready... Valmis... &File &Tiedosto &New... &Uusi... &Open... &Avaa... &Import from ADIF... Tu&o ADIF-tiedostosta... Import an ADIF file into the current log. Tuo ADIF-tiedosto nykyiseen lokiin. &Save As... Tallenna &nimellä... Export to ADIF... Vie ADIF-tiedostoon... Export the current log to an ADIF logfile. Vie nykyinen loki ADIF lokitiedostoon. Export all logs to ADIF... Vie kaikki lokit ADIF-tiedostoon... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Vie kaikki QSO:t yhteen ADIF-tiedostoon, yhdistäen QSO:t kaikista lokeista. Export Requested QSL to ADIF... Vie pyydetty QSL ADIF-tiedostoon... Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a QSL tag printing program). Vie kaikki QSO:t joilla on QSL pyyntöjä, ADIF-tiedostoon (esim. tuodaksesi ne QSL tagin tulostus ohjelmaan). Export ADIF for LoTW... Vie ADIF LoTW:iä varten... Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before uploading to LoTW! Vie ADIF-tiedosto lähetettäväksi LoTW:iin. Muista kirjata se TQSL:lla ennen lataamista LoTW:iin! &Print Log... Tulosta loki... Print your log. Tulosta lokisi. KLog folder KLog-kansio Opens the data folder of KLog. Avaa KLog:in tallennuskansion. E&xit Ulo&s &Tools Työkalut Fill in QSO data Täytä QSO:n tiedot Go through the log reusing previous QSOs to fill missing information in other QSOs. Käy loki läpi käyttäen edellisiä QSO:ita täyttämään puuttuvat tiedot muissa QSO:issa. Fill in DXCC data Täytä DXCC-tiedot Go through the log filling QSOs without a DXCC defined. Käy loki läpi täyttäen QSO:t joihin ei ole määritelty DXCC:tä. QSL tools... QSL työkalut... &Find QSO to QSL &Etsi QSO QSL:lle Shows QSOs for which you should send your QSL and request the DX QSL. Näyttää QSO:t joita varten sinun tulisi lähettää QSL ja pyytää DX QSL:ää. Find My-QSLs pending to send Etsi Minun QSL:t jotka odottavat lähetystä Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Näyttää QSO:t joilla on odottavia pyyntöjä lähettää QSL:iä. Tämä jono tulisi pitää tyhjänä! &Find DX-QSLs pending to receive &Etsi DX-QSL:t jotka odottavat vastaanottoa Shows the DX-QSL that has been requested or QSLs has been sent with no answer. Näyttää DX-QSL:t jotka on pyydetty, tai QSL:t on lähetetty ilman vastausta. &Find requested pending to receive &Etsi vastaanottoa odottavat Shows the DX-QSL that has been requested. Näyttää DX-QSL:n jota on pyydetty. LoTW tools... LoTW työkalut... Queue all QSL to be sent of this log Aseta jonoon kaikki tämän lokin QSL:t Mark all non sent QSOs in this log as queued to be uploaded. Merkitse kaikki tässä lokissa olevat lähettämättömät QSO:t lähetysjonoon. Queue all QSL to be sent Aseta jonoon kaikki tämän lokin QSL:t Mark all non sent QSOs as queued to be uploaded. Merkitse kaikki lähettämättömät QSO:t lähetysjonoon. Mark as sent all queued QSO of this log Merkitse kaikki tämän lokin jonossa olevat QSO:t lähetetyiksi Mark all queued QSOs in this log as sent to LoTW. Merkitse kaikki tämän lokin jonossa olevat QSO:t lähetetyiksi LoTW:iin. Mark all queued QSO as sent Merkitse kaikki jonossa olevat QSO:t lähetetyiksi Mark all queued QSOs as sent to LoTW. Merkitse kaikki jonossa olevat QSO:t lähetetyiksi LoTW:iin. &Update cty.csv &Päivitä cty.csv For updated DX-Entity data, update cty.csv. Päivitettyjä DX-yksikkö tietoja varten, päivitä cty.csv. &Update Satellite Data &Päivitä Satelliitti Tiedot Stats Tilastot Show the statistics of your radio activity. Näytä radioaktiivisuutesi tilastot. &Setup &Asetukset &Setup... &Asetukset... &Help &Ohjeet Check updates... Tarkista päivitykset... &About... &Tietoja... About Qt... Tietoja Qt:stä... KLog LoTW KLog LoTW All pending QSO of this log has been marked as queued for LoTW! Kaikki tämän lokin odottavat QSO:t on merkattu jonoon LOTW:iä varten! Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. Nyt voit mennä Tiedostot valikkoon viedäksesi LoTW:n ADIF-tiedostoon ja lataa se LoTW:iin. There was a problem to mark all pending QSO of this log as queued for LoTW! Odottavien QSO:iden merkinnässä jonoon LoTW:iä varten ilmeni ongelma! All pending QSO has been marked as queued for LoTW! Kaikki odottavat QSO:t on merkattu jonoon LOTW:iä varten! The log that you have selected contains more than just one station callsign. Valitsemasi loki sisältää enemmän kuin vain yhden aseman kutsutunnuksen. Please select the station callsign you want to mark as sent to LoTW: Valitse aseman kutsutunnus, jonka haluat merkata ladatuksi LoTW:iin: Station Callsign: Aseman kutsutunnus: Define Station Callsign Määritä aseman kutsutunnus You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the call you are entering here. Et ole valinnut kutsutunnusta. KLog merkkaa QSO:t ilman asetettua aseman kutsutunnusta, kutsulla jonka syötät tähän. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Syötä tässä lokissa käytettävä aseman kutsutunnus, tai jätä se tyhjäksi QSO:lle ilman määritettyä aseman kutsutunnusta: No station callsign has been selected and therefore no log will be marked Aseman kutsutunnusta ei ole valittu, joten lokia ei merkata All queued QSO of this log has been marked as sent for LoTW! Kaikki tämän lokin jonossa olevat QSO:t on merkattu lähetetyiksi LOTW:iin! There was a problem to mark all queued QSO of this log as sent for LoTW! Kaikkien QSO:iden merkinnässä lähetetyiksi LoTW:iin, ilmeni ongelma! All queued QSO has been marked as sent to LoTW! Kaikki jonossa olevat QSO:t on merkattu lähetetyiksi LoTW:iin! There was a problem to mark all queued QSO of this log as sent to LoTW! Kaikkien jonossa olevien QSO:iden merkinnässä lähetetyiksi LoTW:iin, ilmeni ongelma! About... Tietoja... KLog update checking result KLog päivityksen tarkastuksen tulos Congratulations! Onnittelut! You already have the latest version. Sinulla on jo viimeisin versio. Nothing has been saved. You have to select a valid file type. Mitään ei ole tallennettu. Sinun täytyy valita oikea tiedostotyyppi. Save File Tallenna tiedosto ADIF file ADIF-tiedosto Cabrillo files Cabrillo-tiedostot Any file Kaikki tiedostot You can find the KLog data folder here: KLog talletuskansio löytyy täältä: DUPE DUPE Filling DXCC in QSOs... QSO: Täytetään DXCC QSO:n QSO: TX Frequency in MHz. Frequency is not in a hamradio band! TX Taajuus MHz. Taajuus ei ole oikealla taajuusalueella! RX Frequency in MHz. Frequency is not in a hamradio band! RX Taajuus MHz. Taajuus ei ole oikealla taajuusalueella! QSO logged from WSJT-X: QSO kirjattu WSJT-X:stä: start käynnistys stop pysäytys It seems that there are no QSO in the database. Näyttää siltä ettei tietokannassa ole QSO:ta. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Jos olet varma että tietokannassa on QSO:ita ja KLog ei löydä niitä, voit ottaa yhteyttä kehittäjiin saadaksesi apua (katso valikon kohta Tietoja KLogista) TX Frequency in MHz. TX Taajuus MHz:inä. RX Frequency in MHz. RX Taajuus MHz:inä. Power used by the DX. DX:n käyttämä virta. Logging operator's callsign. Lokinpitäjän kutsutunnus. Callsign used over the air. Lähetyksissä käytetty kutsutunnus. My QTH locator. Minun QTH lokaattori. Name of the DX. DX:n nimi. QTH of the DX. DX:n QTH. Locator of the DX. DX:n lokaattori. QRZ of the QSO. QSO:n QRZ. Click to recalculate the award status. Napsauta laskeaksesi palkintotilanne uudestaan. TX RST. TX RST. RX RST. RX RST. TX Exchange. TX Exchange. RX Exchange. RX Exchange. Band of the QSO. QSO:n taajuusalue. Mode of the QSO. QSO:n moodi. Date of the QSO. QSO:n päivämäärä. Time of the QSO. QSO:n aika. Add the QSO to the log. Lisää QSO lokiin. Clear the box. Tyhjennä ruutu. The logfile has been modified. Lokia on muokattu. Do you want to save your changes? Haluatko tallentaa muutokset? UDP Server error The UDP server failed to %1. start or stop UDP-palvelinvirhe UDP-palvelin ei onnistunut %1. Clears the QSO entry. Poistaa QSO merkinnän. Number of confirmed DXCC entities. Vahvistettujen DXCC-yksiköiden määrä. Number of worked DXCC entities. Työstettyjen DXCC-yksiköiden määrä. Number of confirmed WAZ zones. Vahvistettujen WAZ vyöhykkeiden määrä. Number of worked WAZ zones. Työstettyjen WAZ vyöhykkeiden määrä. Number of confirmed local references. Vahvistettujen paikallisten referenssien määrä. Number of worked local references. Työstettyjen paikallisten referenssien määrä. Number of confirmed QSOs. Vahvistettujen QSO:iden määrä. Number of worked QSOs. Työstettyjen QSO:iden määrä. Number of QSOs worked on the selected year. Työstettyjen QSO:iden määrä, valittuna vuonna. Number of DXCC worked on the selected year. Työstettyjen DXCC:iden määrä, valittuna vuonna. Number of CQ Zones worked on the selected year. Työstettyjen CQ vyöhykkeiden määrä, valittuna vuonna. Score for the DXMarathon on the selected year. DXMarathon pisteet, valittuna vuonna. Select the year you want to check. Valitse vuosi jonka haluat nähdä. Status of the DX entity. DX yksikön tila. Name of the DX entity. DX yksikön nimi. Name Nimi QTH QTH Locator Lokaattori Power(rx) Teho(rx) RST(tx) RST(tx) RST(rx) RST(rx) Freq TX TX Taajuus Freq RX RX Taajuus QSO QSO QSL QSL eQSL eQSL Comment Kommentti Others Muut My Data Minun tiedot Satellite Satelliitti QSOs QSO:t DXCC DXCC CQ CQ Score Pisteet DX-Marathon DX-Maratoni Info Info Award Palkinto Confirmed Vahvistettu Worked Työstetty WAZ WAZ Local Paikallinen Awards Palkinnot Search Etsi Log Loki DX-Cluster DX-Klusteri Save ADIF File Tallenna ADIF-tiedosto LoTW logfile has been properly exported! LoTW lokitiedosto on viety onnistuneesti! Remember to: Muista: Before uploading: sign the LoTW log; and Ennen lataamista: allekirjoita LoTW loki; ja After uploading: mark as sent all the queued QSO (LoTW Tools). Lataamisen jälkeen, merkkaa kaikki jonossa olevat QSO:t lähetetyiksi (LoTW työkalut). There was no QSO to be exported. Vietäviä QSO:ita ei ollut. If you think that some QSO should have been exported, please look for them and ensure that the eQSL LoTW QSL sent box is marked as: Jos uskot, että joitakin QSO:ita olisi pitänyt viedä, etsi niitä ja varmista, että eQSL LoTW QSL lähetetty laatikko on merkitty seuraavasti: Q - Queued J - Jonossa There was an error while exporting the LoTW. The log has not been exported! LotW viennissä tapahtui virhe. Lokin vienti epäonnistui! Save Cabrillo File Tallenna Cabrillo Tiedosto Open File Avaa Tiedosto &Modify &Muokkaa - Needed for DXMarathon - Tarvitaan DXMarathon:iin Filling QSOs... Täyttää QSO:t... Abort filling Keskeytä täyttäminen Number Numero Date Päivämäärä Time Aika Band Taajuusalue Mode Tila Print Log Tulosta loki Printing the log... Tulostetaan lokia... Abort printing Keskeytä tulostus Printing the log... QSO: Tulostetaan lokia... QSO: KLog QSO received KLoq QSO vastaanotettu The following QSO data has been received from WSJT-X to be logged: Seuraavat QSO tiedot vastaanotettu WSJT-X:ltä kirjattaviksi: Call Kutsutunnus Freq Taajuus Time On Lähetys alkaa Time Off Lähetys päättyy RST TX RST TX RST RX RST RX DX-Grid DX-Verkko Comments Kommentit TX Pwr TX teho Operator Operaattori Local-Grid Paikallisverkko Do you want to keep receiving this alerts? (disabling this alerts will prevent that non-valid modes are detected) Haluatko jatkossa saada tämän ilmoituksen? (Mikäli ilmoitus poistetaan käytöstä, ei tuettuja tiloja ei tunnisteta) If the received mode is correct, please contact KLog development team and request support for that mode Mikäli vastaanotettu tila on oikea, ota yhteyttä KLog-kehitystiimiin ja pyydä tukea kyseiselle tilalle A new mode not supported by KLog has been received from an external software or radio: Uusi moodi jota KLog ei tue, saatiin ulkoisesta ohjelmistosta tai radiosta: A duplicated satellite has been detected in the file and will not be imported. Tiedostossa havaittiin päällekkäinen satelliitti, eikä sitä tuoda. Please check the satellite information file and ensure it is properly populated. Tarkista satelliitti tiedot-tiedosto ja varmista ettö siellä on kaikki tarvittava. Now you will see a more detailed error that can be used for debugging... Nyt näet tarkemmat virhetiedot joita voidaan käyttää vianmäärityksessä... An unexpected error ocurred!! Odottamaton virhe tapahtui!! If the problem persists, please contact the developers Jos ongelma jatkuu, ota yhteyttä kehitystiimiin for analysis: analysointia varten: Error in function Virhe funktiossa Error code Virhekoodi Error text Virheteksti Failed query Epäonnistunut kysely Recomendation: Suositus: Export, periodically, your data to ADIF to prevent a potential data loss. Vie tietosi ADIF:iin säännöllisesti, välttääksesi tietojesi katoaminen. Do you want to keep showing errors? Haluatko jatkaa virheiden näyttämistä? MainWindowInputComment Add a comment for this QSO. Lisää tämän QSO:n kommentti. MainWindowInputEQSL Date of the ClubLog upload. ClubLog:in lähetyksen päivämäärä. Date of the eQSL sending. eQSL lähetyksen päivämäärä. Date of the eQSL reception. eQSL:n vastaanoton päivämäärä. Date of the LoTW sending. LoTW:n lähetyksen päivämäärä. Date of the LoTW reception. LoTW vastaanoton päivämäärä. Status on ClubLog. ClubLog:n tilanne. Status of the eQSL sending. eQSL lähetyksen tilanne. Status of the eQSL reception. eQSL vastaanoton tilanne. Status of the LoTW sending. LoTW lähetyksren tila. Status of the LoTW reception. LoTW vastaanoton tila. ClubLog ClubLog eQSL Sent eQSL Sent eQSL Rec eQSL Vastaanotto LoTW Sent LoTW lähetetty LoTW Rec LoTW Vastaanotto MainWindowInputOthers Primary Div Ensisijainen hallinnollinen alue Secondary Div Toissijainen hallinnollinen alue IOTA IOTA Entity Yksikkö Propagation mode Etenemistapa Select the primary division for this QSO. Valitse tämän QSO:n päädivisioona. Select the secondary division for this QSO. Valitse tämän QSO:n toissijainen divisioona. Select the entity for this QSO. Valitse tämän QSO:n yksikkö. Select the propagation mode for this QSO. Valitse tämän QSO:n etenemistapa. Select the IOTA continent for this QSO. Valitse tämän QSO:n IOTA-manner. Select the IOTA reference number for this QSO. Valitse tämän QSO:n IOTA-referenssinumero. Not Identified Ei tunnistettu Not - Not Identified Ei - Ei tunnistettu MainWindowInputQSL QSL Sent QSL lähetetty QSL Rec QSL Vastaanotto QSL Via QSL -kautta QSL Msg QSL Viesti Status of the QSL sending. QSL lähetyksen tila. Status of the QSL reception. QSL vastaanoton tila. QSL sending information. QSL lähetyksen tiedot. QSL reception information. QSL vastaanoton tiedot. Date of the QSL sending. QSL lähetyksen päivämäärä. Date of the QSL reception. QSL vastaanoton päivämäärä. Message of the QSL. QSL:n viesti. QSL via information. QSL -kautta tieto. MainWindowMyDataTab Watt Wattia Keep this data Säilytä nämä tiedot Data entered in this tab will be copied into the next QSO. Tähän välilehteen syötetyt tiedot kopioidaan seuraavaan QSO:n. Power used for the QSO in watts. QSO:n käytetty teho Wateissa. Logging operator's callsign. Lokinpitäjän kutsutunnus. Callsign used over the air. Lähetyksissä käytetty kutsutunnus. My QTH locator. Minun QTH lokaattori. Power Teho Operator Operaattori Station Callsign Aseman kutsutunnus My Locator Minun lokaattori MainWindowSatTab Keep this data Säilytä nämä tiedot Other - Sat not in the list Muut - Satelliitti ei ole listalla Data entered in this tab will be copied into the next QSO. Tähän välilehteen syötetyt tiedot kopioidaan seuraavaan QSO:n. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Satelliitin nimi, jos ei löydy listalta. Aktivoi tämä ruutu valitsemalla: "1%" (nimi on muodossa: A0-51). Satellite mode used. Satelliitti tilaa käytetty. Select the satellite you are using. Valitse satelliitti jota käytät. UpLink band. Lähetyslinkin taajuusalue. DownLink band. Vastaanottolinkin taajuusalue. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. DX aseman lokaattori. Tämä ruutu on sykronisoitu QSO välilehden, lokaattori ruudun kanssa. UpLink Lähetyslinkki DownLink Vastaanottolinkki Satellite Satelliitti Mode Tila DX Locator DX lokaattori Other Muuta MHz MHz Not Sat QSO Ei Satelliitti QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog on havainnut satelliitin nimen, jota se ei tunnista. Jos sen tulisi sen sijaan käyttää jotain tunnettujen satelliittien nimistä sen sijaan, valitse se luettelosta. Vaihtoehtoisesti, voit ottaa yhteyttä kehitystiimiin lisätäksesi uuden satelliitin nimen. The satellite you have in your QSO is: QSO:ssa oleva satelliitti on: Please know that the satellite name will not be saved if it is not in the list so that information may be lost! Huomaa, että satelliitin nimi ei tallennu, jos se ei ole listalla, joten satelliitin tiedot voivat kadota! QObject New One, work it! Uusi, wörki se! Needed, work it! Tarvitaan, wörki se! Worked but not confirmed Wörkitty, mutta ei vahvistettu Confirmed Vahvistettu Not identified Ei tunnistettu Database Error Tietokantavirhe KLog DB needs to be upgraded. KLog tietokanta pitää päivittää uudempaan. Do you want to upgrade it now? Haluatko päivittää uudempaan nyt? If DB is not upgraded KLog may not work properly. Jos tietokantaa ei päivitetä, KLog ei välttämättä toimi oikein. KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog on havainnut aikaisemman lokin tietokannassa. Kaikki tiedot siirretään juuri luotuun DX tyyppiseen lokiin. KLog: Enter Station callsign KLog: Syötä aseman kutsutunnus Enter the station callsign used in this log Syötä tässä lokissa käytetty aseman kutsutunnus Station Callsign Aseman kutsutunnus All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is OK. Kaikki tiedot siirrettiin oikein. Sinun pitäisi nyt mennä Asetukset-> Lisäasetukset-> Lokit tarkistaaksesi, että kaikki on OK. Updating mode information... Päivitetään tilatietoja... Abort updating Keskeytä päivittäminen QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Tämän päivityksen peruuttaminen aiheuttaa epäjohdonmukaisuuksia ja mahdollisen tietojen menettämisen. Haluatko silti peruuttaa? Updating bands information... Päivitetään taajuusalue tiedot... Updating bands information in %1 status... Päivitetään taajuusalue tiedot %1 tila... Progress: Eteneminen: Updating mode information in %1 status... Päivitetään tilatiedot %1 tila... Updating DXCC award information... Päivitetään DXCC palkinto tiedot... Updating DXCC Award information... Päivitetään DXCC palkinto tiedot... Updating WAZ award information... Päivitetään WAZ palkintotiedot... Updating WAZ Award information... Päivitetään WAZ palkintotiedot... Updating DXCC and Continent information... Päivitetään DXCC- ja manner-tietoja... Install wizard was canceled before completing... Asennusohjelma keskeytettiin ennen valmistumista... Do you want to remove the KLog dir from your disk? Haluatko poistaa KLog-kansion kiintolevyltä? Your KLog dir has been removed KLog-kansio on poistettu Thank you for running KLog! Kiitos KLogin käyttämisestä! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. En voinut poistaa KLog-kansiota. Sinun tulee tehdä se manuaalisesti, jos haluat poistaa sen kiintolevyltä. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. KLog-kansiota ei voitu poistaa. Sinun tulee tehdä se manuaalisesti, jos haluat poistaa sen kiintolevyltä. Remember that your KLog dir is on your system... Muista että KLog-kansio on kiintolevyllä... SearchWidget &Clear T&yhjennä &Export Highlighted &Vie Korostetut &Select All Valitse &kaikki &Search &Etsi All Kaikki Clear the searches. Tyhjennä etsinnät Export the search result to an ADIF file. Vie etsinnän tulokset ADIF-tiedostoon. Select/Unselect all the QSOs shown. Valitse/Poista valinnasta kaikki näkyvillä olevat QSO:t. Search in the log. Etsi lokista. Search in all logs. Etsi kaikista lokeista. Enter the QRZ to search for. Syötä etsittävä QRZ. Search results. Etsinnän tulokset. QRZ QRZ Date/Time Päivämäärä/aika Band Taajuusalue Mode Moodi QSL Sent QSL Lähetetty QSL Rcvd QSL Vastaanotettu Station Callsign Aseman kutsutunnus ID ID &Clear selection T&yhjennä valinta Save File Tallenna tiedosto QSL Send QSL lähetys &Delete &Poista Delete a QSO Poista QSO &Edit QSO &Muokkaa QSO:ta Edit this QSO Muokkaa tätä QSO:ta Via &bureau &bureau:n kautta Send this QSL via bureau Lähetä tämä QSL bureau:n kautta D&irect D&irect Send this QSL via direct Lähetä tämä QSL direct:in kautta &Request my QSL Pyy&dä minun QSL Mark my QSL as requested Merkitse minun QSL pyydetyksi Via Direct && mark DX QSL as requested Direct:in kautta && merkitse DX QSL pyydetyksi Send this QSL via direct & mark DX QSL as requested Lähetä tämä QSL direct:in kautta & merkitse DX QSL pyydetyksi Via Bureau && mark DX QSL as requested Bureau:n kautta && merkitse DX QSL pyydetyksi Send this QSL via bureau & mark DX QSL as requested Lähetä tämä QSL bureau:n kautta & merkitse DX QSL pyydetyksi &Request the QSL Pyydä QSL Mark the QSL as requested Merkitse QSL pyydetyksi Via bureau && mark my QSL as requested Bureau:n kautta && merkitse minun QSL pyydetyksi QSL received via bureau & mark my QSL as requested QSL vastaanotettu bureau:n kautta & merkitse minun QSL pyydetyksi Via bureau Bureau:n kautta QSL received via bureau QSL vastaanotettu bureau:n kautta Direc&t && mark as my QSL requested Direc&t && merkitse minun QSL pyydetyksi QSL received via direct & mark my QSL as requested QSL vastaanotettu direct:in kautta & merkitse minun QSL pyydetyksi Direc&t Direc&t QSL received via direct QSL vastaanotettu direct:in kautta You have requested to delete the QSO with: %1 Olet pyytänyt poistettaviksi QSO:t joissa on: %1 Are you sure? Oletko varma? Needed QSO to send the QSL Tarvittava QSO, QSL:n lähetystä varten My QSL requested to be sent QSL pyydetty lähetettäväksi DX QSL pending to be received DX QSL odottaa vastaanottoa SetupDialog My Data Minun Tiedot Bands/Modes Taajuusalueet/Moodit DX-Cluster DX-Klusteri Colors Värit Misc Sekalaiset World Editor Maailma Editori Logs Lokit Satellites Satelliitit HamLib HamLib Cancel Peru OK OK Config Dialog Asetusikkuna User data Käyttäjätiedot D&X-Cluster D&X-Klusteri ClubLog ClubLog WSJT-X WSJT-X You need to enter at least one log in the Logs tab. Ainakin yksi loki on syötettävä Lokit -välilehdellä. World Maailma DB has not been moved to new path Tietokantaa ei ole siirretty Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Siirry sekalaiset-välilehdelle ja napsauta "siirrä tietokanta" muulloin tietokantaa ei siirretä uuteen paikkaan. Go to the User tab and enter valid QRZ. Siirry käyttäjä-välilehdelle ja syötä kelvollinen QRZ. You need to enter at least a valid QRZ. Ainakin olemassaoleva QRZ on syötettävä. You have not selected the kind of log you want. Et ole valinnut minkälaisen lokin haluat. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Sinut ohjataan lokit -välilehdelle. Lisää, ja valitse millaista lokia haluat käyttää. SetupEntityDialog Entity Yksikkö CQ CQ ITU ITU Latitude Leveysaste Longitude Pituusaste UTC UTC Main prefix Ensisijainen etuliite ARRL ID ARRL ID Prefixes Etuliitteet Comma separated possible prefixes, e.g. EA1, EA2, ... Mahdolliset etuliitteet, pilkulla eroteltuina, esim. OH1, OH2, ... Name of the Entity. Yksikön nimi. CQ zone. CQ-vyöhyke. ITU zone. ITU-vyöhyke. Longitude of the Entity. Yksikön pituuspiiri. Local time difference to UTC. Paikallinen aikaero UTC:n. Main prefix of the entity. Yksikön ensisijainen etuliite. ARRL ID. ARRL ID. Date of the deletion. Poistamisen päivämäärä. Deleted Poistettu Cancel Peru OK OK Entity Dialog Yksikköasetukset SetupPageBandMode Bands Taajuusalueet Modes Moodit SetupPageClubLog &Callsign &Kutsutunnus ClubLog &password ClubLog &salasana ClubLog &email ClubLog s&ähköposti Enter the email you used to register in ClubLog. Syötä sähköposti jota käytit ClubLog:in rekisteröitymiseen. Enter the callsign you used to register in ClubLog. Syötä kutsutunnus jota käytit ClubLog:in rekisteröitymiseen. Enter your password in ClubLog. Syötä ClubLog salasanasi. &Send QSOs in real time &Lähetä QSO:t reaaliajassa &Activate ClubLog &Aktivoi ClubLog Use QSO Station &Callsign Käytä QSO Aseman Kutsutunnusta Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Lähetä QSO:t ClubLogiin reaaliajassa, kun niitä lisätään (tai muokataan) KLogissa. Starts the ClubLog support in KLog. Käynnistää ClubLog tuen KLogissa. Use the Station Callsign defined in each QSO instead of the one defined here. Käytä QSOissa käytettyä aseman kutsutunnusta, tähän määritetyn tunnuksen sijasta. SetupPageColors New One Uusi Needed in this band Tarvittu tällä taajuussalueella Worked in this band Työstetty tällä taajuusalueella Confirmed in this band Vahvistettu tällä taajuusalueella Default Oletus Choose a color Valitse väri SetupPageDxCluster Add Lisää Delete Poista Show &HF spots Näytä &HF Spotit Show V/&UHF spots Näytä V/&UHF spotit Show W&ARC spots Näytä W&ARC spotit Show &worked spots Näytä &työstetyt spotit Show &confirmed spots Näytä &vahvistetut spotit Show ANN/&FULL messages Näytä ANN/&FULL viestit Show WW&V messages Näytä WW&V viestit Show WC&Y messages Näytä WC&Y viestit DX Spots DX Spotit Messages Viestit KLog: Add a DXCluster server KLog: Lisää DX-Klusteripalvelin Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Lisää osoite ja :portti Esimerkiksi: dxfun.com:8000 Jos porttia ei määritetä, Käytetään oletusarvoa 41112: SetupPageHamLib Activate HamLib Aktivoi HamLib Activates the hamlib support that will enable the connection to a radio. Aktivoi hamlib tuen joka mahdollistaa yhteyden radioon. RTS on RTS päällä Setting RTS may be needed for some serial ports. RTS:n asetus voi olla vaadittu joillekkin sarjaporteille. DTR on DTR päällä Setting DTR may be needed for some serial ports. DTR:n asetus voi olla vaadittu joillekkin sarjaporteille. Radio Radio Select your rig. Valitse kokoonpanosi. Defines the interval to pool the radio in msecs. Määrittää radion kyselyvälin millisekunneissa. Pool interval Kyselyväli Port Portti Select the serial port. Only the serial ports that are detected are shown. Valitse sarjaportti. Vain tunnistetut sarjaportit näytetään. Scan Tunnista Click to identify the serial ports available in your computer. Klikkaa tunnistaaksesi saatavilla olevat sarjaportit. Bauds Baudia Select the serial port speed. Valitse sarjaportin nopeus. 5 bits 5 bittiä 6 bits 6 bittiä 7 bits 7 bittiä 8 bits 8 bittiä Data bits Data bittejä Select the serial data bits. Valitse databittien määrä. None Ei mitään Hardware Laitteisto Software XON/XOFF Ohjelmisto XON/XOFF Flow control Sarjadatan ohjaus Select the serial flow control Valitse sarjadatan ohjausmenetelmä. No parity Ei pariteettia Even Parillinen Odd Pariton Space Tyhjä Mark Merkki Parity Pariteetti Select the serial parity. Valitse sarjadatan pariteetti. 1 bit 1 bitti 1.5 bits 1.5 bittiä 2 bits 2 bittiä Stop bits Stop bitit Select the serial stop bits. Valitse sarjadatan stop bitit. SetupPageLogs &New &Uusi &Edit &Muokkaa &Remove &Poista Add a new log. Lisää uusi loki. Edit the selected log. Muokkaa valittua lokia. Remove the selected log. Poista valittu loki. Select the log you want to open. Valitse loki jonka haluat avata. KLog KLog Do you really want to remove this log? Haluatko varmasti poistaa tämän lokin? All the QSOs from this log will be also deleted... Lokista poistetaan myös kaikki QSO:t... Log has not been removed. (#3) Lokia ei ole poistettu (#3) Log has not been removed. (#2) Lokia ei ole poistettu (#2) Log has not been removed. (#1) Lokia ei ole poistettu (#1) ID ID Date Päivämäärä Station Callsign Aseman kutsutunnus Operators Operaattorit Comments Kommentit Type Tyyppi An error has occurred showing the following error code: On tapahtunut virhe seuraavalla koodilla: KLog - SetupPageLogs KLog - Lokisivujen asetus SetupPageLogsNew &Date P&äivämäärä &Station Callsign A&seman kutsutunnus &Operators Ope&raattorit Comm&ent Komm&entti &Ok &Ok &Cancel Peru Select categories Valitse kategoriat Callsign used for this log. Tässä lokissa käytettävä kutsutunnus. Comma separated list of operators: callsign1, callsign2. Pilkulla eroteltu lista operaattoreista: kutsutunnus1, kutsutunnus2. Start date of this log. Tämän lokin aloituspäivämäärä. Add a comment about this log. Lisää kommentti tästä lokista. Select the kind of operation for this log. Valitse operaation tyyppi tälle lokille. Select the mode category. Valitse moodi kategoria. Select the operators category. Valitse operaattorit kategoria. Select the assisted category. Valitse avustettu kategoria. Select the power category. Valitse tehokategoria. Select the bands category. Valitse taajuusaluekategoria. Select the Overlay category. Valitse yleiset kategoria. &Type of Operation &Toiminnan tyyppi &Mode Category &Moodi kategoria O&perators Category Operaattorit kategoria &Assisted Category Avustettu kategoria Po&wer Category Teho kategoria &Bands Category Taajuusalue kategoria O&verlay Yleisnäkymä Categories not OK Kategoriat ok You need to enter a valid QRZ in the Station Callsign box. The log will not be opened. Aseman kutsutunnus lokeroon tulee syöttää toimiva QRZ. Lokia ei avata. You selected an invalid combination. The log will not be opened. Valitsit väärän yhdistelmän. Lokia ei avata. Categories OK Kategoriat OK SetupPageMisc &Imperial system &Empiirinen järjestelmä &Log in real time &Kirjaa lokiin reaaliajassa &Time in UTC UTC &Aika &Save ADIF on exit &Tallenna ADIF kun ohjelma suljetaan Use this &default filename Käytä tätä &oletus tiedostonimeä Mark &QSO to send QSL when QSL is received Merkitse &QSO läheettämään QSL kun QSL on vastaanotettu Complete QSO with previous data Täydennä QSO edellisillä tiedoilla Show the Station &Callsign used in the search box Näytä hakukentässä käytetty &Asematunnus &Reset to My Data for all QSOs &Palauta minun tiedot kaikkiin QSO:ihin &Check for new versions automatically &Tarkista automaattisesti uusien versioiden varalta &Provide Info for statistics &Jaa tietoja tilastointia varten Manage DX-Marathon Hallinnoi DX Marathonia Browse Selaa Move DB Siirrä tietokanta QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO:t merkataan QSL:n lähetystä odottaviksi, jos DX QSL on saapunut, etkä ole lähettänyt omaasi. The search box will show also the callsign on the air to do the QSO. Etsintälokero näyttää kutsussa olevan kutsutunnuksen tehdäkseen QSO:n. All the data from the My Data tab will be used or data from the previous QSO will be maintained. Kaikki tiedot Minun Tiedot -välilehdeltä käytetään, tai tiedot edellisestä QSO:sta Säilytetään. Check if there is a new release of KLog available every time you start KLog. Tarkista KLog päivitysten varalta joka käynnistyskerralla. If new version checking is selected, KLog will send the developer your callsign, KLog version & Operating system to help in improving KLog. Jos päivityksien tarkistus on valittu, KLog lähettää kehitystiimille kutsutunnuksesi, KLog version, sekä Käyttöjärjestelmän tiedot, KLogin kehitystä varten. Check it for Imperial system (Miles instead of Kilometers). Tarkista imperiaalisen järjestelmän varalta (Mailit kilometrien sijaan). Select to use real time. Valitse käyttääksesi oikeaa aikaa. Select to use UTC time. Valitse käyttääksesi UTC -aikaa Select if you want to save to ADIF on exit. Valitse jos haluat tallentaa ADIF-tiedostoon kun ohjelma suljetaan. Select to use the following name for the logfile without being asked for it again. Valitse käyttääksesi seuraavaa lokitiedoston nimeä ilman että sitä kysytään joka kerta. Complete the current QSO with previous QSO data. Täydennä nykyinen QSO edellisen QSO:n tiedoilla. Select if you want to manage DX-Marathon. Valitse jos haluat hallinnoida DX Marathonia. This is the default file where ADIF data will be saved. Tämä on oletustiedosto johon ADIF tiedot tallennetaan. This is the directory where the database (logbook.dat) will be saved. Tämä on kansio johon tietokanta (logbook.dat) tallennetaan. Click to change the default ADIF file. Napsauta vaihtaaksesi oletus ADIF-tiedostoa. Click to change the path of the database. Napsauta vaihtaaksesi tietokannan sijainti. Click to move the DB to the new directory. Napsauta Siirtääksesi tietokanta uuteen kansioon. Open File Avaa tiedosto Select Directory Valitse Kansio This is the directory where DB (logbook.dat) will be saved. Tämä on kansio johon tietokanta (logbook.dat) tallennetaan. Please specify an existing directory where the database (logbook.dat) will be saved. Määritä olemassaoleva kansio johon tietokanta (lokbook.dat) tallennetaan. File moved Tiedosto on siirretty File copied Tiedosto on kopioitu File NOT copied Tiedostoa EI ole kopioitu The target directory does not exist. Please select an existing directory. Kohdekansiota ei ole olemassa. Valitse olemassaoleva kansio. SetupPageSats &New &Uusi &Edit &Muokkaa &Remove &Poista &Import &Tuo E&xport &Vie Add a new satellite. Lisää uusi satelliitti. Edit the selected satellite. Muokkaa valittua satelliittia. Remove the selected satellite. Poista valittu satelliitti. Import a satellites file. It will replace the satellites you have now configured. Tuo satelliittitiedosto. Se korvaa nyt määritellyt satelliitit. Export your current satellites to a file. Vie nykyiset satelliitit tiedostoon. Select the sat you want to open. Valitse satelliitti jonka haluat avata. KLog KLog Do you really want to remove this satellite? Haluatko todella poistaa tämän satelliitin? This satellite will not be longer available to be selected ... Tätä satelliittia ei voi enään valita... Sat has not been removed. (#3) Satelliittia ei ole poistettu. (#3) Sat has not been removed. (#2) Satelliittia ei ole poistettu. (#2) Sat has not been removed. (#1) Satelliittia ei ole poistettu. (#1) ID ID Short Lyhyt tunnus Name Nimi Uplink Lähetys Downlink Vastaanotto Modes Moodit An error has occurred showing the following error code: On tapahtunut virhe seuraavalla koodilla: KLog - SetupPageSats KLog - AsetussivunTilastot Open Satellites File Avaa satelliittitiedosto KLog warning KLog varoitus An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Tapahtui odottamaton virhe satelliittidataa tuodessa. Se voi johtua siitä, että tuotava tiedosto on väärän tyyppinen. Please check the format or contact the developer for analysis with the error code: Tarkista tiedostotyyppi tai ota yhteyttä kehittäjään, tarkempaa selvitystä varten, virhekoodilla: Save Satellites File Tallenna Satelliittitiedosto SetupPageSatsNew Short name Lyhyt tunnus Sat name Satelliitin tunnus UpLink Lähetyslinkki DownLink Vastaanottolinkki Modes Moodit &Ok &Ok &Cancel P&eru Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Syötä lyhyt tunnus. Yritä käyttää LoTW tunnusta, jotta voit ladata QSO:si LoTW:iin jälkeenpäin. Enter the name of the satellite. Syötä satelliitin tunnus. Enter the uplink frequencies in this format: 144.300 Syötä lähetystaajuudet muodossa: 144.300 Enter the downlink frequencies in this format: 144.300 Syötä vastaanottotaajuudet muodossa: 144.300 Enter the modes in this format: USB Syötä moodit muodossa: USB Some of the data you have entered is not correct, the satellite can't be added. Jokin syöttämästäsi tiedoista ei ole oikein, satelliittia ei voida lisätä. SetupPageUDP Start UDP Server Käynnistä UDP-palvelin Log automatically QSOs from WSJT-X Kirjaa WSJT-X:stä saadut QSO:t automaattisesti Allow WSJT-X to send logged QSO to KLog Salli WSJT-X:n lähettää kirjatut QSO:t KLog:iin QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected WSJT-X:ään kirjatut QSO:t lähetetään KLogiin ja KLog varmistaa ennen KLogiin kirjaamista, ellei "%1" ole valittuna KLog will log automatically any QSO coming from WSJT-X without any manual confirmation. KLog kirjaa automaattisesti WSJT-X:stä tulevat QSO:t, ilman manuaalista vahvistusta. Receive and Update QSO data to KLog Vastaanota ja päivitä QSO tiedot KLog:iin KLog will automatically show and update data coming from WSJT-X (DX callsign, locator, RPT, ...) KLog näyttää ja päivittää automaattisesti, tiedot jotka tulevat WSJT-X:ltä (DX kutsutunnus, lokaattori, RPT, ...) Make sure it is the same port where the other programs are sending the data to. Default port is 2237. Varmista että se on sama portti johon toiset ohjelmat lähettävät tiedot. Oletusportti on 2237. UDP port number where the UDP Server will listen for packets. UDP-portti jolla UDP-palvelin kuuntelee paketteja. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP-palvelin vastaanottaa toisista ohjelmista lähetetyt QSO:t. Kuten WSJT-X, mahdollistaen sinulle automaattisen kirjaamisen näistä ohjelmista KLogiin. UDP Port UDP-portti QSO notification timeout (milisecs) QSO ilmoituksen aikakatkaisu (millisekuntia) Milliseconds that the notification of QSO received from WSJTX will be shown. Aika, millisekunneissa, jonka QSO vastaanotettu WSJTX:ltä, huomautus näytetään. SetupPageUserDataPage &Personal data &Henkilökohtaiset tiedot Station &data Aseman &tiedot Enter your name. Syötä nimesi. Enter your address - 1st line. Syötä osoitteesi - ensimmäinen rivi. Enter your address - 2nd line. Syötä osoitteesi - toinen rivi. Enter your address - 3rd line. Syötä osoitteesi - kolmas rivi. Enter your address - 4th line. Syötä osoitteesi - neljäs rivi. Enter your city. Syötä kaupunki. Enter your zip code. Syötä postinumero. Enter your province or state. Syötä maakunta tai osavaltio. Enter your country. Syötä maa. &Name &Nimi &Address &Osoite Cit&y &Kaupunki &Zip Code &Postinumero Pro&v/State Maak&unta Countr&y &Maa Enter your information for rig Syötä laitekokoonpanosi tiedot Enter your information for antenna Syötä antennitiedot Enter your power information. Syötä tiedot tehonlähteestäsi. Enter the station callsign that will be used for logging. Syötä kirjaamiseen käytettävä aseman kutsutunnus. &Rig 1 Kokoonpano 1 R&ig 2 Kokoonpano 2 Ri&g 3 Kokoonpano 3 Antenna &1 Antenni &1 Antenna &2 Antenni &2 Antenna &3 Antenni &3 Po&wer Vi&rtalähde Enter the operators (comma separated if more than one). Syötä operaattorit (pilkulla eroteltuina jos useita). Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Syötä aseman lokaattori. Vaihtoehtoisesti KLog voi käyttää arvioitua lokaattoria kutsutunnuksesi perusteella. &QRZ &QRZ &Operators &Operaattorit &CQ Zone &CQ Alue &ITU Zone &ITU Alue &Locator &Lokaattori &Locator (not valid) Lokaattori (virheellinen) SetupPageWorldEditor Add Lisää Delete Poista Edit Muokkaa Export World Vie maailma Import World Tuo maailma Still not implemented. Vielä toteuttamatta. Import a new cty.csv file Tuo uusi cty.csv-tiedosto An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. KLog kansiostasi löytyy yksikkötiedot-tiedosto (cty.csv)joka ladataan. No entities information file (cty.csv) has been detected in your KLog folder. KLog kansiostasi ei löydy yksikkötiedot-tiedostoa (cty.csv). KLog will not be able to show entities information. KLog ei pysty näyttämään yksikkötietoja. Prefix Etuliite Entity Yksikkö ARRL ID ARRL ID Continent Manner CQ Zone CQ Vyöhyke ITU Zone ITU Vyöhyke UTC UTC Latitude Leveysaste Longitude Pituusaste Deleted Poistettu Since Date Lähtien päivämäärästä To Date Päivämäärään asti Open File Avaa Tiedosto BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Yksikkötiedot on päivitetty. Entities information has not been updated. Yksikkötietoja ei ole päivitetty. ShowErrorDialog KLog Message KLog viesti SoftwareUpdateDialog Ok Ok KLog update KLog päivitys Congratulations! Onnittelut! Your KLog has been updated. KLog on päivitetty. You already have the latest version. Sinulla on jo viimeisin versio. StartWizard KLog - The free hamradio logging program KLog - Ilmainen amatööriradio kirjausohjelma Quit Setup Lopeta asennus Setup is not complete yet. Are you sure you want to quit setup? Asennus ei ole vielä valmis. Oletko varma että haluat lopettaa? StatisticsWidget QSO per year QSO:ta vuodessa DXCC per year DXCC:tä vuodessa CQ zones per year CQ vyöhykkeitä vuodessa QSO per band QSO:ta taajuusalueittain QSO per mode QSO:ta moodeittain QSO per DXCC QSO:ta DXCCittäin QSO per Continent QSO:ta mantereittain QSO per hour QSO:ta tunneittain QSO per month QSO:ta kuukausittain Worked / Confirmed status Workitty / Vahvistettu tila Worked / Sent status Workitty / Lähetetty tila Sent / Confirmed status Lähetetty / Vahvistettu tila StatsCQZPerYearBarChartWidget CQ Zones per year CQ Vyöhykkeitä vuodessa Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen CQ zones CQ vyöhykkeet CQ zones per year CQ vyöhykkeitä vuodessa Reading data ... Luetaan tietoja ... Years: %1/%2 Vuodet: %1%2 StatsEntitiesPerYearBarChartWidget Chart title Listan otsikko Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen DXCC Entities DXCC Yksiköitä DXCC Entities per year DXCC Yksiköitä vuosittain Reading data ... Luetaan tietoja ... Entities: Yksiköitä StatsQSOsPerBandBarChartWidget QSOs per band QSO:t taajuusalueittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Bands Taajuusalueet QSO per band distribution QSO:t taajuusaluejakauman mukaan Reading data ... Luetaan tietoja ... Bands: Taajuusalueet: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO:t mantereittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Continents Mantereet Reading data ... Luetaan tietoja ... Hours: Tunnit: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO:ta DXCC:tä kohti Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Reading data... Luetaan tietoja... Entity: Yksikkö: DXCC DXCC Top ten DXCC per QSO Kymmenen parasta DXCC:tä QSOittain StatsQSOsPerHourBarChartWidget QSOs per hour QSO:t tunneittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Hours Tunnit QSOs at hour QSO:t tunnissa Reading data ... Luetaan tietoja ... Hours: Tunnit: StatsQSOsPerModeBarChartWidget QSOs per mode QSO:t moodeittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Modes Moodit QSO per mode distribution QSO:t moodijakauman mukaan Reading data ... Luetaan tietoja ... Modes: Moodit: StatsQSOsPerMonthBarChartWidget QSOs per month QSO:t kuukausittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Jan Tammi Feb Helmi Mar Maalis Apr Huhti May Touko Jun Kesä Jul Heinä Sep Syys Oct Loka Nov Marras Dec Joulu Aug Elo Months Kuukaudet QSOs at Month QSO:t kuukaudessa Reading data ... Luetaan tietoja ... Months: Kuukaudet: StatsQSOsPerYearBarChartWidget Chart title Listan otsikko Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen QSOs QSO:t QSOs per year QSO:ta vuodessa Reading data ... Luetaan tietoja ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Lähetetty - %1 Confirmed - %2 Vahvistettu - %2 StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Wörkitty, ei vahvistettu - %1 Confirmed - %2 Vahvistettu - %2 StatsWorkedSentPieChartWidget Worked - %1 Wörkitty - %1 Sent - %2 Lähetetty - %2 UpdateSatsData Reading Satellites data file... Luetaan satelliitti tiedot-tiedostoa... Abort reading Peruuta lukeminen The Satellites information has been updated. Satelliitti tiedot päivitetty. Open File Avaa tiedosto Sat Data Satelliittitiedot World Entity Yksikkö Continent Manner Reading cty.csv... Luetaan cty.csv... Abort reading Keskeytä luku eLogClubLog Host not found! Isäntää ei löydy! Timeout error! Aikakatkaisu virhe! It seems to be a PASSWORD ERROR; check your password. Virhe näyttää olevan PASSWORD ERROR; tarkista salasanasi. KLog - ClubLog KLog - ClubLog It seems that your ClubLog password is not correct. Näyttää siltä että ClubLog salasanasi on väärä. Please check your password in the setup. ClubLog uploads will be disabled. Tarkista salasanasi asetuksista. ClubLog päivitykset eivät ole käytössä. Undefined error... Määrittelemätön virhe... Callsign missing Kutsutunnus puuttuu Invalid callsign Väärä kutsutunnus Skipping SWL callsign Ohitetaan SWL kutsutunnus Callsign is your own call Kutsutunnus on oma kutsusi Invalid callsign with no DXCC mapping Virheellinen kutsutunnus, ilman DXCC kartoitusta Updated QSO QSO päivitetty Invalid ADIF record Virheellinen ADIF tieto Missing ADIF record Puuttuva ADIF tieto Test mode - parameters ok, no action taken Testitila - parametrit ok, toimintoja ei tehty Excessive API Usage Liiallinen API:n käyttö Internal Error Sisäinen Virhe Rejected Hylätty QSO Duplicate QSO Duplikaatti QSO Modified QSO muokattu Missing Login Puuttuva sisäänkirjaus QSO OK QSO OK Upload denied Lataus kielletty No callsign selected Ei valittua kutsutunnusta No match found Vastaavuutta ei löytynyt Dropped QSO Pudotettu QSO OK OK Login rejected Sisäänkirjautuminen evätty Rejected: Callsign is your own call Hylätty: Kutsutunnus on oma kutsusi klog-0.9.8.1/translations/klog_fr.ts0000644000175000017500000074002713532572307016340 0ustar develdevel AboutDialog About KLog A propos de KLog By Par KLog is a free logbook for hamradio operators. KLog est un carnet de trafic libre pour les radioamateurs. Please know that this is an BETA release and it may contain many bugs.<br>Backup your data before using this software! Veuillez prendre note qu'il s'agit d'une version BETA et qu'elle peut contenir de nombreux bogues.<br>Sauvegardez vos données avant d'utiliser ce logiciel! KLog has been fully rewritten from the 0.6.2 to be able to provide a cross-platform application that runs in the main operating systems (Linux, macOS & Windows) and provide new functionalities that KLog was not providing. KLog a été complétement réécrit depuis la version 0.6.2 pour pouvoir fournir une application multi-plateformes pour les principaux systèmes d'exploitation (Linux, macOS & Windows) et fourni de nouvelles fonctionnalités que KLog ne fournissait pas. Please provide your review in KLog's eHam review page: Veuillez fournir votre révision dans la page de révision eHam de KLog : Find more information and the latest release at Trouvez plus d'information et la dernière version à Author Auteur today aujourd'hui Main developer Développeur principal KLog is developed by a very small team and you are invited to join! KLog est développé par une très petite équipe et vous êtes invités à nous rejoindre ! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Si KLog n'est pas encore disponible dans votre langue et que vous souhaitez nous aidez, rejoignez-nous sur la <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">liste de diffusion KLog dédiée au développement</a> ! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Vous pouvez aussi nous aider en postant des rapports de bogues ou de petites contributions au code source, idées ou tout ce qui selon vous, pourrait améliorer KLog. If you want to provide support you are welcome to join the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Si vous souhaitez apporter votre contribution, rejoignez-nous sur la <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">liste de diffusion KLog dédiée au développement</a> ! Authors Auteurs Translators bring KLog into your language. They are really an important part of the KLog development team. Les traducteurs portent KLog dans votre langue. Ils ont une part importante dans l'équipe de développement KLog. Translators Traducteurs Privacy advisory Avis de confidentialité KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account user's needs Les développeurs de KLog ont inclus une fonctionnalité qui rapporte quelques données utilisateurs au serveur KLog avec le seul but d'identifier les versions installées, de concentrer le développement dans une direction ou une autre en prenant en compte les besoins de l'utilisateur. At present, the data that is provided is the following: Actuellement, les données qui sont collectées sont les suivantes : Callsign Indicatif KLog version Version de KLog Operating system Système d'exploitation Be aware that you can enable/disable this feature from the Misc tab in the Setup page Sachez que vous pouvez activer/désactiver cette fonctionnalité depuis l'onglet Divers dans la page de Configuration KLog KLog Privacy Confidentialité CTYPage Country data download Téléchargement des données des Pays KLog needs country data... Klog a besoin des données des pays... &Download Télécharger &Ignore Ignorer Country data needed Données de pays nécessaire KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC information. KLog utilise le fichier cty.csv depuis http://www.country-files.com/ pour récupérer les informations DXCC. You need to download the cty.csv file if you want KLog to show you the countries, locator, ... of the QSOs you do. Vous avez besoin de télécharger le fichier cty.csv si vous souhaitez que KLog affiche les pays, le locator… des QSos que vous faîtes. Click on Download to download now. Cliquer sur Télecharger pour télécharger maintenant. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Je ne peux pas trouver le serveur distant. Veuillez vérifier votre connexion réseau et réessayez Souhaitez-vous réessayez ? DXCCStatusWidget Update Mise à jour ID ID Entity Entité Pref: CQ: ITU: Beam: Entity not worked in this band. Entité non contacté sur cette bande DXClusterWidget Click on Connect to connect to the DX-Cluster server Cliquez sur Se connecter pour se connecter au serveur DX-Cluster Connect Se connecter Clear Effacer Click on connect to connect to the DX-Cluster Cliquer sur Se connecter pour se connecter au DX-Cluster Trying to connect to the server Tentative de connexion au serveur KLog DXCluster DXCluster KLog The host was not found. Please check: Le serveur distant n'a pas été trouvé. Veuillez vérifier : - your network connection; - the host name and port settings. - Votre connexion réseau ; - La configuration du nom d'hôte et du port du serveur distant. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. La connexion a été refusée par le serveur distant. Soyez sûr que le serveur DXCluster est lancé et vérifiez que le paramètrage du nom d'hôte du serveur distant et du port sont corrects. The following error occurred: %1. L'erreur suivante s'est produite : %1. Connected to server Connecté au serveur KLog message Message KLog Enter your callsign to connect to the cluster: Entrez votre indicatif pour vous connecter au cluster : Enter your password to connect to the cluster: (Just hit enter for no password) Entrez votre mot de passe pour vous connecter au cluster : (Tapez juste sur la touche Entrée s'il n'y a pas de mot de passe) Disconnect Sé déconnecter Not logged on, you may need to enter your callsign again. Non connecté, vous devrez peut-être ressaisir votre indicatif. Enter here the commands to be sent to the DX-Cluster server. Saisir ici les commandes à envoyer au serveur DX-Cluster Connection closed by the server Connexion fermée par le serveur Click on Connect to connect to the DX-Cluster server. Cliquer sur "Se connecter" pour se connecter au serveur DX-Cluster. Send Envoyer DataProxy_SQLite Software version in DB is null La version du logiciel dans la BD est null No query failed Aucune requête n'a échoué Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Terre-Lune-Terre Sporadic E Sporadique E Field Aligned Irregularities Common term in hamradio, do not translate if not sure Field Aligned Irregularities F2 Reflection Common term in hamradio, do not translate if not sure F2 Reflection Internet-assisted Assisté par Internet Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder Répéteur terrestre ou atmosphérique ou transpondeur Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satellite Trans-equatorial Common term in hamradio, do not translate if not sure Trans-équatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Tropospheric ducting Yes Oui No Non Requested Demandé Ignore/Invalid Ignoré/Incorrect Validated Validé Queued Mis en file d'attente Uploaded Téléversé Do not upload Ne pas téléverser Modified Modifié Bureau Common term in hamradio, do not translate if not sure Bureau Direct Direct Electronic Électronique Manager Common term in hamradio, do not translate if not sure Manager KLog DXCC DXCC KLog All QSOs have been updated with a DXCC and the Continent. Tous les QSOs ont été mis à jour avec le DXCC et le continent. DownLoadCTY Download of cty.csv failed with the following error code: Le téléchargement de cty.csv a échoué avec le code d'erreur suivant : Download of cty.csv done. Téléchargement de cty.csv terminé. There is already a cty.csv file in the folder but it will be replaced with the new one. Il y a déjà un fichier cty.csv dans le répertoire, il va être remplacé par le nouveau. Could not open %1 for writing Ouverture impossible de %1 pour écriture FileManager The log that you have selected contains more than just one station callsign. Le journal que vous avez sélectionné contient plus qu'un seul indicatif de station. Please select the station callsign you want to export the log from: Veuillez sélectionner l'indicatif de la station pour lequel vous souhaitez exporter le journal : Station Callsign: Indicatif de la Station : Define Station Callsign Définissez l'Indicatif de la Station You have selected no callsign. KLog will export QSOs without a station callsign defined and those with the call you are entering here. Vous avez sélectionné pas d'indicatif. KLog exportera les QSOs sans un indicatif de station défini et ceux avec l'indicatif que vous avez saisi ici. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Entrez l'indicatif de la station à utiliser pour ce journal ou laissez vide pour des QSO sans indicatif de station défini : No station callsign has been selected and therefore no log will be exported Aucun indicatif de station n'a été sélectionné et par conséquent, aucun journal ne sera exporté Writing ADIF file... En cours d'enregistrement du fichier ADIF... Abort writing Annuler l'enregistrement Exporting LoTW ADIF file... Export vers le fichier ADIF de LoTW... QSO: QSO : Writing ADIF file... QSO: Enregistrement du fichier ADIF... QSO : You have canceled the file export. The file will be removed and no data will be exported. Vous avez annulé l'export du fichier. Le fichier sera supprimé et aucune donnée ne sera exportée. Do you still want to cancel? Souhaitez-vous toujours annuler ? Writing Cabrillo file... Enregistre le fichier Cabrillo... KLog: Cabrillo Log Export not implemented KLog : L'export du journal au format Cabrillo n'est pas implémenté I am sorry but the Cabrillo Export To File feature has still not been implemented. Je suis désolé mais la fonctionnalité de conversion du format Cabrillo vers un fichier n'a pas encore été implémenté. Reading LoTW file... Lecture en cours du fichier LoTW... Abort reading Lecture interrompue There is more than one log in this logfile. Il y a plus d'un journal dans ce fichier journal. All logs will be imported into the current log. Tous les journaux seront importés dans le journal en cours. Do you want to continue? Souhaites-vous continuer ? Reading ADIF file... Lecture du fichier ADIF en cours... Importing ADIF file... Importation du fichier ADIF en cours... It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Il semble qu'il y ait quelques QSOs en doublon dans le fichier ADIF que vous importez. Souhaitez vous continuer ? (Les QSOs en doublon ne seront pas importés) You have cancelled the file import. The file will be removed and no data will be imported. Vous avez interrompu l'importation du fichier. Le fichier sera retiré et aucune donnée ne sera importée. This QSO is not including the minimum data to consider a QSO as valid!. Ce QSO n'inclue pas le nombre de données minimum pour être considéré comme valide ! Please edit the ADIF file and make sure that it include at least: Veuillez éditer le fichier ADIF et soyez sûr qu'il contient à minima : and et This QSO had: Ce QSO a : - The band missing and the following call: - La bande est manquante pour l'indicatif suivant : - The call missing but was done at this time: - L'appel a été perdu mais a été réalisé à cette heure : - The mode missing and the following call: - Le mode est manquant pour l'indicatif suivant : - The date missing and the following call: - La date est manquante pour l'indicatif suivant : - The time missing and the following call: - L'heure est manquante pour l'indicatif suivant : Do you want to continue with the current file? Souhaitez-vous continuer avec le fichier en cours ? KLog: Not all required data found! KLog : Tous les données requises n'ont pas été trouvés ! This log seems to lack of RST-TX information. Ce journal semble manquer d'informations sur le TX-RST. Click on Yes to add a default 59 to all QSO with a similar problem. Cliquer sur Oui pour ajouter 59 par défaut à tous les QSO avec un problème similaire. If you select NO, the QSO may not be imported. Si vous sélectionnez NON, le QSO ne peut pas être importé. KLog: No RST TX found! KLog : Pas de RST TX trouvé ! This log seems to lack of RST-RX information. Ce journal semble manquer d'informations sur le RX-RST. KLog: No RST RX found! KLog : Pas de RST RX trouvé ! InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Continent Prefix Préfixe CQ CQ ITU ITU Short Path Chemin Court Long Path Chemin Long Deg Deg Miles Miles Km Km IntroPage Welcome to KLog! Bienvenue sur KLog ! Welcome to KLog! - brought to you under the terms of the GPL! Bienvenue sur KLog ! - vous est présenté selon les termes de la GPL ! Welcome to KLog Bienvenue sur KLog This looks like it's the first time you've run KLog on this computer. Il semble que c'est la première fois que vous lancez KLog sur cet ordinateur. KLog is a free hamradio logging program that can run on Linux macOS and Windows. KLog est un programme de journalisation radioamateur qui peut être utilisé sous Linux, macOS et Windows. It is designed to provide general purpose, DX and contest logging. Il est conçu pour fournir une journalisation complète des DX et contests. It supports QSL management, import and export of ADIF Il supporte la gestion des QSLs, l'import et l'export and Cabrillo file formats and many other features... aux formats de fichiers ADIF et Cabrillo et aussi beaucoup d'autres fonctionnalités... Before you can start using KLog, you will be asked to: Avant que vous puissiez utiliser KLog, il va vous être demandé de : Acknowledge to the terms of the license. Prendre connaissance des termes de la licence. Download the DX entities information. Télécharger les informations des entités DX. Enter your callsign, CQ zone, etc. and main configuration. Entrer votre indicatif, zone CQ etc... et la configuration principale. Enjoy KLog and contact the development team if you have any suggestions! Appréciez KLog et contactez l'équipe de développement si vous avez des suggestions ! LicPage KLog License information Information de licence KLog Welcome to KLog!- brought to you under the terms of the GPL! Bienvenue sur KLog ! - vous est présenté selon les termes de la GPL ! Acknowledge Remerciements Be aware that KLog is free software. Sachez que KLog est un logiciel libre. LogModel Date Date Time Heure QRZ QRZ Band Bande Mode Mode RSTtx RSTtx RSTrx RSTrx Comment Commentaire LogWindow QSL Send QSL envoyée QSL Rcvd QSL reçue &Delete Supprimer Delete a QSO Supprimer un QSO &Edit QSO &Editer un QSO Edit this QSO Editer ce QSO Via &bureau Via &bureau Send this QSL via bureau Envoyer cette QSL via bureau D&irect D&irecte Send this QSL via direct Envoyer cette QSL via direct Via bureau Via bureau QSL &received via bureau QSL &reçue via bureau Direct Direct QSL received via direc&t QSL reçue via direc&t You have requested to delete this QSO. Vous avez demandé à effacer ce QSO. Are you sure? Êtes-vous sûr ? MainWindow Recalculate Recalculer Starting KLog Démarrage de Klog &Add &Ajouter &Clear Effa&cer Status bar... Bar d'état... DX Entity Entité DX &Log Window Fenêtre de journa&l &Score Window Fenêtre de &Score Watts Watts MHz MHz KLog KLog Annual Annuel Ready Prêt An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Une erreur inattendue s'est produite en essayant d'ajouter votre QSL au journal. Si le You have selected an entity: Vous avez sélectionné une entité : that is different from the KLog proposed entity: qui est différente de l'entité proposée par KLog : Click on the prefix of the correct entity or Cancel to edit the QSO again. Cliquez sur le préfixe de l'entité correcte ou Annuler pour éditer à nouveau le QSO. Click on the prefix of the right entity or Cancel to correct. Cliquez sur le préfix de l'entité correcte ou Annuler pour corriger. Input Entrée RSTrx RSTrx RSTtx RSTtx QRZ QRZ STX STX SRX SRX NEW MULT NOUVEAU MULT Invalid characters used in the QRZ Des caractères invalides ont été utilisés pour le QRZ Ready... Prêt... &File &Fichier &New... &Nouveau... &Open... &Ouvrir... &Import from ADIF... &Importer depuis un fichier ADIF... Import an ADIF file into the current log. Importer un fichier ADIF dans le journal en cours. &Save As... &Enregistrer sous... Export to ADIF... Exporter vers un fichier ADIF... Export the current log to an ADIF logfile. Exporter le log en cours vers un fichier journal ADIF. Export all logs to ADIF... Exporter tous les journaux en ADIF... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exporter TOUS les QSOs dans un fichier ADIF en fusionnant les QSOs de tous les journaux. Export Requested QSL to ADIF... Exporter les QSLs demandées en ADIF... Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a QSL tag printing program). Exporter tous les QSOs avec demande de QSL vers un fichier ADIF (pour par exp. l'importer dans un programme d'impression d'étiquettes de QSL). Export ADIF for LoTW... Exporter en ADIF pour LoTW... Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before uploading to LoTW! Exporter un fichier ADIF à envoyer à LoTW. Pensez à vous connecter avec TSQL avant de téléverser vers LoTW ! &Print Log... Im&primer... Print your log. Imprimer votre journal KLog folder Répertoire de KLog Opens the data folder of KLog. Ouvre le répertoire de données de KLog. E&xit Quitter &Tools Ou&tils Fill in QSO data Saisir les données de QSO Go through the log reusing previous QSOs to fill missing information in other QSOs. Parcourir le journal pour compléter des informations manquantes dans d'autres QSOs en réutilisant de précédents QSOs. Fill in DXCC data Saisir les données DXCC Go through the log filling QSOs without a DXCC defined. Parcourir le journal des QSOs renseignés sans DXCC. QSL tools... Outils QSL... &Find QSO to QSL Rechercher les QSO pour QSL Shows QSOs for which you should send your QSL and request the DX QSL. Affiche les QSOs pour lesquels vous devez envoyer votre QSL et demander la QSL DX. Find My-QSLs pending to send Rechercher Mes-QSLs en attente d'envoi Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Affiche les QSOs avec des demandes en attente d'envoi de QSLs. Vous devriez conserver cette file vide ! &Find DX-QSLs pending to receive Rechercher des QSLs-DX en attente de réception Shows the DX-QSL that has been requested or QSLs has been sent with no answer. Affiche les QSL-DX demandées ou les QSLs envoyées sans retour. &Find requested pending to receive Rechercher les demandes en attente de réception Shows the DX-QSL that has been requested. Affiche les QSL-DX qui ont été demandées. LoTW tools... Outils LoTW... Queue all QSL to be sent of this log Mettre en file d'attente toutes les QSLs à envoyer de ce journal Mark all non sent QSOs in this log as queued to be uploaded. Marquer tous les QSOs non envoyés de ce journal en file d'attente pour être téléversés. Queue all QSL to be sent Mettre en file d'attente toutes les QSLs à envoyer Mark all non sent QSOs as queued to be uploaded. Marquer tous les QSOs non envoyés en file d'attente pour être téléversés. Mark as sent all queued QSO of this log Marquer comme envoyés tous les QSOs en file d'attente de ce journal Mark all queued QSOs in this log as sent to LoTW. Marquer tous les QSOs en file d'attente de ce journal comme envoyé à LoTW. Mark all queued QSO as sent Marquer tous les QSOs en file d'attente comme envoyés Mark all queued QSOs as sent to LoTW. Marquer tous les QSOs en file d'attente comme envoyés à LoTW. &Update cty.csv Mettre à jour cty.csv For updated DX-Entity data, update cty.csv. Pour des données d'entités DX mises à jour, mettre à jour cty.csv. &Update Satellite Data &Mettre à jour les données de Satellite Stats Statistiques Show the statistics of your radio activity. Afficher les statistiques de votre activité radio &Setup Configuration &Setup... Configuration... &Help Aide Check updates... Vérifier les mises à jour... &About... A propos... About Qt... A propos de Qt... KLog LoTW KLog LoTW All pending QSO of this log has been marked as queued for LoTW! Tous les QSOs en attente de ce journal ont été marqués comme étant en file d'attente pour LoTW ! Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. Maintenant, vous pouvez aller dans le menu Fichier pour exporter le fichier ADIF LoTW et le téléverser vers LoTW. There was a problem to mark all pending QSO of this log as queued for LoTW! Il y a eu un problème pour marquer tous les QSOs en attente de ce journal comme étant en attente pour LoTW ! All pending QSO has been marked as queued for LoTW! Tous les QSOs en attente ont été marqués comme étant en file d'attente pour LoTW ! The log that you have selected contains more than just one station callsign. Le journal que vous avez sélectionné contient plus qu'un seul indicatif de station. Please select the station callsign you want to mark as sent to LoTW: Veuillez sélectionner l'indicatif de la station que vous souhaitez marquer comme envoyé à LoTW : Station Callsign: Indicatif de la Station : Define Station Callsign Définir l'indicatif de la Station You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the call you are entering here. Vous n'avez pas sélectionné d'indicatif. KLog marquera les QSOs sans un indicatif de station défini et ceux avec l'indicatif que vous avez saisi ici. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Enter l'indicatif de la station à utiliser pour ce journal ou laisser vide pour un QSO sans un indicatif de station défini : No station callsign has been selected and therefore no log will be marked Aucun indicatif de station n'a été sélectionné, par conséquent aucun journal ne sera marqué All queued QSO of this log has been marked as sent for LoTW! Tous les QSOs en file d'attente de ce journal ont été marqués comme envoyés pour LoTW ! There was a problem to mark all queued QSO of this log as sent for LoTW! Il y a eu un problème pour marquer tous les QSOs en file d'attente de ce journal comme envoyés pour LoTW ! All queued QSO has been marked as sent to LoTW! Tous les QSO en file d'attente ont été marqués comme envoyés à LoTW ! There was a problem to mark all queued QSO of this log as sent to LoTW! Il y a eu un problème pour marquer tous les QSOs en file d'attente de ce journal comme envoyés à LoTW ! About... A propos... KLog update checking result Résultat de vérification des mises à jour KLog Congratulations! Félicitations ! You already have the latest version. Vous disposez déjà de la dernière version. Nothing has been saved. You have to select a valid file type. Rien n'a été sauvegardé. Vous devez sélectionner un type de fichier valide. Save File Sauvegarder le Fichier ADIF file Fichier ADIF Cabrillo files Fichiers Cabrillo Any file N'importe quel fichier You can find the KLog data folder here: Vous pouvez trouver le répertoire de données KLog ici : DUPE DOUBLON Filling DXCC in QSOs... QSO: Saisir le DXCC dans les QSOs... QSO: TX Frequency in MHz. Frequency is not in a hamradio band! Fréquence d'émission en MHz. La fréquence n'est pas une bande réservée aux radioamateurs ! RX Frequency in MHz. Frequency is not in a hamradio band! Fréquence de réception en MHz. La fréquence n'est pas une bande réservée aux radioamateurs ! QSO logged from WSJT-X: QSO loggué depuis WSJT-X : start démarrer stop arrêter It seems that there are no QSO in the database. Il semble qu'il n'y ait pas de QSO dans la base de données. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Si vous êtes sûr que la base de données contient des QSOs et que KLog ne parvient pas à les trouver, veuillez "contacter les développeurs (voir A propos de KLog) pour de l'aide. TX Frequency in MHz. Fréquence TX en MHz RX Frequency in MHz. Fréquence RX en MHz Power used by the DX. Puissance utilisé pour le contact Logging operator's callsign. Indicatif de la station utilisée pour le log Callsign used over the air. Indicatif utilisé sur l'air. My QTH locator. Mon QTH locator Name of the DX. Nom du contact QTH of the DX. QTH du contact Locator of the DX. Locator du contact QRZ of the QSO. QRZ du contact Click to recalculate the award status. Cliquer pour recalculer le statut du diplôme TX RST. RST TX RX RST. RST RX TX Exchange. Echange TX RX Exchange. Echange RX Band of the QSO. Bande Mode of the QSO. Mode Date of the QSO. Date Time of the QSO. Heure Add the QSO to the log. Ajouter le contact Clear the box. Effacer le champ The logfile has been modified. Le fichier de log a été modifié Do you want to save your changes? Voulez-vous sauvegarder vos modifications ? UDP Server error The UDP server failed to %1. start or stop Erreur du serveur UDP Le serveur UDP à échoué : %1. Clears the QSO entry. Efface la saisie Number of confirmed DXCC entities. Nombre d'entités DXCC confirmées. Number of worked DXCC entities. Nombre d'entités DXCC contactées. Number of confirmed WAZ zones. Nombre de zones WAZ confirmées. Number of worked WAZ zones. Nombre de zones WAZ contactées. Number of confirmed local references. Nombre de références locales confirmées. Number of worked local references. Nombre de références locales contactées. Number of confirmed QSOs. Nombre de QSOs confirmés. Number of worked QSOs. Nombre de QSOs réalisés. Number of QSOs worked on the selected year. Nombre de QSOs réalisés pour l'année sélectionnée. Number of DXCC worked on the selected year. Nombre de DXCC réalisés pour l'annéee sélectionnée. Number of CQ Zones worked on the selected year. Nombre de Zones CQ réalisés pour l'année sélectionné. Score for the DXMarathon on the selected year. Score pour le DXMarathon pour l'année sélectionnée. Select the year you want to check. Sélectionnez l'année que vous souhaitez vérifier. Status of the DX entity. Statut de la contrée contactée Name of the DX entity. Nom de la contrée contactée Name Nom QTH QTH Locator Locator Power(rx) Puissance(rx) RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Fréq TX Freq RX Fréq RX QSO QSO QSL QSL eQSL eQSL Comment Commentaire Others Autres My Data Mes Données Satellite Satellite QSOs QSOs DXCC DXCC CQ CQ Score Score DX-Marathon DX-Marathon Info Info Award Diplôme Confirmed Confirmé Worked Réalisé WAZ WAZ Local Local Awards Diplômes Search Rechercher Log Journal DX-Cluster Cluster-DX Save ADIF File Enregistrer le Fichier ADIF LoTW logfile has been properly exported! Le fichier journal LoTW a été correctement exporté ! Remember to: Pensez à : Before uploading: sign the LoTW log; and Avant de téléverser : se connecter au journal LoTW, et After uploading: mark as sent all the queued QSO (LoTW Tools). Après le téléversement, marquer comme envoyés tous les QSOs en file d'attente (Outils LoTW). There was no QSO to be exported. Il n'y a pas de QSO à exporter. If you think that some QSO should have been exported, please look for them and ensure that the eQSL LoTW QSL sent box is marked as: Si vous pensez que certains QSOs auraient du être exportés, veuillez les rechercher et assurez-vous que la case eQSL LoTW QSL est marquée comme : Q - Queued Q - En file d'attente There was an error while exporting the LoTW. The log has not been exported! Une erreur s'est produite pendant l'export vers LoTW. Le journal n'a pas été exporté ! Save Cabrillo File Sauvegarder le Fichier Cabrillo Open File Ouvrir un Fichier &Modify &Modifier - Needed for DXMarathon - Nécessaire pour le DXMarathon Filling QSOs... Saisir des QSOs... Abort filling Annuler la saisie Number Numéro Date Date Time Heure Band Bande Mode Mode Print Log Imprimer le Journal Printing the log... Imprimer le journal... Abort printing Annuler l'impression Printing the log... QSO: Impression du journal… QSO : KLog QSO received ASO KLog reçu The following QSO data has been received from WSJT-X to be logged: Les données de QSO suivant ont été reçues de WSJT-X pour être journalisées : Call Indicatif Freq Fréq Time On Heure de début Time Off Heure de fin RST TX TX RST RST RX RX RST DX-Grid DX-Grid Comments Commentaires TX Pwr Pwr TX Operator Opérateur Local-Grid Grid-Local Do you want to keep receiving this alerts? (disabling this alerts will prevent that non-valid modes are detected) Souhaitez-vous continuer à recevoir ces alertes ? (la désactivation de ces alertes empêchera que les modes non-valides soient détectés) If the received mode is correct, please contact KLog development team and request support for that mode Si le mode reçu est correct, veuillez contacter l'équipe de développement KLog et demandez le support de ce mode A new mode not supported by KLog has been received from an external software or radio: Un nouveau mode non supporté par KLog a été reçu d'un logiciel externe ou d'une radio : A duplicated satellite has been detected in the file and will not be imported. Un Satellite en doublon a été détecté dans le fichier et ne sera pas importé. Please check the satellite information file and ensure it is properly populated. Veuillez vérifier le fichier des informations sur les Satellites et assurez-vous qu'il est proprement rempli. Now you will see a more detailed error that can be used for debugging... Vous allez voir une erreur plus détaillée qui pourra être utilisée pour le déboggage... An unexpected error ocurred!! Une erreur inattendue s'est produite !! If the problem persists, please contact the developers Si le problème persiste, veuillez contacter les développeurs for analysis: pour analyse : Error in function Erreur dans la fonction Error code Code d'erreur Error text Texte d'erreur Failed query Requête échouée Recomendation: Recommandation : Export, periodically, your data to ADIF to prevent a potential data loss. Exporte périodiquement vos données en ADIF pour prévenir une perte de données potentielle. Do you want to keep showing errors? Voulez-vous continuer à afficher les erreurs ? MainWindowInputComment Add a comment for this QSO. Ajouter un commentaire pour ce QSO MainWindowInputEQSL Date of the ClubLog upload. Date du transfert vers ClubLog Date of the eQSL sending. Date de l'envoi de l'eQSL Date of the eQSL reception. Date de réception de l"eQSL Date of the LoTW sending. Date de l'envoi LoTW. Date of the LoTW reception. Date de la réception LoTW Status on ClubLog. Statut sur ClubLog Status of the eQSL sending. Statut de l'envoi de l'eQSL Status of the eQSL reception. Statut de la réception de l'eQSL Status of the LoTW sending. Statut de l'envoi LoTW Status of the LoTW reception. Statut de la réception LoTW ClubLog ClubLog eQSL Sent eQSL Env. eQSL Rec eQSL Reçu LoTW Sent LoTW Env. LoTW Rec LoTW Reçu MainWindowInputOthers Primary Div Div Principale Secondary Div Div Secondaire IOTA IOTA Entity Entité Propagation mode Mode de propagation Select the primary division for this QSO. Choisir la division principale pour ce QSO Select the secondary division for this QSO. Choisir la division secondaire pour ce QSO Select the entity for this QSO. Choisir l'entité pour ce QSO Select the propagation mode for this QSO. Choisir le mode de propagation pour ce QSO Select the IOTA continent for this QSO. Choisir le continent IOTA pour ce QSO Select the IOTA reference number for this QSO. Choisir la référence IOTA pour ce QSO Not Identified Non Identifié Not - Not Identified Non - Non Identifié MainWindowInputQSL QSL Sent QSL Env. QSL Rec QSL Reçue QSL Via QSL Via QSL Msg QSL Msg Status of the QSL sending. Statut de l'envoi de la QSL Status of the QSL reception. Statut de la réception de la QSL QSL sending information. Informations d'envoi de la QSL QSL reception information. Informations de réception de la QSL Date of the QSL sending. Date d'envoi de la QSL Date of the QSL reception. Date de la réception de la QSL Message of the QSL. Message de la QSL QSL via information. Information QSL via MainWindowMyDataTab Watt Watt Keep this data Conserver ces données Data entered in this tab will be copied into the next QSO. Les données saisies dans cet onglet seront réutilisées pour les prochains QSOs Power used for the QSO in watts. Puissance utilisée pour le QSO en watts Logging operator's callsign. Authentification de l'indicatif de l'opérateur. Callsign used over the air. Indicatif utilisé sur l'air. My QTH locator. Mon QTH locator. Power Puissance Operator Opérateur Station Callsign Indicatif de la Station My Locator Mon Locator MainWindowSatTab Keep this data Conserver ces données Other - Sat not in the list Autre - Sat n'est pas dans la liste Data entered in this tab will be copied into the next QSO. Les données saisies dans cet onglet seront réutilisées pour les prochains QSOs Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Le nom du Satellite n'est pas dans la liste. Choisir : "%1" pour activer ce champ. (format like AO-51). Satellite mode used. Mode Satellite utilisé Select the satellite you are using. Choisir le satellite que vous utilisez UpLink band. Bande UpLink DownLink band. Bande DownLink Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Locator de la station contactée. Ce champ est synchronisé avec le champ Locator de l'onglet QSO UpLink UpLink DownLink DownLink Satellite Satellite Mode Mode DX Locator Locator DX Other Autre MHz MHz Not Sat QSO QSO non Sat KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog a détecté un nom de satellite qu'il ne reconnaît pas. Si vous préférez utiliser l'un des noms de satellites connus à la place, veuillez le choisir dans la liste. Sinon, veuillez contacter l'équipe de développement pour ajouter le nouveau nom de satellite. The satellite you have in your QSO is: Le satellite que vous avez dans votre QSO est : Please know that the satellite name will not be saved if it is not in the list so that information may be lost! Veuillez prendre connaissance que le nom du satellite ne sera pas sauvegardé s'il n'est pas dans la liste donc cette information peut être perdue ! QObject New One, work it! Un Nouveau, le faire ! Needed, work it! Nécessaire, le faire ! Worked but not confirmed Réalisé mais non confirmé Confirmed Confirmé Not identified Non identifié Database Error Erreur de base de données KLog DB needs to be upgraded. La BD de KLog doit être mise à jour. Do you want to upgrade it now? Voulez-vous la mettre à jour maintenant ? If DB is not upgraded KLog may not work properly. Si la BD n'est pas mise à jour, KLog peut ne pas fonctionner correctement. KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog a détecté un ancien journal dans la BD. Toutes les données seront migrées vers un nouveau journal de type DX pour vous. KLog: Enter Station callsign KLog : Saisir l'indicatif de la Station Enter the station callsign used in this log Saisir l'indicatif de la station utilisé dans ce journal Station Callsign Indicatif de la Station All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is OK. Toutes les données ont été correctement migrées. Vous devriez aller maintenant dans Configuration->Préférences->Journaux pour vérifier que tous est OK. Updating mode information... Mise à jour des informations sur les modes... Abort updating Mise à jour annulée QSO: QSO : Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Annuler cette mise à jour entraînera une altération des données et une perte de données possible. Souhaitez-vous quand même annuler ? Updating bands information... Mise à jour des informations de bande... Updating bands information in %1 status... Mise à jour des information sur les bandes en statut %1... Progress: Progression : Updating mode information in %1 status... Mise à jour des informations sur les modes en statut %1... Updating DXCC award information... Mise à jour des informations sur les diplômes DXCC... Updating DXCC Award information... Mise à jour des informations sur les Diplômes DXCC... Updating WAZ award information... Mise à jour des informations sur les diplômes WAZ... Updating WAZ Award information... Lise à jour des informations sur les Diplômes WAZ... Updating DXCC and Continent information... Mise à jour des informations sur les Contrées DXCC et Continents... Install wizard was canceled before completing... L'assistant d'installation a été annulé avant de terminer... Do you want to remove the KLog dir from your disk? Voulez-vous supprimer le répertoire KLog de votre disque ? Your KLog dir has been removed Votre répertoire KLog a été supprimé Thank you for running KLog! Merci à vous d'utiliser KLog ! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Je n'ai pas pu supprimer votre répertoire KLog. Vous devrez le faire manuellement si vous voulez le supprimer de votre disque-dur. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Votre répertoire KLog ne peut pas être supprimé. Vous devrez le faire manuellement si vous voulez le supprimer de votre disque dur. Remember that your KLog dir is on your system... Rappelez-vous que votre répertoire KLog est sur votre système... SearchWidget &Clear Effa&cer &Export Highlighted &Exporter la Sélection &Select All Tout &Sélectionner &Search Rechercher All Tout Clear the searches. Effacer les recherches. Export the search result to an ADIF file. Exporter le résultat de la recherche vers un fichier ADIF. Select/Unselect all the QSOs shown. Sélectionner/Désélectionner tous les QSOs affichés. Search in the log. Rechercher dans le journal. Search in all logs. Rechercher dans tous les journaux. Enter the QRZ to search for. Saisir le QRZ que vous recherchez. Search results. Résultats de la recherche QRZ QRZ Date/Time Date/Heure Band Bande Mode Mode QSL Sent QSL Env. QSL Rcvd QSL Reçue Station Callsign Indicatif de la Station ID ID &Clear selection Effacer la sélection Save File Sauvegarder le Fichier QSL Send QSL Envoyée &Delete Supprimer Delete a QSO Supprimer un QSO &Edit QSO &Editer le QSO Edit this QSO Editer ce QSO Via &bureau Via &bureau Send this QSL via bureau Envoyer cette QSL via bureau D&irect D&irect Send this QSL via direct Envoyer cette QSL via direct &Request my QSL Demande&r ma QSL Mark my QSL as requested Marquer ma QSL en demandée Via Direct && mark DX QSL as requested Via Direct && marquer cette QSL DX en demandée Send this QSL via direct & mark DX QSL as requested Envoyer cette QSL via direct & marquer la QSL DX en demandée Via Bureau && mark DX QSL as requested Via Bureau && marquer la QSL en demandée Send this QSL via bureau & mark DX QSL as requested Envoyer cette QSL via bureau & marquer la QSL en demandée &Request the QSL Demande&r la QSL Mark the QSL as requested Marquer la QSL en demandée Via bureau && mark my QSL as requested Via bureau && marquer ma QSL en demandée QSL received via bureau & mark my QSL as requested QSL reçue via bureau & marquer ma QSL en demandée Via bureau Via bureau QSL received via bureau QSL reçue via bureau Direc&t && mark as my QSL requested Direc&t && marquer comme ma QSL demandée QSL received via direct & mark my QSL as requested QSL reçue via direct & marquer ma QSL en demandée Direc&t Direc&t QSL received via direct QSL reçue via direct You have requested to delete the QSO with: %1 Vous avez demandé à supprimer le QSO avec : %1 Are you sure? Êtes-vous sûr ? Needed QSO to send the QSL QSO nécessaire pour envoyer la QSL My QSL requested to be sent Ma QSL demandée à envoyer DX QSL pending to be received QSL DX en attente de réception SetupDialog My Data Mes données Bands/Modes Bandes/Modes DX-Cluster Cluster DX Colors Couleurs Misc Divers World Editor Editeur du Monde Logs Journaux Satellites Satellites HamLib HamLib Cancel Annuler OK OK Config Dialog Fenêtre de Configuration User data Données utilisateur D&X-Cluster Cluster D&X ClubLog ClubLog WSJT-X WSJT-X You need to enter at least one log in the Logs tab. Vous devez saisir au moins un journal dans l'onglet Journaux. World Monde DB has not been moved to new path La Base de Données n'a pas été déplacée vers le noucel emplacement Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Aller dans l'onglet "Divers" et cliquer sur "Déplacer la base de données" sinon la base de données ne sera pas déplacée vers le nouvel emplacement. Go to the User tab and enter valid QRZ. Aller dans l'onglet "Utilisateur" et saisir un QRZ valide. You need to enter at least a valid QRZ. Vous devez au moins saisir un QRZ valide. You have not selected the kind of log you want. Vous n'avez pas choisi le type de journal que vous souhaitez. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Vous allez être redirigé vers l'onglet Journal. Veuillez ajouter et choisir le type de journal que vous souhaitez utiliser. SetupEntityDialog Entity Entité CQ CQ ITU ITU Latitude Latitude Longitude Longitude UTC UTC Main prefix Préfix principal ARRL ID ID ARRL Prefixes Préfixes Comma separated possible prefixes, e.g. EA1, EA2, ... Préfixes possibles séparés par des virgules : EA1, EA2... Name of the Entity. Nom de la Contrée CQ zone. Zone CQ ITU zone. Zone ITU Longitude of the Entity. Longitude de la Contrée DXCC Local time difference to UTC. Différence entre l'heure locale et l'heure UTC Main prefix of the entity. Préfixe principal de la contrée ARRL ID. ID ARRL Date of the deletion. Date de suppression Deleted Supprimé Cancel Annuler OK OK Entity Dialog Fenêtre de l'entité SetupPageBandMode Bands Bandes Modes Modes SetupPageClubLog &Callsign Indi&catif ClubLog &password ClubLog mot de &passe ClubLog &email ClubLog &email Enter the email you used to register in ClubLog. Entrez le mail utilisé lors de votre inscription à ClubLog Enter the callsign you used to register in ClubLog. Entrez l'indicatif utilisé lors de votre enregistrement à ClubLog Enter your password in ClubLog. Entrez votre mot de passe ClubLog &Send QSOs in real time Envoyer les QSOs en temps réel &Activate ClubLog &Activer ClubLog Use QSO Station &Callsign Utiliser l'Indicatif de la Station du QSO Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Envoyer chaque QSO à ClubLog en même temps qu'ils sont ajoutés ou modifiés dans KLog Starts the ClubLog support in KLog. Activer le support de ClubLog dans KLog Use the Station Callsign defined in each QSO instead of the one defined here. Utiliser l'indicatif de station défini dans chaque QSO au lieu de celui défini ici SetupPageColors New One Un Nouveau Needed in this band Nécessaire dans cette bande Worked in this band Contacté dans cette bande Confirmed in this band Confirmé dans cette bande Default Défaut Choose a color Choisir une couleur SetupPageDxCluster Add Ajouter Delete Supprimer Show &HF spots Afficher les spots &HF Show V/&UHF spots Afficher les spots V/&UHF Show W&ARC spots Afficher les spots W&ARC Show &worked spots Afficher les spots contactés Show &confirmed spots Afficher les spots &confirmés Show ANN/&FULL messages Afficher les messages ANN/&FULL Show WW&V messages Afficher les messages WW&V Show WC&Y messages Afficher les messages WC&Y DX Spots Spots DX Messages Messages KLog: Add a DXCluster server KLog : Ajouter un serveur Cluster DX Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Ajouter l'adresse suivie par le :port Exemple : dxfun.com:8000 Si aucun port n'est précisé, le port 41112 sera utilisé par défaut : SetupPageHamLib Activate HamLib Activer HamLib Activates the hamlib support that will enable the connection to a radio. Activer le support hamlib pour permettre la connexion à un transceiver. RTS on RTS sur Setting RTS may be needed for some serial ports. Le paramétrage de RTS peut être nécessaire pour certains ports série. DTR on DTR sur Setting DTR may be needed for some serial ports. Le paramétrage de RTS peut être nécessaire pour certains ports série. Radio Radio Select your rig. Sélectionnez votre rig Defines the interval to pool the radio in msecs. Définir l'intervalle de polling avec la radio en millisecondes. Pool interval Intervalle de pooling Port Port Select the serial port. Only the serial ports that are detected are shown. Sélectionner le port série. Seuls les ports série détectés sont affichés. Scan Scanner Click to identify the serial ports available in your computer. Cliquer pour identifier les ports série disponible sur votre ordinateur Bauds Bauds Select the serial port speed. Sélectionner la vitesse du port série 5 bits 5 bits 6 bits 6 bits 7 bits 7 bits 8 bits 8 bits Data bits Bits de données Select the serial data bits. Sélectionner les bits de données None Aucun Hardware Matériel Software XON/XOFF Software XON/XOFF Flow control Contrôle de flux Select the serial flow control Sélectionner le contrôle de flux No parity Pas de parité Even Pair Odd Impair Space Espace Mark Marque Parity Parité Select the serial parity. Sélectionner la parité 1 bit 1 bit 1.5 bits 1,5 bits 2 bits 2 bits Stop bits Bits d'arrêt Select the serial stop bits. Sélectionner les bits d'arrêt SetupPageLogs &New &Nouveau &Edit &Editer &Remove Supp&rimer Add a new log. Ajouter un nouveau log Edit the selected log. Éditer le log sélectionné Remove the selected log. Supprimer le log sélectionné Select the log you want to open. Choisir le log à éditer KLog KLog Do you really want to remove this log? Souhaitez-vous réellement retirer ce journal ? All the QSOs from this log will be also deleted... Tous les QSOs de ce journal seront également supprimés... Log has not been removed. (#3) Le journal n'a pas été retiré. (#3) Log has not been removed. (#2) Le journal n'a pas été retiré. (#2) Log has not been removed. (#1) Le journal n'a pas été retiré. (#1) ID ID Date Date Station Callsign Indicatif de la Station Operators Opérateurs Comments Commentaires Type Type An error has occurred showing the following error code: Une erreur s'est produite avec le code d'erreur suivant : KLog - SetupPageLogs KLog - Page de configuration des journaux SetupPageLogsNew &Date &Date &Station Callsign Indicatif de la &Station &Operators &Opérateurs Comm&ent Comm&entaire &Ok &Ok &Cancel &Annuler Select categories Sélectionner les catégories Callsign used for this log. Indicatif utilisé pour ce log Comma separated list of operators: callsign1, callsign2. Liste d'opérateurs séparés par une virgule : indicatif1, indicatif2... Start date of this log. Date de démarrage du log Add a comment about this log. Ajouter un commentaire pour ce log Select the kind of operation for this log. Choisir le type d'opération pour ce log Select the mode category. Choisir la catégorie "Mode" Select the operators category. Choisir la catégorie "Opérateurs" Select the assisted category. Choisir la catégorie "Assisté" Select the power category. Choisir la catégorie de Puissance Select the bands category. Choisir la catégorie "Bande" Select the Overlay category. Choisir la catégorie "Overlay" &Type of Operation &Type d'Opération &Mode Category Catégorie du &Mode O&perators Category Catégorie des O&pérateurs &Assisted Category Catégorie &Assistée Po&wer Category Catégorie de Puissance &Bands Category Catégories de &Bandes O&verlay Revêtement Categories not OK Les catégories ne sont pas OK You need to enter a valid QRZ in the Station Callsign box. The log will not be opened. Vous avez besoin de renseigner un QRZ valide dans le champ Indicatif de la Station. Le journal ne s'ouvrira pas. You selected an invalid combination. The log will not be opened. Vous avez sélectionné une combinaison invalide. Le journal ne s'ouvrira pas. Categories OK Catégories OK SetupPageMisc &Imperial system Système &Impérial &Log in real time Journalisation en temps réel &Time in UTC Heure en UTC &Save ADIF on exit &Sauvegarder l'ADIF en quittant Use this &default filename Utiliser ce nom de fichier par &défaut Mark &QSO to send QSL when QSL is received Marquer le &QSO pour envoyer une QSL quand la QSL est reçue Complete QSO with previous data Compléter le QSO avec les données du précédent Show the Station &Callsign used in the search box Afficher l'indicatif de la station utilisée dans le champ de recherche &Reset to My Data for all QSOs Réinitialiser mes données pour tous les QSOs &Check for new versions automatically Vérifier les nouvelles versions automatiquement &Provide Info for statistics Fournir des informations pour les statistiques Manage DX-Marathon Gérer le DX-Marathon Browse Parcourir Move DB Déplacer la BD QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. Les QSOs seront marqués en attente pour envoyer une QSL si vous recevez la QSL et que vous n'avez pas encore retourné la vôtre The search box will show also the callsign on the air to do the QSO. La boîte de recherche affichera aussi l'indicatif sur l'air pour réaliser le QSO All the data from the My Data tab will be used or data from the previous QSO will be maintained. Toutes les données de l'onglet Mes Données seront utilisés ou les données du QSO précédent seront conservées Check if there is a new release of KLog available every time you start KLog. Vérifier si une nouvelle version de KLog est disponible chaque fois que vous lancez KLog If new version checking is selected, KLog will send the developer your callsign, KLog version & Operating system to help in improving KLog. Si ce champ est côché, KLog enverra au développeur votre indicatif, version de KLog & Système d'exploitation pour aider à améliorer KLog Check it for Imperial system (Miles instead of Kilometers). Cocher pour le système Imperial (Miles au lieu de Kilomètres) Select to use real time. Sélectionner pour utiliser l'heure en temps réel. Select to use UTC time. Sélectionnez pour utiliser l'heure UTC Select if you want to save to ADIF on exit. Sélectionnez si vous souhaitez enregistrer vers ADIF en quittant Select to use the following name for the logfile without being asked for it again. Sélectionnez pour utiliser le nom indiqué pour le fichier journal sans que cela soit à nouveau demandé Complete the current QSO with previous QSO data. Complète le QSO en cours avec les données du QSO précédent Select if you want to manage DX-Marathon. Sélectionner pour gérer le DX-Marathon This is the default file where ADIF data will be saved. Fichier par défaut où les données ADIF seront sauvegardées This is the directory where the database (logbook.dat) will be saved. Répertoire où la base de données (logbook.dat) sera sauvegardée Click to change the default ADIF file. Cliquez pour changer le fichier ADIF par défaut. Click to change the path of the database. Cliquez pour modifier le chemin de la base de données. Click to move the DB to the new directory. Cliquez pour déplacer la BD vers le nouveau répertoire. Open File Ouvrir un Fichier Select Directory Sélectionnez un répertoire This is the directory where DB (logbook.dat) will be saved. C'est le répertoire où la BD (logbook.dat) sera sauvegardée. Please specify an existing directory where the database (logbook.dat) will be saved. Veuillez spécifier un répertoire existant où la base de données (logbook.dat)sera sauvegardée. File moved Fichier déplacé File copied Fichié copié File NOT copied Fichier NON copié The target directory does not exist. Please select an existing directory. Le répertoire cible n'existe pas. Veuillez sélectionner un répertoire existant. SetupPageSats &New &Nouveau &Edit &Editer &Remove &Retirer &Import &Importer E&xport E&xporter Add a new satellite. Ajouter un nouveau satellite Edit the selected satellite. Editer le satelite sélectionné Remove the selected satellite. Retirer le satellite sélectionné Import a satellites file. It will replace the satellites you have now configured. Importe un fichier de satellites. Il remplacera les satellites que vous avez configuré. Export your current satellites to a file. Exporte la liste des satellites actuels vers un fichier Select the sat you want to open. Sélectionner le satellite à éditer KLog KLog Do you really want to remove this satellite? Souhaitez-vous vraiment retirer ce satellite ? This satellite will not be longer available to be selected ... Ce satellite ne sera plus sélectionnable... Sat has not been removed. (#3) Le satellite n'a pas été retiré. (#3) Sat has not been removed. (#2) Le satellite n'a pas été retiré. (#2) Sat has not been removed. (#1) Le satellite n'a pas été retiré. (#1) ID ID Short Court Name Nom Uplink Uplink Downlink Downlink Modes Modes An error has occurred showing the following error code: Une erreur s'est produite avec le code d'erreur suivant : KLog - SetupPageSats KLog - SetupPageSats Open Satellites File Ouvrir le fichier des satellites KLog warning Avertissement KLog An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Une erreur innatendue s'est produite pendant l'importation des données des satellites. Cela peut provenir du fait que le fichier que vous essayer d'importer n'a pas le format requis. Please check the format or contact the developer for analysis with the error code: Veuillez vérifier le format ou contacter le développeur pour analyse avec le code d'erreur : Save Satellites File Enregistrer le fichier des satellites SetupPageSatsNew Short name Nom court Sat name Nom du satellite UpLink UpLink DownLink DownLink Modes Modes &Ok &Ok &Cancel &Annuler Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Saisir le nom court. Essayez d'utiliser le nom court LoTW ce qui vous permettra ensuite d'envoyer votre QSO à LoTW. Enter the name of the satellite. Saisir le nom du satellite Enter the uplink frequencies in this format: 144.300 Saisir les fréquences d'uplink dans ce format : 144.300 Enter the downlink frequencies in this format: 144.300 Saisir les fréquences de downlink dans ce format : 144.300 Enter the modes in this format: USB Saisir les modes dans ce format : USB Some of the data you have entered is not correct, the satellite can't be added. Une partie des données saisies est incorrecte, le satellite ne peut être ajouté. SetupPageUDP Start UDP Server Démarrer le serveur UDP Log automatically QSOs from WSJT-X Journaliser automatiquement les QSOs de WSJT-X Allow WSJT-X to send logged QSO to KLog Permettre à WSJT-X d'envoyer les QSO journalisés à KLog QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected Les QSOs loggués dans WSJT-X seront envoyés à KLog. KLog demandera une confirmation avant de les logguer à moins que "%1" soit sélectionné KLog will log automatically any QSO coming from WSJT-X without any manual confirmation. KLog journalisera automatiquement chaque QSO provenant de WSJT-X sans confirmation manuelle Receive and Update QSO data to KLog Reçois et Mets à jour les données du QSO sur KLog KLog will automatically show and update data coming from WSJT-X (DX callsign, locator, RPT, ...) KLog affichera et mettra à jour automatiquement les données provenant de WSJT-X (indicatif DX, locator, RPT...) Make sure it is the same port where the other programs are sending the data to. Default port is 2237. Assurez-vous qu'il s'agit du même port que celui utilisé par les autres programmes pour envoyer des données. Le port par défaut est le 2237. UDP port number where the UDP Server will listen for packets. Numéro du port UDP où le serveur UDP doit être à l'écoute des paquets réseaux UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. Le serveur UDP recevra les QSOs envoyés par d'autres programmes tels que WSJT-Xvous permettant ainsi de les journaliser automatiquement dans KLog UDP Port Port UDP QSO notification timeout (milisecs) Notification du délai dépassé du QSO (milli-secondes) Milliseconds that the notification of QSO received from WSJTX will be shown. Millisecondes pour que la notification du QSO reçu de WSJTX puisse être affichée SetupPageUserDataPage &Personal data Données &Personnelles Station &data &Données de la Station Enter your name. Saisir vore nom Enter your address - 1st line. Saisir votre adresse - 1ère ligne Enter your address - 2nd line. Saisir votre adresse - 2ème ligne Enter your address - 3rd line. Saisir votre adresse - 3ème ligne Enter your address - 4th line. Saisir votre adresse - 4ème ligne Enter your city. Saisir votre ville Enter your zip code. Saisir votre code postal Enter your province or state. Saisir votre province ou état Enter your country. Saisir votre pays &Name &Nom &Address &Adresse Cit&y Ville &Zip Code Code Postal Pro&v/State Pro&vince/Etat Countr&y Pa&ys Enter your information for rig Entrez vos informations de rig Enter your information for antenna Entrez les informations de votre antenne Enter your power information. Saisir votre puissance Enter the station callsign that will be used for logging. Saisir l'indicatif de la station qui sera utilisé pour le log &Rig 1 Ri&g 1 R&ig 2 Ri&g 2 Ri&g 3 Ri&g 3 Antenna &1 Antenne &1 Antenna &2 Antenne &2 Antenna &3 Antenne &3 Po&wer Puissance Enter the operators (comma separated if more than one). Entrez les opérateurs (séparés par une virgule si plusieurs) Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Entrez le locator de votre station. Alternativement, KLog peut utiliser un locator approximatif basé sur votre indicatif. &QRZ &QRZ &Operators &Opérateurs &CQ Zone Zone &CQ &ITU Zone Zone &ITU &Locator &Locator &Locator (not valid) &Locator (invalide) SetupPageWorldEditor Add Ajouter Delete Supprimer Edit Éditer Export World Exporter Import World Importer Still not implemented. Pas encore implémenté. Import a new cty.csv file Importer un nouveau fichier cty.csv An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Un fichier d'information sur les entités (cty.csv) a été détecté dans votre répertoire KLog et sera chargé. No entities information file (cty.csv) has been detected in your KLog folder. Aucun fichier d'information sur les entités (cty.csv) n'a été détecté dans votre répertoire KLog. KLog will not be able to show entities information. KLog ne sera pas en mesure d'afficher des informations d'entité. Prefix Préfixe Entity Entité ARRL ID ID ARRL Continent Continent CQ Zone Zone CQ ITU Zone Zone ITU UTC UTC Latitude Latitude Longitude Longitude Deleted Supprimé Since Date Depuis la Date To Date Jusqu'à la Date Open File Ouvrir un fichier BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Les informations d'entité ont été mises à jour. Entities information has not been updated. Les informations d'entitées n'ont pas été mises à jour. ShowErrorDialog KLog Message Message KLog SoftwareUpdateDialog Ok Ok KLog update Mise à jour KLog Congratulations! Félicitations ! Your KLog has been updated. Votre KLog a été mis à jour. You already have the latest version. Vous avez déjà la dernière version. StartWizard KLog - The free hamradio logging program KLog - Le logiciel libre de journalisation des contacts radioamateurs Quit Setup Quitter l'Installation Setup is not complete yet. Are you sure you want to quit setup? L'installation n'est pas encore terminée. Êtes-vous sûr de quitter l'installation ? StatisticsWidget QSO per year QSO par an DXCC per year DXCC par an CQ zones per year Zones CQ par an QSO per band QSO par bande QSO per mode QSO par mode QSO per DXCC QSO par DXCC QSO per Continent QSO par continent QSO per hour QSO par heure QSO per month QSO par mois Worked / Confirmed status Réalisé / Statut confirmé Worked / Sent status Réaisé / Statut d'envoi Sent / Confirmed status Envoyé / Statut confirmé StatsCQZPerYearBarChartWidget CQ Zones per year Zones CQ par an Reading data ... Lecture des données... Abort reading Interrompre la lecture CQ zones Zones CQ CQ zones per year Zones CQ par an Reading data ... Lecture des données en cours... Years: %1/%2 Années : %1/%2 StatsEntitiesPerYearBarChartWidget Chart title Titre du graphique Reading data ... Lecture des données... Abort reading Interrompre la lecture DXCC Entities Contrées DXCC DXCC Entities per year Contrées DXCC par an Reading data ... Lecture des données en cours... Entities: Contrées DXCC : StatsQSOsPerBandBarChartWidget QSOs per band QSOs par bande Reading data ... Lecture des données... Abort reading Lecture interrompue Bands Bandes QSO per band distribution Répartition des QSOs par bande Reading data ... Lecture des données en cours... Bands: Bandes : StatsQSOsPerContinentBarChartWidget QSOs per continent QSOs par continent Reading data ... Lecture des données... Abort reading Lecture interrompue Continents Continents Reading data ... Lecture des données en cours... Hours: Heures : StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSOs par DXCC Reading data ... Lecture des données... Abort reading Lecture interrompue Reading data... Lecture des données en cours... Entity: Contrée DXCC : DXCC DXCC Top ten DXCC per QSO Top 10 DXCC par QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSOs par heure Reading data ... Lecture des données... Abort reading Lecture interrompue Hours Heures QSOs at hour QSOs à l'heure Reading data ... Lecture des données en cours... Hours: Heures : StatsQSOsPerModeBarChartWidget QSOs per mode QSOs par mode Reading data ... Lecture des données... Abort reading Lecture interrompue Modes Modes QSO per mode distribution Répartition des QSOs par mode Reading data ... Lecture des données en cours... Modes: Modes : StatsQSOsPerMonthBarChartWidget QSOs per month QSOs par mois Reading data ... Lecture des données... Abort reading Lecture interrompue Jan Jan Feb Fév Mar Mar Apr Avr May Mai Jun Juin Jul Juil Sep Sep Oct Oct Nov Nov Dec Déc Aug Août Months Mois QSOs at Month QSOs du mois Reading data ... Lecture des données en cours... Months: Mois : StatsQSOsPerYearBarChartWidget Chart title Titre du graphique Reading data ... Lecture des données... Abort reading Lecture interrompue QSOs QSOs QSOs per year QSOs par an Reading data ... Lecture des données en cours... QSO: %1/%2 QSO : %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Envoyé - %1 Confirmed - %2 Confirmé - %2 StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Réalisé, non confirmé - %1 Confirmed - %2 Confirmé - %2 StatsWorkedSentPieChartWidget Worked - %1 Réalisé - %1 Sent - %2 Envoyé - %2 UpdateSatsData Reading Satellites data file... Lecture du fichier de données sur les Satellites en cours... Abort reading Lecture annulée The Satellites information has been updated. Les informations sur les Satellites ont été mises à jour. Open File Ouvrir un Fichier Sat Data Données Sat. World Entity Entité Continent Continent Reading cty.csv... En cours de lecture de cty.csv... Abort reading Lecture annulée eLogClubLog Host not found! Machine non trouvée ! Timeout error! Erreur de dépassement du délai ! It seems to be a PASSWORD ERROR; check your password. Cela semble être une ERREUR DE MOT DE PASSE. Vérifiez-le. KLog - ClubLog KLog - ClubLog It seems that your ClubLog password is not correct. Il semble que votre mot de passe ClubLog est incorrect. Please check your password in the setup. ClubLog uploads will be disabled. Veuillez vérifier votre mot de passe dans la configuration. Les déversements ClubLog seront désactivés. Undefined error... Erreur indéfinie... Callsign missing Indicatif manquant Invalid callsign Indicatif invalide Skipping SWL callsign Sauter l'indicatif SWL Callsign is your own call L'indicatif est le vôtre Invalid callsign with no DXCC mapping Indicatif invalide sans correspondance DXCC Updated QSO QSO mis à jour Invalid ADIF record Entrée ADIF incorrecte Missing ADIF record Entrée ADIF manquante Test mode - parameters ok, no action taken Mode test - paramètres ok, pas d'action réalisée Excessive API Usage Utilisation excessive de l'API Internal Error Erreur interne Rejected Rejeté QSO Duplicate QSO en Doublon QSO Modified QSO Modifié Missing Login Identifiant non saisi QSO OK QSO OK Upload denied Déversement interdit No callsign selected Pas d'indicatif sélectionné No match found Pas de correspondance trouvée Dropped QSO QSO rejeté OK OK Login rejected Identifiant rejeté Rejected: Callsign is your own call Rejeté : L'indicatif est le vôtre klog-0.9.8.1/translations/klog_pl.ts0000644000175000017500000071465413532572307016353 0ustar develdevel AboutDialog About KLog O progrmie By Przez KLog is a free logbook for hamradio operators. KLog jest darmowym programem logującym dla krótkofalowców. Please know that this is an BETA release and it may contain many bugs.<br>Backup your data before using this software! Proszę zwrócić uwagę że jest to wersja BETA wydanie może zawierać liczne błędy.<br> Proszę wykonać kopię zapasową przed użyciem tego programu! KLog has been fully rewritten from the 0.6.2 to be able to provide a cross-platform application that runs in the main operating systems (Linux, macOS & Windows) and provide new functionalities that KLog was not providing. KLOG został całkowicie przepisany rozpoczynając od wersji 0.6.2 tak aby była możliwość pracy na wielu systemach operacyjnych ( Linux, macOS & Windows ) Zawiera również nowe funkcje którch KLOG nie było we wcześniejszych wydaniach. Please provide your review in KLog's eHam review page: Proszę o napisanie opini na tema KLog na stronie eHam: Find more information and the latest release at Aby dowiedzieć się więcej oraz najnowsze wydania na You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Możesz również pomóc przesyłając błędy programu oraz swoje pomysły lub cokolwiek co pomogło by w poprawie KLog. If you want to provide support you are welcome to join the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account user's needs Twórcy programy KLog umieścili w kodzie programu możliwość przesyłanie niewielkich ilości danych użytkownika na serwery KLog informujące o ilości zainstalowanych wersji,ma to pomóc twórcy programu w rozwijaniu i przystosowaniu oprogramowania do wymagań użytkowników At present, the data that is provided is the following: W tym momęcie, dane dostarczone zawierają: Be aware that you can enable/disable this feature from the Misc tab in the Setup page Proszę zauważyć że istnieje możliwość wyłączenie \ włączenie tej funkcji w zakładce Inne w menu głównym Author Autor today dzisiaj Main developer Główny twórca KLog is developed by a very small team and you are invited to join! KLOG Jest tworzony przez bardzo małe grono entuzjastów. Dołącz do nas! Authors Autorzy Translators bring KLog into your language. They are really an important part of the KLog development team. Tłumacze przełożli KLOG na Twój język. Tłumacze są naprawdę ważną częścią grupy rozwojowej KLOG. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Translators Tłumacze Privacy advisory Postanowienia prawne Callsign Znak wywoławczy KLog version Wersja KLog Operating system System operacyjny KLog Klog Privacy Prywatność BarChartStats Abort reading Przerwij wczytywanie QSOs QSOs Bands Pasma Modes Emisje DXCC DXCC CTYPage Country data download Lista krajów została pobran KLog needs country data... Klog wymga danych państwa... &Download &Pobieranie &Ignore &Ignorownie Country data needed Wymagana lista krajów KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC information. Klog korzysta z pliku CSV.CTY który można pobrać ze strony http://www.country-files.com/. You need to download the cty.csv file if you want KLog to show you the countries, locator, ... of the QSOs you do. Wymagane jest pobranie pliku CSV.CTY aby Klog mógł podawać dane państ oraz lokator, ...QSO które prowadzisz. Click on Download to download now. Proszę nacisnąć Pobierz aby zacząć pobieranie. KLog Klog I can't find the host. Please check your network and try again Do you want to try again? Nie mogę odnaleźć host. Proszę sprawdzić swoje połączenie sieciowe oraz spróbować ponownie Czy chciałbyś spróbować ponownie? DXCCStatusWidget Update Aktualizacja ID ID Entity Jednostka Pref: CQ: ITU: Beam: Entity not worked in this band. DXClusterWidget Click on Connect to connect to the DX-Cluster server Naciśnij Połącz aby połączyć z DX-Cluterem Connect Połącz Clear Wyczyść Click on connect to connect to the DX-Cluster Naciśnij na Połącz aby połączyć z DX-Cluster Trying to connect to the server Próba nawiązania połączenia z serwerem KLog DXCluster Klog DX Cluster The host was not found. Please check: Host nie został odnaleziony. Proszę sprawdzić: - your network connection; - the host name and port settings. - połączenie sieciowe; - nazwa hosta oraz ustawienia portów. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Połączenie zostało odrzucone przez peer Upewnij się że DX Cluster jest włączony oraz sprawdź czy ustawienia są prawidłowe. The following error occurred: %1. Pojawił się pewien błąd:%1. Connected to server Połączono z serwerem KLog message Wiadomość KLog Enter your callsign to connect to the cluster: Wprowadź swój znak aby połączyć się z clusterem: Enter your password to connect to the cluster: (Just hit enter for no password) Wprowadź swoje hasło aby połączyć się z Clusterem: ( Naciśnij Enter aby połączyć bez hasła ) Disconnect Rozłącz Not logged on, you may need to enter your callsign again. Nie zalogowano, być może konieczne będzie wpisać Twój znak ponownie. Enter here the commands to be sent to the DX-Cluster server. Connection closed by the server Połączenie zamknięte przez serwer Click on Connect to connect to the DX-Cluster server. Send Wyślij DataProxy_SQLite Software version in DB is null Wersja oprogramowania w DB jest zero No query failed Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Sporadic E Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Terrestrial or atmospheric repeater or transponder Rain scatter Common term in hamradio, do not translate if not sure Satellite Satelita Bureau Common term in hamradio, do not translate if not sure Manager Common term in hamradio, do not translate if not sure All QSOs have been updated with a DXCC and the Continent. Field Aligned Irregularities Common term in hamradio, do not translate if not sure F2 Reflection Common term in hamradio, do not translate if not sure Trans-equatorial Common term in hamradio, do not translate if not sure Tropospheric ducting Common term in hamradio, do not translate if not sure Yes No Requested Ignore/Invalid Validated Queued Uploaded Do not upload Modified Direct Direct Electronic KLog DXCC KLog DXCC DownLoadCTY Download of cty.csv failed with the following error code: Pobieranie pliku CTY.CSV zakończone z błędem o kodzie: Download of cty.csv done. Pobieranie pliku CTY.CSV ukończone. There is already a cty.csv file in the folder but it will be replaced with the new one. Plik CTY.CSV już znajduje się w folderze ale zostnie on zastąpiony nowym. Could not open %1 for writing FileManager Writing ADIF file... Zapisywanie pliku ADIF... Abort writing Przerwij zapisywanie Writing ADIF file... QSO: Zapisywanie pliku ADIF... QSO: It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Wygląda na to że w pliku ADIF który właśnie importujesz znajduje się kilka zduplikowanych QSO. Czy nadal chcesz kontynuować? ( Zduplikowane QSO nie będą zaimportowane ) You have canceled the file export. The file will be removed and no data will be exported. Eksport pliku zosał anulowany. Plik zostanie usunięty oraz żadne dane wyeksportowane. Please select the station callsign you want to export the log from: Do you still want to cancel? Czy nadal chcesz anulować? There is more than one log in this logfile. W tym pliku logu znajduje się więcej niż jeden log. All logs will be imported into the current log. Wszystkie logi zostaną zaimportowane do bierzącego logu. Do you want to continue? Czy nadal chcesz kontynuować? Importing ADIF file... Importowanie pliku ADIF... QSO: QSO: This QSO had: To QSO miało: Do you want to continue with the current file? Czy nadal chcesz kontynuować z obecnym plikiem? The log that you have selected contains more than just one station callsign. Log który właśnie został zaznaczony zawiera więcej niż jeden znak stacji. Station Callsign: Znak Stacji: Define Station Callsign Zdefinuj Znak Stacji You have selected no callsign. KLog will export QSOs without a station callsign defined and those with the call you are entering here. Nie wybrano żadnego znaku. KLog wyeksportuje wszystkie QSO bez znaku stacji oraz te ze znakiem stacji który wpiszesz tutaj. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Wprowadż znak stacji aby używać go z tym Logiem, lub pozostaw puste miejsce dlaQSO bez znaku: No station callsign has been selected and therefore no log will be exported Nie wybrano żadnego znaku i dlatego żaden log nie zostanie wyeksportowany Exporting LoTW ADIF file... Eksportowanie pliku ADIF do LOTW... Writing Cabrillo file... Zapisywanie pliki Cabrillo... KLog: Cabrillo Log Export not implemented KLog: Eksport Logu do formatu Cabrillo nie jest jeszcze możliwy I am sorry but the Cabrillo Export To File feature has still not been implemented. Bardzo mi przykro ale eksport pliku do formatu Cabrillo nie został jeszcze wdrożony. Reading LoTW file... Wczytywanie pliku LOTW... You have cancelled the file import. The file will be removed and no data will be imported. Reading ADIF file... Wczytywanie pliku ADIF... This QSO is not including the minimum data to consider a QSO as valid!. To QSO nie zawiera minimalnej ilości danych aby uznać je za zaliczone!. Please edit the ADIF file and make sure that it include at least: Proszę o sprawdzenie pliku ADIF oraz upewnienie się że zawiera przynajmniej: and oraz This log seems to lack of RST-TX information. Wygląda na to że w tym Logu brakuje RST TX. Click on Yes to add a default 59 to all QSO with a similar problem. Naciśniej Tak aby dodać domyślnie 59 do wszystkich QSO z podobnym problemem. If you select NO, the QSO may not be imported. Jeśli wybierzesz NIE, QSO może nie zostać zaimportowane. This log seems to lack of RST-RX information. Wygląda na to że w tym Logu brakuje informacji RST TX. Abort reading Przerwij wczytywanie - The band missing and the following call: - Brakuje pasma w wybranym QSO: - The call missing but was done at this time: - Brakuje Znaku ? - The mode missing and the following call: - Brakuje emisji dla wybranego znaku: - The date missing and the following call: - Brakuje daty dla wybranego znaku: - The time missing and the following call: - Brakuje czasu dla wybranego znaku: KLog: Not all required data found! KLog: Nie wszystkie wymagane dane zostały znalezione! KLog: No RST TX found! Klog: Nie znaleziono RST-TX! KLog: No RST RX found! Klog: Nie znaleziono odebranych raportów RST-RX! InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Kontynent Prefix Prefiks CQ CQ ITU ITU Short Path Krótka droga Long Path Długa droga Deg Miles Mile Km Km IntroPage Welcome to KLog! Witamy w KLog! Welcome to KLog! - brought to you under the terms of the GPL! Witamy w KLog! - Napisanym pod licęcją GPL! Welcome to KLog Witaj w KLog This looks like it's the first time you've run KLog on this computer. Wygląda na to że to pierwszy raz kiedy korzystasz z KLog na tym komputerze. KLog is a free hamradio logging program that can run on Linux macOS and Windows. KLog jest darmowym programem logującym dla radioamatorów który może pracować pod systemami Linux, macOS oraz Windows. It is designed to provide general purpose, DX and contest logging. Został stworzony do codziennej pracy, DX oraz w zawodach. It supports QSL management, import and export of ADIF Posiada możlowość zarządzania kartami QSL, import oraz eksport z oraz do ADIF and Cabrillo file formats and many other features... oraz format Cabrill and wiele innych funkcji... Before you can start using KLog, you will be asked to: Zanim zaczniesz korzystać z KLog, będziesz poproszony o: Acknowledge to the terms of the license. Informacje dotyczące warunków licencji. Download the DX entities information. Pobierz Informacje o jednostakach DX. Enter your callsign, CQ zone, etc. and main configuration. Podaj swój znak wywoławczy, Strefę CQ, oraz inne przy konfiguracji główniej. Enjoy KLog and contact the development team if you have any suggestions! Korzystaj z KLog oraz z twóracmi programu jeśli masz jakieś sugestje! LicPage KLog License information KLog informacje na temat licęcji Welcome to KLog!- brought to you under the terms of the GPL! Witaj w KLog! -Napisany pod licencją GPL! Acknowledge Acknowledge Be aware that KLog is free software. Pamiętaj o tym że KLog jest oprogramowaniem darmowym. LogModel Date Data Time Czas QRZ QRZ Band Pasmo Mode Emisja RSTtx RSTtx RSTrx RSTrx Comment Komentarz LogWindow QSL Send QSL wysłane QSL Rcvd QSL Otrzymane &Delete &Delete Delete a QSO Usuń QSO &Edit QSO &Edit QSO Edit this QSO Edytuj QSO Via &bureau Via &bureau Send this QSL via bureau Wyśłij QSL przez biuro D&irect D&irect Send this QSL via direct Wyślij QSL direktem Via bureau Przez biuro QSL &received via bureau QSL &received via bureau Direct Direct QSL received via direc&t QSL odebrane przez direct&t You have requested to delete this QSO. To QSO zaostało zaznaczone do usnunięcia. Are you sure? Czy jesteś pewien? MainWindow Recalculate Click to recalculate the award status. Starting KLog &Add &Clear &Clear Status bar... DX Entity &Log Window &Score Window Watts MHz MHz KLog Klog Annual Ready An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: You have selected an entity: that is different from the KLog proposed entity: Click on the prefix of the correct entity or Cancel to edit the QSO again. Click on the prefix of the right entity or Cancel to correct. QRZ of the QSO. TX RST. RX RST. TX Exchange. Band of the QSO. Mode of the QSO. Date of the QSO. Time of the QSO. Add the QSO to the log. Clear the box. Input RSTrx RSTrx RSTtx RSTtx QRZ QRZ STX SRX NEW MULT Invalid characters used in the QRZ Ready... &File &New... &Open... &Import from ADIF... Import an ADIF file into the current log. &Save As... Export to ADIF... Export the current log to an ADIF logfile. Export all logs to ADIF... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Export Requested QSL to ADIF... Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a QSL tag printing program). Export ADIF for LoTW... Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before uploading to LoTW! &Print Log... Print your log. KLog folder Opens the data folder of KLog. E&xit &Tools Fill in QSO data Go through the log reusing previous QSOs to fill missing information in other QSOs. Fill in DXCC data Go through the log filling QSOs without a DXCC defined. QSL tools... &Find QSO to QSL Shows QSOs for which you should send your QSL and request the DX QSL. Find My-QSLs pending to send Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! &Find DX-QSLs pending to receive Shows the DX-QSL that has been requested or QSLs has been sent with no answer. &Find requested pending to receive Shows the DX-QSL that has been requested. LoTW tools... Queue all QSL to be sent of this log Mark all non sent QSOs in this log as queued to be uploaded. Queue all QSL to be sent Mark all non sent QSOs as queued to be uploaded. Mark as sent all queued QSO of this log Mark all queued QSOs in this log as sent to LoTW. Mark all queued QSO as sent Mark all queued QSOs as sent to LoTW. &Update cty.csv For updated DX-Entity data, update cty.csv. &Update Satellite Data Stats Show the statistics of your radio activity. &Setup &Setup... &Help Check updates... &About... About Qt... KLog LoTW All pending QSO of this log has been marked as queued for LoTW! Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. There was a problem to mark all pending QSO of this log as queued for LoTW! All pending QSO has been marked as queued for LoTW! The log that you have selected contains more than just one station callsign. Log który właśnie został zaznaczony zawiera więcej niż jeden znak stacji. Please select the station callsign you want to mark as sent to LoTW: Station Callsign: Znak Stacji: Define Station Callsign Zdefinuj Znak Stacji You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the call you are entering here. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Wprowadż znak stacji aby używać go z tym Logiem, lub pozostaw puste miejsce dlaQSO bez znaku: No station callsign has been selected and therefore no log will be marked All queued QSO of this log has been marked as sent for LoTW! There was a problem to mark all queued QSO of this log as sent for LoTW! All queued QSO has been marked as sent to LoTW! There was a problem to mark all queued QSO of this log as sent to LoTW! About... KLog update checking result Congratulations! Gratulacje! You already have the latest version. Już posiadasz najnowszą wersję. Nothing has been saved. You have to select a valid file type. Save File Zapisz plik ADIF file Cabrillo files Any file You can find the KLog data folder here: DUPE start stop It seems that there are no QSO in the database. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. TX Frequency in MHz. RX Frequency in MHz. Power used by the DX. Logging operator's callsign. Logowanie znaku operatora. Callsign used over the air. Znak używan. My QTH locator. Mój QTH Lokator. Name of the DX. QTH of the DX. Locator of the DX. Filling DXCC in QSOs... QSO: TX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. Frequency is not in a hamradio band! QSO logged from WSJT-X: RX Exchange. The logfile has been modified. Do you want to save your changes? UDP Server error The UDP server failed to %1. start or stop Clears the QSO entry. Number of confirmed DXCC entities. Number of worked DXCC entities. Number of confirmed WAZ zones. Number of worked WAZ zones. Number of confirmed local references. Number of worked local references. Number of confirmed QSOs. Number of worked QSOs. Number of QSOs worked on the selected year. Number of DXCC worked on the selected year. Number of CQ Zones worked on the selected year. Score for the DXMarathon on the selected year. Select the year you want to check. Status of the DX entity. Name of the DX entity. Name QTH Locator Power(rx) RST(tx) RST(rx) Freq TX Freq RX QSO QSL eQSL Comment Komentarz Others My Data Moje dane Satellite Satelita QSOs QSOs DXCC DXCC CQ CQ Score DX-Marathon Info Award Confirmed Potwierdzone Worked WAZ Local Awards Search Log DX-Cluster DX-Klaster Save ADIF File LoTW logfile has been properly exported! Remember to: Before uploading: sign the LoTW log; and After uploading: mark as sent all the queued QSO (LoTW Tools). There was no QSO to be exported. If you think that some QSO should have been exported, please look for them and ensure that the eQSL LoTW QSL sent box is marked as: Q - Queued There was an error while exporting the LoTW. The log has not been exported! Save Cabrillo File Open File Otwórz plik &Modify - Needed for DXMarathon Filling QSOs... Abort filling Number Date Data Time Czas Band Pasmo Mode Emisja Print Log Printing the log... Abort printing Printing the log... QSO: KLog QSO received The following QSO data has been received from WSJT-X to be logged: Call Freq Time On Time Off RST TX RST RX DX-Grid Comments Komentarz TX Pwr Operator Operator Local-Grid If the received mode is correct, please contact KLog development team and request support for that mode Do you want to keep receiving this alerts? (disabling this alerts will prevent that non-valid modes are detected) A new mode not supported by KLog has been received from an external software or radio: A duplicated satellite has been detected in the file and will not be imported. Please check the satellite information file and ensure it is properly populated. Now you will see a more detailed error that can be used for debugging... An unexpected error ocurred!! If the problem persists, please contact the developers for analysis: Error in function Error code Error text Failed query Recomendation: Export, periodically, your data to ADIF to prevent a potential data loss. Do you want to keep showing errors? MainWindowInputComment Add a comment for this QSO. MainWindowInputEQSL Date of the ClubLog upload. Data aktualizacji ClubLog. Date of the eQSL sending. Data wysłania eQSL. Date of the eQSL reception. Data otrzymania eQSL. Date of the LoTW sending. Date of the LoTW reception. Status of the LoTW sending. Status of the LoTW reception. LoTW Sent LoTW Rec Status on ClubLog. Status ClubLog. Status of the eQSL sending. Status wysłania eQSL. Status of the eQSL reception. Status otrzymywanych eQSL. ClubLog ClubLog eQSL Sent eQSL Wysłane eQSL Rec eQSL Otrzymane MainWindowInputOthers Primary Div Primary Div Secondary Div Secondary Div IOTA IOTA Entity Jednostka Propagation mode Typ propagacji Select the primary division for this QSO. Select the secondary division for this QSO. Select the entity for this QSO. Select the propagation mode for this QSO. Select the IOTA continent for this QSO. Select the IOTA reference number for this QSO. Not Identified Not - Not Identified MainWindowInputQSL QSL Sent QSL wysłane QSL Rec QSL Otrzymane QSL Via QSL Via QSL Msg QSL Msg Status of the QSL sending. Stan wysłanych kart QSL. Status of the QSL reception. Stan kart QSL otrzymanych. QSL sending information. Informacje dotyczące wysyłania QSL. QSL reception information. Informacje dostyczące odebranej karty QSL. Date of the QSL sending. Data wysłania karty QSL. Date of the QSL reception. Data otrzymania karty QSL. Message of the QSL. Informacje o QSL. QSL via information. Info o sposobie wysłania QSL. MainWindowMyDataTab Watt Wat Keep this data Zachowaj te dane Data entered in this tab will be copied into the next QSO. Power used for the QSO in watts. Logging operator's callsign. Logowanie znaku operatora. Callsign used over the air. Znak używan. My QTH locator. Mój QTH Lokator. Power Moc Operator Operator Station Callsign Znak stacji My Locator Mój lokator MainWindowSatTab Keep this data Zachowaj te dane Other - Sat not in the list Inne - Satelita nie jest na liście Data entered in this tab will be copied into the next QSO. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Satellite mode used. Select the satellite you are using. UpLink band. DownLink band. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. UpLink UpLink DownLink DownLink Satellite Satelita Mode Emisja DX Locator Other Inne MHz MHz Not Sat QSO QSO nie przez SAT KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog wykrył nazwę satelity która nie została rozpoznana. Jeśli chcesz użyć jednej ze znanych zamiast tej, proszę wybrać ją z listy. Ewentualnie, proszę o kontak z twórcami programu aby satelita mógł zostać do listy w kolejnych wydaniach. Please know that the satellite name will not be saved if it is not in the list so that information may be lost! Proszę zauważyć że nazwa satelity nie zostanie zapisana jeśli nie jest nia liście więc informacje mogą zostać utracone! The satellite you have in your QSO is: Satelita w Twoim QSO to: QObject New One, work it! New One, work it! Needed, work it! Potrzebny, zrób QSO! Worked but not confirmed Zrobione, ale nie potwierdzone Confirmed Potwierdzone Not identified Nie zidetyfikowany Database Error Błąd bazy dancyh KLog DB needs to be upgraded. Baza danych KLog musi zostać zaktualizowana. KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog wykrył poprzedni LOG w bazie dancy. Wszystkie dane zostaną dla Ciebie zaimportowane do nowo utworzonego Logu. KLog: Enter Station callsign KLog: Wprowadź znak stacji Enter the station callsign used in this log Wprowadź znak używany w KLog Station Callsign Znak Stacji All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is OK. Wszystkie dane zostały zaimportowane poprawnie. Przejdź do Ustawień >Właściwości>Logi do sprawdzenia czy wszystko jest OK. QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Przerwanie tej aktualizjacji może grozić utratą danych, Czy napewno chcesz przerwać? Progress: Postęp: Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... Updating mode information... Updating mode information... Do you want to upgrade it now? Czy chcesz aktualizować teraz? If DB is not upgraded KLog may not work properly. Jeśli DB nie zostanie zauktualizowana KLog może nie działać poprawnie. Abort updating Przerwij aktualizowanie Updating bands information... Aktualizowanie informacjo o pasmach... Updating bands information in %1 status... Updating bands information in %1 status... Updating mode information in %1 status... Updating mode information in %1 status... Install wizard was canceled before completing... Proces aktualizacji został przerwany przed zakończeniem... Do you want to remove the KLog dir from your disk? Czy chcesz usunąć katalog KLoog ze sswojego dysku? Your KLog dir has been removed Katalog KLog został usunięty I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Usunięcie katalogu KLog było nie możliwe. Powinieneś zrobić to manualnie jeśli aby katalog KLog został całkowicie usunięty. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Katalog KLog nie został usunięty. Aby usunąć ten katalog z dysku powinieneś usunąć go ręcznie. Remember that your KLog dir is on your system... Pamiętaj że katalog Klo jest w zainstalowany na Twoim systemie... Thank you for running KLog! Dziękujemy za korzystanie z KLog! Updating DXCC and Continent information... SearchWidget &Clear &Clear &Select All &Select All &Search &Search All Wszystko &Export Highlighted &Export Highlighted Clear the searches. Wyczyść wyszukiwanie. Export the search result to an ADIF file. Wyeksportuj wyniki wyszukiwania do pliku ADIF. Select/Unselect all the QSOs shown. Zaznacz/Odznacz wszystkie wyświetlone QSO. Search in the log. Przeszukaj log. Search in all logs. Przeszukaj we wszystkich logach. Enter the QRZ to search for. Wprowadź znak aby wyszukać. Search results. Przeszukaj wyniki. QRZ QRZ Date/Time Data/Czas Band Pasmo Mode Emisja QSL Sent QSL Wysłane QSL Rcvd QSL Otrzymane Station Callsign Znak stacji ID ID &Clear selection &Clear selection Save File Zapisz plik QSL Send QSL Wysłane &Delete &Delete Delete a QSO Usuń QSO &Edit QSO &Edit QSO Edit this QSO Edytuj to QSO Via &bureau Via &bureau Send this QSL via bureau Wyślij to QSL przez biuro D&irect D&irect Send this QSL via direct Wyślij to QSL direktem &Request my QSL &Request my QSL Mark my QSL as requested Zaznacz moje QSL jako oczekiwane Via Direct && mark DX QSL as requested Via Direct && mark DX QSL as requested Send this QSL via direct & mark DX QSL as requested Wyślij to QSL direktem oraz oznacz QSL jako oczekiwane Via Bureau && mark DX QSL as requested Przez biuro oraz zaznacz DX QSL jako oczekiwane Send this QSL via bureau & mark DX QSL as requested Wyślij to QSL przez biuro oraz zaznacz DX QSL jako oczekiwane &Request the QSL &Request the QSL Mark the QSL as requested Zaznacz to QSL jako oczekiwane Via bureau && mark my QSL as requested Via biuro oraz zaznacz moje QSL jako oczekiwane QSL received via bureau & mark my QSL as requested QSL otrzymane przez biuro oraz zaznacz QSL jako oczekiwane Via bureau Via biuro QSL received via bureau QSL otrzymane via biuro Direc&t && mark as my QSL requested Direc&t && mark as my QSL requested QSL received via direct & mark my QSL as requested QSL otrzymane direktem oraz zaznacz moje QSL jako oczekiwane Direc&t Direc&t QSL received via direct QSL otrzymane direktem You have requested to delete the QSO with: %1 Are you sure? Czy jesteś pewien? Needed QSO to send the QSL QSO wymagne aby wysłać QSL My QSL requested to be sent Moje QSL jako oczekiwane DX QSL pending to be received DX QSL jako oczekjące SetupDialog My Data Moje dane Bands/Modes Pasma/Emisje DX-Cluster DX-Klaster Colors Kolory Misc Inne World Editor Edycja Znaków Logs Logi Satellites HamLib ClubLog ClubLog Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Go to the User tab and enter valid QRZ. Cancel Anuluj OK OK Config Dialog Okno konfiguracji User data Dane użytkownika D&X-Cluster D&X-Cluster DB has not been moved to new path DB nie została przeniesiona w nowe miejsce You will be redirected to the Log tab. Please add and select the kind of log you want to use. Zstaniesz przekierowany do zakłdki Log. Proszę wybrać z którego logu chcesz obecnie korzystać. World Świat WSJT-X You need to enter at least one log in the Logs tab. Wymagane jest abyś dodał przynajmniej jeden Log w zakładce Log. You need to enter at least a valid QRZ. Wmagane jest wprowadzenie przynajmniej jednego aktualnego znaku. You have not selected the kind of log you want. Nie zanaczono żadnego logu. SetupEntityDialog Entity Jednostka CQ CQ ITU ITU Latitude Szerokość Longitude Szerokość UTC UTC Main prefix Główny Prefiks ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... Prefixy oddzielpone przecinkiem Np EA1, EA2, ... Prefixes Prefiksy Name of the Entity. CQ zone. ITU zone. Longitude of the Entity. Local time difference to UTC. Main prefix of the entity. ARRL ID. Date of the deletion. Deleted Usunięty Cancel Anuluj OK OKOK Entity Dialog Opis Jednostki SetupPageBandMode Bands Pasma Modes Emisje SetupPageClubLog &Callsign &Callsign ClubLog &password ClubLog &password ClubLog &email ClubLog &email Enter the email you used to register in ClubLog. Wprowadź e-mail którego użyłeś podczas rejestracji w ClubLog. Enter the callsign you used to register in ClubLog. Wprowadź znak który podałeś podczas rejestracji w ClubLog. Enter your password in ClubLog. Wprowadź swoje hasło do ClubLog. &Send QSOs in real time &Send QSO in real time &Activate ClubLog &Active ClubLog Use QSO Station &Callsign Użyj znaku stacji &Callsign Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Starts the ClubLog support in KLog. Use the Station Callsign defined in each QSO instead of the one defined here. SetupPageColors New One Nowy kraj Needed in this band Potrzebny na tym paśmie Worked in this band Zrobiony na tym paśmie Confirmed in this band Potwierdzony na tym paśmie Default Domyślny Choose a color Wybierz kolor SetupPageDxCluster Add Dodaj Delete Usuń Show &HF spots Pokaż &HF spots Show V/&UHF spots Pokaż V/&UHF spots Show W&ARC spots Pokaż W&ARC spots Show &worked spots Pkaż &worked spots Show &confirmed spots Pokaż &confirmed spots Show ANN/&FULL messages Pokaż ANN/&FULL messages Show WW&V messages Pokaż WW&V messages Show WC&Y messages Pokaż WC&Y messages DX Spots DX spot Messages Wiadomość KLog: Add a DXCluster server KLog: Dodaj server DXCluster Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Proszę podać adres razem z numerem :portu Na przykład: dxfun.com:8000 Jeśli numer portu nie zostanie podany, port 41112 zostanie użyty jako domyślny: SetupPageHamLib Activate HamLib Activates the hamlib support that will enable the connection to a radio. Radio Select your rig. Defines the interval to pool the radio in msecs. Pool interval Port Select the serial port. Only the serial ports that are detected are shown. Scan Click to identify the serial ports available in your computer. Bauds Select the serial port speed. 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None Hardware Software XON/XOFF Flow control Select the serial flow control No parity Even Odd Space Mark Parity Select the serial parity. 1 bit 1.5 bits 2 bits Stop bits Select the serial stop bits. SetupPageLogs &New &New &Edit &Edit &Remove &Remove KLog Klog Log has not been removed. (#3) Log nie został usunięty. (#3) Do you really want to remove this log? Czy na pewno chcesz usunąć ten Log? Add a new log. Edit the selected log. Remove the selected log. Select the log you want to open. All the QSOs from this log will be also deleted... Wszystkie QSO z tego Logu zostaną usunięte... Log has not been removed. (#2) Log nie został usunięty. (#2) Log has not been removed. (#1) Log nie został usunięty. (#1) ID ID Date Data Station Callsign Znak stacji Operators Comments Komentarz Type Rodzaj An error has occurred showing the following error code: Wystąpił błąd o wskazanym kodzie błędu: KLog - SetupPageLogs Klog -SetupPageLogs SetupPageLogsNew &Date &Date &Station Callsign &Satation Callsign &Operators &Operators Comm&ent Comm&ent &Ok &OK &Cancel &Cancel Select categories Zaznacz kategorie Callsign used for this log. Comma separated list of operators: callsign1, callsign2. Lista operatorów oddzielona przecinkiem: Znak Sacji1, Znak Stacji2. {1,?} Start date of this log. Add a comment about this log. Select the kind of operation for this log. Select the mode category. Select the operators category. Select the assisted category. Select the power category. Select the bands category. Select the Overlay category. &Type of Operation &Type of Operation &Mode Category &Mode Category O&perators Category O&perators Category &Assisted Category &Assisted Category Po&wer Category Po&wer Category &Bands Category &Bands Category O&verlay O&verlay Categories not OK Kategorie nie poprawne You need to enter a valid QRZ in the Station Callsign box. The log will not be opened. Wpisz aktualny znak QRZ w polu Znak Stacji. Log nie zostanie otwarty. You selected an invalid combination. The log will not be opened. Nie odpowiednie zostawienie zostało wybrane. Log nie zostanie otwarty. Categories OK Kategorie OK SetupPageMisc &Imperial system &Imperial system &Log in real time &Log in real time &Time in UTC &Time in UTC &Save ADIF on exit &Save ADIF on exit Use this &default filename Use this &default filname Mark &QSO to send QSL when QSL is received Mark &QSO to send QSL when QSL is recived Complete QSO with previous data Uzupełnij QSO ze wcześniejszymi danymi Show the Station &Callsign used in the search box Show the Station &Callsign used in the search box &Reset to My Data for all QSOs &Reset to My Data for all QSOs Manage DX-Marathon QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO zostanie oznaczone jako oczekujące QSL jeśli otrzymasz kartę QSL a Twoja jeszcze nie została wysłana. If new version checking is selected, KLog will send the developer your callsign, KLog version & Operating system to help in improving KLog. Jeśli nowa wersja zosyanie wybrana wówczas KLog wyśle do twórców programy używaną wersję KLog oraz system operacyjny na którym KLog został zainstalowany, w celu ulepszenia KLog. Check it for Imperial system (Miles instead of Kilometers). Select to use the following name for the logfile without being asked for it again. Proszę zaznaczyć wybrnaną nazwę pliku aby nie być ponownie pytany o jego nazwę. Select if you want to manage DX-Marathon. This is the default file where ADIF data will be saved. To jest domyślna nazwa pliku w którym ADIF zostanie zapisany. Please specify an existing directory where the database (logbook.dat) will be saved. Proszę wybrać istniejący katalog w którym baza danych programu ( logbook.dat) zostanie zapisana. &Check for new versions automatically &Check for new version automaticlly &Provide Info for statistics &Provide info for statistics Browse Przeglądaj Move DB Przenieś DB The search box will show also the callsign on the air to do the QSO. W polu wyszukiwania zostanie wskazany również znak stacji pracującej z którą można zrobić QSO. All the data from the My Data tab will be used or data from the previous QSO will be maintained. Zostaną wykorzystane wszystkie dane zapisane w zakładce Moje Dane lub dane z poprzednich QSO zostaną zaktualizowane. Check if there is a new release of KLog available every time you start KLog. Sprawdź czy są dostępne nowe wydania KLog każdorazowno kiedy KLog jest uruchamiany. Select to use real time. Zaznacz aby pracować w czasie rzeczywistym. Select to use UTC time. Zaznacz aby użyć czasu UTC. Select if you want to save to ADIF on exit. Zaznacz aby zapisać do ADIF przy wyjściu z programu. Complete the current QSO with previous QSO data. Uzupełnij obecne QSO danymi z poprzednich QSO. This is the directory where the database (logbook.dat) will be saved. To jest katalog w którym baza danych ( logbook.dat) zostanie zapisana. Click to change the path of the database. Kliknij aby zmienić miejsce w którym baza danych zostanie zapisana. This is the directory where DB (logbook.dat) will be saved. To jest katalog w którym DB ( logbook.dat ) zostanie zapisana. Click to change the default ADIF file. Kliknij aby zmienić domyślny plik ADIF. Click to move the DB to the new directory. Kliknij aby przenieść DB do nowego katalogu. Open File Otwórz plik Select Directory Zaznacz Katalog File moved Plik przeniesiony File copied Plik skopiowany File NOT copied Plik NIE skopiowany The target directory does not exist. Please select an existing directory. Katalog docelowy nie istnieje . Proszę wybrać istniejący katalog. SetupPageSats &New &New &Edit &Edit &Remove &Remove &Import E&xport Add a new satellite. Edit the selected satellite. Remove the selected satellite. Import a satellites file. It will replace the satellites you have now configured. Export your current satellites to a file. Select the sat you want to open. KLog Klog Do you really want to remove this satellite? This satellite will not be longer available to be selected ... Sat has not been removed. (#3) Sat has not been removed. (#2) Sat has not been removed. (#1) ID ID Short Name Uplink Downlink Modes Emisje An error has occurred showing the following error code: Wystąpił błąd o wskazanym kodzie błędu: KLog - SetupPageSats Open Satellites File KLog warning An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Please check the format or contact the developer for analysis with the error code: Save Satellites File SetupPageSatsNew Short name Sat name UpLink UpLink DownLink DownLink Modes Emisje &Ok &OK &Cancel &Cancel Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Enter the name of the satellite. Enter the uplink frequencies in this format: 144.300 Enter the downlink frequencies in this format: 144.300 Enter the modes in this format: USB Some of the data you have entered is not correct, the satellite can't be added. SetupPageUDP Start UDP Server Log automatically QSOs from WSJT-X Allow WSJT-X to send logged QSO to KLog QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will log automatically any QSO coming from WSJT-X without any manual confirmation. Receive and Update QSO data to KLog KLog will automatically show and update data coming from WSJT-X (DX callsign, locator, RPT, ...) Make sure it is the same port where the other programs are sending the data to. Default port is 2237. UDP port number where the UDP Server will listen for packets. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP Port QSO notification timeout (milisecs) Milliseconds that the notification of QSO received from WSJTX will be shown. SetupPageUserDataPage &Personal data &Personal data Station &data Station &data Enter your name. Enter your address - 1st line. Enter your address - 2nd line. Enter your address - 3rd line. Enter your address - 4th line. Enter your city. Enter your zip code. Enter your province or state. Enter your country. &Name &Name &Address &Address Cit&y Cit&y &Zip Code &Zip Code Pro&v/State Pro&v/State Countr&y Countr&y Enter your information for rig Wpisz informacje o swoim radiu Enter your information for antenna Wpisz informacje o swojej antenie Enter your power information. Enter the station callsign that will be used for logging. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Wpisz lokator swojej stacji. Alternatywnie KLog może skorzystać z przybliżonej lokalizacji bazując na Twoim znaku wywoławczym. &Rig 1 &Rig 1 R&ig 2 R&ig 2 Ri&g 3 Ri&g 3 Antenna &1 Antenna &1 Antenna &2 Antenna &2 Antenna &3 Antenna &3 Po&wer Po&wer Enter the operators (comma separated if more than one). Wpisz operatorów ( skorzystaj z przecinka jeśli więcej niż jeden ). &QRZ &QRZ &Operators &Operators &CQ Zone &CQ Zone &ITU Zone &ITU Zone &Locator &Locator &Locator (not valid) &Locator (not valid) SetupPageWorldEditor Add Dodaj Delete Usuń Edit Export World Import World Still not implemented. Import a new cty.csv file An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Plik z informacjami jednostek DXCC ( cty.csv ) został wykryty w katalogu KLog i zostanie on wczytany. No entities information file (cty.csv) has been detected in your KLog folder. Plik z jednostkami DXCC nie został wykryty ( cty.csv) w folderze KLog. KLog will not be able to show entities information. KLog nie będzie mógł pokazać informacji jednostek DXCC. Prefix Prefix Entity Jednostka ARRL ID ARRL ID Continent Kontynent CQ Zone Strefa CQ ITU Zone Strefa ITU UTC UTC Latitude Szerokość geograficzna Longitude Długość geograficzna Deleted Usunięty Since Date Od daty To Date Do daty Open File Otwórz plik BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Informacje o jednostkach DXCC zostały zaktualizowane. Entities information has not been updated. Informacje o jednostkach DXCC nie zostały zaktualizowane. ShowErrorDialog KLog Message SoftwareUpdateDialog Ok OK KLog update Aktualizacja KLog Congratulations! Gratulacje! Your KLog has been updated. Twój KLog został zaktualizowany. You already have the latest version. Już posiadasz najnowszą wersję. StartWizard KLog - The free hamradio logging program KLog - Darmowy program logujący dla krótkofalowców Quit Setup Opuść Ustawienia Setup is not complete yet. Are you sure you want to quit setup? Ustawienia nie zostały jeszcze ukończone. Czy jesteś pewien że chcesz opuścić ustawienia? StatisticsWidget QSO per year DXCC per year CQ zones per year QSO per band QSO per mode QSO per DXCC QSO per Continent QSO per hour QSO per month Worked / Confirmed status Worked / Sent status Sent / Confirmed status StatsCQZPerYearBarChartWidget CQ Zones per year Reading data ... Abort reading Przerwij wczytywanie CQ zones CQ zones per year Reading data ... Years: %1/%2 StatsEntitiesPerYearBarChartWidget Chart title Reading data ... Abort reading Przerwij wczytywanie DXCC Entities DXCC Entities per year Reading data ... Entities: StatsQSOsPerBandBarChartWidget QSOs per band Reading data ... Abort reading Przerwij wczytywanie Bands Pasma QSO per band distribution Reading data ... Bands: StatsQSOsPerContinentBarChartWidget QSOs per continent Reading data ... Abort reading Przerwij wczytywanie Continents Reading data ... Hours: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC Reading data ... Abort reading Przerwij wczytywanie Reading data... Entity: DXCC DXCC Top ten DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour Reading data ... Abort reading Przerwij wczytywanie Hours QSOs at hour Reading data ... Hours: StatsQSOsPerModeBarChartWidget QSOs per mode Reading data ... Abort reading Przerwij wczytywanie Modes Emisje QSO per mode distribution Reading data ... Modes: StatsQSOsPerMonthBarChartWidget QSOs per month Reading data ... Abort reading Przerwij wczytywanie Jan Feb Mar Apr May Jun Jul Sep Oct Nov Dec Aug Months QSOs at Month Reading data ... Months: StatsQSOsPerYearBarChartWidget Chart title Reading data ... Abort reading Przerwij wczytywanie QSOs QSOs QSOs per year Reading data ... QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Confirmed - %2 StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Confirmed - %2 StatsWorkedSentPieChartWidget Worked - %1 Sent - %2 UpdateSatsData Reading Satellites data file... Abort reading Przerwij wczytywanie The Satellites information has been updated. Open File Otwórz plik Sat Data World Entity Jednostka Continent Kontynent Reading cty.csv... Wczytywanie cty.csv... Abort reading Przerwij wczytywanie eLogClubLog Host not found! Host nie został odnaleziony! Timeout error! Przekroczony został limit czasu! KLog - ClubLog Klog -ClubLog Undefined error... Niezidenfikowany błąd... Callsign missing Brak znaku wywoławczego Invalid callsign Niepoprawny znak wywoławczy Skipping SWL callsign Opuszczanie znaków wywołaczych stacji nasłuchowych SWL Callsign is your own call Znka wywoławczy jest Twoim własnym znakiem Invalid callsign with no DXCC mapping Niepoprawny znak wywoławczy brak w spisie DXCC Updated QSO QSO Zaktualizowane Invalid ADIF record Niepoprawny zapis ADIF Missing ADIF record Brakujący wpis ADIF Test mode - parameters ok, no action taken Tryb testujący -Parametry OK, brak akcji It seems to be a PASSWORD ERROR; check your password. Wygląda na BŁĘDNE HASŁOOR; sprwdź hasło. It seems that your ClubLog password is not correct. Wygląda na to że Twoje hasło do ClubLog jest nie poprawne. Please check your password in the setup. ClubLog uploads will be disabled. Proszę sprawdź hasło w ustawieniach. Aktualizajcja ClubLog będzie wyłączona. Excessive API Usage Znaczne użcie API Internal Error Błąd wewnętrzny Rejected Odrzucony QSO Duplicate QSO zduplikowane QSO Modified QSO Zmodyfikowane Missing Login Brakujący Login QSO OK QSO OK Upload denied Przesyłanie odrzucone No callsign selected Znak wywoławczy nie zaznaczony No match found Nie znaleziono poasujących elemętów Dropped QSO QSO Opuszczone OK OK Login rejected Logowanie odrzucone Rejected: Callsign is your own call Odrzucone: Znak wywoławczy jest Twoim własnym znakiem klog-0.9.8.1/translations/klog_it.ts0000644000175000017500000071517113532572307016347 0ustar develdevel AboutDialog About KLog About KLog You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Per aiutare puoi comunicare bug, fornire nuovo codice, idee o suggerimenti o qualsiasi altra cosa possa migliorare KLog. If you want to provide support you are welcome to join the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Authors Autori By Da Please know that this is an BETA release and it may contain many bugs.<br>Backup your data before using this software! Per favore tieni conto che questa è una versione BETA e pertanto può contenere molti bug.<br>Copia i tuoi dati prima di usare questo software! Author Autore KLog has been fully rewritten from the 0.6.2 to be able to provide a cross-platform application that runs in the main operating systems (Linux, macOS & Windows) and provide new functionalities that KLog was not providing. Dalla versione 0.6.2 KLog è stato completamente riscritto per poter funzionare su tutti i principali sistemi operativi (Linux, MacOS & Windows) oltre che nuove funzioni. KLog is a free logbook for hamradio operators. KLog è un software libero per radioamatori. Please provide your review in KLog's eHam review page: Per favore scrivi un tuo contributo sulla pagina commenti di KLog: today oggi Main developer Sviluppatore Senior KLog is developed by a very small team and you are invited to join! Klog è sviluppato da un esiguo numero di programmatori e tu sei invitato a partecipare! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account user's needs Gli sviluppatori di KLog hanno inserito una funzione che trasmette alcuni dati utente al server di KLog con la sola finalità di contare le versioni effettivamente installate, per sviluppare KLog in modo più funzionale alle esigenze degli utenti At present, the data that is provided is the following: Correntemente, i dati forniti sono i seguenti: Be aware that you can enable/disable this feature from the Misc tab in the Setup page Tieni presente che puoi sempre abilitare/disabilitare questa funzione dalla tab Misc (Altro) della pagina di impostazioni Translators bring KLog into your language. They are really an important part of the KLog development team. I traduttori realizzano una versione KLog specifica per la tua lingua. Sono pertanto una parte importante della squadra di sviluppo di KLog. Find more information and the latest release at Cerca ulteriori informazioni e l'ultima versione presso Translators Traduttori Privacy advisory Nota sul trattamento dei dati personali Callsign Nominativo KLog version Versione KLog Operating system Sistema operativo KLog KLog Privacy Privacy BarChartStats QSOs QSO Bands Bande Modes Modi DXCC DXCC CTYPage Country data download Scarico dati Country KLog needs country data... KLog ha bisogno di informazioni sui Country... &Download &Scarica &Ignore &Ignora Country data needed Dati Country richiesti KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC information. KLog usa il file cty.cvs disponibile su http://www.country-files.com/ per acquisire le informazioni DXCC. You need to download the cty.csv file if you want KLog to show you the countries, locator, ... of the QSOs you do. E' necessario scaricare il file cty.cvs se vuoi che KLog mostri countries, locator, ... relativi al QSO avvvenuto. Click on Download to download now. Clicca su Scarica per avviare lo scarico. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Non riesco a raggiungere l'host. Per favore verifica la tua conenssione di rete e riprova Vuoi fare un ulteriore tentativo? DXCCStatusWidget Update Aggiornamento ID ID Entity Collegamento Pref: CQ: ITU: Beam: Entity not worked in this band. DXClusterWidget Click on Connect to connect to the DX-Cluster server Clicca su Connetti per collegarti al server DX-Cluter Connect Connetti Clear Pulisce Click on connect to connect to the DX-Cluster Clicca su Connetti per colelgarti al DX-Cluster Trying to connect to the server Tentativo di connessione al server in corso KLog DXCluster KLog DXCluster The host was not found. Please check: Server host non trovato. Per favore verifica: - your network connection; - the host name and port settings. - la tua configurazione di rete; - il nome del server ed il numero di porta configurato. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. La conenssione è stata rifiutata lato server. Accertati che il server DXCluster sia in funzione, e controlla che il nome del server host e l'impostazione delle porte sia corretto. The following error occurred: %1. Errore appena rilevato: %1. Connected to server Connesso al server KLog message Messaggio KLog Enter your callsign to connect to the cluster: Inserisci il nominativo di conenssione al cluster: Enter your password to connect to the cluster: (Just hit enter for no password) Inserisci la password di connessione al cluster: (direttamente Invio per nessuna password) Disconnect Scollega Not logged on, you may need to enter your callsign again. Non collegato, forse devi inserire di nuono il nominativo. Enter here the commands to be sent to the DX-Cluster server. Connection closed by the server Collegamento chiuso dal server Click on Connect to connect to the DX-Cluster server. Send Trasmetti DataProxy_SQLite Software version in DB is null Versione software nel DB vuota No query failed Nessuna query fallita Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Sporadic E Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Terrestrial or atmospheric repeater or transponder Rain scatter Common term in hamradio, do not translate if not sure Satellite Satellite Bureau Common term in hamradio, do not translate if not sure Manager Common term in hamradio, do not translate if not sure All QSOs have been updated with a DXCC and the Continent. Field Aligned Irregularities Common term in hamradio, do not translate if not sure F2 Reflection Common term in hamradio, do not translate if not sure Trans-equatorial Common term in hamradio, do not translate if not sure Tropospheric ducting Common term in hamradio, do not translate if not sure Yes No Requested Ignore/Invalid Validated Queued Uploaded Do not upload Modified Direct Diretta Electronic KLog DXCC KLog-DXCC DownLoadCTY Download of cty.csv failed with the following error code: Lo scarico di cty.csv è fallito generando il seguente codice errore: Download of cty.csv done. Scarico di cty.cvs completo. There is already a cty.csv file in the folder but it will be replaced with the new one. E' già presente un file cty.cvs nella cartella ma sarà sovrascritto dal nuovo. Could not open %1 for writing FileManager Writing ADIF file... File ADIF in scrittura... Abort writing Scrittura annullata Writing ADIF file... QSO: File ADIF in scrittura... QSO: You have canceled the file export. The file will be removed and no data will be exported. Hai annullato l'operazione di export. Il file sarà rimosso e nessun dato sarà esportato. Do you still want to cancel? Sei sicuro di voler annullare l'operazione? QSO: QSO: The log that you have selected contains more than just one station callsign. Il log scelto contiene più nominativi di stazione. Station Callsign: Nominativo di stazione: Define Station Callsign Imposta il nominativo di stazione You have selected no callsign. KLog will export QSOs without a station callsign defined and those with the call you are entering here. Non hai scelto il nominativo di stazione. KLog esporterà I QSO senza un nominativo di stazione definito ed con il nominatativo qua indicato. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Scegli il nominativo di stazione di questo log o lascialo vuoto per i QSO senza nominativo definito: Exporting LoTW ADIF file... Exportazione file LOTW ADIF... Writing Cabrillo file... File Cabrilo in scrittura... KLog: Cabrillo Log Export not implemented KLog: funzione di export di Log su Cabrillo non implementata I am sorry but the Cabrillo Export To File feature has still not been implemented. Spiacente, ma la funzione di esport del log su file Cabrillo non è stata ancora implementata. Reading LoTW file... Lettura file LoTW... Reading ADIF file... File ADIF in lettura... This QSO is not including the minimum data to consider a QSO as valid!. Questo QSO non contiene le informazioni minime necessarie per essere considerato un QSO valido!. Please edit the ADIF file and make sure that it include at least: Per favore modifica il file ADIF ed inserisci al suo interno almeno: and e This QSO had: Questo QSO aveva: Abort reading Annullamento lettura No station callsign has been selected and therefore no log will be exported Non hai scelto un nominativo di stazione e perciò nessun log sarà esportato There is more than one log in this logfile. Esiste più di una registrazione in questo file log. All logs will be imported into the current log. Tutte le registrazioni saranno importante nel corrente log. Do you want to continue? Vuoi proseguire? Importing ADIF file... Import di ADIF file in corso... You have cancelled the file import. The file will be removed and no data will be imported. Hai annullato l'import. Il file sarà rimosso e nessun dato importato. It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Ho trovato alcuni QSL duplicati nel file ADIF che stai importando. Vuoi continuare ugualmente? (I QSO duplicati non saranno comunque importati) Please select the station callsign you want to export the log from: - The band missing and the following call: - La banda non è indicata ed il seguente nominativo: - The call missing but was done at this time: - Il nominativo non è indicato ma è stato effettuato all'ora: - The mode missing and the following call: - Il modo operativo non è indicato e il seguente nominativo: - The date missing and the following call: - La data non è indicata ed il seguente nominativo: - The time missing and the following call: - L'ora non è indicata ed ils eguente nominativo: Do you want to continue with the current file? Vuoi poroseguire sul seguente file? KLog: Not all required data found! KLOg: Dati necessari mancanti! This log seems to lack of RST-TX information. Questo log sembra non contenere informazioni RTS-TX. Click on Yes to add a default 59 to all QSO with a similar problem. Clicca su Sì per aggiungere un 59 come default a tutti i QSO con un problema simile. If you select NO, the QSO may not be imported. Se scegli NO, il QSO non sarà importato. KLog: No RST TX found! KLog: Non trovato RST TX! This log seems to lack of RST-RX information. Questo log sembra non contenere informazioni RST-RX. KLog: No RST RX found! KLog: Non trovato RST TX! InfoWidget 10M 10m 15M 15m 20M 20m 40M 40m 80M 80m 160M 160m 2M 2m 6M 6m 12M 12m 17M 17m 30M 30m 70CM 70cm Continent Contienente Prefix Prefisso CQ CQ ITU ITU Short Path Percorso breve Long Path Percorso lungo Deg Miles Miglia Km Km IntroPage Welcome to KLog! Benvenuto/a su KLog! Welcome to KLog! - brought to you under the terms of the GPL! Benvenuto su KLog! -acquisito sotto i termini della licenza GPL! Welcome to KLog Benvenuto su KLog This looks like it's the first time you've run KLog on this computer. Sembra questa sia la prima volta tu stia eseguendo KLog su questo computer. KLog is a free hamradio logging program that can run on Linux macOS and Windows. KLog è un software libero per radioamatori di memorizzazione log che gira su Linux MacOS e Windows. It is designed to provide general purpose, DX and contest logging. E' progettato per un uso generico, DX e log di contest. It supports QSL management, import and export of ADIF Supporta l'amministrazione di QSL, importa ed esporta in formato ADIF and Cabrillo file formats and many other features... ed il formato Cabrillo e molte altre caratteristiche... Before you can start using KLog, you will be asked to: Prima che tu possa iniziare ad usare KLog, ti è richiesto di: Acknowledge to the terms of the license. Conferma i termini di uso della licenza. Download the DX entities information. Scarica le informazioni DX. Enter your callsign, CQ zone, etc. and main configuration. Inserisci il tuo nominativo, zona CQ, ecc. e configura le impostazioni principali. Enjoy KLog and contact the development team if you have any suggestions! Divertiti usando KLog e contatta liberamente lo staff di sviluppo per ogni suggerimento! LicPage KLog License information KLog inofmrazioni sulla licenza Welcome to KLog!- brought to you under the terms of the GPL! Benvenuto si KLog!- acquisito sotto il termini della licenza GPL! Acknowledge Conferma Be aware that KLog is free software. Attenzione che KLog è software libero. LogModel Date Data Time Ora QRZ QRZ Band Banda Mode Modo RSTtx RSTtx RSTrx RSTrx Comment Commento LogWindow QSL Send Trasmetti QSL QSL Rcvd Ricevi QSL &Delete &Cancella Delete a QSO Cancella un QSO &Edit QSO &Modifica QSO Edit this QSO Modifica questo QSO Via &bureau Via &bureau Send this QSL via bureau Trasmetti questa QSL via bureau D&irect D&iretta Send this QSL via direct Trasmetti questa QSL via diretta Via bureau Via bureau QSL &received via bureau QSL &ricevuta via bureau Direct Diretta QSL received via direc&t QSL ricevuta cia diret&ta You have requested to delete this QSO. Hai richiesto di cancellare questo QSO. Are you sure? Sei sicuro? MainWindow Recalculate Click to recalculate the award status. Starting KLog &Add &Clear &Pulisce Status bar... DX Entity &Log Window &Score Window Watts MHz MHz KLog KLog Annual Ready An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: You have selected an entity: that is different from the KLog proposed entity: Click on the prefix of the correct entity or Cancel to edit the QSO again. Click on the prefix of the right entity or Cancel to correct. QRZ of the QSO. TX RST. RX RST. TX Exchange. Band of the QSO. Mode of the QSO. Date of the QSO. Time of the QSO. Add the QSO to the log. Clear the box. Input RSTrx RSTrx RSTtx RSTtx QRZ QRZ STX SRX NEW MULT Invalid characters used in the QRZ Ready... &File &New... &Open... &Import from ADIF... Import an ADIF file into the current log. &Save As... Export to ADIF... Export the current log to an ADIF logfile. Export all logs to ADIF... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Export Requested QSL to ADIF... Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a QSL tag printing program). Export ADIF for LoTW... Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before uploading to LoTW! &Print Log... Print your log. KLog folder Opens the data folder of KLog. E&xit &Tools Fill in QSO data Go through the log reusing previous QSOs to fill missing information in other QSOs. Fill in DXCC data Go through the log filling QSOs without a DXCC defined. QSL tools... &Find QSO to QSL Shows QSOs for which you should send your QSL and request the DX QSL. Find My-QSLs pending to send Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! &Find DX-QSLs pending to receive Shows the DX-QSL that has been requested or QSLs has been sent with no answer. &Find requested pending to receive Shows the DX-QSL that has been requested. LoTW tools... Queue all QSL to be sent of this log Mark all non sent QSOs in this log as queued to be uploaded. Queue all QSL to be sent Mark all non sent QSOs as queued to be uploaded. Mark as sent all queued QSO of this log Mark all queued QSOs in this log as sent to LoTW. Mark all queued QSO as sent Mark all queued QSOs as sent to LoTW. &Update cty.csv For updated DX-Entity data, update cty.csv. &Update Satellite Data Stats Show the statistics of your radio activity. &Setup &Setup... &Help Check updates... &About... About Qt... KLog LoTW All pending QSO of this log has been marked as queued for LoTW! Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. There was a problem to mark all pending QSO of this log as queued for LoTW! All pending QSO has been marked as queued for LoTW! The log that you have selected contains more than just one station callsign. Il log scelto contiene più nominativi di stazione. Please select the station callsign you want to mark as sent to LoTW: Station Callsign: Nominativo di stazione: Define Station Callsign Imposta il nominativo di stazione You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the call you are entering here. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Scegli il nominativo di stazione di questo log o lascialo vuoto per i QSO senza nominativo definito: No station callsign has been selected and therefore no log will be marked All queued QSO of this log has been marked as sent for LoTW! There was a problem to mark all queued QSO of this log as sent for LoTW! All queued QSO has been marked as sent to LoTW! There was a problem to mark all queued QSO of this log as sent to LoTW! About... KLog update checking result Congratulations! congratulazioni! You already have the latest version. Stai già usando la versione più recente. Nothing has been saved. You have to select a valid file type. Save File Salva File ADIF file Cabrillo files Any file You can find the KLog data folder here: DUPE start stop It seems that there are no QSO in the database. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. TX Frequency in MHz. RX Frequency in MHz. Power used by the DX. Logging operator's callsign. Logging nominativo dell'operatore. Callsign used over the air. Nominativo usato via etere. My QTH locator. Locator del mio QTH. Name of the DX. QTH of the DX. Locator of the DX. Filling DXCC in QSOs... QSO: TX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. Frequency is not in a hamradio band! QSO logged from WSJT-X: RX Exchange. The logfile has been modified. Do you want to save your changes? UDP Server error The UDP server failed to %1. start or stop Clears the QSO entry. Number of confirmed DXCC entities. Number of worked DXCC entities. Number of confirmed WAZ zones. Number of worked WAZ zones. Number of confirmed local references. Number of worked local references. Number of confirmed QSOs. Number of worked QSOs. Number of QSOs worked on the selected year. Number of DXCC worked on the selected year. Number of CQ Zones worked on the selected year. Score for the DXMarathon on the selected year. Select the year you want to check. Status of the DX entity. Name of the DX entity. Name QTH Locator Power(rx) RST(tx) RST(rx) Freq TX Freq RX QSO QSL eQSL Comment Commento Others My Data Dati personali Satellite Satellite QSOs QSO DXCC DXCC CQ CQ Score DX-Marathon Info Award Confirmed Confermato Worked WAZ Local Awards Search Log DX-Cluster DX-CLuster Save ADIF File LoTW logfile has been properly exported! Remember to: Before uploading: sign the LoTW log; and After uploading: mark as sent all the queued QSO (LoTW Tools). There was no QSO to be exported. If you think that some QSO should have been exported, please look for them and ensure that the eQSL LoTW QSL sent box is marked as: Q - Queued There was an error while exporting the LoTW. The log has not been exported! Save Cabrillo File Open File Apre File &Modify - Needed for DXMarathon Filling QSOs... Abort filling Number Date Data Time Ora Band Banda Mode Modo Print Log Printing the log... Abort printing Printing the log... QSO: KLog QSO received The following QSO data has been received from WSJT-X to be logged: Call Freq Time On Time Off RST TX RST RX DX-Grid Comments Commenti TX Pwr Operator Operatore Local-Grid If the received mode is correct, please contact KLog development team and request support for that mode Do you want to keep receiving this alerts? (disabling this alerts will prevent that non-valid modes are detected) A new mode not supported by KLog has been received from an external software or radio: A duplicated satellite has been detected in the file and will not be imported. Please check the satellite information file and ensure it is properly populated. Now you will see a more detailed error that can be used for debugging... An unexpected error ocurred!! If the problem persists, please contact the developers for analysis: Error in function Error code Error text Failed query Recomendation: Export, periodically, your data to ADIF to prevent a potential data loss. Do you want to keep showing errors? MainWindowInputComment Add a comment for this QSO. MainWindowInputEQSL Date of the ClubLog upload. Data del Clublog scaricata. Date of the eQSL sending. Date of the eQSL sending. Date of the eQSL reception. Date of the eQSL reception. Date of the LoTW sending. Data della trasmissione LoTW. Date of the LoTW reception. Data della ricezione LoTW. Status of the LoTW sending. Stato della trasmissione LoTW. Status of the LoTW reception. Stato della ricezione LoTW. LoTW Sent Trasmissione LoTW LoTW Rec Registrazione LoTW Status on ClubLog. Stato su ClubLog. Status of the eQSL sending. Stato della spedizione delle eQSL. Status of the eQSL reception. Stato della ricezione di eQSL. ClubLog ClubLog eQSL Sent Invio eQSL eQSL Rec Registrazione eQSL MainWindowInputOthers Primary Div Primary Div Secondary Div Secondary Div IOTA IOTA Entity Collegamento Propagation mode Modo di propagazione Select the primary division for this QSO. Select the secondary division for this QSO. Select the entity for this QSO. Select the propagation mode for this QSO. Select the IOTA continent for this QSO. Select the IOTA reference number for this QSO. Not Identified Non identificato Not - Not Identified No - Non identificato MainWindowInputQSL QSL Sent Invio QSL QSL Rec QSL Rec QSL Via QSL Via QSL Msg QSL Message Status of the QSL sending. Stato QSL in trasmissione. Status of the QSL reception. Stato QSL in ricezione. QSL sending information. Informazioni invio QSL. QSL reception information. Informazioni ricezione QSL. Date of the QSL sending. Data invio QSL. Date of the QSL reception. Data ricezione QSL. Message of the QSL. Messaggio sulla QSL. QSL via information. Informazioni su Via QSL. MainWindowMyDataTab Watt Watt Keep this data Mantieni questa data Data entered in this tab will be copied into the next QSO. Power used for the QSO in watts. Logging operator's callsign. Logging nominativo dell'operatore. Callsign used over the air. Nominativo usato via etere. My QTH locator. Locator del mio QTH. Power Potenza Operator Operatore Station Callsign Nominativo di stazione My Locator Il mio Locator MainWindowSatTab Keep this data Mantieni questa data Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Satellite mode used. Select the satellite you are using. UpLink band. DownLink band. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. UpLink Uplink DownLink Downlink Satellite Satellite Mode Modo DX Locator DX-Locator Other Altro MHz MHz Not Sat QSO QSO non satellitare KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog ha trovato un nome di satellite non riconosciuto. Se hai bisogno di usare un nome di satellite conosciuto invece, selezionalo dalla lista. In alternativa, per favore contatta lo staff di sviluppo per aggiungere il nuovo nome di satellite. Please know that the satellite name will not be saved if it is not in the list so that information may be lost! Teni gentilmente presente che il nome del satellite non sarà salvato se assente dalla lista così quest'informazione andrà persa! Other - Sat not in the list Altro - Satellite assente dalla lista Data entered in this tab will be copied into the next QSO. The satellite you have in your QSO is: Il satellite del tuo QSO è: QObject New One, work it! Nuovo, work it! Needed, work it! Necessario, work it! Worked but not confirmed Lavorato ma non confermato Confirmed Confermato Not identified Non identificato Database Error Errore nel database KLog DB needs to be upgraded. Il DB KLog deve essere aggiornato. KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog ha rilevato un precedente log nel DB. Tutti i dati saranno copiati su un nuovolog tipo DX per te. KLog: Enter Station callsign KLog: Inserisci nominativo di stazione Enter the station callsign used in this log Inserisci il nominativo di stazione usato in questo log Station Callsign Nominativo di stazione All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is OK. Tutti i dati sono stati copiati correttamente. Adesso dovresti andare su Configurazione > Preferenze >Logs per controllare che sia tutto OK. QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Annullare questo aggiornamento può causare inconsistenza dei dati caricati e perdite di dati. Ancora vuoi effettuare l'annullamento? Progress: Progresso: Updating DXCC award information... Aggiornamento imformazioni award DXCC... Updating DXCC Award information... Aggiornamento infomrazioni award DXCC... Updating WAZ award information... Aggiornamento informazioni award WAZ... Updating WAZ Award information... Updating mode information... Aggiornamento informazioni modi... Do you want to upgrade it now? Vuoi effettuare l'aggiornamento adesso? If DB is not upgraded KLog may not work properly. Se il DB non è aggiornato KLog potrebbe non funzionare correttamente. Abort updating Annulla aggiornamento Updating bands information... Aggiornamento informazione bande... Updating bands information in %1 status... Aggiornamento informazione bande %1 stato... Updating mode information in %1 status... Aggiornamento informazioni modi %1 stato... Install wizard was canceled before completing... Il wizard di installazione è stato annullato prima di aver completato l'operazione... Do you want to remove the KLog dir from your disk? Vuoi rimuovere la cartella KLog dal tuo disco? Your KLog dir has been removed La tua cartella di KLog è stata eliminata I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Non sono riuscito ad eliminare la tua cartella KLog. Dovrai eliminarla a mano dal tuo hard disk. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Non sono riuscito a rimuovere la cartella di KLog. Dovrai eliminarla a mano dal disco. Remember that your KLog dir is on your system... Ricorda che la cartella di KLog è sul tuo sistema... Thank you for running KLog! Grazie per aver usato KLog! Updating DXCC and Continent information... SearchWidget &Clear &Pulisce &Select All &Seleziona Tutto &Search &Cerca All Tutto &Export Highlighted &Esporta elementi evidenziati Clear the searches. Cancella le ricerche. Export the search result to an ADIF file. Esporta i risultati della ricerca su un file ADIF. Select/Unselect all the QSOs shown. Seleziona/deleseziona tutti i QSO mostrati. Search in the log. Cerca nel log. Search in all logs. Cerca in tutti i logs. Enter the QRZ to search for. Inserisci il QRZ da cercare. Search results. Risultati della ricerca. QRZ QRZ Date/Time Data/Ora Band Banda Mode Modo QSL Sent QSL inviata QSL Rcvd QSL ricevuta Station Callsign Nominativo di stazione ID ID &Clear selection &Pulisce selezione Save File Salva File QSL Send Invia QSL &Delete &Cancella Delete a QSO Cancella un QSO &Edit QSO &Modifica QSO Edit this QSO Modifica questo QSO Via &bureau Via &bureau Send this QSL via bureau Invia questa QSL via bureau D&irect D&iretta Send this QSL via direct Invia questa QSL via diretta &Request my QSL &Richiedi la mia QSL Mark my QSL as requested Segna la mia QSL come richiesta Via Direct && mark DX QSL as requested Via Diretta && segna QSL DX come richiesta Send this QSL via direct & mark DX QSL as requested Invia questa QSL via diretta & segna QSL DX come richiesta Via Bureau && mark DX QSL as requested Via bureau && segna QSL DX come richiesta Send this QSL via bureau & mark DX QSL as requested Invia questa QSL via bureau & segna QSL DX come richiesta &Request the QSL &Richiedi la QSL Mark the QSL as requested Segna la QSL come richiesta Via bureau && mark my QSL as requested Via bureau && segna la mia QSL come richiesta QSL received via bureau & mark my QSL as requested QSL rcievuta via bureau & segna la mia QSL come richiesta Via bureau Via bureau QSL received via bureau QSL ricevuta via bureau Direc&t && mark as my QSL requested Diret&ta && segna come richiesta la mia QSL QSL received via direct & mark my QSL as requested QSL ricevuta via diretta & segna la mia QSL come richiesta Direc&t Diret&ta QSL received via direct QSL ricevuta via diretta You have requested to delete the QSO with: %1 Are you sure? Sei sicuro? Needed QSO to send the QSL QSO che hanno bisogno to inviare la QSL My QSL requested to be sent La mia richiesta di QSL da inviare DX QSL pending to be received QSL DX in attesa di essere ricevuta SetupDialog My Data Dati personali Bands/Modes Bande/modi DX-Cluster DX-CLuster Colors Colori Misc Altro World Editor World Editor Logs Logs ClubLog ClubLog Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Cancel Annulla Satellites HamLib OK OK Config Dialog Pagina di configurazione User data Dati utente D&X-Cluster D&X-Cluster WSJT-X You need to enter at least one log in the Logs tab. E' necessario caricare almeno un log nella tab configurazione logs. World World You need to enter at least a valid QRZ. E' necessario che tu inserisca almeno un corretto QRZ. Go to the User tab and enter valid QRZ. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Sarai portato sulla tab di impostazione log. Per favore aggiungi e scegli il tipo di log che vuoi utilizzare. DB has not been moved to new path DB non è stato spostato alla nuova path You have not selected the kind of log you want. Non hai scelto il tipo di log che vuoi usare. SetupEntityDialog Entity Collegamento CQ CQ ITU ITU Latitude latitudine Longitude Longitudine UTC UTC Main prefix Prefisso principale ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... Virgole separano possibili prefissi, es. EA1,EA2, ... Prefixes Prefissi Name of the Entity. CQ zone. ITU zone. Longitude of the Entity. Local time difference to UTC. Main prefix of the entity. ARRL ID. Date of the deletion. Deleted Cancellato Cancel Cancella OK OK Entity Dialog Maschera collegamento SetupPageBandMode Bands Bande Modes Modi SetupPageClubLog &Callsign &Nominativo ClubLog &password ClobLog &password ClubLog &email ClubLog &email Enter the email you used to register in ClubLog. Inserisci l'email che hai usato per registrarti a ClubLog. Enter the callsign you used to register in ClubLog. Inserisci il nominativo che hai usato per registrarti a ClubLog. Enter your password in ClubLog. Inserisci la tua password per ClubLog. &Send QSOs in real time &Invia QSO in tempo reale &Activate ClubLog &Attiva ClubLog Use QSO Station &Callsign Usa stazione QSO &Nominativo Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Starts the ClubLog support in KLog. Use the Station Callsign defined in each QSO instead of the one defined here. SetupPageColors New One Nuovo Needed in this band Necessario in questa banda Worked in this band Lavorato in questa banda Confirmed in this band Comfermato in questa banda Default Default Choose a color Scegli un colore SetupPageDxCluster Add Aggiungi Delete Cancella Show &HF spots Mostra &HF spots Show V/&UHF spots Mostra V/&UHF spots Show W&ARC spots Mostra W&ARC spots Show &worked spots Mostra spots &lavorati Show &confirmed spots Mostra spot &confermati Show ANN/&FULL messages Mostra ANN/&TUTTI i messaggi Show WW&V messages Mostra messaggi WW&V Show WC&Y messages Mostra messaggi WC&Y DX Spots DX Spots Messages Messaggi KLog: Add a DXCluster server KLog: Aggiungi un server DXCluster Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Aggiungi l'indirizzo seguito da :porta Esempio: dxfun.com:8000 Se la porta non è specificata, 41112 sarà usato di default: SetupPageHamLib Activate HamLib Activates the hamlib support that will enable the connection to a radio. Radio Select your rig. Defines the interval to pool the radio in msecs. Pool interval Port Select the serial port. Only the serial ports that are detected are shown. Scan Click to identify the serial ports available in your computer. Bauds Select the serial port speed. 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None Hardware Software XON/XOFF Flow control Select the serial flow control No parity Even Odd Space Mark Parity Select the serial parity. 1 bit 1.5 bits 2 bits Stop bits Select the serial stop bits. SetupPageLogs &New &Nuovo &Edit &Modifica &Remove &Elimina KLog KLog Log has not been removed. (#3) Il Log non è stato rimosso. (#3) Do you really want to remove this log? Davvero vuoi eliminare questo log? Add a new log. Edit the selected log. Remove the selected log. Select the log you want to open. All the QSOs from this log will be also deleted... Anche tutti i QSO di questo log saranno eliminati... Log has not been removed. (#2) Il Log non è stato rimosso. (#2) Log has not been removed. (#1) Il Log non è stato rimosso. (#1) ID ID Date Data Station Callsign Nominativo di stazione Operators Operatori Comments Commenti Type Tipo An error has occurred showing the following error code: Si è verificato un errore che riporta il seguente codice di errore: KLog - SetupPageLogs KLog - Pagina setup Logs SetupPageLogsNew &Date &Data &Station Callsign &Nominativo di stazione &Operators &Operatori Comm&ent Comm&enta &Ok &Ok &Cancel &Annulla Select categories Seleziona categoria Callsign used for this log. Comma separated list of operators: callsign1, callsign2. Lista degli operatori separati da virgola: nome1, nome2. {1,?} Start date of this log. Add a comment about this log. Select the kind of operation for this log. Select the mode category. Select the operators category. Select the assisted category. Select the power category. Select the bands category. Select the Overlay category. &Type of Operation &Tipo di operazione &Mode Category Categoria &Modo O&perators Category Categoria o&peratori &Assisted Category Categoria &Assisted Po&wer Category Categoria Po&tenza &Bands Category Categoria &Bande O&verlay O&verlay Categories not OK Categorie non OK You need to enter a valid QRZ in the Station Callsign box. The log will not be opened. E' necessario che tu isnerisca un valido QRZ nella pagina di configurazione del bnominativo di stazione. Il log non sarà aperto. You selected an invalid combination. The log will not be opened. Hai scelto una combinazione non valida. Il log non sarà aperto. Categories OK Categorie OK SetupPageMisc &Imperial system Sistema &Imperiale &Log in real time &Log in tempo reale &Time in UTC &Ora in UTC &Save ADIF on exit &Salva ADIF all'uscita Use this &default filename Usa questo nome di file per &default Mark &QSO to send QSL when QSL is received Segna il &QSO per inviare QSL quando una QSL è ricevuta Complete QSO with previous data Completa i dati del QSO con dati precedenti Show the Station &Callsign used in the search box Mostra il &nominativo di stazione caricato nella pagina di ricerca The search box will show also the callsign on the air to do the QSO. La pagina di ricerca mostra anche il nominativo usato durante il QSO. All the data from the My Data tab will be used or data from the previous QSO will be maintained. Tutti i dati nella pagina configurazione personale saranno usato oppure saranno mantenuti i dati del precedente QSO. &Check for new versions automatically &Controlla automaticamente nuove versioni Check if there is a new release of KLog available every time you start KLog. Controlla se è diosponibile una nuova versione di KLog ogni volta che tu avvii KLog. &Provide Info for statistics &Fornisci informazioni per statistiche Move DB Sposta DB Select to use real time. Scegli di usare ora reale. Select to use UTC time. Scegli di usare ora UTC. Select if you want to save to ADIF on exit. Scegli se vuoi salvare su formato ADIF all'uscita. Complete the current QSO with previous QSO data. Completa il QSO corrente con i dati del precedente QSO. This is the directory where DB (logbook.dat) will be saved. Questa è la cartella dove DB (logbook.dat) sarà salvato. Click to change the default ADIF file. Clicca per cambiare il file ADIF di default. Click to move the DB to the new directory. Clicca per spostare il DB su una nuova cartella. Select Directory Scegli la cartella File moved File spostato File copied File copiato File NOT copied File NON copiato The target directory does not exist. Please select an existing directory. La cartella di destinazione non esiste. Per favore scegli una cartella valida. Browse Browse &Reset to My Data for all QSOs &Reimposta ai miei dati su tutti i QSO Manage DX-Marathon QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. Il QSO sarà marcato come in attesadi inviare una QSL se ricevi la QSL DX senza aver inviato la tua. If new version checking is selected, KLog will send the developer your callsign, KLog version & Operating system to help in improving KLog. Se il controllo di nuova versione è attivato, KLog trasmetterà allo sviluppatore il tuo nominativo, la versione di KLog & il sistema operativo coem strumento per aiutare a migliorare KLog. Check it for Imperial system (Miles instead of Kilometers). Select to use the following name for the logfile without being asked for it again. Scegli il seguente nome per il file di log senza che ti venga chiesto di nuovo. Select if you want to manage DX-Marathon. This is the default file where ADIF data will be saved. Questo è il file di default dove i dati ADIF saranno salvati. This is the directory where the database (logbook.dat) will be saved. Questa è la cartella dove il database (logbook.dat) sarà salvato. Click to change the path of the database. Clicca per cambiare la path del database. Open File Apre File Please specify an existing directory where the database (logbook.dat) will be saved. Per favore indica una cartella valida dove il database (logbook.dat) sarà salvato. SetupPageSats &New &Nuovo &Edit &Modifica &Remove &Elimina &Import E&xport Add a new satellite. Edit the selected satellite. Remove the selected satellite. Import a satellites file. It will replace the satellites you have now configured. Export your current satellites to a file. Select the sat you want to open. KLog KLog Do you really want to remove this satellite? This satellite will not be longer available to be selected ... Sat has not been removed. (#3) Sat has not been removed. (#2) Sat has not been removed. (#1) ID ID Short Name Uplink Downlink Modes Modi An error has occurred showing the following error code: Si è verificato un errore che riporta il seguente codice di errore: KLog - SetupPageSats Open Satellites File KLog warning An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Please check the format or contact the developer for analysis with the error code: Save Satellites File SetupPageSatsNew Short name Sat name UpLink Uplink DownLink Downlink Modes Modi &Ok &Ok &Cancel &Annulla Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Enter the name of the satellite. Enter the uplink frequencies in this format: 144.300 Enter the downlink frequencies in this format: 144.300 Enter the modes in this format: USB Some of the data you have entered is not correct, the satellite can't be added. SetupPageUDP Start UDP Server Log automatically QSOs from WSJT-X Allow WSJT-X to send logged QSO to KLog QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will log automatically any QSO coming from WSJT-X without any manual confirmation. Receive and Update QSO data to KLog KLog will automatically show and update data coming from WSJT-X (DX callsign, locator, RPT, ...) Make sure it is the same port where the other programs are sending the data to. Default port is 2237. UDP port number where the UDP Server will listen for packets. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP Port QSO notification timeout (milisecs) Milliseconds that the notification of QSO received from WSJTX will be shown. SetupPageUserDataPage &Personal data Dati &Personali Station &data &Data Stazione Enter your name. Enter your address - 1st line. Enter your address - 2nd line. Enter your address - 3rd line. Enter your address - 4th line. Enter your city. Enter your zip code. Enter your province or state. Enter your country. &Name &Nome &Address &Indirizzo Cit&y Cit&tà &Zip Code &Cap Pro&v/State Pro&v/Stato Countr&y Countr&y Enter your information for rig Inserisci informazioni per rig Enter your information for antenna Inserisci informazioni sulla tua antenna Enter your power information. Enter the station callsign that will be used for logging. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Inserisci il locator della tua stazione. In alternativa, KLog è in grado di usare un locator approssimativo ricavato dal tuo nominativo. &Rig 1 &Impianto 1 R&ig 2 &Impianto 1 Ri&g 3 &Impianto 1 Antenna &1 Antenna &1 Antenna &2 Antenna &2 Antenna &3 Antenna &3 Po&wer Po&tenza Enter the operators (comma separated if more than one). Inserisci gli operatori (separati da virgola se più di uno). &QRZ &QRZ &Operators &Operatori &CQ Zone &CQ zona &ITU Zone &ITU zona &Locator &Locator &Locator (not valid) &Locator (non valido) SetupPageWorldEditor Add Aggiungi Delete Cancella Edit Export World Import World Still not implemented. Import a new cty.csv file An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Un file di informazioni collegamenti (cty.csv) è stato trovato nella cartella di KLog e sarà caricato. No entities information file (cty.csv) has been detected in your KLog folder. Nessun file di informazioni di collegamenti (cty.cvs) è stato trovato nella cartalla di KLog. KLog will not be able to show entities information. KLog non sarà in grado di mostrare le informazioni di collegamento. Prefix Prefisso Entity Collegamento ARRL ID ARRL ID Continent Continente CQ Zone CQ zona ITU Zone ITU zona UTC UTC Latitude Latidudine Longitude Longitudine Deleted Eliminato Since Date Dalla data To Date Alla data Open File Apre File BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Informazioni collegamento aggiornate. Entities information has not been updated. Informazioni collegamento non aggiornate. ShowErrorDialog KLog Message Messaggio KLog SoftwareUpdateDialog Ok Ok KLog update Aggiornamento KLog Congratulations! congratulazioni! Your KLog has been updated. KLog è stato aggiornato. You already have the latest version. Stai già usando la versione più recente. StartWizard KLog - The free hamradio logging program KLog.- Un software libero di annotazione dei collegamento Quit Setup Esce dalla configurazione Setup is not complete yet. Are you sure you want to quit setup? Configurazione non ancora completa. Sei sicuro di voler uscire dalla configurazione? StatisticsWidget QSO per year DXCC per year CQ zones per year QSO per band QSO per mode QSO per DXCC QSO per Continent QSO per hour QSO per month Worked / Confirmed status Worked / Sent status Sent / Confirmed status StatsCQZPerYearBarChartWidget CQ Zones per year Reading data ... Abort reading CQ zones CQ zones per year Reading data ... Years: %1/%2 StatsEntitiesPerYearBarChartWidget Chart title Reading data ... Abort reading DXCC Entities DXCC Entities per year Reading data ... Entities: StatsQSOsPerBandBarChartWidget QSOs per band Reading data ... Abort reading Bands Bande QSO per band distribution Reading data ... Bands: StatsQSOsPerContinentBarChartWidget QSOs per continent Reading data ... Abort reading Continents Reading data ... Hours: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC Reading data ... Abort reading Reading data... Entity: DXCC DXCC Top ten DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour Reading data ... Abort reading Hours QSOs at hour Reading data ... Hours: StatsQSOsPerModeBarChartWidget QSOs per mode Reading data ... Abort reading Modes Modi QSO per mode distribution Reading data ... Modes: StatsQSOsPerMonthBarChartWidget QSOs per month Reading data ... Abort reading Jan Feb Mar Apr May Jun Jul Sep Oct Nov Dec Aug Months QSOs at Month Reading data ... Months: StatsQSOsPerYearBarChartWidget Chart title Reading data ... Abort reading QSOs QSO QSOs per year Reading data ... QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Confirmed - %2 StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Confirmed - %2 StatsWorkedSentPieChartWidget Worked - %1 Sent - %2 UpdateSatsData Reading Satellites data file... Abort reading The Satellites information has been updated. Open File Apre File Sat Data World Entity Collegamento Continent continente Abort reading Annulla lettura Reading cty.csv... Lettura cty.cvs... eLogClubLog Host not found! Host non trovato! Timeout error! Errore di Timeout! It seems to be a PASSWORD ERROR; check your password. Si è verificato un ERRORE DI PASSWORD; controlla la tua password. KLog - ClubLog KLog - ClubLog Undefined error... Errore indefinito... Callsign missing Nominativo di chiamata assente Invalid callsign Nominativo di stazione non valido Skipping SWL callsign Salto nominativo SWL Callsign is your own call Callsign is you own call Invalid callsign with no DXCC mapping Nominativo di stazione non valido con nessuna localizzazione DXCC Updated QSO Trasferito QSO Invalid ADIF record Record ADIF non valido Missing ADIF record Record ADIF mancante Test mode - parameters ok, no action taken Modalità test parametri ok, nessuna azione intrapresa It seems that your ClubLog password is not correct. Sembra la tua password ClubLog non sia corretta. Please check your password in the setup. ClubLog uploads will be disabled. Per favore controlla la tua password nella configurazione. Il caricamento su ClubLog non sarà attivo. Excessive API Usage Eccessivo uso delle API Internal Error Errore Interno Rejected Rifiutato QSO Duplicate QSO Duplicato QSO Modified QSO Modificato Missing Login Login mancante QSO OK QSO OK Upload denied Trasferimento rifiutato No callsign selected Nessun nominativo selezionato No match found Nessuna corrispondenza trovata Dropped QSO QSO interrotto OK OK Login rejected Login rifiutato Rejected: Callsign is your own call Rifiutato: Nominativo is your own call klog-0.9.8.1/translations/klog_ca.ts0000644000175000017500000074104413532572307016314 0ustar develdevel AboutDialog About KLog Quant al KLog You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. També ens podeu ajudar enviant informes d'error o col·laboracions petites de codi, idees o el que penseu que podria millorar el KLog. If you want to provide support you are welcome to join the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Si voleu col·laborar, sou benvingut a posar-vos en contacte amb la <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">llista de desenvolupament del KLog</a>! Authors Autors By Per Please know that this is an BETA release and it may contain many bugs.<br>Backup your data before using this software! Tingueu present que aquesta és un llançament BETA i podria contenir algun error.<br>Feu una còpia de seguretat abans d'usar aquest programari! Author Autor KLog has been fully rewritten from the 0.6.2 to be able to provide a cross-platform application that runs in the main operating systems (Linux, macOS & Windows) and provide new functionalities that KLog was not providing. El KLog s'ha reescrit completament a partir de la 0.6.2 per ser capaç de proporcionar una aplicació multiplataforma que s'executa en els sistemes operatius principals (Linux, macOS i Windows) i proporciona funcionalitats noves que el KLog no feia. KLog is a free logbook for hamradio operators. El KLog és un registre lliure per a operadors de radioafició. Please provide your review in KLog's eHam review page: Si us plau, proporcioneu comentaris a la pàgina de revisions del KLog a eHam: today avui Main developer Desenvolupador principal KLog is developed by a very small team and you are invited to join! El KLog està desenvolupat per un equip molt petit i esteu convidat a unir-vos-hi! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Si el KLog encara no està en el vostre idioma i voleu ajudar-nos, sou benvingut a posar-vos en contacte amb la <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">llista de desenvolupament del KLog</a>! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account user's needs Els desenvolupadors del KLog han inclòs una funcionalitat que informa de vàries dades d'usuari al servidor del KLog amb l'únic propòsit d'identificat el nombre de versions instal·lades, per enfocar el desenvolupament cap a una direcció o una altre tenint en compte les necessitats dels usuaris At present, the data that is provided is the following: Actualment, les dades proporcionades són les següents: Be aware that you can enable/disable this feature from the Misc tab in the Setup page Tingueu present que podeu activar/desactivar aquesta funcionalitat des de la pestanya Varis a la pestanya de configuració Translators bring KLog into your language. They are really an important part of the KLog development team. Els traductors adapten el KLog al vostre idioma. Són una part important de l'equip de desenvolupament del KLog. Find more information and the latest release at Podeu trobar més informació i l'últim llançament a Translators Traductors Privacy advisory Avís de privadesa Callsign Indicatiu KLog version Versió del KLog Operating system Sistema operatiu KLog KLog Privacy Privadesa CTYPage Country data download Baixa les dades de països KLog needs country data... El KLog necessita dades de països... &Download &Baixa &Ignore &Ignora Country data needed Cal les dades de països KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC information. El KLog usa el fitxer «cty.csv» de http://www.country-files.com/ per obtenir la informació DXCC. You need to download the cty.csv file if you want KLog to show you the countries, locator, ... of the QSOs you do. Cal baixar el fitxer «cty.csv» si voleu que el KLog mostri els països, localitzadors, ... dels QSO que feu. Click on Download to download now. Cliqueu a Baixa per baixar ara. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? No s'ha pogut trobar la màquina. Reviseu la configuració de xarxa i proveu de nou Voleu tornar-ho a intentar? DXCCStatusWidget Update Actualitza ID ID Entity Entitat Pref: CQ: ITU: Beam: Entity not worked in this band. L'entitat no ha treballat en aquesta banda. DXClusterWidget Connect Connecta Clear Neteja Click on connect to connect to the DX-Cluster Cliqueu a Connecta per connectar al DX-Cluster KLog DXCluster Kontest DXCluster DXCluster del KLog Click on Connect to connect to the DX-Cluster server Cliqueu a Connecta per connectar al servidor de DX-Cluster Trying to connect to the server S'intenta connectar amb el servidor The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. La connexió ha estat rebutjada pel servidor. Assegureu-vos que el servidor de DXCluster està executant-se i comproveu que el nom de la màquina i el port siguin correctes. The following error occurred: %1. Ha ocorregut el següent error: %1. Connected to server Connectat al servidor KLog message Kontest message Missatge del KLog Enter your callsign to connect to the cluster: Introduïu el vostre indicatiu per connectar al clúster: Enter your password to connect to the cluster: (Just hit enter for no password) Introduïu la contrasenya per connectar al clúster: (premeu retorn si no hi ha contrasenya) Not logged on, you may need to enter your callsign again. No esteu connectat, cal tornar a introduir el vostre indicatiu un altre cop. Enter here the commands to be sent to the DX-Cluster server. Introduïu aquí les ordres a enviar al servidor DX-Cluster. Disconnect Desconnecta The host was not found. Please check: No s'ha trobat la màquina. Comproveu: - your network connection; - the host name and port settings. - la connexió de xarxa; - la configuració del nom de màquina i el port. Connection closed by the server Connexió tancada pel servidor Click on Connect to connect to the DX-Cluster server. Feu clic a Connecta per connectar al servidor DX-Cluster. Send Envia DataProxy_SQLite Software version in DB is null La versió del programari a la BD és nul No query failed No ha fallat cap consulta Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Terra-Lluna-Terra Sporadic E Sporadic E Internet-assisted Assistit per Internet Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder Repetidor o transponedor terrestre o atmosfèric Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satèl·lit Bureau Common term in hamradio, do not translate if not sure Bureau Manager Common term in hamradio, do not translate if not sure Manager All QSOs have been updated with a DXCC and the Continent. S'han actualitzat tots els QSO amb un DXCC i el continent. Field Aligned Irregularities Common term in hamradio, do not translate if not sure Field Aligned Irregularities F2 Reflection Common term in hamradio, do not translate if not sure F2 Reflection Trans-equatorial Common term in hamradio, do not translate if not sure Trans-equatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Tropospheric ducting Yes No No Requested Requerit Ignore/Invalid Ignora/No vàlid Validated Validat Queued En cua Uploaded Pujat Do not upload No pujat Modified Modificat Direct Directe Electronic Electrònic KLog DXCC DXCC del KLog DownLoadCTY Download of cty.csv failed with the following error code: La baixada del «cty.csv» ha fallat amb el codi d'error següent: Download of cty.csv done. La baixada de «cty.csv» ha finalitzat. There is already a cty.csv file in the folder but it will be replaced with the new one. Ja hi ha un fitxer «cty.csv» a la carpeta, però se substituirà pel nou. Could not open %1 for writing No s'ha pogut obrir %1 per a escriptura FileManager Reading ADIF file... S'està llegint el fitxer ADIF... Abort reading Interromp la lectura The log that you have selected contains more than just one station callsign. El registre que heu seleccionat conté més d'un indicatiu d'estació. Station Callsign: Indicatiu d'estació: Define Station Callsign Defineix l'indicatiu d'estació You have selected no callsign. KLog will export QSOs without a station callsign defined and those with the call you are entering here. No heu seleccionat cap indicatiu. El KLog exportarà els QSO sense cap indicatiu d'estació definit i aquells amb l'indicatiu que introduïu aquí. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Introduïu l'indicatiu emprat en aquest registre o deixeu-ho buit pels QSO sense indicatiu d'estació definit: Writing ADIF file... Escrivint el fitxer ADIF... Abort writing Interromp l'escriptura Exporting LoTW ADIF file... S'està exportant el fitxer LoTW ADIF... Writing ADIF file... QSO: S'està escrivint el fitxer ADIF... QSO: Reading LoTW file... S'està llegint el fitxer LoTW... Do you want to continue with the current file? Voleu continuar amb el fitxer actual? This log seems to lack of RST-TX information. Sembla que aquest registre li manca informació de RST-TX. Click on Yes to add a default 59 to all QSO with a similar problem. Cliqueu a Sí per afegir un 59 per defecte a tots els QSO amb un problema semblant. If you select NO, the QSO may not be imported. Si seleccioneu No, el QSO pot no importar-se. This log seems to lack of RST-RX information. Sembla que aquest registre li manca informació de RST-RX. - The band missing and the following call: - Manca la banda i l'indicatiu següent: - The call missing but was done at this time: - Manca l'indicatiu però s'ha fet a hores d'ara: - The mode missing and the following call: - Manca el mode i l'indicatiu següent: - The date missing and the following call: - Manca la data i l'indicatiu següent: - The time missing and the following call: - Manca l'hora i l'indicatiu següent: You have canceled the file export. The file will be removed and no data will be exported. Heu cancel·lat l'exportació del fitxer. El fitxer s'eliminarà i no s'exportarà cap dada. Do you still want to cancel? Encara voleu cancel·lar? QSO: QSO: Please select the station callsign you want to export the log from: Seleccioneu l'indicatiu de l'estació de la qual voleu exportar el registre: No station callsign has been selected and therefore no log will be exported No s'ha seleccionat cap indicatiu, i per tant no s'exportarà cap registre Writing Cabrillo file... S'està escrivint el fitxer Cabrillo... KLog: Cabrillo Log Export not implemented Kontest: Cabrillo Log Export not implemented KLog: L'exportació del registre en format Cabrillo no està implementada I am sorry but the Cabrillo Export To File feature has still not been implemented. Ho sentim però la funció d'exportar Cabrillo encara no està implementada. There is more than one log in this logfile. Hi ha més d'un registre en aquest fitxer de registre. All logs will be imported into the current log. S'importaran tots els registres al registre actual. Do you want to continue? Voleu continuar? Importing ADIF file... S'està important el fitxer ADIF... It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Sembla que hi ha diversos QSO duplicats al fitxer ADIF que s'està important. Voleu continuar? (Els QSO duplicats no s'importaran) You have cancelled the file import. The file will be removed and no data will be imported. Heu cancel·lat la importació del fitxer. El fitxer s'eliminarà i no s'importarà cap dada. This QSO is not including the minimum data to consider a QSO as valid!. Aquest QSO no inclou les dades mínimes per a considerar-se un QSO vàlid! Please edit the ADIF file and make sure that it include at least: Editeu el fitxer ADIF i assegureu-vos que inclou, com a mínim: and i This QSO had: Aquest QSO té: KLog: Not all required data found! KLog: No s'han trobat totes les dades necessàries! KLog: No RST TX found! KLog: No s'ha trobat RST TX! KLog: No RST RX found! KLog: No s'ha trobat RST RX! InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Continent Prefix Prefix CQ CQ ITU ITU Short Path Camí curt Long Path Camí llarg Deg Graus Miles Milles Km Km IntroPage Welcome to KLog! Welcome to Kontest! Us donem la benvinguda al KLog! Welcome to KLog! - brought to you under the terms of the GPL! Us donem la benvinguda al KLog! - Distribuït sota els termes de la GPL! Welcome to KLog Us donem la benvinguda al KLog This looks like it's the first time you've run KLog on this computer. Sembla que aquesta és la primera vegada que s'executa el KLog en aquest ordinador. KLog is a free hamradio logging program that can run on Linux macOS and Windows. El KLog és un programa lliure d'enregistrament de radioafició que es pot executar en el Linux, MacOS i Windows. It is designed to provide general purpose, DX and contest logging. Està dissenyat per proporcionar enregistrament de propòsit general, DX i concurs. It supports QSL management, import and export of ADIF Permet la gestió de QSL, importació i exportació de formats and Cabrillo file formats and many other features... de fitxer ADIF i Cabrillo, i moltes altres funcionalitats... Before you can start using KLog, you will be asked to: Abans de començar a usar el KLog, us demanarem: Acknowledge to the terms of the license. Reconeixement dels termes de la llicència. Download the DX entities information. Baixada de la informació de les entitats DX. Enter your callsign, CQ zone, etc. and main configuration. Introduïu el vostre identificador, zona CQ, etc. i configuració principal. Enjoy KLog and contact the development team if you have any suggestions! Gaudiu del KLog i contacteu amb l'equip de desenvolupament si teniu qualsevol suggeriment! LicPage KLog License information Informació de la llicència del KLog Welcome to KLog!- brought to you under the terms of the GPL! Us donem la benvinguda al KLog! - Distribuït sota els termes de la GPL! Acknowledge Reconeixement Be aware that KLog is free software. Tingueu present que el KLog és programari lliure. LogModel Date Data Time Hora QRZ QRZ Band Banda Mode Mode RSTtx RSTtx RSTrx RSTrx Comment Comentari LogWindow QSL Send QSL enviada QSL Rcvd QSL rebuda &Delete &Suprimeix Delete a QSO Suprimeix un QSO &Edit QSO &Edita QSO Edit this QSO Edita aquest QSO Via &bureau Via &bureau Send this QSL via bureau Envia aquesta QSL via bureau D&irect D&irecta Send this QSL via direct Envia aquesta QSL via directa Via bureau Via bureau QSL &received via bureau QSL &rebuda via bureau Direct Directa QSL received via direc&t QSL rebuda via direc&ta You have requested to delete this QSO. Heu sol·licitat suprimir aquest QSO. Are you sure? Esteu segur? MainWindow Recalculate Recalcula Click to recalculate the award status. Cliqueu per tornar a calcular l'estat dels diplomes. Starting KLog S'està iniciant el KLog &Add &Afegeix &Clear &Neteja Status bar... Barra d'estat... DX Entity Entitat DX &Log Window &Finestra del registre &Score Window Fine&stra de puntuació Watts Watts MHz MHz KLog KLog Annual Anual Ready Llest An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: S'ha produït un error inesperat en intentar afegir el QSO al registre. Si el problema persisteix, contacteu amb el desenvolupador per a una anàlisi: You have selected an entity: Heu seleccionat una entitat: that is different from the KLog proposed entity: que és diferent de l'entitat proposada pel KLog: Click on the prefix of the correct entity or Cancel to edit the QSO again. Feu clic al prefix de l'entitat correcta o Cancel·la per tornar a editar el QSO. Click on the prefix of the right entity or Cancel to correct. Feu clic al prefix de l'entitat correcta o Cancel·la per corregir. QRZ of the QSO. QRZ del QSO. TX RST. TX RST. RX RST. RX RST. TX Exchange. Intercanvi TX. Band of the QSO. Banda del QSO. Mode of the QSO. Mode del QSO. Date of the QSO. Data del QSO. Time of the QSO. Hora del QSO. Add the QSO to the log. Afegeix el QSO al registre. Clear the box. Neteja el quadre. Input Entrada RSTrx RSTrx RSTtx RSTtx QRZ QRZ STX STX SRX SRX NEW MULT NEW MULT Invalid characters used in the QRZ Caràcters no vàlids usats al QRZ Ready... Llest... &File &Fitxer &New... &Nou... &Open... &Obre... &Import from ADIF... &Importa des d'ADIF... Import an ADIF file into the current log. Importa un fitxer ADIF al registre actual. &Save As... &Desa com a... Export to ADIF... Exporta a ADIF... Export the current log to an ADIF logfile. Exporta el registre actual a un fitxer ADIF. Export all logs to ADIF... Exporta tots els registres a ADIF... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exporta tots els QSO a un fitxer ADIF, fusionant els QSO de tots els registres. Export Requested QSL to ADIF... Exporta els QSL sol·licitats a ADIF... Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a QSL tag printing program). Exporta tots els QSO que sol·licitin QSL a un fitxer ADIF (p. ex. en importar-los a un programa d'impressió d'etiquetes QSL). Export ADIF for LoTW... Exporta l'ADIF per a LoTW... Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before uploading to LoTW! Exporta un fitxer ADIF per enviar a LoTW. Recordeu signar-lo amb TQSL abans de pujar-lo a LoTW! &Print Log... Im&primeix el registre... Print your log. Imprimeix el registre. KLog folder Carpeta del KLog Opens the data folder of KLog. Obre la carpeta de dades del KLog. E&xit S&urt &Tools &Eines Fill in QSO data Omple les dades QSO Go through the log reusing previous QSOs to fill missing information in other QSOs. Recorre el registre reutilitzant els QSO anteriors per omplir informació que manqui en altres QSO. Fill in DXCC data Omple les dades DXCC Go through the log filling QSOs without a DXCC defined. Recorre el registre omplint els QSO sense cap DXCC definit. QSL tools... Eines QSL... &Find QSO to QSL &Cerca QSO als QSL Shows QSOs for which you should send your QSL and request the DX QSL. Mostra els QSO pels quals cal enviar el vostre QSL i sol·licitar el DX QSL. Find My-QSLs pending to send Cerca els meus QSL pendents d'enviar Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Mostra els QSO amb sol·licituds pendents d'enviar els QSL. Cal mantenir buida aquesta cua! &Find DX-QSLs pending to receive &Cerca els DX-QSL pendents de rebre Shows the DX-QSL that has been requested or QSLs has been sent with no answer. Mostra les DX-QSL que s'han sol·licitat o les QSL que s'han enviat sense resposta. &Find requested pending to receive &Cerca sol·licituds pendents de rebre Shows the DX-QSL that has been requested. Mostra les DX-QSL que s'han sol·licitat. LoTW tools... Eines LoTW... Queue all QSL to be sent of this log Posa a la cua totes les QSL a enviar d'aquest registre Mark all non sent QSOs in this log as queued to be uploaded. Marca tots els QSO no enviats en aquest registre com a posats en cua per a ser pujats. Queue all QSL to be sent Posa a la cua totes les QSL a enviar Mark all non sent QSOs as queued to be uploaded. Marca tots els QSO no enviats com a posats en cua per a ser pujats. Mark as sent all queued QSO of this log Marca com a enviats tots els QSO d'aquest registre Mark all queued QSOs in this log as sent to LoTW. Marca tots els QSO posats en cua d'aquest registre com a enviats al LoTW. Mark all queued QSO as sent Marca tots els QSO posats en cua com a enviats Mark all queued QSOs as sent to LoTW. Marca tots els QSO posats en cua com a enviats al LoTW. &Update cty.csv &Actualitza el «cty.csv» For updated DX-Entity data, update cty.csv. Per a dades DX-Entity actualitzades, actualitzeu el «cty.csv». &Update Satellite Data Act&ualitza les dades dels satèl·lits Stats Estadístiques Show the statistics of your radio activity. Mostra les estadístiques de la vostra activitat de ràdio. &Setup &Configuració &Setup... &Configuració... &Help &Ajuda Check updates... Comprova les actualitzacions... &About... &Quant a... About Qt... Quant a les Qt... KLog LoTW KLog LoTW All pending QSO of this log has been marked as queued for LoTW! Tots els QSO pendents d'aquest registre s'han marcat com a posats en cua pel LoTW! Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. Ara podeu anar al menú Fitxer per exportar el fitxer LoTW ADIF i pujar-lo a LoTW. There was a problem to mark all pending QSO of this log as queued for LoTW! Hi ha hagut un problema en marcar tots els QSO pendents d'aquest registre com a posats en cua pel LoTW! All pending QSO has been marked as queued for LoTW! Tots els QSO pendents s'han marcat com a posats en cua pel LoTW! The log that you have selected contains more than just one station callsign. El registre que heu seleccionat conté més d'un indicatiu d'estació. Please select the station callsign you want to mark as sent to LoTW: Seleccioneu l'indicatiu d'estació que voleu marcar com enviat a LoTW: Station Callsign: Indicatiu d'estació: Define Station Callsign Defineix l'indicatiu d'estació You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the call you are entering here. No heu seleccionat cap indicatiu. El KLog marcarà els QSO sense cap indicatiu d'estació definit i aquells amb l'indicatiu que introduïu aquí. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Introduïu l'indicatiu d'estació emprat en aquest registre o deixeu-ho buit pels QSO sense indicatiu d'estació definit: No station callsign has been selected and therefore no log will be marked No s'ha seleccionat cap indicatiu, i per tant no es marcarà cap registre All queued QSO of this log has been marked as sent for LoTW! Tots els QSO posats en cua d'aquest registre s'han marcat com a enviats pel LoTW! There was a problem to mark all queued QSO of this log as sent for LoTW! Hi ha hagut un problema en marcar tots els QSO posats en cua d'aquest registre com a enviats pel LoTW! All queued QSO has been marked as sent to LoTW! Tots els QSO posats en cua s'han marcat com a enviats al LoTW! There was a problem to mark all queued QSO of this log as sent to LoTW! Hi ha hagut un problema en marcar tots els QSO posats en cua d'aquest registre com a enviats al LoTW! About... Quant a... KLog update checking result Resultat de la comprovació d'actualitzacions del KLog Congratulations! Enhorabona! You already have the latest version. Ja teniu la versió més recent. Nothing has been saved. You have to select a valid file type. No s'ha guardat res. Cal seleccionar un tipus de fitxer vàlid. Save File Desa el fitxer ADIF file Fitxer ADIF Cabrillo files Fitxers Cabrillo Any file Qualsevol fitxer You can find the KLog data folder here: Podeu trobar la carpeta de dades del KLog aquí: DUPE DUPLICAT start començar stop aturar It seems that there are no QSO in the database. Sembla que no hi ha cap QSO a la base de dades. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Si esteu segur que la base de dades conté QSO i el KLog no és capaç de trobar-los, contacteu amb els desenvolupadors (vegeu Quant al KLog) per sol·licitar ajuda. TX Frequency in MHz. Freqüència de TX en MHz. RX Frequency in MHz. Freqüència de RX en MHz. Power used by the DX. Potència usada pel DX. Logging operator's callsign. Indicatiu de l'operador del registre. Callsign used over the air. Indicatiu usat a l'aire. My QTH locator. El meu localitzador QTH. Name of the DX. Nom del DX. QTH of the DX. QTH del DX. Locator of the DX. Localitzador del DX. Filling DXCC in QSOs... QSO: S'està omplint els DXCC als QSO... QSO: TX Frequency in MHz. Frequency is not in a hamradio band! Freqüència TX en MHz. La freqüència no es en una banda de radioafició! RX Frequency in MHz. Frequency is not in a hamradio band! Freqüència RX en MHz. La freqüència no es en una banda de radioafició! QSO logged from WSJT-X: QSO enregistrat des del WSJT-X: RX Exchange. Intercanvi RX. The logfile has been modified. El fitxer de registre s'ha modificat. Do you want to save your changes? Voleu desar els canvis? UDP Server error The UDP server failed to %1. start or stop Error del servidor UDP El servidor UDP ha fallat en %1. Clears the QSO entry. Neteja l'entrada QSO. Number of confirmed DXCC entities. Nombre d'entitats DXCC confirmades. Number of worked DXCC entities. Nombre d'entitats DXCC treballades. Number of confirmed WAZ zones. Nombre de zones WAZ confirmades. Number of worked WAZ zones. Nombre de zones WAZ treballades. Number of confirmed local references. Nombre de referències locals confirmades. Number of worked local references. Nombre de referències locals treballades. Number of confirmed QSOs. Nombre de QSO confirmats. Number of worked QSOs. Nombre de QSO treballats. Number of QSOs worked on the selected year. Nombre de QSO treballats durant l'any seleccionat. Number of DXCC worked on the selected year. Nombre de DXCC treballats durant l'any seleccionat. Number of CQ Zones worked on the selected year. Nombre de zones CQ treballades durant l'any seleccionat. Score for the DXMarathon on the selected year. Puntuació per al DXMarathon durant l'any seleccionat. Select the year you want to check. Seleccioneu l'any que voleu comprovar. Status of the DX entity. Estat de l'entitat DX. Name of the DX entity. Nom de l'entitat DX. Name Nom QTH QTH Locator Localitzador Power(rx) Potència (rx) RST(tx) RST (tx) RST(rx) RST(rx) Freq TX Freq TX Freq RX Freq RX QSO QSO QSL QSL eQSL eQSL Comment Comentari Others Altres My Data Les meves dades Satellite Satèl·lit QSOs QSO DXCC DXCC CQ CQ Score Puntuació DX-Marathon DX-Marathon Info Informació Award Diploma Confirmed Confirmats Worked Treballats WAZ WAZ Local Local Awards Diplomes Search Cerca Log Registre DX-Cluster DX-Cluster Save ADIF File Desa el fitxer ADIF LoTW logfile has been properly exported! El fitxer de registre LoTW s'ha exportat adequadament! Remember to: Recordeu: Before uploading: sign the LoTW log; and Abans de la pujada: signeu el registre LoTW; i After uploading: mark as sent all the queued QSO (LoTW Tools). Després de la pujada: marca com a enviats tots els QSO en la cau (eines LoTW). There was no QSO to be exported. No hi ha cap QSO a exportar. If you think that some QSO should have been exported, please look for them and ensure that the eQSL LoTW QSL sent box is marked as: Si penseu que s'haurien d'haver exportat alguns QSO, cerqueu-los i assegureu-vos que la casella d'enviament eQSL LoTW QSL està marcada amb: Q - Queued Q - A la cua There was an error while exporting the LoTW. The log has not been exported! S'ha produït un error en exportar el LoTW. No s'ha exportat el registre! Save Cabrillo File Desa el fitxer Cabrillo Open File Obre un fitxer &Modify &Modifica - Needed for DXMarathon - Necessari per DXMarathon Filling QSOs... Omplint els QSO... Abort filling Interromp l'ompliment Number Número Date Data Time Hora Band Banda Mode Mode Print Log Imprimeix el registre Printing the log... S'està imprimint el registre... Abort printing Interromp la impressió Printing the log... QSO: S'està imprimint el registre... QSO: KLog QSO received S'ha rebut un QSO al KLog The following QSO data has been received from WSJT-X to be logged: S'han rebut les dades QSO següents des del WSJT-X per a enregistrar: Call Trucada Freq Freq. Time On Hora d'inici Time Off Hora final RST TX RST TX RST RX RST RX DX-Grid DX-Grid Comments Comentaris TX Pwr TX Pwr Operator Operador Local-Grid Local-Grid If the received mode is correct, please contact KLog development team and request support for that mode Si el mode rebut és correcte, contacteu amb l'equip de desenvolupament del KLog i sol·liciteu la implementació d'aquest mode Do you want to keep receiving this alerts? (disabling this alerts will prevent that non-valid modes are detected) Voleu continuar rebent aquestes alertes? (la desactivació d'aquestes alertes evitarà que es detectin modes no vàlids) A new mode not supported by KLog has been received from an external software or radio: S'ha rebut un mode nou des de programari extern o ràdio no suportat pel KLog: A duplicated satellite has been detected in the file and will not be imported. S'ha detectat un satèl·lit duplicat al fitxer i no s'importarà. Please check the satellite information file and ensure it is properly populated. Comproveu el fitxer d'informació del satèl·lit i assegureu que estigui correctament omplert. Now you will see a more detailed error that can be used for debugging... Ara veureu un error més detallat que es pot usar per a la depuració... An unexpected error ocurred!! Hi ha hagut un error inesperat!! If the problem persists, please contact the developers Si el problema persisteix, contacteu amb els desenvolupadors for analysis: per a l'anàlisi: Error in function Error a la funció Error code Codi d'error Error text Text de l'error Failed query Ha fallat la consulta Recomendation: Recomanació: Export, periodically, your data to ADIF to prevent a potential data loss. Periódicament exporteu les dades a l'ADIF per evitar una pèrdua potencial de dades. Do you want to keep showing errors? Voleu mantenir la visualització dels errors? MainWindowInputComment Add a comment for this QSO. Afegeix un comentari per a aquest QSO. MainWindowInputEQSL Date of the ClubLog upload. Data de la pujada al ClubLog. Date of the eQSL sending. Data de l'enviament de l'eQSL. Date of the eQSL reception. Data de la recepció de l'eQSL. Date of the LoTW sending. Data de l'enviament del LoTW. Date of the LoTW reception. Data de la recepció del LoTW. Status of the LoTW sending. Estat de l'enviament del LoTW. Status of the LoTW reception. Estat de la recepció del LoTW. LoTW Sent LoTW enviat LoTW Rec LoTW rebut Status on ClubLog. Estat al ClubLog. Status of the eQSL sending. Estat de l'enviament de l'eQSL. Status of the eQSL reception. Estat de la recepció de l'eQSL. ClubLog ClubLog eQSL Sent eQSL enviat eQSL Rec eQSL rebut MainWindowInputOthers Primary Div Div principal Secondary Div Div secundària IOTA IOTA Entity Entitat Propagation mode Mode de propagació Select the primary division for this QSO. Selecciona la divisió primària per aquest QSO. Select the secondary division for this QSO. Selecciona la divisió secundària per aquest QSO. Select the entity for this QSO. Selecciona l'entitat per aquest QSO. Select the propagation mode for this QSO. Selecciona el mode de propagació per aquest QSO. Select the IOTA continent for this QSO. Seleccioneu el continent IOTA per aquest QSO. Select the IOTA reference number for this QSO. Seleccioneu el número de referència IOTA per aquest QSO. Not Identified No identificat Not - Not Identified Not - No identificat MainWindowInputQSL QSL Sent QSL enviada QSL Rec QSL rebuda QSL Via QSL via QSL Msg Missatge QSL Status of the QSL sending. Estat de l'enviament de la QSL. Status of the QSL reception. Estat de la recepció de la QSL. QSL sending information. Informació d'enviament de la QSL. QSL reception information. Informació de recepció de la QSL. Date of the QSL sending. Data de l'enviament de la QSL. Date of the QSL reception. Data de la recepció de la QSL. Message of the QSL. Missatge de la QSL. QSL via information. QSL via informació. MainWindowMyDataTab Watt Watt Keep this data Mantén aquestes dades Data entered in this tab will be copied into the next QSO. Les dades introduïdes en aquesta pestanya es copiaran en el QSO següent. Power used for the QSO in watts. Potència usada pel QSO, en watts. Logging operator's callsign. Indicatiu de l'operador del registre. Callsign used over the air. Indicatiu usat a l'aire. My QTH locator. El meu localitzador QTH. Power Potència Operator Operador Station Callsign Indicatiu de l'estació My Locator El meu localitzador MainWindowSatTab Keep this data Mantén aquestes dades Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Nom del satèl·lit si no és a la llista. Seleccioneu: «%1» per activar aquest quadre. (format semblant AO-51). Satellite mode used. Mode usat de satèl·lit. Select the satellite you are using. Seleccioneu el satèl·lit que esteu usant. UpLink band. Banda de pujada (UpLink). DownLink band. Banda de baixada (DownLink). Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Localitzador de l'estació DX. Aquest quadre està sincronitzat amb el quadre Localitzador de la pestanya QSO. UpLink Pujada DownLink Baixada Satellite Satèl·lit Mode Mode DX Locator Localitzador DX Other Altres MHz MHz Not Sat QSO QSO sense satèl·lit KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. El KLog ha detectat un nom de satèl·lit que no reconeix. En el seu lloc, caldria usar un dels noms coneguts de satèl·lit. Seleccioneu-lo de la llista. Alternativament, contacteu amb l'equip de desenvolupament per afegir el nom nou de satèl·lit. Please know that the satellite name will not be saved if it is not in the list so that information may be lost! Sapigueu que el nom del satèl·lit no es desarà si no és a la llista, per tant, aquesta informació es podria perdre! Other - Sat not in the list Altres - El satèl·lit no és a la llista Data entered in this tab will be copied into the next QSO. Les dades introduïdes en aquesta pestanya es copiaran en el QSO següent. The satellite you have in your QSO is: El satèl·lit que hi ha al QSO és: QObject Database Error Error de base de dades KLog DB needs to be upgraded. La BD del KLog necessita actualitzar-se. Do you want to upgrade it now? La voleu actualitzar ara? If DB is not upgraded KLog may not work properly. Si la BD no s'actualitza, el KLog podria no funcionar adequadament. KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. El KLog ha detectat un registre anterior a la BD. Es migraran totes les dades a un registre de tipus DX creat de nou. KLog: Enter Station callsign KLog: Introduïu l'indicatiu de l'estació Enter the station callsign used in this log Introduïu l'indicatiu emprat en aquest registre Station Callsign Indicatiu de l'estació All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is OK. Totes les dades s'han migrat correctament. Ara hauríeu d'anar a Configuració->Preferències->Registres per comprovar que tot és correcte. QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? La cancel·lació d'aquesta actualització provocarà inconsistència de dades i possiblement pèrdua de dades. Encara voleu cancel·lar? Progress: Progrés: Updating DXCC award information... S'està actualitzant la informació dels diplomes DXCC... Updating DXCC Award information... S'està actualitzant la informació dels diplomes DXCC... Updating WAZ award information... S'està actualitzant la informació dels diplomes WAZ... Updating WAZ Award information... S'està actualitzant la informació dels diplomes WAZ... Updating mode information... Actualitzant informació del mode... Abort updating Interromp l'actualització Updating bands information... Actualitzant informació de bandes... Updating bands information in %1 status... Actualitzant informació de bandes en %1... Updating mode information in %1 status... Actualitzant informació dels modes en %1... New One, work it! nNew One, work it! Un de nou, treballeu-ho! Needed, work it! Necessari, treballeu-ho! Worked but not confirmed Treballat però no confirmat Confirmed Confirmat Not identified No identificat Install wizard was canceled before completing... L'assistent d'instal·lació s'ha cancel·lat abans de finalitzar... Do you want to remove the KLog dir from your disk? Voleu eliminar el directori del KLog del disc? Your KLog dir has been removed S'ha eliminat el directori del KLog I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. No s'ha pogut eliminar el directori del KLog. Caldria fer-ho manualment si el voleu eliminar del disc dur. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. No s'ha pogut eliminar el directori del KLog. Caldria fer-ho manualment si el voleu eliminar del disc dur. Remember that your KLog dir is on your system... Recordeu que el directori del KLog és al vostre sistema... Thank you for running KLog! Moltes gràcies per usar el KLog! Updating DXCC and Continent information... S'està actualitzant la informació dels DXCC i del continent... SearchWidget &Clear &Neteja &Select All &Selecciona-ho tot &Search &Cerca All Tot &Export Highlighted &Exporta els ressaltats Clear the searches. Neteja les cerques. Export the search result to an ADIF file. Exporta el resultat de la cerca a un fitxer ADIF. Select/Unselect all the QSOs shown. Selecciona/Desselecciona tots els QSO mostrats. Search in the log. Cerca al registre. Search in all logs. Cerca a tots els registres. Enter the QRZ to search for. Introduïu el QRZ a cercar. Search results. Resultats de la cerca. QRZ QRZ Date/Time Data/hora Band Banda Mode Mode QSL Sent QSL enviada QSL Rcvd QSL rebuda Station Callsign Indicatiu d'estació ID ID &Clear selection &Neteja la selecció Save File Desa fitxer QSL Send QSL enviada &Delete &Suprimeix Delete a QSO Suprimeix un QSO &Edit QSO &Edita QSO Edit this QSO Edita aquest QSO Via &bureau Via &bureau Send this QSL via bureau Envia aquesta QSL via bureau D&irect D&irecta Send this QSL via direct Envia aquesta QSL via directa &Request my QSL &Sol·licita la meva QSL Mark my QSL as requested Marca la meva QSL com a sol·licitada Via Direct && mark DX QSL as requested Via directa i marca la QSL DX com a sol·licitada Send this QSL via direct & mark DX QSL as requested Envia aquesta QSL via directa i marca la QSL DX com sol·licitada Via Bureau && mark DX QSL as requested Via bureau i marca la QSL DX com a sol·licitada Send this QSL via bureau & mark DX QSL as requested Envia aquesta QSL via bureau i marca la QSL DX com a sol·licitada &Request the QSL &Sol·licita la QSL Mark the QSL as requested Marca la QSL com a sol·licitada Via bureau && mark my QSL as requested Via bureau i marcar la meva QSL com a sol·licitada QSL received via bureau & mark my QSL as requested QSL rebuda via bureau i marca la meva QSL com a sol·licitada Via bureau Via bureau QSL received via bureau QSL rebuda via bureau Direc&t && mark as my QSL requested Direc&ta i marca-la com a QSL sol·licitada QSL received via direct & mark my QSL as requested QSL rebuda via directa i marca la meva QSL com a sol·licitada Direc&t Direc&ta QSL received via direct QSL rebuda via directa You have requested to delete the QSO with: %1 Heu demanat suprimir el QSO amb: %1 Are you sure? Esteu segur? Needed QSO to send the QSL QSO necessari per enviar la QSL My QSL requested to be sent La meva QSL sol·licitada per enviar DX QSL pending to be received QSL del DX pendent de rebre SetupDialog User data Dades de l'usuari Bands/Modes Bandes/modes My Data Les meves dades DX-Cluster DX-Cluster Colors Colors Misc Varis World Editor Editor mundial ClubLog ClubLog Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Aneu a la pestanya Varis i feu clic a Mou la BD o la BD no es mourà a la ubicació nova. Cancel Cancel·la Satellites Satèl·lits HamLib HamLib OK D'acord Config Dialog Diàleg de configuració D&X-Cluster D&X-Cluster WSJT-X WSJT-X You need to enter at least one log in the Logs tab. Com a mínim cal introduir un registre a la pestanya Registres. You need to enter at least a valid QRZ. Com a mínim cal introduir un QRZ vàlid. Go to the User tab and enter valid QRZ. Aneu a la pestanya Usuari i introduïu un QRZ vàlid. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Sereu redirigit a la pestanya Registre. Afegiu i seleccioneu la classe de registre que voleu usar. DB has not been moved to new path La BD no s'ha mogut al camí nou You have not selected the kind of log you want. No heu seleccionat la classe de registre que voleu. Logs Registres World Mundial SetupEntityDialog Entity Entitat CQ CQ ITU ITU Latitude Latitud Longitude Longitud UTC UTC Main prefix Prefix principal ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... Prefixos possibles separats per comes, p. ex. EA1, EA2, ... Prefixes Prefixos Name of the Entity. Nom de l'entitat. CQ zone. Zona CQ. ITU zone. Zona ITU. Longitude of the Entity. Longitud de l'entitat. Local time difference to UTC. Diferència de l'hora local respecte a UTC. Main prefix of the entity. Prefix principal de l'entitat. ARRL ID. ARRL ID. Date of the deletion. Data de la supressió. Deleted Suprimit Cancel Cancel·la OK D'acord Entity Dialog Diàleg d'entitat SetupPageBandMode Bands Bandes Modes Modes SetupPageClubLog &Callsign Indi&catiu ClubLog &password Contra&senya del ClubLog ClubLog &email Corr&eu electrònic del ClubLog Enter the email you used to register in ClubLog. Introduïu el correu electrònic usat per registrar-se al ClubLog. Enter the callsign you used to register in ClubLog. Introduïu l'indicatiu usat per registrar-se al ClubLog. Enter your password in ClubLog. Introduïu la vostra contrasenya al ClubLog. &Send QSOs in real time &Envia els QSO en temps real &Activate ClubLog &Activa el ClubLog Use QSO Station &Callsign Usar indi&catiu de l'estació del QSO Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Envia cada QSO al ClubLog en temps real, quan s'afegeixin (o es modifiquin) en el KLog. Starts the ClubLog support in KLog. Inicia l'admissió del ClubLog al KLog. Use the Station Callsign defined in each QSO instead of the one defined here. Usa l'indicatiu d'estació definit en cada QSO en lloc del que s'ha definit aquí. SetupPageColors New One Un de nou Needed in this band Necessari en aquesta banda Worked in this band Treballat en aquesta banda Confirmed in this band Confirmed Confirmat en aquesta banda Default Predeterminat Choose a color Escolliu un color SetupPageDxCluster Add Afegeix Delete Suprimeix Show &HF spots Show HF spots Mostra els avisos en &HF Show V/&UHF spots Show V/UHF spots Mostra els avisos en V/&UHF Show W&ARC spots Show WARC spots Mostra els avisos en W&ARC Show &worked spots Show worked spots Mostra els a&visos treballats Show &confirmed spots Show confirmed spots Mostra els avisos &confirmats Show ANN/&FULL messages Show ANN/FULL messages Mostra els missatges ANN/&FULL Show WW&V messages Show WWV messages Mostra els missatges WW&V Show WC&Y messages Show WCY messages Mostra els missatges WC&Y DX Spots Avisos DX Messages Missatges KLog: Add a DXCluster server Kontest: Add a DXCluster server KLog: Afegeix un servidor DXCluster Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default.: Afegeix l'adreça seguida de :port Exemple: dxfun.com:8000 Si no s'especifica port, s'usarà 41112 de forma predeterminada: SetupPageHamLib Activate HamLib Activa la HamLib Activates the hamlib support that will enable the connection to a radio. Activa la implementació de la «hamlib» que activarà la connexió a la ràdio. RTS on RTS actiu Setting RTS may be needed for some serial ports. Pot ser necessari el paràmetre RTS per diversos ports sèrie. DTR on DTR actiu Setting DTR may be needed for some serial ports. Pot ser necessari el paràmetre DTR per diversos ports sèrie. Radio Ràdio Select your rig. Seleccioneu el vostre equip. Defines the interval to pool the radio in msecs. Defineix l'interval de disponibilitat de la ràdio in msecs. Pool interval Interval de disponibilitat Port Port Select the serial port. Only the serial ports that are detected are shown. Seleccioneu el port sèrie. Només es mostren els ports sèrie detectats. Scan Escaneja Click to identify the serial ports available in your computer. Feu clic per identificar els ports sèrie disponibles a l'ordinador. Bauds Bauds Select the serial port speed. Seleccioneu la velocitat del port sèrie. 5 bits 5 bits 6 bits 6 bits 7 bits 7 bits 8 bits 8 bits Data bits Bits de dades Select the serial data bits. Seleccioneu els bits de dades del sèrie. None Cap Hardware Maquinari Software XON/XOFF Programari XON/XOFF Flow control Control de flux Select the serial flow control Seleccioneu el control de flux del sèrie No parity Sense paritat Even Parells Odd Senars Space Espai Mark Marca Parity Paritat Select the serial parity. Seleccioneu la paritat del sèrie. 1 bit 1 bit 1.5 bits 1.5 bits 2 bits 2 bits Stop bits Bits de parada Select the serial stop bits. Seleccioneu els bits d'aturada del sèrie. SetupPageLogs Type Tipus &New New &Nou &Edit &Edita &Remove &Elimina KLog KLog Do you really want to remove this log? Esteu segur que voleu eliminar aquest registre? All the QSOs from this log will be also deleted... També s'eliminaran tots els QSO d'aquest registre... Operators Operadors An error has occurred showing the following error code: Hi ha hagut un error en mostrar el codi d'error següent: Log has not been removed. (#3) No s'ha eliminat el registre. (#3) Add a new log. Afegeix un registre nou. Edit the selected log. Edita el registre seleccionat. Remove the selected log. Elimina el registre seleccionat. Select the log you want to open. Seleccioneu el registre que voleu obrir. Log has not been removed. (#2) No s'ha eliminat el registre. (#2) Log has not been removed. (#1) No s'ha eliminat el registre. (#1) KLog - SetupPageLogs KLog - SetupPageLogs ID ID Station Callsign Indicatiu de l'estació Comments Comentaris Date Data SetupPageLogsNew &Ok D'ac&ord &Cancel &Cancel·la Select categories Seleccioneu les categories &Date &Data &Station Callsign Indicatiu d'e&stació &Operators &Operadors Comm&ent Com&entari Callsign used for this log. Indicatiu usat per aquest registre. Comma separated list of operators: callsign1, callsign2. Llista separada per comes dels operadors: indicatiu1, indicatiu2. Start date of this log. Data inicial d'aquest registre. Add a comment about this log. Afegiu un comentari quant a aquest registre. &Type of Operation &Tipus d'operació Select the kind of operation for this log. Seleccioneu la classe d'operació per a aquest registre. &Mode Category Categoria de &mode Select the mode category. Seleccioneu la categoria del mode. O&perators Category Categoria d'o&peradors Select the operators category. Seleccioneu la categoria dels operadors. &Assisted Category Categoria d'&assistit Select the assisted category. Seleccioneu la categoria d'assistit. Po&wer Category Categoria de &potència Select the power category. Seleccioneu la categoria de la potència. &Bands Category Categoria de &bandes Select the bands category. Seleccioneu la categoria de les bandes. O&verlay S&uperposició Select the Overlay category. Seleccioneu la categoria de la superposició. Categories not OK Categories no correctes You need to enter a valid QRZ in the Station Callsign box. The log will not be opened. You need to enter a valid QRZ in the Station Callsign box The log will not be opened. Cal introduir un QRZ vàlid a la casella d'indicatiu d'estació. El registre no s'obrirà. You selected an invalid combination. The log will not be opened. You selected an invalid combination The log will not be opened. Heu seleccionat una combinació no vàlida. El registre no s'obrirà. Categories OK Categories correctes SetupPageMisc &Imperial system Imperial system Sistema &imperial &Log in real time Log in real time &Registre en temps real &Time in UTC Time in UTC Hora en U&TC &Save ADIF on exit Save ADIF on exit De&sa l'ADIF en sortir Use this &default filename Use this default filename Usa aquest nom de fitxer pre&determinat Mark &QSO to send QSL when QSL is received Mark QSO to send QSL when QSL is received Marca el &QSO per enviar QSL quan es rebi la QSL Complete QSO with previous data Completa QSO amb dades prèvies &Reset to My Data for all QSOs &Restaura les meves dades a tots els QSO Manage DX-Marathon Gestiona una marató DX Move DB Mou la BD If new version checking is selected, KLog will send the developer your callsign, KLog version & Operating system to help in improving KLog. Si s'ha seleccionat la comprovació de versió nova, el KLog enviarà al desenvolupador el vostre indicatiu, la versió del KLog i el sistema operatiu per ajudar a millorar el KLog. Check it for Imperial system (Miles instead of Kilometers). Activeu-ho per al sistema imperial (milles en lloc de kilòmetres). Select to use the following name for the logfile without being asked for it again. Seleccioneu l'ús del nom següent com a fitxer de registre sense tornar-ho a preguntar. Select if you want to manage DX-Marathon. Seleccioneu si voleu gestionar la marató DX. This is the default file where ADIF data will be saved. Aquests és el fitxer predeterminat a on es desaran les dades ADIF. This is the directory where the database (logbook.dat) will be saved. Aquest és el directori a on es desarà la base de dades (logbook.dat). Click to change the path of the database. Cliqueu per canviar el camí a la base de dades. Please specify an existing directory where the database (logbook.dat) will be saved. Especifiqueu un directori existent a on es desarà la base de dades (logbook.dat). This is the directory where DB (logbook.dat) will be saved. Aquest és el directori a on es desarà la BD (logbook.dat). Click to change the default ADIF file. Cliqueu per canviar el fitxer ADIF predeterminat. Click to move the DB to the new directory. Cliqueu per moure la BD a un directori nou. Select Directory Selecció de directori File moved S'ha mogut el fitxer File copied S'ha copiat el fitxer File NOT copied NO s'ha copiat el fitxer The target directory does not exist. Please select an existing directory. El directori de destinació no existeix. Seleccioneu un directori existent. The search box will show also the callsign on the air to do the QSO. El quadre de cerca mostrarà també l'indicatiu a l'aire emprat per fer el QSO. Show the Station &Callsign used in the search box Mostra l'indi&catiu d'estació usat al quadre de cerca All the data from the My Data tab will be used or data from the previous QSO will be maintained. S'empraran totes les dades de la pestanya Les meves dades o bé es mantindran les dades del QSO anterior. &Check for new versions automatically &Comprova automàticament si hi ha versions noves QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. Els QSO es marcaran com a pendents d'enviar una QSL si rebeu el DX QSL i no heu enviat el vostre. Check if there is a new release of KLog available every time you start KLog. Comprova si hi ha un llançament nou disponible del KLog cada vegada que s'iniciï el KLog. &Provide Info for statistics &Proporciona informació per a estadístiques Select to use real time. Seleccioneu-ho per emprar temps real. Select to use UTC time. Seleccioneu-ho per emprar l'hora UTC. Select if you want to save to ADIF on exit. Seleccioneu si voleu desar a l'ADIF en sortir. Complete the current QSO with previous QSO data. Completa el QSO actual amb dades de QSO anteriors. Browse Explora Open File Obre fitxer SetupPageSats &New &Nou &Edit &Edita &Remove &Elimina &Import &Importa E&xport E&xporta Add a new satellite. Afegeix un satèl·lit nou. Edit the selected satellite. Edita el satèl·lit seleccionat. Remove the selected satellite. Elimina el satèl·lit seleccionat. Import a satellites file. It will replace the satellites you have now configured. Importa un fitxers de satèl·lits. Substituirà els satèl·lits que tingueu configurats ara. Export your current satellites to a file. Exporta els satèl·lits actuals a un fitxer. Select the sat you want to open. Seleccioneu el satèl·lit que voleu obrir. KLog KLog Do you really want to remove this satellite? Esteu segur que voleu eliminar aquest satèl·lit? This satellite will not be longer available to be selected ... Aquest satèl·lit ja no estarà disponible per a sigui seleccionable... Sat has not been removed. (#3) No s'ha eliminat el satèl·lit. (#3) Sat has not been removed. (#2) No s'ha eliminat el satèl·lit. (#2) Sat has not been removed. (#1) No s'ha eliminat el satèl·lit. (#1) ID ID Short Curt Name Nom Uplink Pujada Downlink Baixada Modes Modes An error has occurred showing the following error code: Hi ha hagut un error en mostrar el codi d'error següent: KLog - SetupPageSats KLog - Pàgina de configuració de satèl·lits Open Satellites File Obre el fitxer de satèl·lits KLog warning Avís del KLog An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Hi ha hagut un error inesperat en importar les dades dels satèl·lits. Pot ser degut a que el fitxer que esteu intentant importar no té el format correcte. Please check the format or contact the developer for analysis with the error code: Verifiqueu el format o contacteu amb el desenvolupador per a un anàlisi amb el codi d'error: Save Satellites File Desa el fitxer de satèl·lits SetupPageSatsNew Short name Nom curt Sat name Nom del satèl·lit UpLink Pujada DownLink Baixada Modes Modes &Ok D'ac&ord &Cancel &Cancel·la Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Introduïu el nom curt. Intenteu usar el nom curt LoTW per a que pugueu pujar després el QSO a LoTW. Enter the name of the satellite. Introduïu el nom del satèl·lit. Enter the uplink frequencies in this format: 144.300 Introduïu les freqüències de pujada en aquest format: 144.300 Enter the downlink frequencies in this format: 144.300 Introduïu les freqüències de baixada en aquest format: 144.300 Enter the modes in this format: USB Introduïu els modes aquest format: USB Some of the data you have entered is not correct, the satellite can't be added. Diverses dades que heu introduït no són correctes, no s'ha pogut afegir el satèl·lit. SetupPageUDP Start UDP Server Inicia el servidor UDP Log automatically QSOs from WSJT-X Enregistra automàticament els QSO del WSJT-X Allow WSJT-X to send logged QSO to KLog Permet que el WSJT-X enviï QSO enregistrats al KLog KLog will log automatically any QSO coming from WSJT-X without any manual confirmation. El KLog enregistrarà automàticament qualsevol QSO que vingui del WSJT-X sense cap confirmació manual. Receive and Update QSO data to KLog Recepció i actualització de dades QSO al KLog KLog will automatically show and update data coming from WSJT-X (DX callsign, locator, RPT, ...) El KLog mostrarà i actualitzarà automàticament les dades provinents del WSJT-X (indicador DX, localitzador, RPT, ...) QSO notification timeout (milisecs) Temps excedit de la notificació QSO (mil·lisegons) Milliseconds that the notification of QSO received from WSJTX will be shown. Mil·lisegons durant els que es mostrarà la notificació del QSO rebut des del WSJTX. Make sure it is the same port where the other programs are sending the data to. Default port is 2237. Comproveu que sigui el mateix port a on els altres programes envien les dades. El port predeterminat és el 2237. QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected Els QSO enregistrats al WSJT-X s'enviaran al KLog i el KLog preguntarà abans d'enregistrar-los al KLog a menys que se seleccioni «%1» UDP port number where the UDP Server will listen for packets. Número de port UDP a on el servidor UDP escoltarà els paquets. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. El servidor UDP rebrà els QSO enviats des d'altres programes com el WSJT-X, permetent enregistrar-los automàticament al KLog des d'aquests programes. UDP Port Port UDP SetupPageUserDataPage &Personal data Personal data Dades &personals Station &data Station data &Dades de l'estació &Name Name &Nom &Address Address &Adreça Cit&y City Ci&utat &Zip Code Zip Code Codi &postal Pro&v/State Prov/State Pro&v/Estat Countr&y Country Paí&s Enter your information for rig Introduïu la informació de l'equip Enter your information for antenna Introduïu la informació de l'antena Enter your name. Introduïu el vostre nom. Enter your address - 1st line. Introduïu l'adreça - 1a línia. Enter your address - 2nd line. Introduïu l'adreça - 2a línia. Enter your address - 3rd line. Introduïu l'adreça - 3a línia. Enter your address - 4th line. Introduïu l'adreça - 4a línia. Enter your city. Introduïu la ciutat. Enter your zip code. Introduïu el codi postal. Enter your province or state. Introduïu la província o l'estat. Enter your country. Introduïu el país. Enter your power information. Introduïu la informació de potència. &Rig 1 &Equip 1 R&ig 2 E&quip 2 Ri&g 3 Eq&uip 3 Antenna &1 Antena &1 Antenna &2 Antena &2 Antenna &3 Antena &3 Po&wer Po&tència Enter the station callsign that will be used for logging. Introduïu l'indicatiu de l'estació que s'usarà per l'enregistrament. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Introduïu l'indicatiu de la vostra estació. Alternativament, el KLog pot usar un indicatiu aproximat a partir del vostre indicatiu. &QRZ &QRZ &Operators &Operadors &CQ Zone Zona &CQ &ITU Zone Zona &ITU &Locator &Localitzador &Locator (not valid) &Localitzador (no vàlid) Enter the operators (comma separated if more than one). Introduïu els operadors (separats per comes si hi ha més d'un). SetupPageWorldEditor KLog will not be able to show entities information. El KLog no serà capaç de mostra la informació de les entitats. Prefix Prefix Entity Entitat An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. S'ha detectat un fitxer d'informació d'entitats (cty.csv) a la carpeta del KLog i es carregarà. Add Afegeix Delete Suprimeix Edit Edita Export World Exporta el món Import World Importa el món Still not implemented. Encara no està implementat. Import a new cty.csv file Importa un fitxer «cty.csv» nou No entities information file (cty.csv) has been detected in your KLog folder. No s'ha detectat cap fitxer d'informació d'entitats (cty.csv) a la carpeta del KLog. ARRL ID ARRL ID Continent Continent CQ Zone Zona CQ ITU Zone Zona ITU UTC UTC Latitude Latitud Longitude Longitud Deleted Suprimit Since Date Des de la data To Date Fins a la data Open File Obre fitxer BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. S'ha actualitzat la informació de les entitats. Entities information has not been updated. No s'ha actualitzat la informació de les entitats. ShowErrorDialog KLog Message Missatge del KLog SoftwareUpdateDialog Ok D'acord KLog update Actualització del KLog Congratulations! Enhorabona! Your KLog has been updated. S'ha actualitzat el KLog. You already have the latest version. Ja teniu la versió més recent. StartWizard KLog - The free hamradio logging program KLog - El programa lliure d'enregistrament de radioafició Quit Setup Surt de la configuració Setup is not complete yet. Are you sure you want to quit setup? La configuració encara no està completa. Esteu segur que voleu sortir de la configuració? StatisticsWidget QSO per year QSO per any DXCC per year DXCC per any CQ zones per year Zones CQ per any QSO per band QSO per banda QSO per mode QSO per mode QSO per DXCC QSO per DXCC QSO per Continent QSO per continent QSO per hour QSO per hora QSO per month QSO per mes Worked / Confirmed status Estat Treballat / Confirmat Worked / Sent status Estat Treballat / Enviat Sent / Confirmed status Estat Enviat / Confirmat StatsCQZPerYearBarChartWidget CQ Zones per year Zones CQ per any Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura CQ zones Zones CQ CQ zones per year Zones CQ per any Reading data ... S'estan llegint les dades... Years: %1/%2 Anys: %1/%2 StatsEntitiesPerYearBarChartWidget Chart title Títol del gràfic Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura DXCC Entities Entitats DXCC DXCC Entities per year Entitats DXCC per any Reading data ... S'estan llegint les dades... Entities: Entitats: StatsQSOsPerBandBarChartWidget QSOs per band QSO per banda Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Bands Bandes QSO per band distribution QSO per distribució de bandes Reading data ... S'estan llegint les dades... Bands: Bandes: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO per continent Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Continents Continents Reading data ... S'estan llegint les dades... Hours: Hores: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO per DXCC Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Reading data... S'estan llegint les dades... Entity: Entitat: DXCC DXCC Top ten DXCC per QSO Els deu DXCC més importants per QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSO per hora Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Hours Hores QSOs at hour QSO per hora Reading data ... S'estan llegint les dades... Hours: Hores: StatsQSOsPerModeBarChartWidget QSOs per mode QSO per mode Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Modes Modes QSO per mode distribution QSO per distribució de modes Reading data ... S'estan llegint les dades... Modes: Modes: StatsQSOsPerMonthBarChartWidget QSOs per month QSO per mes Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Jan Gen Feb Feb Mar Mar Apr Abr May Mai Jun Jun Jul Jul Sep Set Oct Oct Nov Nov Dec Dec Aug Ago Months Mesos QSOs at Month QSO per mes Reading data ... S'estan llegint les dades... Months: Mesos: StatsQSOsPerYearBarChartWidget Chart title Títol del gràfic Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura QSOs QSO QSOs per year QSO per any Reading data ... S'estan llegint les dades... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Enviat - %1 Confirmed - %2 Confirmat - %2 StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Treballat, no confirmat - %1 Confirmed - %2 Confirmat - %2 StatsWorkedSentPieChartWidget Worked - %1 Treballat - %1 Sent - %2 Enviat - %2 UpdateSatsData Reading Satellites data file... S'estan llegint el fitxer de les dades de satèl·lits... Abort reading Interromp la lectura The Satellites information has been updated. S'ha actualitzat la informació dels satèl·lits. Open File Obre un fitxer Sat Data Dades de satèl·lit World Entity Entitat Continent Continent Abort reading Interromp la lectura Reading cty.csv... S'està llegint el «cty.csv»... eLogClubLog Host not found! No s'ha trobat la màquina! Timeout error! Error de temps excedit! KLog - ClubLog KLog - clublog KLog - ClubLog Undefined error... Error no definit... Callsign missing Manca l'indicatiu Invalid callsign Indicatiu no vàlid Skipping SWL callsign S'omet l'indicatiu SWL Callsign is your own call Callsign is your ow call L'indicatiu és el vostre propi indicatiu Invalid callsign with no DXCC mapping Indicatiu no vàlid sense correspondència amb DXCC Updated QSO QSO actualitzat Invalid ADIF record Enregistrament ADIF no vàlid Missing ADIF record Manca enregistrament ADIF Test mode - parameters ok, no action taken Mode Test - paràmetres correctes, sense acció It seems to be a PASSWORD ERROR; check your password. Sembla que hi ha una ERROR DE CONTRASENYA; comproveu la vostra contrasenya. It seems that your ClubLog password is not correct. Sembla que la vostra contrasenya del ClubLog no és correcta. Please check your password in the setup. ClubLog uploads will be disabled. Si us plau, comproveu la vostra contrasenya a la configuració. Les pujades al ClubLog es desactivaran. Excessive API Usage Ús excessiu de l'API Internal Error Error intern Rejected Rebutjat QSO Duplicate QSO duplicat QSO Modified QSO modificat Missing Login Manca inici de sessió QSO OK QSO OK Upload denied Pujada denegada No callsign selected No s'ha seleccionat cap indicatiu No match found Cap coincidència Dropped QSO QSO eliminat OK D'acord Login rejected S'ha rebutjat l'inici de sessió Rejected: Callsign is your own call Rebutjat: L'indicatiu és el vostre propi indicatiu klog-0.9.8.1/translations/klog_da.ts0000644000175000017500000072364613532572307016325 0ustar develdevel AboutDialog About KLog Om KLog By af KLog is a free logbook for hamradio operators. KLog er en fri logbog for operatører af amatørradio. Please know that this is an BETA release and it may contain many bugs.<br>Backup your data before using this software! Vær opmærksom på, at dette er en BETA-udgivelse og den kan indeholde mange fejl.<br>Lav en sikkerhedskopi af dine data før du bruger dette program! KLog has been fully rewritten from the 0.6.2 to be able to provide a cross-platform application that runs in the main operating systems (Linux, macOS & Windows) and provide new functionalities that KLog was not providing. KLog er blevet skrevet helt om fra version 0.6.2 for ata kunne tilbyde et program for flere platforme, som kan afvikles i de vigtigst operativsystemer (Linux, macOS og Windows) og tilbyde nye funktioner, som KLog ikke tilbød tidligere. Please provide your review in KLog's eHam review page: Giv en anmeldelse i KLogs eHam-anmeldelsesside: Find more information and the latest release at Find yderligere information og den seneste udgivelse på Author Forfatter today i dag Main developer Hovedudvikler KLog is developed by a very small team and you are invited to join! KLog er udviklet af et meget lille hold og du er inviteret! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Hvis KLog ikke er oversat til dit sprog og du ønsker at hjælpe os, så er velkommen til at kontakte os via <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog-udviklernes postliste</a>! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Du kan også hjælpe os ved at sende fejlrapporter eller små kodebidrag, ideer eller andet som kan forbedre KLog. If you want to provide support you are welcome to join the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Hvis du ønsker at tilbyde understøttelse, så er du velkommen via <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog-udviklernes postliste</a>! Authors Forfattere Translators bring KLog into your language. They are really an important part of the KLog development team. Oversættere bringer KLog til dit sprog. De er en vigtig del af KLog-udviklingsholdet. Translators Oversættere Privacy advisory Privatlivsråd KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account user's needs KLog-udviklere har inkluderet en funktion, som rapporterer nogle brugerdata til KLog-serveren med det formål at identificere antallet af installerede versionre, for at fokusere udviklingen i en retning eller en anden alt efter brugernes behov At present, the data that is provided is the following: I øjeblikket omfatter dataene følgende: Callsign Kaldesignal KLog version Klog-version Operating system Operativsystem Be aware that you can enable/disable this feature from the Misc tab in the Setup page Vær opmærksom på at du kan aktivere/deaktivere denne funktion fra fanebladet Diverse på opsætningssiden KLog KLog Privacy Privatliv CTYPage Country data download Overførsel af landedata KLog needs country data... KLog skal bruge landedata ... &Download &Hent &Ignore &Ignorer Country data needed Landedata krævet KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC information. KLog bruger cty.csv-filen fra http://www.country-files.com/ til at hente DXCC-information. You need to download the cty.csv file if you want KLog to show you the countries, locator, ... of the QSOs you do. Du skal hente cty.csv-filen, hvis du ønsker at KLog skal vise dig landene, locator, ... af QSO'erne du bruger. Click on Download to download now. Klik på Hent for at hente nu. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Jeg kan ikke finde værten. Kontroller dit netværk og prøv igen. Ønsker du at prøve igen? DXCCStatusWidget Update Opdater ID Id Entity Entitet Pref: CQ: ITU: Beam: Entity not worked in this band. Entitet fungerede ikke i dette bånd. DXClusterWidget Click on Connect to connect to the DX-Cluster server Klik på Forbind for at forbinde til DX-Cluster-serveren Connect Forbind Clear Ryd Click on connect to connect to the DX-Cluster Klik på forbind for at forbinde til DX-Cluster Trying to connect to the server Forsøger at forbinde til serveren KLog DXCluster KLog DXCluster The host was not found. Please check: Værten blev ikke fundet. Kontroller venligst: - your network connection; - the host name and port settings. - din netværksforbindelse; - værtsnavnet og portindstillinger. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Forbindelsen blev nægtet af modparten. Sikr dig, at DXCluster-serveren kører og kontroller at værtsnavnet og portindstillinger er korrekte. The following error occurred: %1. Den følgende fejl opstod: %1. Connected to server Forbundet med serveren KLog message KLog-besked Enter your callsign to connect to the cluster: Indtast dit kaldesignal for at forbinde til klyngen: Enter your password to connect to the cluster: (Just hit enter for no password) Indtast din adgangskode for at forbinde til klyngen: (Tryk på retur for at undlade adgangskode) Disconnect Afbryd Not logged on, you may need to enter your callsign again. Ikke logget ind, du skal eventuelt indtaste dit kaldesignal igen. Enter here the commands to be sent to the DX-Cluster server. Indtast kommandoerne, der skal sendes til DX-Cluster-serveren, her. Connection closed by the server Forbindelse afbrudt af serveren Click on Connect to connect to the DX-Cluster server. Klik på Forbind for at forbinde til DX-Cluster-serveren. Send Send DataProxy_SQLite Software version in DB is null Programversion i DB er nul No query failed Ingen forespørgsel mislykkedes Aircraft Scatter Common term in hamradio, do not translate if not sure Flystøj Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Baggrundsstøj Earth-Moon-Earth Jorden-månen-jorden Sporadic E Sporadisk E Field Aligned Irregularities Common term in hamradio, do not translate if not sure Feltjusterede uregelmæssigheder F2 Reflection Common term in hamradio, do not translate if not sure F2-reflektion Internet-assisted Internetassisteret Ionoscatter Common term in hamradio, do not translate if not sure Ionostøj Meteor scatter Common term in hamradio, do not translate if not sure Meteorstøj Terrestrial or atmospheric repeater or transponder Terrestrisk eller atmosfærisk repeater eller transponder Rain scatter Common term in hamradio, do not translate if not sure Regnstøj Satellite Satellit Trans-equatorial Common term in hamradio, do not translate if not sure Trans-ækvatoriale Tropospheric ducting Common term in hamradio, do not translate if not sure Troposfærisk kanalisering Yes Ja No Nej Requested Anmodt Ignore/Invalid ignorer/ugyldig Validated Valideret Queued I kø Uploaded Overført Do not upload Overfør ikke Modified Ændret Bureau Common term in hamradio, do not translate if not sure Bureau Direct Direkte Electronic Elektronisk Manager Common term in hamradio, do not translate if not sure Manager KLog DXCC KLog-DXCC All QSOs have been updated with a DXCC and the Continent. Alle QSO'er er blevet opdateret med en DXCC og kontinentet. DownLoadCTY Download of cty.csv failed with the following error code: Overførsel af cty.csv mislykkedes med den følgende fejlkode: Download of cty.csv done. Overførsel af cty.csv udført. There is already a cty.csv file in the folder but it will be replaced with the new one. Der er allerede en cty.csv-fil i mappen, men den vil blive erstattet med den nye. Could not open %1 for writing Kunne ikke åbne %1 for at skrive FileManager The log that you have selected contains more than just one station callsign. Loggen du har valgt indeholder mere end bare et stationskaldesignal. Station Callsign: Stationskaldesignal: Define Station Callsign Definer stationskaldesignal You have selected no callsign. KLog will export QSOs without a station callsign defined and those with the call you are entering here. Du har ikke valgt et kaldesignal. KLog vil eksportere QSO'er uden et stationskaldesignal defineret og dem med kaldet du indtaster her. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Indtast stationskaldesignalet at bruge for denne log eller efterlad den tom for QSO uden stationskaldesignale defineret: Writing ADIF file... Skriver ADIF-fil ... Abort writing Afbryd skrivning Exporting LoTW ADIF file... Eksporterer LoTW ADI-fil ... Writing ADIF file... QSO: Skriver ADIF-fil ... QSO: You have canceled the file export. The file will be removed and no data will be exported. Du har afbrudt fileksporten. Filen vil blive fjernet og ingen data vil blive eksporteret. Do you still want to cancel? Ønsker du stadig at afbryde? Writing Cabrillo file... Skriver Cabrillo-fil ... KLog: Cabrillo Log Export not implemented KLog: Cabrillo-logeksport er ikke implementeret I am sorry but the Cabrillo Export To File feature has still not been implemented. Jeg beklager, men Cabrillo eksport til fil-funktionen er endnu ikke implementeret. Reading LoTW file... Læser LotW-fil ... - The band missing and the following call: - Båndet mangler og det følgende kald: - The call missing but was done at this time: - Kaldet mangler men blev udført på dette tidspunkt: - The mode missing and the following call: - Tilstanden mangler og det følgende kald: - The date missing and the following call: - Datoen mangler og det følgende kald: - The time missing and the following call: - Tidspunktet mangler og det følgende kald: Reading ADIF file... Læser ADIF-fil ... Abort reading Om læsning QSO: QSO: Please select the station callsign you want to export the log from: Vælg venligst stationskaldesignalet du ønsker at eksportere loggen fra: No station callsign has been selected and therefore no log will be exported Intet stationskaldesignal er valgt og derfor vil ingen log blive eksporteret There is more than one log in this logfile. Der er mere end en log i denne logfil. All logs will be imported into the current log. Alle logge vil blive importeret i den nuværende log. Do you want to continue? Ønsker du at fortsætte? Importing ADIF file... Importerer ADIF-fil ... It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Der ser ud til at der er nogle dublette QSO'er i ADIF-filen, du importerer. Ønsker du at fortsætte? (dublette QSO'er vil ikke blive importeret) You have cancelled the file import. The file will be removed and no data will be imported. Du har afbrudt filimporten. Filen vil blive fjernet og ingen data vil blive importeret. This QSO is not including the minimum data to consider a QSO as valid!. Denne QSO inkluderer ikke de minimumsdata der er krævet for at en QSO er gyldig!. Please edit the ADIF file and make sure that it include at least: Rediger din ADI-fil og sikr dig at den som minimum indeholder: and og This QSO had: Denne QSO havde: Do you want to continue with the current file? Ønsker du at fortsætte med den nuværende fil? KLog: Not all required data found! KLog: Ikke alle krævede data blev fundet! This log seems to lack of RST-TX information. Denne log ser ud til at mangle RST-TX-information. Click on Yes to add a default 59 to all QSO with a similar problem. Klik på Ja for at tilføje en standard 59 til alle QSO med et tilsvarende problem. If you select NO, the QSO may not be imported. Hvis du vælger Nej, så bliver QSO'en måske ikke importeret. KLog: No RST TX found! KLog: Ingen RST TX blev fundet! This log seems to lack of RST-RX information. Denne log ser ud til at mangle RST-RX-information. KLog: No RST RX found! KLog: Ingen RST RX fundet! InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Kontinent Prefix Præfiks CQ CQ ITU ITU Short Path Kort sti Long Path Lang sti Deg Deg Miles Mil Km Km IntroPage Welcome to KLog! Velkommen til KLog! Welcome to KLog! - brought to you under the terms of the GPL! Velkommen til Klog! - bragt til dig under betingelserne i GPL'en! Welcome to KLog Velkommen til KLog This looks like it's the first time you've run KLog on this computer. Dette ser ud til, at det er første gang du afvikler KLog på denne computer. KLog is a free hamradio logging program that can run on Linux macOS and Windows. KLog er et frit logningsprogram for amatørradio, som kan afvikles på Linux, macOS and Windows. It is designed to provide general purpose, DX and contest logging. Det er designet til at tilbyde almen, DX- og konkurrencelogning. It supports QSL management, import and export of ADIF Programemt understøtter QSL-håndtering, import og eksport af ADIF and Cabrillo file formats and many other features... samt Cabrillofilformater og mange andre funktioner ... Before you can start using KLog, you will be asked to: Før du kan begynde med KLog vil du blive spurgt om: Acknowledge to the terms of the license. Anerkendelse af betingelserne i licensen. Download the DX entities information. Hente DX-entitetsinformationen. Enter your callsign, CQ zone, etc. and main configuration. Indtast dit kaldesignal, CQ-zone etc. og hovedkonfiguration. Enjoy KLog and contact the development team if you have any suggestions! Nyd KLog og kontakt udviklingsholdet hvis du har nogen forslag! LicPage KLog License information KLog-licensinformation Welcome to KLog!- brought to you under the terms of the GPL! Velkommen til KLog! - bragt til dig under betingelsen i GPL'en! Acknowledge Anerkendelse Be aware that KLog is free software. Vær opmærksom på at KLog er et frit program. LogModel Date Dato Time Tidspunkt QRZ QRZ Band Bånd Mode Tilstand RSTtx RSTtx RSTrx RSTrx Comment Kommentar LogWindow QSL Send QSL send QSL Rcvd QSL modt &Delete &Slet Delete a QSO Slet en QSO &Edit QSO &Rediger QSO Edit this QSO Rediger denne QSO Via &bureau Via &bureau Send this QSL via bureau Send denne QSL via bureau D&irect D&irect Send this QSL via direct Send denne QSL via direct Via bureau Via bureau QSL &received via bureau QSL &modtaget via bureau Direct Direct QSL received via direc&t QSL modtaget via direc&t You have requested to delete this QSO. Du har anmodt om at slette denne QSO. Are you sure? Er du sikker? MainWindow Recalculate Genberegn Starting KLog Starter KLog &Add &Tilføj &Clear &Ryd Status bar... Statuslinje ... DX Entity DX-entitet &Log Window &Logvindue &Score Window &Bedømmelsesvindue Watts Watt MHz MHz KLog Klog Ready Klar An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Der opstod en uventet fejl under tilføjelse af QSO'en til din log. Hvis problemet består, så kontakt udvikleren for fejlsøgning: You have selected an entity: Du har valgt en entitet: that is different from the KLog proposed entity: som er anderledes fra den af KLog foreslåede entitet: Click on the prefix of the correct entity or Cancel to edit the QSO again. Klik på præfikset for den korrekte entitet eller Afbryd for at redigere QSO'en igen. Click on the prefix of the right entity or Cancel to correct. Klik på præfikset på den højre entitet eller Afbryd for at rette. Input Inddata RSTrx RSTrx RSTtx RSTtx QRZ QRZ STX STX SRX SRX NEW MULT NEW MULT Invalid characters used in the QRZ Ugyldige tegn brugt i QRZ'en Ready... Klar ... &File &Fil &New... &Ny ... &Open... &Åbn ... &Import from ADIF... &Importer fra ADIF ... &Save As... &Gem som ... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Eksporter ALLE QSO'erne til en ADIF-fil, sammenføj QSO'erne fra alle loggene. Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before uploading to LoTW! Eksporter en ADIF-fil som skal sendes til LoTW. Husk at underskrive den med TQSL før overførsel til LoTW! &Print Log... &Udskriv log ... KLog folder KLog-mappe E&xit &Afslut &Tools &Værktøjer Fill in QSO data Udfyld QSO-data QSL tools... QSL-værktøjer ... &Find QSO to QSL &Find QSO til QSL Find My-QSLs pending to send Find My-QSL'er under afsendelse Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Viser QSO'erne med afventende forespørgsler for at sende QSL'er. Du bør holde denne kø tom! &Find DX-QSLs pending to receive &Find DX-QSL'er under modtagelse &Find requested pending to receive &Find anmodte under modtagelse Import an ADIF file into the current log. Importer en ADIF-fil ind i den aktuelle log. Export the current log to an ADIF logfile. Eksporter den aktuelle log til en ADIF-logfil. Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a QSL tag printing program). Eksporter alle QSO'er der anmoder om QSL'er til en ADIF-fil (f.eks. for at importere den i et udskrivningsprogram for QSL-mærker). Print your log. Udskriv din log. Opens the data folder of KLog. Åbner datamappen for KLog. Go through the log reusing previous QSOs to fill missing information in other QSOs. Gå igennem loggen der genbruger tidligere QSO'er for at udfylde manglende information i andre QSO'er. Fill in DXCC data Udfyld DXCC-data Go through the log filling QSOs without a DXCC defined. Gå igennem de logudfyldnede QSO'er uden en DXCC defineret. Shows QSOs for which you should send your QSL and request the DX QSL. Viser QSO'er som du bør sende din QSL og forespørge på DX QSL'en. Shows the DX-QSL that has been requested or QSLs has been sent with no answer. Viser den anmodte DX-QSL eller QSL'er sendt uden noget svar. Shows the DX-QSL that has been requested. Viser DX-QSL'en som er blevet forespurgt. LoTW tools... LoTW-værktøjer ... Mark all non sent QSOs in this log as queued to be uploaded. Marker alle ikke sendte QSO'er i denne log som er lagt i kø til overførsel. Queue all QSL to be sent of this log Sæt hele QSL'en i kø til afsendelse for denne log Queue all QSL to be sent Sæt hele QSL'en i kø til afsendelse Mark all non sent QSOs as queued to be uploaded. Marker alle ikke sendte QSO'er som i kø til overførsel. Mark as sent all queued QSO of this log Marker som sendt alle QSO'er i kø for denne log Mark all queued QSOs in this log as sent to LoTW. Marker alle QSO'er i kø i denne log som sendt til LoTW. Mark all queued QSO as sent Marker alle QSO'er i kø som sendt Mark all queued QSOs as sent to LoTW. Marker alle QSO'er i kø som sendt til LoTW. &Update cty.csv &Opdaater cty.csv For updated DX-Entity data, update cty.csv. For opdaterede DX-Entity-data, opdater cty.csv. &Setup &Opsætning &Setup... &Opsætning ... &Help &Hjælp Check updates... Kontroller opdateringer ... &About... &Om ... About Qt... Om Qt ... KLog LoTW KLog-LoTW All pending QSO of this log has been marked as queued for LoTW! Al QSO i kø for denne log er blevet markeret som sat i kø for LoTW! There was a problem to mark all pending QSO of this log as queued for LoTW! Der opstod et problem under markering af al igangværende QSO for denne log som sat i kø for LoTW! All pending QSO has been marked as queued for LoTW! Al igangværende QSO er blevet markeret som sat i kø for LoTW! Please select the station callsign you want to mark as sent to LoTW: Vælg venligst stationskaldesignalet du ønsker at markere som sendt til LoTW: All queued QSO of this log has been marked as sent for LoTW! Al QSO sat i kø for denne log er blevet markeret som sendt for LoTW! There was a problem to mark all queued QSO of this log as sent for LoTW! Der opstod et problem under markering af al QSO sat i kø for denne log som sendt for LoTW! The log that you have selected contains more than just one station callsign. Loggen du har valgt indeholder mere end bare et stationskaldesignal. Export to ADIF... Eksporter til ADIF ... Export all logs to ADIF... Eksporter alle logge til ADIF ... Export Requested QSL to ADIF... Eksporter valgt QSL til ADIF ... Export ADIF for LoTW... Eksporter ADIF for LoTW ... Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. Nu kan du gå til filmenuen for at eksportere LoTW ADIF-filen og overføre den til LoTW. Station Callsign: Stationskaldesignal: Define Station Callsign Definer stationskaldesignal You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the call you are entering here. Du har ikke valgt et kaldesignal. KLog vil markere QSO'er uden et stationskaldesignal defineret og dem med kaldet du indtaster her. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Indtast stationskaldesignalet at bruge for denne log eller efterlad den tom for QSO uden stationskaldesignal defineret: No station callsign has been selected and therefore no log will be marked Intet stationskaldesignal er blevet valgt og derfor vil ingen log blive markeret All queued QSO has been marked as sent to LoTW! Al QSO sat i kø er blevet markeret som sendt til LoTW! There was a problem to mark all queued QSO of this log as sent to LoTW! Der opstod et problem under markering af al QSO sat i kø for denne log som sendt til LoTW! About... Om ... KLog update checking result Kontrolresultat for KLog-opdatering Congratulations! Tillykke! You already have the latest version. Du har allerede den seneste version. Nothing has been saved. You have to select a valid file type. Intet er blevet gemt. Du skal vælge en gyldig filtype. Save File Gem fil ADIF file ADIF-fil Cabrillo files Cabrillofiler Any file Enhver fil You can find the KLog data folder here: Du kan finde KLog-datamappen her: DUPE DUPE start start stop stop It seems that there are no QSO in the database. Der ser ud til, at der ikke er QSO i databasen. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Hvis du er sikker på, at databasen indeholder QSO'er og KLog ikke kan finde dem, så kontakt udviklerne (se Om KLog) for hjælp. TX Frequency in MHz. TX-frekvens i MHz. RX Frequency in MHz. RX-frekvens i MHz. Power used by the DX. Strøm brugt af DX'en. Logging operator's callsign. Logningsoperatørs kaldesignal. Callsign used over the air. Kaldesignal brugt over radioen. My QTH locator. Min QTH-locator. Name of the DX. Navn på DX'en. QTH of the DX. QTH for DX'en. Locator of the DX. Locator for DX'en. QRZ of the QSO. QRZ for QSO'en. Click to recalculate the award status. Klik for at genberegne præmiestatus. Annual Årlig TX RST. TX RST. RX RST. RX RST. TX Exchange. TX Exchange. RX Exchange. RX Exchange. Band of the QSO. Bånd for QSO'en. Mode of the QSO. Tilstand for QSO'en. Date of the QSO. Dato for QSO'en. Time of the QSO. Tidspunkt for QSO'en. Add the QSO to the log. Tilføj QSO'en til loggen. Clear the box. Ryd boksen. The logfile has been modified. Logfilen er blevet ændret. Do you want to save your changes? Ønsker du at gemme dine ændringer? &Update Satellite Data &Updater satellitdata Stats Stat Show the statistics of your radio activity. Vi statistik over din radioaktivitet. UDP Server error The UDP server failed to %1. start or stop UDP-serverfejl UDP-serveren mislykkedes i at %1. Clears the QSO entry. Rydder QSO-elementet. Number of confirmed DXCC entities. Antallet af bekræftede DXCC-entiteter. Number of worked DXCC entities. Antallet af bearbejdede DXCC-entiteter. Number of confirmed WAZ zones. Antallet af bekræftede WAZ-zoner. Number of worked WAZ zones. Antallet af bearbejdede WAZ-zoner. Number of confirmed local references. Antallet af bekræftede lokale referencer. Number of worked local references. Antallet af bearbejdede lokale referencer. Number of confirmed QSOs. Antallet af bekræftede QSO'er. Number of worked QSOs. Antallet af bearbejdede QSO'er. Number of QSOs worked on the selected year. Antallet af QSO'er bearbejdet for det valgte år. Number of DXCC worked on the selected year. Antallet af DXCC bearbejdet for det valgte år. Number of CQ Zones worked on the selected year. Antallet af CQ-zoner bearbejdet for det valgte år. Score for the DXMarathon on the selected year. Bedømmelse for DXMarthonen for det valgte år. Select the year you want to check. Vælg året du ønsker at kontrollere. Status of the DX entity. Status på DX-entitet. Name of the DX entity. Navn på DX-entitet. Name Navn QTH QTK Locator Locator Power(rx) Power(rx) RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Freq TX Freq RX Freq RX QSO QSO QSL QSL eQSL eQSL Comment Kommentar Others Andre My Data Mine data Satellite Satellit QSOs QSO'er DXCC DXCC CQ CQ Score Bedømmelse DX-Marathon DX-Marathon Info Info Award Præmie Confirmed Bekræftet Worked Bearbejdet WAZ WAZ Local Lokal Awards Præmier Search Søg Log Log DX-Cluster DX-Cluster Save ADIF File Gem ADIF-fil LoTW logfile has been properly exported! LoTW-logfil er blevet korrekt eksporteret! Remember to: Husk at: Before uploading: sign the LoTW log; and Før overførsel: underskriv LoTW-loggen; og After uploading: mark as sent all the queued QSO (LoTW Tools). Efter overførsel: marker hele QSO-køen som sendt (LoTW-værktøjer). There was no QSO to be exported. Der var ingen QSO at eksportere. If you think that some QSO should have been exported, please look for them and ensure that the eQSL LoTW QSL sent box is marked as: Hvis du mener at QSO skulle være eksporteret, så kig efter dem og sikr dig at send-bakken for eQSL LoTW QSL'en er markeret som: Q - Queued Q - sat i kø There was an error while exporting the LoTW. The log has not been exported! Der opstod en fejl under eksport af LoTW'en. Loggen er ikke blevet eksporteret! Save Cabrillo File Gem Cabrillofil Filling DXCC in QSOs... QSO: Udfylder DXCC i QSO'er ... QSO: TX Frequency in MHz. Frequency is not in a hamradio band! TX-frekvens i MHz. Frekvens er ikke i et amatørradiobånd! RX Frequency in MHz. Frequency is not in a hamradio band! RX-frekvens i MHz. Frekvens er ikke i et amatørradiobånd! Call Call Freq Frek Time On Tid på Time Off Tid væk RST TX RST TX RST RX RST RX DX-Grid DX-Grid Comments Kommentarer TX Pwr TX Pwr Operator Operatør Local-Grid Lokalt-Net QSO logged from WSJT-X: QSO logget fra WSJT-X: Open File Åbn fil &Modify &Ændr - Needed for DXMarathon - Krævet for DXMarathon Filling QSOs... Udfylder QSO'er ... Abort filling Afbryd udfyldning Number Nummer Date Dato Time Tidspunkt Band Bånd Mode Tilstand Print Log Udskrivningslog Printing the log... Udskriver loggen ... Abort printing Om udskrivning Printing the log... QSO: Udskrivning af loggen ... QSO: KLog QSO received KLog QSO modtog The following QSO data has been received from WSJT-X to be logged: De følgende QSO-data er blevet modtaget fra WSJT-X for at blive logget: Do you want to keep receiving this alerts? (disabling this alerts will prevent that non-valid modes are detected) Ønsker du at fortsætte med at modtage alarmer? (deaktivering af disse alarmer vil forhindre at ikke-gyldige tilstande registreres) If the received mode is correct, please contact KLog development team and request support for that mode Hvis den modtagne tilstand er korrekt, så kontakt venligst KLog-udviklingsholdet og anmod om understøttelse for den tilstand A new mode not supported by KLog has been received from an external software or radio: En ny tilstand ikke understøttet af KLog er blevet modtaget fra et eksternt program eller radio: A duplicated satellite has been detected in the file and will not be imported. En dubletsatellit er blevet registreret i filen og vil ikke blive importeret. Please check the satellite information file and ensure it is properly populated. Kontroller venligst satellitinformationsfilen og sikr dig at den er korrekt udfyldt. Now you will see a more detailed error that can be used for debugging... Nu vil du se en mere detaljeret fejl, som kan bruges til fejlsøgning ... An unexpected error ocurred!! Der opstod en uventet fejl! If the problem persists, please contact the developers Hvis problemet består, så kontakt udviklerne for analysis: for analyse: Error in function Fejl i funktion Error code Fejlkode Error text Fejltekst Failed query Mislykket forespørgsel Recomendation: Anbefaling: Export, periodically, your data to ADIF to prevent a potential data loss. Eksporter, periodisk, dine data til ADIF for at forhindre et potentielt datatab. Do you want to keep showing errors? Ønsker du fortsat at vise fejl? MainWindowInputComment Add a comment for this QSO. Tilføj en kommentar for denne QSO. MainWindowInputEQSL Date of the ClubLog upload. Dato for ClubLog-overførslen. Date of the eQSL sending. Dato for eQSL-afsendelsen. Date of the eQSL reception. Dato for eQSL-modtagelsen. Date of the LoTW sending. Dato for LoTW-afsendelsen. Date of the LoTW reception. Dato for LoTW-modtagelsen. Status of the LoTW sending. Status for LoTW-afsendelsen. Status of the LoTW reception. Status for LoTW-modtagelsen. LoTW Sent LoTW sendt LoTW Rec LoTW modt Status on ClubLog. Status for ClubLog. Status of the eQSL sending. Status for eQSL-afsendelsen. Status of the eQSL reception. Status for eQSL-modtagelsen. ClubLog ClubLog eQSL Sent eQSL sendt eQSL Rec eQSL modt MainWindowInputOthers Primary Div Primær div Secondary Div Sekundær div IOTA IOTA Entity Entitet Propagation mode Propagationtilstand Select the primary division for this QSO. ælg den primære division for denne QSO. Select the secondary division for this QSO. Vælg den sekundære division for denne QSO. Select the entity for this QSO. Vælg identiteten for denne QSO. Select the propagation mode for this QSO. Vælg propagatonstilstand for denne QSO. Select the IOTA continent for this QSO. Vælg IOTA-kontinentet for denne QSO. Select the IOTA reference number for this QSO. Vælg IOTA-referencenummeret for denne QSO. Not Identified Ikke Identificeret Not - Not Identified Ikke - ikke identificeret MainWindowInputQSL QSL Sent QSL sendt QSL Rec QSL modt QSL Via QSL via QSL Msg QSL bskd Status of the QSL sending. Status for QSL-afsendelsen. Status of the QSL reception. Status for QSL-modtagelsen. QSL sending information. QSL-afsendelsesinformation. QSL reception information. QSL-modtagelsesinformation. Date of the QSL sending. Dato for QSL-afsendelsen. Date of the QSL reception. Dato for QSL-modtagelsen. Message of the QSL. Besked for QSL'en. QSL via information. QSL via information. MainWindowMyDataTab Watt Watt Keep this data Behold disse data Data entered in this tab will be copied into the next QSO. Data indtastet i dette faneblad vil blive kopieret til den næste QSO. Power used for the QSO in watts. Strøm brugt for QSO'en i watt. Logging operator's callsign. Logningsoperatørs kaldesignal. Callsign used over the air. Kaldesignal brugt over radioen. My QTH locator. Min QTH-locator. Power Strøm Operator Operatør Station Callsign Stationkaldesignal My Locator Min locator MainWindowSatTab Keep this data Behold disse data Other - Sat not in the list Andre - sat er ikke i listen Data entered in this tab will be copied into the next QSO. Data indtastet i dette faneblad vil blive kopieret ind i den næste QSO. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Navn på satellitten hvis ikke i listen. Vælg: »%1« for at aktivere denne boks. Satellite mode used. Satellittilstand anvendt. Select the satellite you are using. Vælg satelitten du bruger. UpLink band. UpLink-bånd. DownLink band. DownLink-bånd. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Lokalisering af DX-stationen. Denne boks er synkroniseret med lokaliseringsboksen i QSO-fanebladet. UpLink UpLink DownLink DownLink Satellite Satellit Mode Tilstand DX Locator DX-lokalisering Other Andet MHz MHz Not Sat QSO Ikke sat QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog har registreret et satellitnavn, som det ikke genkender. Hvis det skal bruge et af navnene på kendte satellitter i stedet for, vælg det fra listen. Alternativt så kontakt udviklingsholdet for at tilføje det nye satellitnavn. The satellite you have in your QSO is: Satellitten du har i din QSO er: Please know that the satellite name will not be saved if it is not in the list so that information may be lost! Husk at satellitnavnet ikke vil blive gemt, hvis det ikke er i listen, så den information kan gå tabt! QObject New One, work it! Ny, bearbejd den! Needed, work it! Krævet, bearbejd den! Worked but not confirmed Bearbejdet men ikke bekræftet Confirmed Bekræftet Not identified Ikke identficeret Database Error Databasefejl KLog DB needs to be upgraded. KLog-databasen skal opgraderes. Do you want to upgrade it now? Ønsker du at opgradere den nu? If DB is not upgraded KLog may not work properly. Hvis databasen ikke bliver opgraderet så fungerer KLog måske ikke korrekt. KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog har registreret en tidligere log i databasen. Alle data vil blive migreret til en ny DX-typelog. KLog: Enter Station callsign KLog: Indtast stationskaldesignal Enter the station callsign used in this log Indtast stationskaldesignalet brugt i denne log Station Callsign Stationskaldesignal All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is OK. Alle dataene blev migreret korrekt. Du skal nu gå til Opsætning->Præferencer->Logge for at kontrollere at alt er o.k. Updating mode information... Opdaterer tilstandsinformation ... Abort updating Afbryd opdatering QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Afbrydelse af denne opdatering vil medføre datauoverensstemmelser og muligvis datatab. Ønsker du stadig at afbryde? Updating bands information... Opdaterer båndinformation ... Updating bands information in %1 status... Opdaterer båndinformation i %1 status ... Progress: Status: Updating mode information in %1 status... Opdaterer tilstandsinformation i %1 status ... Updating DXCC award information... Opdaterer DXCC-præmieinformation ... Updating DXCC Award information... Opdaterer DXCC-præmieinformation ... Updating WAZ award information... Opdaterer WAZ-præmieinformation ... Updating WAZ Award information... Opdaterer WAZ Award-information ... Install wizard was canceled before completing... Installationsguide blev afbrudt før fuldførelse ... Do you want to remove the KLog dir from your disk? Ønsker du at fjerne KLog-mappen fra din disk? Your KLog dir has been removed Din KLog-mappe er blevet fjernet Thank you for running KLog! Tak fordi du bruger KLog! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Jeg kunne ikke fjerne din KLog-mappe. Du bør gøre det manuelt, hvis du ønsker at den fjernes fra din harddisk. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Din KLog-mappe kan ikke fjernes. Du skal gøre det manuelt, hvis du ønsker den fjernet fra din harddisk. Remember that your KLog dir is on your system... Husk at din KLog-mappe er på dit system ... Updating DXCC and Continent information... Opdaterer DSCC- og kontinentinformation ... SearchWidget &Clear &Ryd &Export Highlighted &Eksporter markering &Select All &Vælg alle &Search &Søg All Alle Clear the searches. Ryd søgninger. Export the search result to an ADIF file. Eksporter søgeresutlatet til en ADIF-fil. Select/Unselect all the QSOs shown. Vælg/fravælg alle viste QSO'ere. Search in the log. Søg i loggen. Search in all logs. Søg i alle logge. Enter the QRZ to search for. Indtast QRZ'en at søge efter. Search results. Søgeresultater. QRZ QRZ Date/Time Dato/tid Band Bånd Mode Tilstand QSL Sent QSL sendt QSL Rcvd QSL modt Station Callsign Stationskaldesignal ID Id &Clear selection &Ryd markering Save File Gem fil QSL Send QSL send &Delete &Slet Delete a QSO Slet en QSO &Edit QSO &Rediger QSO Edit this QSO Rediger denne QSO Via &bureau Via &bureau Send this QSL via bureau Send denne QSL via bureau D&irect D&irect Send this QSL via direct Send denne QSL via direct &Request my QSL &Anmod om min QSL Mark my QSL as requested Marker min QSL som anmodt om Via Direct && mark DX QSL as requested Via Direct && marker DX QSL som anmodt om Send this QSL via direct & mark DX QSL as requested Send denne QSL viar direct & marker DX QSL som anmodt om Via Bureau && mark DX QSL as requested Via Bureau && marker DX QSL som anmodt om Send this QSL via bureau & mark DX QSL as requested Send denne QSL via bureau & marker DX QSL som anmodt om &Request the QSL &Anmod om QSL'en Mark the QSL as requested Marker QSL'en som anmodt om Via bureau && mark my QSL as requested Via bureau && marker min QSL som anmodt om QSL received via bureau & mark my QSL as requested QSL modtaget via bureau & marker min QSL som anmodt om Via bureau Via bureau QSL received via bureau QSL modtaget via bureau Direc&t && mark as my QSL requested Direc&t && marker som min anmodte QSL QSL received via direct & mark my QSL as requested QSL modtaget via direct & marker min QSL som anmodt om Direc&t Direc&t QSL received via direct QSL modtaget via direct You have requested to delete the QSO with: %1 Du har anmodt om at slette QSO'en med: %1 Are you sure? Er du sikker? Needed QSO to send the QSL Krævet QSO til at sende QSL'en My QSL requested to be sent Min QSL anmodt om at blive sendt DX QSL pending to be received DX QSL igangværende til modtagelse SetupDialog My Data Mine data Bands/Modes Bånd/tilstande DX-Cluster DX-Cluster Colors Farver Misc Diverse World Editor Verdensredigeringsprogram Logs Logge Satellites Sattelitter ClubLog ClubLog Cancel Afbryd HamLib HamLib OK O.k. Config Dialog Konfigurationsdialog User data Brugerdata D&X-Cluster D&X-Cluster WSJT-X WSJT-X You need to enter at least one log in the Logs tab. Du skal indtaste mindst en log i fanebladet for logge. World Verden DB has not been moved to new path Databasen er ikke flyttet til ny sti Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Gå til diversefanebladet og klik på flyt db ellers vil databasen ikke blive flyttet til den nye placering. Go to the User tab and enter valid QRZ. Gå til brugerfanebladet og indtast gyldig QRZ. You need to enter at least a valid QRZ. Du skal indtaste mindst en gyldig QRZ. You have not selected the kind of log you want. Du har valgt den slags log du ønsker. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Du vil blive dirigeret til log-fanebladet. Tilføj og vælg den slags log du ønsker at bruge. SetupEntityDialog Entity Entitet CQ CQ ITU ITU Latitude Breddegrad Longitude Længdegrad UTC UTC Main prefix Hovedpræfiks ARRL ID ARRL ID Prefixes Præfiks Comma separated possible prefixes, e.g. EA1, EA2, ... Kommaadskilt mulige præfiks, f.eks. EA1, EA2, ... Name of the Entity. Navn på element. CQ zone. CQ-zone. ITU zone. ITU-zone. Longitude of the Entity. Længdegrad for entitet. Local time difference to UTC. Lokal forskel i tid til UTC. Main prefix of the entity. Hovedpræfiks for entitet. ARRL ID. ARRL-Id. Date of the deletion. Sletningsdato. Deleted Slettet Cancel Afbryd OK O.k. Entity Dialog Entitetdialog SetupPageBandMode Bands Bånd Modes Tilstande SetupPageClubLog &Callsign &Kaldesignal ClubLog &password ClubLog-&adgangskode ClubLog &email ClubLog-&e-post Enter the email you used to register in ClubLog. Indtast e-posten du ønsker at registrere i ClubLog. Enter the callsign you used to register in ClubLog. Indtast kaldesignalet du ønsker at registrere i ClubLog. Enter your password in ClubLog. Indtast din adgangskode i ClubLog. &Send QSOs in real time &Send QSO'er i realtid &Activate ClubLog &Aktiver ClubLog Use QSO Station &Callsign Brug QSO-stations&kaldesignal Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Send hver QSO til ClubLog i realtid, efterhånden som de tilføjes (eller ændres) i KLog. Starts the ClubLog support in KLog. Starter ClubLog-understøttelse i KLog. Use the Station Callsign defined in each QSO instead of the one defined here. Brug stationskaldenavnet defineret i hver QSO i stedet for det defineret her. SetupPageColors New One Ny Needed in this band Krævet i dette bånd Worked in this band Bearbejdet i dette bånd Confirmed in this band Bekræftet i dette bånd Default Standard Choose a color Vælg en farve SetupPageDxCluster Add Tilføj Delete Slet Show &HF spots Vis %HF-spot Show V/&UHF spots Vis V/&UHF-spot Show W&ARC spots Vis W&ARC-spot Show &worked spots Vis &bearbejdede spot Show &confirmed spots Vis &bekræftede spot Show ANN/&FULL messages Vis ANN/&FULL-beskeder Show WW&V messages Vis WW&V-beskeder Show WC&Y messages Vis WC&Y-beskeder DX Spots DX-spot Messages Beskeder KLog: Add a DXCluster server Klog: Tilføj en DXCluster-server Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Tilføj adressen fulgt af :port Eksempel: dxfun.com:8000 Hvis ingen port er angivet, så vil 41112 blive brugt som standard: SetupPageHamLib Activate HamLib Aktiver HamLib Activates the hamlib support that will enable the connection to a radio. Aktiverer understøttelse af hamlib, der vil aktivere forbindelsen til en radio. RTS on RTS aktiveret Setting RTS may be needed for some serial ports. Angivelse af RTS kan være krævet for nogle serielle porte. DTR on DTR aktiveret Setting DTR may be needed for some serial ports. Angivelse af DTR kan være krævet for nogle serielle porte. Radio Radio Select your rig. Vælg din rig. Defines the interval to pool the radio in msecs. Definerer intervallet at samle radioen i msek. Pool interval Indsamlingsinterval Port Port Select the serial port. Only the serial ports that are detected are shown. Vælg den serielel port. Kun den serielle porter, der er registreret vises. Scan Skan Click to identify the serial ports available in your computer. Klik for at identificere de serielle porte tilgængelige i din computer. Bauds Bauds Select the serial port speed. Vælg den serielle porthastighed. 5 bits 5-bit 6 bits 6-bit 7 bits 7-bit 8 bits 8-bit Data bits Databit Select the serial data bits. Vælg den serielle databit. None Ingen Hardware Udstyr Software XON/XOFF Software XON/XOFF Flow control Flow-kontrol Select the serial flow control Vælg den serielle flow-kontrol No parity Ingen paritet Even Lige Odd Ulige Space Mellemrum Mark Mærke Parity Paritet Select the serial parity. Vælg den serielle paritet. 1 bit 1 bit 1.5 bits 1,5 bit 2 bits 2 bit Stop bits Stop-bit Select the serial stop bits. Vælg den serielle stop-bit. SetupPageLogs &New &Ny &Edit &Rediger &Remove &Fjern Add a new log. Tilføj en ny log. Edit the selected log. Rediger den valgte log. Remove the selected log. Fjern den valgte log. Select the log you want to open. Vælg loggen du ønsker at åbne. KLog KLog Do you really want to remove this log? Ønsker du at fjerne denne log? All the QSOs from this log will be also deleted... Alle QSO'erne fra denne log vil også blive slettet ... Log has not been removed. (#3) Log er ikke blevet fjernet. (#3) Log has not been removed. (#2) Log er ikke blevet fjernet. (#2) Log has not been removed. (#1) Log er ikke blevet fjernet. (#1) ID Id Date Dato Station Callsign Stationskaldesignal Operators Operatører Comments Kommentarer Type Type An error has occurred showing the following error code: Der opstod en fejl med denne fejlkode: KLog - SetupPageLogs KLog - SetupPageLogs SetupPageLogsNew &Date &Dato &Station Callsign &Stationskaldesignal &Operators &Operatører Comm&ent &Kommentar &Ok &O.k. &Cancel &Afbryd Select categories Vælg kategorier Callsign used for this log. Kaldesignal brugt for denne log. Comma separated list of operators: callsign1, callsign2. Kommaadskilt liste over operatører: kaldesignal1, kaldesignal2. Start date of this log. Startdato for denne log. Add a comment about this log. Tilføj en kommentar om denne log. Select the kind of operation for this log. Vælg operationstypen for denne log. Select the mode category. Vælg tilstandskategori. Select the operators category. Vælg operatørens kategori. Select the assisted category. Vælg den assisterede kategori. Select the power category. Vælg strømkategorien. Select the bands category. Vælg båndkategorien. Select the Overlay category. Vælg overlagskategorien. &Type of Operation &Operatonstype &Mode Category &Tilstandskategori O&perators Category &Operatørkategori &Assisted Category &Bistået kategori Po&wer Category &Strømkategori &Bands Category &Båndkategori O&verlay &Overlag Categories not OK Kategorier er ikke o.k. You need to enter a valid QRZ in the Station Callsign box. The log will not be opened. Du skal indtaste en gyldig QRZ i boksen for stationskaldesignal. Loggen vil ikke blive åbnet. You selected an invalid combination. The log will not be opened. Du valgte en ugyldig kombination. Loggen vil ikke blive åbnet. Categories OK Kategorier o.k. SetupPageMisc &Imperial system &Imperial-system &Log in real time &Log i realtid &Time in UTC &Tid i UTC &Save ADIF on exit &Gem ADIF ved afslut Use this &default filename Brug dette &filnavn som standard Mark &QSO to send QSL when QSL is received Marker &QSO til at sende QSL når OSL er modtaget Complete QSO with previous data Fuldfør QSO med tidligere data Show the Station &Callsign used in the search box Vis stations&kaldesignal brugt i søgeboksen &Reset to My Data for all QSOs &Nulstil til Mine data for alle QSO'er &Check for new versions automatically &Kontroller for nye versioner automatisk &Provide Info for statistics &Tilbyd information for statistik Manage DX-Marathon Håndter DX-Maraton Browse Gennemse Move DB Flyt database QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO'er vil blive markeret som afventende på at sende en QSL hvis du modtager DX QSL'en og ikke har sendt dine. The search box will show also the callsign on the air to do the QSO. Søgeboksen vil også vise kaldesignalet på radioen til at udføre QSO'en. All the data from the My Data tab will be used or data from the previous QSO will be maintained. Alle dataene fra fanebladet Mine data vil blive brugt eller data fra den forrige QSO vil blive vedligeholdt. Check if there is a new release of KLog available every time you start KLog. Kontroller om der er en ny version af KLog tilgængelig hver gang du starter KLog. If new version checking is selected, KLog will send the developer your callsign, KLog version & Operating system to help in improving KLog. Hvis kontrol af ny version er valgt så vil KLog sende udvikleren dit kaldesignal, KLog-version og operativsystem for at hjælpe med at forbedre KLog. Check it for Imperial system (Miles instead of Kilometers). Kontroller for Imperial-system (mil i stedet for kilometer). Select to use real time. Vælg at bruge realtid. Select to use UTC time. Vælg at bruge UTC-tidspunkter. Select if you want to save to ADIF on exit. Vælg hvis du ønsker at gemme til ADIF ved afslut. Select to use the following name for the logfile without being asked for it again. Vælg at bruge det følgende navn for logfilen uden at blive spurgt om det igen. Complete the current QSO with previous QSO data. Fuldfør den nuværende QSO med tidligere QSO-data. Select if you want to manage DX-Marathon. Vælg om du ønsker at håndtere DX-Marathon. This is the default file where ADIF data will be saved. Dette er standardfilen hvor ADIF-data vil blive gemt. This is the directory where the database (logbook.dat) will be saved. Dette er mappen hvor databsen (logbook.dat) vil blive gemt. Click to change the default ADIF file. Klik for at ændre ADIF-standardfilen. Click to change the path of the database. Klik for at ændre stien for databasen. Click to move the DB to the new directory. Klik for at flytte databasen til den nye mappe. Open File Åbn fil Select Directory Vælg mappe This is the directory where DB (logbook.dat) will be saved. Dette er mappen hvor DB (logbook.dat) vil blive gemt. Please specify an existing directory where the database (logbook.dat) will be saved. Angiv en eksisterende mappe hvor databasen (logbook.dat) vil blive gemt. File moved Fil flyttet File copied Fil kopieret File NOT copied Filen blev IKKE kopieret The target directory does not exist. Please select an existing directory. Målmappen findes ikke. Vælg venligst en eksisterende mappe. SetupPageSats &New &Ny &Edit &Rediger &Remove &Fjern &Import &Import E&xport &Eksport Add a new satellite. Tilføj en ny satellit. Edit the selected satellite. Rediger den valgte satellit. Remove the selected satellite. Fjern den valgte satellit. Import a satellites file. It will replace the satellites you have now configured. Importer en satellitfil. Den vil erstatte de satellitter du har konfigureret. Export your current satellites to a file. Eksporter dine nuværende satellitter til en fil. Select the sat you want to open. Vælg satellitten du ønsker at åbne. KLog KLog Do you really want to remove this satellite? Ønsker du virkelig at fjerne denne satellit? This satellite will not be longer available to be selected ... Denne satellit vil ikke længere være tilgængelig ... Sat has not been removed. (#3) Sat. er ikke blevet fjernet. (#3) Sat has not been removed. (#2) Sat. er ikke blevet fjernet. (#2) Sat has not been removed. (#1) Sat. er ikke blevet fjernet. (#1) ID Id Short Kort Name Navn Uplink Uplink Downlink Downlink Modes Tilstande An error has occurred showing the following error code: Der opstod en fejl der viser den følgende fejlkode: KLog - SetupPageSats Klog - SetupPageSats Open Satellites File Åbn satellitfil KLog warning KLog-advarsel An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Der opstod en uventet fejl under import af satellitdata. Det kan være fordi, at filen du forsøger at imporetere ikke har det korrekte format. Please check the format or contact the developer for analysis with the error code: Kontroller venligst formatet eller kontakt udvikleren for analyse med fejlkoden: Save Satellites File Gem satellitfil SetupPageSatsNew Short name Kort navn Sat name Sat.-navn UpLink UpLink DownLink DownLink Modes Tilstande &Ok &O.k. &Cancel &Afbryd Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Indtast det korte navn. Prøv at bruge LoTW-kort navn, så du kan overføre din QSo til LoTW efterfølgende. Enter the name of the satellite. Indtast navnet på satellitten. Enter the uplink frequencies in this format: 144.300 Indtast uplink-frekvenser i dette format: 144.300 Enter the downlink frequencies in this format: 144.300 Indtast downlink-frekvenser i dette format: 144.300 Enter the modes in this format: USB Indtast tilstandene i dette format: USB Some of the data you have entered is not correct, the satellite can't be added. Nogle af dataene du har indtastet er ikke korrekte, satellitten kan ikke tilføjes. SetupPageUDP Start UDP Server Start UDP-server Log automatically QSOs from WSJT-X Log automatisk QSO'er fra WSJT-X Allow WSJT-X to send logged QSO to KLog Tillad at WSJT-X sender logget QSO til KLog QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected QSO logget i WSJT-X vil blive sendt til KLog og KLog vil spørge før der logges ind i KLog med mindre »%1« er valgt QSO notification timeout (milisecs) QSO-påmindelsestidsudløb (milliesek.) Milliseconds that the notification of QSO received from WSJTX will be shown. Millisekunder som påmindelsen for QSO modtog fra WSJTX vil blive vist. KLog will log automatically any QSO coming from WSJT-X without any manual confirmation. KLog vil automatisk logge enhver QSO fra WSJT-X uden nogen manuel bekræftelse. Receive and Update QSO data to KLog Modtag og opdater QSO-data til KLog KLog will automatically show and update data coming from WSJT-X (DX callsign, locator, RPT, ...) KLog vil automatisk vise og opdatere data fra WSJT-X (DX-kaldesignal, lokalisering, RPT, ...) Make sure it is the same port where the other programs are sending the data to. Default port is 2237. Sikr dig det er den samme port hvor de andre programmer sender dataene til Standardporten er 2237. UDP port number where the UDP Server will listen for packets. UDP-portnummer hvor UDP-serveren vil lytte efter pakker. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP-server vil modtage QSO'er sendt fra andre programmer såsom WSJT-X hvilket gør, at du kan logge ind i KLog automatisk fra disse programmer. UDP Port UDP-port SetupPageUserDataPage &Personal data &Personlige data Station &data Stations&data Enter your name. Indtast dit navn. Enter your address - 1st line. Indtast din adresse - 1. linje. Enter your address - 2nd line. Indtast din adresse - 2. linje. Enter your address - 3rd line. Indtast din adresse - 3. linje. Enter your address - 4th line. Indtast din adresse - 4. linje. Enter your city. Indtast din by. Enter your zip code. Indtast din zip-kode. Enter your province or state. Indtast din provins eller stat. Enter your country. Indtast dit land. &Name &Navn &Address &Adresse Cit&y &By &Zip Code &Zip-kode Pro&v/State &Prov/stat Countr&y &Land Enter your information for rig Indtast din information for rig Enter your information for antenna Indtast din information for antenne Enter your power information. Indtast din strøminformation. Enter the station callsign that will be used for logging. Indtast stationskaldesignalet som vil blive brugt til logning. &Rig 1 &Rig 1 R&ig 2 R&ig 2 Ri&g 3 Ri&g 3 Antenna &1 Antenne &1 Antenna &2 Antenne &2 Antenna &3 Antenne &3 Po&wer &Strøm Enter the operators (comma separated if more than one). Indtast operatørerne (kommaadskilt hvis mere end en). Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Indtast locatoren for din station. Alternativt kan KLog bruge en omtrentlig loacator baseret på dit kaldesignal. &QRZ &QRZ &Operators &Operatører &CQ Zone &CQ-zone &ITU Zone &ITU-zone &Locator &Locator &Locator (not valid) &Locator (ikke gyldig) SetupPageWorldEditor Add Tilføj Delete Slet Edit Rediger Export World Eksportverden Import World Importverden Still not implemented. Endnu ikke implementeret. Import a new cty.csv file Importer en ny cty.csv-fil An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. En entitetsinformationsfil (cty.csv) er blevet registreret i din KLog-mappe og vil blive indlæst. No entities information file (cty.csv) has been detected in your KLog folder. Ingen entitetinformationsfil (cty.csv) er blevet registreret i din KLog-mappe. KLog will not be able to show entities information. KLog vil ikke kunne vise entitetinformation. Prefix Præfiks Entity Entitet ARRL ID ARRL-id Continent Kontinent CQ Zone CQ-zone ITU Zone ITU-zone UTC UTC Latitude Breddegrad Longitude Længdegrad Deleted Slettet Since Date Siden dato To Date Til dato Open File Åbn fil BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Entitetinformation er blevet opdateret. Entities information has not been updated. Entitetinformatoin er ikke blevet opdateret. ShowErrorDialog KLog Message KLog-besked SoftwareUpdateDialog Ok O.k. KLog update KLog-opdatering Congratulations! Tillykke! Your KLog has been updated. Din KLog er blevet opdateret. You already have the latest version. Du har allerede den seneste version. StartWizard KLog - The free hamradio logging program KLog - Det frie logningsprogram for amatørradio Quit Setup Afslut opsætning Setup is not complete yet. Are you sure you want to quit setup? Opsætning er ikke færdig endnu. Er du sikker på, at du ønsker at afslutte opsætningen? StatisticsWidget QSO per year QSO per år DXCC per year DXCC per år CQ zones per year CQ-zoner per år QSO per band QSO per bånd QSO per mode QSO per tilstand QSO per DXCC QSO per DXCC QSO per Continent QSO per kontinent QSO per hour QSO per time QSO per month QSO per måned Worked / Confirmed status Bearbejdet / bekræftet status Worked / Sent status Bearbejdet / sendt-status Sent / Confirmed status Sendt / Bekræftet status StatsCQZPerYearBarChartWidget CQ Zones per year CQ-zoner per år Reading data ... Læser data ... Abort reading Afbryd læsning CQ zones CQ-zoner CQ zones per year CQ-zoner per år Reading data ... Læser data ... Years: %1/%2 År: %1/%2 StatsEntitiesPerYearBarChartWidget Chart title Diagramtitel Reading data ... Læser data ... Abort reading Afbryd læsning DXCC Entities DXCC-elementer DXCC Entities per year DXCC-elementer per år Reading data ... Læser data ... Entities: Elementer: StatsQSOsPerBandBarChartWidget QSOs per band QSO'er per bånd Reading data ... Læser data ... Abort reading Afbryd læsning Bands Bånd QSO per band distribution QSO per bånddistribution Reading data ... Læser data ... Bands: Bånd: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO'er per kontinent Reading data ... Læser data ... Abort reading Afbryd læsning Continents Kontinenter Reading data ... Læser data ... Hours: Timer: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO'er per DSCC Reading data ... Læser data ... Abort reading Afbryd læsning Reading data... Læser data ... Entity: Element: DXCC DXCC Top ten DXCC per QSO Top ti DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSO'er per time Reading data ... Læser data ... Abort reading Afbryd læsning Hours Timer QSOs at hour QSO'er per time Reading data ... Læser data ... Hours: Timer: StatsQSOsPerModeBarChartWidget QSOs per mode QSO'er til tilstand Reading data ... Læser data ... Abort reading Afbryd læsning Modes Tilstande QSO per mode distribution QSO per tilstandsdistribution Reading data ... Læser data ... Modes: Tilstande: StatsQSOsPerMonthBarChartWidget QSOs per month QSO'er per måned Reading data ... Læser data ... Abort reading Afbryd læsning Jan Jan Feb Feb Mar Mar Apr Apr May Maj Jun Jun Jul Jul Sep Sep Oct Okt Nov Nov Dec Dec Aug Aug Months Måneder QSOs at Month QSO'er per måned Reading data ... Læser data ... Months: Måneder: StatsQSOsPerYearBarChartWidget Chart title Diagramtitel Reading data ... Læser data ... Abort reading Afbryd læsning QSOs QSO'er QSOs per year QSO'er per år Reading data ... Læser data ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Sendt - %1 Confirmed - %2 Bekræftet - %2 StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Bearbejdet, ikke bekræftet - %1 Confirmed - %2 Bekræftet - %2 StatsWorkedSentPieChartWidget Worked - %1 Bearbejdet - %1 Sent - %2 Sendt - %2 UpdateSatsData Reading Satellites data file... Læser satellitdatafil ... Abort reading Om læsning The Satellites information has been updated. Satellitinformationen er blevet opdateret. Open File Åbn fil Sat Data Sat-data World Entity Entitet Continent Kontinent Reading cty.csv... Læser cty.csv ... Abort reading Afbryd læsning eLogClubLog Host not found! Vært blev ikke fundet! Timeout error! Tidsudløbsfejl! It seems to be a PASSWORD ERROR; check your password. Det ligner en ADGANGSKODEFEJL; kontroller din adgangskode. KLog - ClubLog KLog - ClubLog It seems that your ClubLog password is not correct. Det ser ud til, at din ClubLog-adgangskode ikke er korrket. Please check your password in the setup. ClubLog uploads will be disabled. Kontroller venligst din adgangskode i opsætnignen. ClubLog-overførsler vil være deaktiveret. Undefined error... Fejl er ikke defineret ... Callsign missing Kaldesignal mangler Invalid callsign Ugyldig kaldesignal Skipping SWL callsign Udelader SWL-kaldesignal Callsign is your own call Kaldesignal er dit eget kald Invalid callsign with no DXCC mapping Ugyldigt kaldesignal uden DXCC-oversættelse Updated QSO Opdateret QSO Invalid ADIF record Ugyldig ADIF-post Missing ADIF record Manglende ADIF-post Test mode - parameters ok, no action taken Testtilstand - parametre o.k., ingen handling taget Excessive API Usage Overdreven API-forbrug Internal Error Intern fejl Rejected Afvist QSO Duplicate QSO dublet QSO Modified QSO ændret Missing Login Manglende logind QSO OK QSO OK Upload denied Overførsel afvist No callsign selected Inter kaldesignal valgt No match found Intet match fundet Dropped QSO Droppet QSO OK O.k. Login rejected Logind afvist Rejected: Callsign is your own call Afvist: Kaldesignal er dit eget kald klog-0.9.8.1/translations/klog_es.ts0000644000175000017500000074511313532572307016341 0ustar develdevel AboutDialog About KLog Acerca de KLog Authors Autores By Por Please know that this is an BETA release and it may contain many bugs.<br>Backup your data before using this software! Por favor, tenga en cuenta que esta es una versión BETA que puede tener muchos errores.<br>¡Haga copia de seguridad de sus datos antesde usar este programa! Author Autor KLog has been fully rewritten from the 0.6.2 to be able to provide a cross-platform application that runs in the main operating systems (Linux, macOS & Windows) and provide new functionalities that KLog was not providing. KLog fue reescrito completamente en su versión 0.6.2 para hacerlo multiplataforma de forma que pudiera ejecutarse en los sistemas operativos principales (Linux, macOS & Windows) y proveer funcionalidades nuevas que aun no se proveían. KLog is a free logbook for hamradio operators. KLog es un software libre de log para radioaficionados. Please provide your review in KLog's eHam review page: Por favor, escriba su crítica en la página de críticas de eHam: Find more information and the latest release at Más información y la última versión en today hoy Main developer Desarrollador principal KLog is developed by a very small team and you are invited to join! ¡KLog está desarrollado por un equipo muy pequeño y está invitado a unirse! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Puede ayudarnos reportando errores o pequeñas contribuciones de código, ideas o cualquier otra cosa que crea que puede mejorar KLog. If you want to provide support you are welcome to join the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! ¡Si quiere ayudar es bienvenido a unirse a la <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">lista de desarrollo de KLog</a>! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account user's needs Los desarrolladores de KLog han incluido una función que reporta algunos datos del usuario al servidor de KLog con el único objetivo de saber el número de versiones instaladas y poder centrar el desarrollo en una u otra dirección en función de las necesidades de los usuarios. At present, the data that is provided is the following: Hoy, los datos que se proporcionan son los siguientes: Be aware that you can enable/disable this feature from the Misc tab in the Setup page Sepa que puede habilitar/deshabilitar esta función en la pestaña de Varios de la página de configuración Translators bring KLog into your language. They are really an important part of the KLog development team. Los traductores traen KLog a su idioma. Son una parte realmente importante del equipo de desarrollo de KLog. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! ¡Si KLog no está aun en su idioma y quiere ayudarnos, es bienvenido a contactar con nosotros a través de la <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">lista de desarrollo de KLog</a>! Translators Traductores Privacy advisory Aviso de privacidad Callsign Indicativo KLog version Versión de KLog Operating system Sistema operativo KLog KLog Privacy Privacidad BarChartStats Chart title Título del gráfico Abort reading Cancelar lectura Reading data ... Leyendo datos ... QSOs QSOs QSOs per year QSOs por año QSO: %1/%2 QSO: %1/%2 DXCC Entities Entidades DXCC DXCC Entities per year Entidades DXCC por año CQ zones Zonas CQ CQ zone per year Zonas CQ por año Years: %1/%2 Años: %1/%2 Bands Bandas QSO per band distribution Distribubución de QSO por banda Reading data ... Leyendo datos ... Entities: Entidades: Bands: Bandas: Modes Modos QSO per mode distribution Distribución QSO por modo Reading data... Leyendo datos ... Modes: Modos: Entity: Entidad: DXCC DXCC Top ten DXCC per QSO Top 10 de DXCC por QSO Continents Continentes QSOs per continent QSOs por continente Hours Horas QSOs at hour QSO por hora Hours: Horas: CTYPage Country data download Descargar datos de entidades KLog needs country data... KLog necesita datos de las entidades ... &Download &Descargar &Ignore &Ignorar Country data needed Información de entidades KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC information. KLog usa el fichero cty.csv (de http://www.country-files.com/) para obtener la información del DXCC. You need to download the cty.csv file if you want KLog to show you the countries, locator, ... of the QSOs you do. Necesita descargar el cty.csv si quiere que KLog muestre información de entidad, locator, ... de los QSO que haga. Click on Download to download now. Pulse en Descargar para descargar ahora. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? No se pudo encontrar la máaquina. Revise su configuración de red y pruebe de nuevo ¿Quiere volverlo a intentar? DXCCStatusWidget Update Actualizar ID ID Entity Entidad Pref: Pref: CQ: CQ: ITU: ITU: Beam: Azimuth: Entity not worked in this band. Entidad no trabajada en esta banda. DXClusterWidget Connect Conectar Clear Limpiar Click on connect to connect to the DX-Cluster Pulse en conectar para conectar al DX-Cluster KLog DXCluster Kontest DXCluster DXCluster de KLog Click on Connect to connect to the DX-Cluster server Pulse en Conectar para conectar al servidor de DX-Cluster Trying to connect to the server Intentando conectar con el servidor The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. La conexióon fue rechazada por el servidor. Asegúrese de que el servidor de DXCluster estáa ejecutáandose y compruebe el nombre de máquina y puerto. The following error occurred: %1. El siguiente error ha tenido lugar: %1. Connected to server Conectado al servidor KLog message Kontest message Mensaje de KLog Enter your callsign to connect to the cluster: Introduzca su indicativo para conectar al cluster: Enter your password to connect to the cluster: (Just hit enter for no password) Introduzca su contraseña para conectar al cluster: (pulse enter si no hay contraseña) Not logged on, you may need to enter your callsign again. No identificado, puede introducir su contraseña de nuevo. Enter here the commands to be sent to the DX-Cluster server. Introduzca aquí los comandos a enviar al servidor de DX-Cluster. Disconnect Desconectar The host was not found. Please check: No se ha encontrado el servidor. Por favor revise: - your network connection; - the host name and port settings. - la conexión de red; - el nombre de máquina y puerto. Connection closed by the server Conexión cerrada por el servidor Click on Connect to connect to the DX-Cluster server. Pulse en Conectar para conectar al servidor de DX-Cluster. Send Enviar DataProxy_SQLite Software version in DB is null La versión de software de la BBDD es nulo No query failed No falló ninguna query Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Rebote Lunar Sporadic E Esporádica E Internet-assisted Asistido por Internet Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Terrestrial or atmospheric repeater or transponder Terrestre, repetidor atmosférico o transpondedor Rain scatter Common term in hamradio, do not translate if not sure Satellite Satélite Bureau Common term in hamradio, do not translate if not sure Bureau Manager Common term in hamradio, do not translate if not sure Manager All QSOs have been updated with a DXCC and the Continent. Todos los QSO se han actualizado con un DXCC y un continente. Field Aligned Irregularities Common term in hamradio, do not translate if not sure F2 Reflection Common term in hamradio, do not translate if not sure Reflexión F2 Trans-equatorial Common term in hamradio, do not translate if not sure Trans-ecuatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Conducto troposférico Yes No No Requested Requerida Ignore/Invalid Ignorar/No válida Validated Validada Queued En cola Uploaded Subida Do not upload No subir Modified Modificado Direct Directa Electronic Electrónica KLog DXCC KLog DXCC DownLoadCTY Download of cty.csv failed with the following error code: La descarga de cty.csv falló con el siguiente código de error: Download of cty.csv done. Descarga de CTY.CSV finalizada. There is already a cty.csv file in the folder but it will be replaced with the new one. Ya hay un cty.csv en la carpeta pero será reemplazado por el nuevo. Could not open %1 for writing No se puede abrir %1 para escritura FileManager Reading ADIF file... Leyendo fichero ADIF... Abort reading Cancelar lectura The log that you have selected contains more than just one station callsign. El log que ha seleccionado contiene más de un sólo indicativo de estación. Station Callsign: Indicativo de la estación: Define Station Callsign Definir indicativo de estación You have selected no callsign. KLog will export QSOs without a station callsign defined and those with the call you are entering here. No ha seleccionado indicativo. KLog exportará los QSOs sin un indicativo de estación definido y aquellos con el indicativo que está seleccionando aquí. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Introduzca el indicativo de estación para usar en este log o déjelo vacío para poner un QSO sin un indicativo de estación definido: Writing ADIF file... Escribiendo fichero ADIF... Abort writing Cancelar escritura Exporting LoTW ADIF file... Exportando fichero ADIF de LoTW... Writing ADIF file... QSO: Escribiendo fichero ADIF ... QSO: Writing Cabrillo file... Escribiendo fichero Cabrillo ... KLog: Cabrillo Log Export not implemented Kontest: Cabrillo Log Export not implemented KLog: La exportación de log en en formato Cabrillo no está implementada I am sorry but the Cabrillo Export To File feature has still not been implemented. Lo sentimos pero la función de Exportar Cabrillo aun no está implementada. Reading LoTW file... Leyendo fichero LoTW... Do you want to continue with the current file? ¿Quiere continuar con el fichero actual? This log seems to lack of RST-TX information. Este log parece que no tiene la información de RST-TX. Click on Yes to add a default 59 to all QSO with a similar problem. Pulse en Si para añadir 59 de forma predeterminada a todoslos QSO con un problema similar. If you select NO, the QSO may not be imported. Si selecciona No, el QSO puede no ser importado. This log seems to lack of RST-RX information. Este log parece que no tiene la información de RST-RX. - The band missing and the following call: - La banda inexistente pero el siguiente indicativo: - The call missing but was done at this time: - El indicativo inexistente pero la siguiente hora: - The mode missing and the following call: - El modo inexistente pero el siguiente indicativo: - The date missing and the following call: - La fecha inexistente pero el siguiente indicativo: - The time missing and the following call: - La hora inexistente pero el siguiente indicativo: You have canceled the file export. The file will be removed and no data will be exported. Has cancellado la exportación del fichero. El fichero se eliminará y no se exportará ningún dato. Do you still want to cancel? ¿Aun quiere cancelar? QSO: QSO: No station callsign has been selected and therefore no log will be exported No se ha seleccionado indicativo de estación por lo que no se exportará ningún log There is more than one log in this logfile. Hay más de un log en este fichero. All logs will be imported into the current log. Todos los logs se importarán en el log actual. Do you want to continue? ¿Quiere continuar? Importing ADIF file... Importando fichero ADIF... You have cancelled the file import. The file will be removed and no data will be imported. Has cancelado la importación del fichero. El fichero se eliminará y no se importará ningún dato. It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Parece que hay algunos QSO duplicados en el fichero ADIF que está importando. ¿Quiere continuar? (los QSO duplicados no se importarán) Please select the station callsign you want to export the log from: Por favor seleccione el indicativo de estación del que quiere exportar el log: This QSO is not including the minimum data to consider a QSO as valid!. ¡Este QSO no incluye la información mínima para considerarse un QSO válido! Please edit the ADIF file and make sure that it include at least: Por favor, edite el fichero ADIF y asegúrese de que incluye al menos: and y This QSO had: Este QSO tenía: KLog: Not all required data found! KLog: ¡No se encontraron todos los datos necesarios! KLog: No RST TX found! KLog: ¡No se encontró RST TX! KLog: No RST RX found! KLog: ¡No se encontró RST RX! InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70Cm Continent Continente Prefix Prefijo CQ CQ ITU ITU Short Path Salto corto Long Path Salto largo Deg Grad Miles Millas Km Km IntroPage Welcome to KLog! Welcome to Kontest! ¡Bienvenido a KLog! Welcome to KLog! - brought to you under the terms of the GPL! ¡Bienvenido a KLog - disponible gracias a los términos de la GPL! Welcome to KLog Bienvenido a KLog This looks like it's the first time you've run KLog on this computer. Parece que es la primera vez que ejecuta KLog en este ordenador. KLog is a free hamradio logging program that can run on Linux macOS and Windows. KLog es un programa libre de log de radioaficionados que puede correr en Linux, macOS y Windows. It is designed to provide general purpose, DX and contest logging. Está diseñado para proveer de log de propósito general, DX y concursos. It supports QSL management, import and export of ADIF Soporta gestión de QSL, importa y exporta formato ADIF and Cabrillo file formats and many other features... y Cabrillo y otras otras muchas funcionalidades... Before you can start using KLog, you will be asked to: Antes de empezar a usar KLog, se le pedirá que: Acknowledge to the terms of the license. Conocer los térmimos de la licencia. Download the DX entities information. Descargar los datos de entidades DX. Enter your callsign, CQ zone, etc. and main configuration. Introduzca el indicativo, zona CQ, etc y la configuración principal. Enjoy KLog and contact the development team if you have any suggestions! ¡Disfrute de KLog y contacte con el equipo de desarrollo si tiene alguna sugerencia! LicPage KLog License information Información de licencia de KLog Welcome to KLog!- brought to you under the terms of the GPL! ¡Bienvenido a KLog - disponible gracias a los términos de la GPL! Acknowledge Aceptar Be aware that KLog is free software. Sepa que KLog es software libre LogModel Date Fecha Time Hora QRZ QRZ Band Banda Mode Modo RSTtx RSTtx RSTrx RSTrx Comment Comentario LogWindow QSL Send Enviar QSL QSL Rcvd QSL Recibida &Delete &Borrar Delete a QSO Borrar un QSO &Edit QSO &Editar QSO Edit this QSO Edita este QSO Via &bureau Vía &bureau Send this QSL via bureau Envía esta QSL vía bureau D&irect D&irecta Send this QSL via direct Envía esta QSL vía directa Via bureau Vía bureau QSL &received via bureau QSL &recibida vía bureau Direct Directa QSL received via direc&t QSL recibida vía direc&ta You have requested to delete this QSO. Ha solicitado eliminar este QSO. Are you sure? ¿Está seguro? MainWindow Recalculate Recalcular Click to recalculate the award status. Pulsar para recalcular el estado de los diplomas. Starting KLog Iniciando KLog &Add &Añadir &Clear &Limpiar Status bar... Barra de estado ... DX Entity Entidad DX &Log Window Ventana de &Log &Score Window Ventana de &Puntuación Watts Vatios MHz MHz KLog KLog Annual Anual Ready Listo An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Ha ocurrido un error inesperado al intentar añadir el QSO al log. Si el problema persiste, contacte con el desarrollador para que lo analice: You have selected an entity: Ha seleccionado la entidad: that is different from the KLog proposed entity: que es distinta de la que propone KLog: Click on the prefix of the correct entity or Cancel to edit the QSO again. Pulse en el prefijo de la entidad correcta o Cancelar para editar el QSO de nuevo. Click on the prefix of the right entity or Cancel to correct. Pulse en el prefijo de la entidad correcta o Cancelar para corregir. QRZ of the QSO. QRZ del QSO. TX RST. RST enviado. RX RST. RST recibido. TX Exchange. Intercambio enviado. Band of the QSO. Banda del QSO. Mode of the QSO. Modo del QSO. Date of the QSO. Fecha del QSO. Time of the QSO. Hora del QSO. Add the QSO to the log. Añadir QSO al log. Clear the box. Limpiar el cuadro. Input Entrada RSTrx RSTrx RSTtx RSTtx QRZ QRZ STX SRX NEW MULT Invalid characters used in the QRZ Caracteres no válidos en el QRZ Ready... Listo ... &File &Archivo &New... &Nuevo ... &Open... A&brir ... &Import from ADIF... &Importar desde ADIF ... Import an ADIF file into the current log. Importar un fichero ADIF al log actual. &Save As... &Salvar como ... Export to ADIF... Exportar a ADIF ... Export the current log to an ADIF logfile. Exportar ellog actual al un fichero de log ADIF. Export all logs to ADIF... Exportar todos los logs a ADIF ... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exportar TODOS los QSO a un fichero ADIF, mezclando los QSOs de todos los logs. Export Requested QSL to ADIF... Exportar las QSL solicitadas a ADIF ... Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a QSL tag printing program). Exporta todas los los QSOs de las que se solicita la QSL a un fichero ADIF (e.j. para importarlo después a un programa de impresión de etiquetas de QSL). Export ADIF for LoTW... Exportar ADIF a LoTW ... Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before uploading to LoTW! Exporta un fichero ADIF para enviarse a LoTW. ¡Recuerde firmarlo con TQSL antes de subir al LoTW! &Print Log... Im&primir Log ... Print your log. Imprime el log. KLog folder Carpeta KLog Opens the data folder of KLog. Abre la carpeta de datos de KLog. E&xit Sali&r &Tools Herramien&tas Fill in QSO data Completar QSOs Go through the log reusing previous QSOs to fill missing information in other QSOs. Revisar el log, reutilizando datos de QSOs anteriores para completar información que falte en otros QSOs. Fill in DXCC data Completar datos DXCC Go through the log filling QSOs without a DXCC defined. Revisar el log, completando los QSOs que no tengan DXCC definidos. QSL tools... Herramientas de QSL ... &Find QSO to QSL &Buscar QSO para enviar QSL Shows QSOs for which you should send your QSL and request the DX QSL. Muestra QSOs para los que tenga que enviat la QSL y solicitar la QSL del DX. Find My-QSLs pending to send Buscar mis QSL pendientes de envío Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Muestra los QSOs que tienen QSL pendiente de enviar. ¡Debería mantener esta cola vacía! &Find DX-QSLs pending to receive B&uscar QSL DX pendientes de recibir Shows the DX-QSL that has been requested or QSLs has been sent with no answer. Muestra las QSL de estaciones DX que se han solicitado o hemos enviado pero no tenemos respuesta. &Find requested pending to receive Bu&scar solicitadas sin recibir Shows the DX-QSL that has been requested. Muestra QSL DX que se han solicitado. LoTW tools... Herramientas LoTW ... Queue all QSL to be sent of this log Encolar todas las QSL del log a enviar Mark all non sent QSOs in this log as queued to be uploaded. Marca todos los QSOs de este log como encolados para ser enviados. Queue all QSL to be sent Encolar toas las QSL a enviar Mark all non sent QSOs as queued to be uploaded. Marca todos los QSL sin enviar como en cola para ser enviados. Mark as sent all queued QSO of this log Marcar como enviados todos los QSO encolados del log Mark all queued QSOs in this log as sent to LoTW. Marcar como encolados los QSOs de este log como enviados a LoTW. Mark all queued QSO as sent Marcar como enviados todos los QSO en cola Mark all queued QSOs as sent to LoTW. Marca todos los QSOs encolados como enviados por LoTW. &Update cty.csv Act&ualizar cty.csv For updated DX-Entity data, update cty.csv. Actualizar cty.csv para actualizar los datos de entidades DX. &Update Satellite Data Actualizar datos de &satélites Stats Estadísticas Show the statistics of your radio activity. Muestra estadísticas de la actividad en radio. &Setup &Preferencias &Setup... &Preferencias ... &Help &Ayuda Check updates... Comprobar actualizaciones ... &About... &Acerca de ... About Qt... Acerca de Qt ... KLog LoTW KLog LoTW All pending QSO of this log has been marked as queued for LoTW! Todos los QSO pendientes del log se han marcado como encolados para LoTW. Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. Ahora puede ir al menú Archivo para exportar el fichero ADIF LoTW y subirlo a LoTW. There was a problem to mark all pending QSO of this log as queued for LoTW! ¡Hubo un problema al marcar todos los QSO pendientes de este log como en cola para LoTW! All pending QSO has been marked as queued for LoTW! ¡Se han marcado como en cola para LoTW todos los QSO! The log that you have selected contains more than just one station callsign. El log que ha seleccionado contiene más de un sólo indicativo de estación. Please select the station callsign you want to mark as sent to LoTW: Por favor seleccione el indicativo de estación que quiere marcar como enviado a LoTW: Station Callsign: Indicativo de la estación: Define Station Callsign Definir indicativo de estación You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the call you are entering here. No ha seleccionado indicativo. KLog marcará los QSOs sin un indicativo de estación definido y aquellos con el indicativo que está seleccionando aquí. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Introduzca el indicativo de estación para usar en este log o déjelo vacío para poner un QSO sin un indicativo de estación definido: No station callsign has been selected and therefore no log will be marked No se ha seleccionado indicativo de estación por lo que no se exportará ningún log All queued QSO of this log has been marked as sent for LoTW! ¡Se han marcado como enviados a LoTW todos los QSO encolados del log! There was a problem to mark all queued QSO of this log as sent for LoTW! ¡Hubo un problema al marcar todos los QSO en cola de este log como enviados a LoTW! All queued QSO has been marked as sent to LoTW! ¡Se han marcado como enviados a LoTW todos los QSO en cola! There was a problem to mark all queued QSO of this log as sent to LoTW! ¡Hubo un problema al marcar todos los QSO en cola de este log como enviados a LoTW! About... Acerca de ... KLog update checking result Resultado de la comprobación de actualizaciones de KLog Congratulations! ¡Enhorabuena! You already have the latest version. Ya cuenta con la última versión. Nothing has been saved. You have to select a valid file type. No se ha guardado nada. Debe seleccionar un tipo de fichero válido. Save File Guardar fichero ADIF file Fichero ADIF Cabrillo files Ficheros Cabrillo Any file Cualquier fichero You can find the KLog data folder here: Puede encontrar la carpeta de KLog aquí: DUPE DUPE start arrancar stop parar It seems that there are no QSO in the database. Parece que no hay QSO en la base de datos. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Si está seguro de que la base de datos contiene QSOs y KLog no es capaz de encontrarlo, por favor contacte con los desarrolladores (mirar en Acerca de KLog) para obtener ayuda. TX Frequency in MHz. Frecuencia de TX en MHz. RX Frequency in MHz. Frecuencia de RX en MHz. Power used by the DX. Potencia usada por el DX. Logging operator's callsign. Indicativo del operador. Callsign used over the air. Indicativo usado en el aire. My QTH locator. Mi QTH locator. Name of the DX. Nombre del DX. QTH of the DX. QTX del DX. Locator of the DX. Locator del DX. Filling DXCC in QSOs... QSO: Completando DXCC en QSOs ... QSO: TX Frequency in MHz. Frequency is not in a hamradio band! Frecuencia de TX en MHz. ¡La frecuencia no está en una banda de radioaficionados! RX Frequency in MHz. Frequency is not in a hamradio band! Frecuencia de RX en MHz. ¡La frecuencia no está en una banda de radioaficionados! QSO logged from WSJT-X: QSO guardado desde WSJT-X: RX Exchange. Intercambio recibido. The logfile has been modified. Se ha modificado el log. Do you want to save your changes? ¿Quiere guardar los cambios? UDP Server error The UDP server failed to %1. start or stop Error del servidor UDP El servidor de UDP falló al %1. Clears the QSO entry. Limpia la entrada de QSO. Number of confirmed DXCC entities. Número de entidades DX confirmadas. Number of worked DXCC entities. Número de entidades DXCC confirmadas. Number of confirmed WAZ zones. Número de zonas WAZ confirmadas. Number of worked WAZ zones. Número de zonas WAZ trabajadas. Number of confirmed local references. Número de referencias locales confirmadas. Number of worked local references. Número de referencias locales trabajadas. Number of confirmed QSOs. Número de QSOs confirmados. Number of worked QSOs. Número de QSOs trabjados. Number of QSOs worked on the selected year. Número de QSOs trabajados en el año seleccionado. Number of DXCC worked on the selected year. Número de entidades DXCC trabajados en el año seleccionado. Number of CQ Zones worked on the selected year. Número de zonas CQ trabajadas en el año seleccionado. Score for the DXMarathon on the selected year. Número de QSOs trabajados en el año seleccionado. Select the year you want to check. Seleccione el año que quiere comprobar. Status of the DX entity. Estado de la entidad DX. Name of the DX entity. Nombre de la entidad DX. Name Nombre QTH QTH Locator Locator Power(rx) Potencia(rx) RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Frec TX Freq RX Frec RX QSO QSO QSL QSL eQSL eQSL Comment Comentario Others Otros My Data Mis datos Satellite Satélite QSOs QSOs DXCC DXCC CQ CQ Score Puntuación DX-Marathon DX-Marathon Info Info Award Diploma Confirmed Confirmado Worked Trabajado WAZ WAZ Local Local Awards Diplomas Search Buscar Log Log DX-Cluster DX-Cluster Save ADIF File Salvar fichero ADIF LoTW logfile has been properly exported! ¡El fichero de LoTW se ha exportado correctamente! Remember to: Recuerde: Before uploading: sign the LoTW log; and Antes de subir: firmar el log de LoTW; y After uploading: mark as sent all the queued QSO (LoTW Tools). Después de subir: marcar como enviados todos los ficheros en cola (Herramientas LoTW). There was no QSO to be exported. No había QSO a exportar. If you think that some QSO should have been exported, please look for them and ensure that the eQSL LoTW QSL sent box is marked as: Si piensa que debería haberse exportado algún QSO, búsquelos y asegúrese de que el cuadro enviar QSL de eQSL LoTW está marcado como: Q - Queued Q - En cola There was an error while exporting the LoTW. The log has not been exported! Hubo un error al exportar a LoTW. ¡El log no se ha exportado! Save Cabrillo File Salvar fichero Cabrillo Open File Abrir fichero &Modify &Modificar - Needed for DXMarathon - Necesitado para DXMarathon Filling QSOs... Completando QSOs ... Abort filling Cancelar completado Filling QSOs... QSO: Completando QSOs ... QSO: Number Número Date Fecha Time Hora Band Banda Mode Modo Print Log Imprimir log Printing the log... Imprimiendo el log ... Abort printing Cancelar impresión Printing the log... QSO: Imprimiendo el log ... QSO: KLog QSO received KLog QSO recibido The following QSO data has been received from WSJT-X to be logged: Se ha recibido el siguiente QSO desde WSJT-X para ser guardado: Call Indicativo Freq Frec Time On Hora inicio Time Off Hora fin RST TX RST TX RST RX RST RX DX-Grid DX locator Comments Comentarios TX Pwr Potencia TX Operator Operador Local-Grid Locator local A new mode not supported by KLog has been received from an external software: Se ha recibido un modo nuevo, no soportado por KLog desde un programa externo: If the received mode is correct, please contact KLog development team and request support for that mode So el modo recibido es correcto, contacte con el equipo de desarrollo de KLog y solicite soporte para ese modo Do you want to keep receiving this alerts? (disabling this alerts will prevent that non-valid modes are detected) ¿Quiere seguir recibiendo estas alertas? (deshabilitar esta alerta evitará que los modos no válidos se detecten) A new mode not supported by KLog has been received from an external software or radio: Se ha recibido un nuevo modo no soportado por KLog desde un software externo o la radio: A duplicated satellite has been detected in the file and will not be imported. Se ha detectado un satélite duplicado en el fichero y no se importará. Please check the satellite information file and ensure it is properly populated. Por favor, revise el fichero de la información de satélites y asegúrese de que está correctamente relleno. Now you will see a more detailed error that can be used for debugging... Ahora verá errores más detallados que pueden ser usados para depurar ... An unexpected error ocurred!! ¡Ha ocurrido un error inesperado! If the problem persists, please contact the developers Si el problema persiste contacte con los desarrolladores for analysis: para que lo analicen: Error in function Error en la función Error code Código de error Error text Texto del error Failed query Consulta fallida Recomendation: Recomendación: Export, periodically, your data to ADIF to prevent a potential data loss. Exporte peódicamente los datos a ADIF para prevenir una potencial pérdida de datos. Do you want to keep showing errors? ¿Quiere seguir viendo los errores? MainWindowInputComment Add a comment for this QSO. Añadir un comentario a este QSO. MainWindowInputEQSL Date of the ClubLog upload. Dato del envío a ClubLog. Date of the eQSL sending. Fecha del envío de eQSL. Date of the eQSL reception. Fecha de la recepción de eQSL. Date of the LoTW sending. Fecha del envío de LoTW. Date of the LoTW reception. Fecha de la recepción de LoTW. Status of the LoTW sending. Estado del envío de LoTW. Status of the LoTW reception. Estado de la recepción de LoTW. LoTW Sent Envío LoTW LoTW Rec Recepción LoTW Status on ClubLog. Estado en ClubLog. Status of the eQSL sending. Estado de envío de eQSL. Status of the eQSL reception. Estado de recepción de eQSL. ClubLog ClubLog eQSL Sent Envío eQSL eQSL Rec Recepción eQSL MainWindowInputOthers Primary Div Div principal Secondary Div Div secundaria IOTA IOTA Entity Entidad Propagation mode Modo de propagación Select the primary division for this QSO. Seleccionar la división principal de este QSO. Select the secondary division for this QSO. Seleccionar la división secundaria de este QSO. Select the entity for this QSO. Seleccionar la entidad de este QSO. Select the propagation mode for this QSO. Seleccionar el modo de propagación de este QSO. Select the IOTA continent for this QSO. Seleccionar el continente IOTA de este QSO. Select the IOTA reference number for this QSO. Seleccionar la referencia IOTA de este QSO. Not Identified Sin identificar Not - Not Identified No - Sin identificar MainWindowInputQSL QSL Sent QSL Enviada QSL Rec QSL Rec QSL Via QSL Vía QSL Msg Msj QSL Status of the QSL sending. Estado del envío de QSL. Status of the QSL reception. Estado de la recepción de QSL. QSL sending information. Información de envío de QSL. QSL reception information. Información de recepción de QSL. Date of the QSL sending. Fecha del envío de QSL. Date of the QSL reception. Fecha de recepción de QSL. Message of the QSL. Mensaje de la QSL. QSL via information. Información de QSL via. MainWindowMyDataTab Watt Vatio Keep this data Mantener estos datos Data entered in this tab will be copied into the next QSO. Los datos introducidos en esta pestaña se copiarán al próximo QSO. Power used for the QSO in watts. Potencia usada para el QSO en vatios. Logging operator's callsign. Indicativo del operador. Callsign used over the air. Indicativo usado en el aire. My QTH locator. Mi QTH locator. Power Potencia Operator Operador Station Callsign Indicativo de la estación My Locator Mi locator MainWindowSatTab Keep this data Mantener estos datos Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Nombre del satélite si no está en la lista: Seleccione "%1" para habilitar este cuadro (formato como AO-51). Satellite mode used. Modo usado en el satélite. Select the satellite you are using. Selecciona el satélite que se está usando. UpLink band. Banda de subida (TX de la estación en tierra). DownLink band. Banda de bajada (RX de la estación en tierra). Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Locator de la estación DX. Este cuadro se sincroniza con el cuadro de locator en la pestaña QSO. UpLink Subida DownLink Bajada Satellite Satélite Mode Modo DX Locator Locator DX Other Otro MHz MHz Not Sat QSO QSO sin satélite KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog ha detectado un nombre de satélite no reconocido. Si debería ser uno de los satélites conocidos, por favor seleccionelo de la lista. Alternativamente puede contactar con el equipo de desarrollo para que añadan el nuevo nombre de satélite. Please know that the satellite name will not be saved if it is not in the list so that information may be lost! ¡Tenga en cuenta que el nombre del satélite no se guardará si no está en la lista y puede perder esa información! Other - Sat not in the list Otro - Satélite no en la lista Data entered in this tab will be copied into the next QSO. Los datos introducidos en esta pestaña se copiarán al próximo QSO. Locator of the DX station. This box is syncronized with the Locator box in the QSO tab. Locator de la estación DX. Este cuadro se sincroniza con el cuadro de Locator en la pestaña QSO. The satellite you have in your QSO is: El satélite que tiene en su QSO es: QObject Database Error Error de base de datos KLog DB needs to be upgraded. La BD de KLog necesita actualizarse. Do you want to upgrade it now? ¿Quiere actualizar ahora? If DB is not upgraded KLog may not work properly. Si no actualiza la base de datos es posible que KLog no funcione correctamente. KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog ha detectado un log anterior en la BD. Todos los datos serán migrados a un log tipo DX creado para usted. KLog: Enter Station callsign KLog: Introduzca indicativo Enter the station callsign used in this log Introduzca el indicativo usado en este log Station Callsign Indicativo de la estación All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is OK. Todos los datos se han migrado de forma correcta. Ahora debería ir a Preferencias->Logs para compribar que todo está OK. QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Cancelar esta actualización causará inconsistencia de datos y posible pérdida de datos. ¿Quiere cancelar? Progress: Progreso: Updating DXCC award information... Actualizand la información del diploma DXCC... Updating DXCC Award information... Actualizando la información del diploma DXCC... Updating WAZ award information... Actualizando la información del diploma WAZ... Updating WAZ Award information... Actualizando la información del diploma WAZ... Updating mode information... Actualizando información de modo... Abort updating Cancelar actualización Updating bands information... Actualizando información de bandas... Updating bands information in %1 status... Actualizando información de bandas en %1... Updating mode information in %1 status... Actualizando información de modos en %1... New One, work it! nNew One, work it! ¡Nuevo, trabájelo! Needed, work it! ¡Necesitado, trabájelo! Worked but not confirmed Trabajado pero no confirmado Confirmed Confirmado Not identified No identificado Install wizard was canceled before completing... El asistente de instalación fué cancelado antes de terminar... Do you want to remove the KLog dir from your disk? ¿Quiere eliminar la carpeta de KLog de su disco? Your KLog dir has been removed Su directorio de KLog ha sido eliminado I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. No se pudo eliminar su directorio de KLog. Debería eliminarlo manualmente si no lo quiere en su disco duro. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. No se pudo eliminar su directorio de KLog. Debería eliminarlo manualmente si no lo quiere en su disco duro. Remember that your KLog dir is on your system... Recuerde que la carpeta de KLog está en su sistema... Thank you for running KLog! ¡Gracias por usar KLog! Updating DXCC and Continent information... Actualizando la información de DXCC y continente... SearchWidget &Clear &Limpiar &Select All &Seleccionar todos &Search Bu&scar All Todos &Export Highlighted &Exportar marcados Clear the searches. Limpiar búsquedas. Export the search result to an ADIF file. Exporta el resultado de la búsqueda a un fichero ADIF. Select/Unselect all the QSOs shown. Selecione/Deseleccione todos los QSOs mostrados. Search in the log. Buscar en el log. Search in all logs. Buscar en todos los logs. Enter the QRZ to search for. Introduzca el QRZ a buscar. Search results. Resultados de la búsqueda. QRZ QRZ Date/Time Fecha/Hora Band Banda Mode Modo QSL Sent QSL Enviada QSL Rcvd QSL Recibida Station Callsign Indicativo de la estación ID ID &Clear selection &Limpiar selección Save File Guardar fichero QSL Send Enviar QSL &Delete &Borrar Delete a QSO Borrar un QSO &Edit QSO &Editar QSO Edit this QSO Editar este QSO Via &bureau Vía &bureau Send this QSL via bureau Envia esta QSL vía bureau D&irect D&irecta Send this QSL via direct Envía esta QSL vía directa &Request my QSL &Requerir mi QSL Mark my QSL as requested Marcar mi QSL como requerida Via Direct && mark DX QSL as requested Vía directa y marcar QSL DX como solicitada Send this QSL via direct & mark DX QSL as requested Enviar esta QSL vía directa y marcar QSL DX como solicitada Via Bureau && mark DX QSL as requested Vía Bureau y marcar QSL DX como solicitada Send this QSL via bureau & mark DX QSL as requested Enviar esta QSL vía bureau y marcar QSL DX como solicitada &Request the QSL &Requerir la QSL Mark the QSL as requested Marcar la QSL como requerida Via bureau && mark my QSL as requested Vía bureau y marcar mi QSL como requerida QSL received via bureau & mark my QSL as requested QSL recibida vía bureau y marcar mi QSL como solicitada Via bureau Vía bureau QSL received via bureau QSL recibida vía bureau Direc&t && mark as my QSL requested Direc&ta y marcar mi QSL como requerida QSL received via direct & mark my QSL as requested QSL recibida vía directa y marcar mi QSL como requerida Direc&t Direc&ta QSL received via direct QSL recibida vía directa You have requested to delete the QSO with: %1 Ha solicitado eliminar un QSO con: %1 Are you sure? ¿Está seguro? Needed QSO to send the QSL QSO al que es necesario enviar la QSL My QSL requested to be sent Se ha solicitado el envío de mi QSL DX QSL pending to be received QSL del DX pendiente de recibir SetupDialog User data Datos de usuario Bands/Modes Bandas/modos My Data Mis datos DX-Cluster DX-Cluster Colors Colores Misc Varios World Editor Editor de entidades Satellites Satélites HamLib HamLib ClubLog ClubLog Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Vaya a la pestaña Varios y pulse sobre Mover BBDD o la base de datos no se moverá a la nueva ubicación. Go to the User tab and enter valid QRZ. Vaya a la pestaña Usuario e introduzca un QRZ válido. Cancel Cancelar OK OK Config Dialog Configuración D&X-Cluster D&X-Cluster WSJT-X WSJT-X You need to enter at least one log in the Logs tab. Debe introducir al menos un log en la pestaña de Logs. You need to enter at least a valid QRZ. Debe introducir un QRZ válido. DB has not been moved to new path la BBDD no se ha movido a la nueva ubicación You have not selected the kind of log you want. No ha seleccionado el tipo de log que quiere. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Será redirigido a la pestaña de Log. Añada y seleccione el tipo de log que quiere usar. Logs Logs World Entidades SetupEntityDialog Entity Entidad CQ CQ ITU ITU Latitude Latitud Longitude Longitud UTC UTC Main prefix Prefijo ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... Lista separada por comas de prefijos posibles. Ej. EA1, EA2, ... Prefixes Prefijos Name of the Entity. Nombre de la entidad. CQ zone. Zona CQ. ITU zone. Zona ITU. Longitude of the Entity. Longitud de la entidad. Local time difference to UTC. DIferencia entre la hora local y la UTC. Main prefix of the entity. Prefijo principal de la entidad. ARRL ID. ID ARRL - Identificador numérico de la ARRL. Date of the deletion. Fecha de eliminación. Deleted Eliminado Cancel Cancelar OK Ok Entity Dialog Entidad SetupPageBandMode Bands Bandas Modes Modos SetupPageClubLog &Callsign Indi&cativo ClubLog &password Contrase&ña ClubLog &email Correo &electrónico Enter the email you used to register in ClubLog. Introduzca el correo-e que usó para registrarse en ClubLog. Enter the callsign you used to register in ClubLog. Introduzca el indicativo que usó para registrarse en ClubLog. Enter your password in ClubLog. Introduzca su contraseña de ClubLog. &Send QSOs in real time &Enviar QSOs en tiempo real &Activate ClubLog &Activar ClubLog Use QSO Station &Callsign Usar indicativo de esta&ción del QSO Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Envía cada QSO a CLubLog en tiempo real, según se van añadiendo (o modificando) en KLog. Starts the ClubLog support in KLog. Inicia el soporte de ClubLog en KLog. Use the Station Callsign defined in each QSO instead of the one defined here. Usa el indicativo de estación definido en cada QSO en vez de el definido aquí. SetupPageColors New One Nuevo Needed in this band Necesitado en esta banda Worked in this band Trabajado en esta banda Confirmed in this band Confirmed Confirmado en esta banda Default Predeterminado Choose a color Elija un color SetupPageDxCluster Add Añadir Delete Borrar Show &HF spots Show HF spots Mostrar avisos en I&HF Show V/&UHF spots Show V/UHF spots Mostrar avisos en V/&UHF Show W&ARC spots Show WARC spots Mostrar avisos en W&ARC Show &worked spots Show worked spots Mostrar a&visos trabajados Show &confirmed spots Show confirmed spots Mostrar avisos &confirmados Show ANN/&FULL messages Show ANN/FULL messages Mostrar mensajes ANN/&FULL Show WW&V messages Show WWV messages Mostrar mensajes &WWV Show WC&Y messages Show WCY messages Mostrar mensajes WC&Y DX Spots Avisos DX Messages Mensajes KLog: Add a DXCluster server Kontest: Add a DXCluster server KLog: Añadir servidor DX-Cluster Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default.: Añade la dirección seguida de :puerto Ejemplo: dxfun.com:8000 Si no se especifica puerto se usará 41112 de forma predeterminada: SetupPageHamLib Activate HamLib Activar HamLib Activates the hamlib support that will enable the connection to a radio. Activa el soporte de hamlib que habilitará la conexión a una radio. RTS on Habilitar RTS Setting RTS may be needed for some serial ports. Puede ser necesario habilitar el RTS en algunos puertos serie. DTR on Habilitar DTR Setting DTR may be needed for some serial ports. Puede ser necesario habilitar el DTR en algunos puertos serie. Radio Radio Select your rig. Seleccionar equipo Defines the interval to pool the radio in msecs. Define el intervalo con el que se consulta a la radio en milisegundos. Pool interval Actualización Port Puerto Select the serial port. Only the serial ports that are detected are shown. Seleccione el puerto serie. Solo se muestran los puertos que se pueden detectar. Scan Buscar Click to identify the serial ports available in your computer. Pulsar para identificar los puertos disponibles en el ordenador. Bauds Baudios Select the serial port speed. Seleccionar la velocidad del puerto serie. 5 bits 5 bits 6 bits 6 bits 7 bits 7 bits 8 bits 8 bits Data bits Bits de datos Select the serial data bits. Seleccionar los bits de datos None Ninguno Hardware Hardware Software XON/XOFF Software XON/XOFF Flow control Control de flujo Select the serial flow control Seleccione el contrl de flujo del puerto serie. No parity Sin paridad Even Par Odd Impar Space Espacio Mark Marca Parity Paridad Select the serial parity. Seleccione la paridad del puerto serie. 1 bit 1 bit 1.5 bits 1.5 bits 2 bits 2 bits Stop bits Bits de parada Select the serial stop bits. Seleccionar los bits de parada. SetupPageLogs Type Tipo &New New &Nuevo &Edit &Editar &Remove Elimina&r KLog KLog Do you really want to remove this log? ¿Realmente quiere eliminar este log? All the QSOs from this log will be also deleted... Todos los QSOs de este log también se eliminarán... Operators Operadores An error has occurred showing the following error code: Ha ocurrido un error que muestra el siguiente código de error: Log has not been removed. (#3) Log no eliminado (#3) Add a new log. Añade un nuevo log. Edit the selected log. Edita el log seleccionado. Remove the selected log. Elimina el log seleccionado. Select the log you want to open. Selecciona el log que quiere usarse. Log has not been removed. (#2) Log no eliminado (#2) Log has not been removed. (#1) Log no eliminado (#1) KLog - SetupPageLogs KLog - SetupPageLogs ID ID Station Callsign Indicativo de la estación Comments Comentarios Date Fecha SetupPageLogsNew &Ok &Ok &Cancel &Cancelar Select categories Seleccione categorías &Date &Fecha &Station Callsign &Indicativo Estación &Operators &Operadores Comm&ent Com&entario Callsign used for this log. Indicativo usado en este log. Comma separated list of operators: callsign1, callsign2. Lista separada por comas de los operadores: indicativo1, indicativo2. Start date of this log. Fecha de inicio de este log. Add a comment about this log. Añade un comentario sobre este log. &Type of Operation &Tipo de Operación Select the kind of operation for this log. Selecciona el tipo de operación del log. &Mode Category &Modo operación Select the mode category. Selecciona a categoría de modo. O&perators Category Categoría O&peradores Select the operators category. Selecciona la categoría de operadores. &Assisted Category Categoría &Asistido Select the assisted category. Selecciona la categoría asistida. Po&wer Category Categoría &Potencia Select the power category. Selecciona la categoría de potencia. &Bands Category Categoría &Bandas Select the bands category. Selecciona la categoría de bandas. O&verlay O&verlay Select the Overlay category. Selecciona la categoría de overlay. Categories not OK Categorías no OK You need to enter a valid QRZ in the Station Callsign box. The log will not be opened. You need to enter a valid QRZ in the Station Callsign box The log will not be opened. Necesita introducir un indicativo válido en el cuadro de Indicativo. El log no se abrirá. You selected an invalid combination. The log will not be opened. You selected an invalid combination The log will not be opened. Ha seleccionado una categoría no válida. El log no se abrirá. Categories OK Categorías OK SetupPageMisc &Imperial system Imperial system Sistema &imperial &Log in real time Log in real time &Log en tiempo real &Time in UTC Time in UTC Hora en U&TC &Save ADIF on exit Save ADIF on exit Guardar ADIF al &salir Use this &default filename Use this default filename Usar este fichero &de forma predeterminada Mark &QSO to send QSL when QSL is received Mark QSO to send QSL when QSL is received Marcar como &QSL por enviar cuando se recibe la QSL Complete QSO with previous data Completar QSO con datos anteriores &Reset to My Data for all QSOs &Reiniciar Mis Datos en todos los QSO Manage DX-Marathon Gestionar DX-Marathon Move DB Mover BBDD If new version checking is selected, KLog will send the developer your callsign, KLog version & Operating system to help in improving KLog. Si se selecciona el comprobar nuevas versiones, KLog enviará al desarrollador el indicativo, la versión de KLog y el sistema operativo para ayudar a mejorar KLog. Check it for Imperial system (Miles instead of Kilometers). Marcar si se desea sistema imperial (millas en vez de kilómetros). Select to use the following name for the logfile without being asked for it again. Seleccione para usar el siguiente nombre de fichero y que no se le pregunte más. Select if you want to manage DX-Marathon. Seleccionar si quiere gestionar DX-Marathon. This is the default file where ADIF data will be saved. Este es el nombre de fichero predeterminado donde se guardará el fichero ADIF. This is the directory where the database (logbook.dat) will be saved. Este es el directorio donde la base de datos (logbook.dat) se guardará. Click to change the path of the database. Pulse para cambiar la ubicación de la base de datos. Please specify an existing directory where the database (logbook.dat) will be saved. Por favor, especifique un directorio existente donde la base de datos (logbook.dat) se almacenará. This is the directory where DB (logbook.dat) will be saved. Este es el directorio donde la base de datos (logbook.dat) se guardará. Click to change the default ADIF file. Pulse para cambiar el nombre predeterminado del fichero ADIF. Click to move the DB to the new directory. Pulse para mover la BBDD al nuevo directorio. Select Directory Seleccionar directorio File moved Archivo movido File copied Archivo copiado File NOT copied Archivo NO copiado The target directory does not exist. Please select an existing directory. El directorio destino no existe. Por favor, seleccione un directorio existente. The search box will show also the callsign on the air to do the QSO. El cuadro de búsqueda mostraráa también el indicativo usado para hacer el QSO. Show the Station &Callsign used in the search box Mostrar indicativo usado en el &cuadro de búsqueda All the data from the My Data tab will be used or data from the previous QSO will be maintained. Todos los datos de la pestaña Mis Datos se usarán o bien se usarán datos del QSO anterior. &Check for new versions automatically &Comprobar si hay nuevas versiones automáticamente QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. Los QSO se marcarán como pendientes de enviar si se recibe la tarjeta del DX y no ha enviado la suya. Check if there is a new release of KLog available every time you start KLog. Comprueba si hay una nueva versión de KLog disponible cada vez que inicia KLog. &Provide Info for statistics &Proporcionar datos para estadísticas Select to use real time. Seleccione para usar tiempo real. Select to use UTC time. Seleccione para usar UTC. Select if you want to save to ADIF on exit. Seleccione si quiere guardar en ADIF al salir. Complete the current QSO with previous QSO data. Completar el QSO actual con datos de QSO anteriores. Browse Buscar Open File Abrir fichero SetupPageSats &New &Nuevo &Edit &Editar &Remove Elimina&r &Import &Importar E&xport E&xportar Add a new satellite. Añadir un nuevo satélite. Edit the selected satellite. Editar el satélite seleccionado. Remove the selected satellite. Eliminar el satélite seleccionado. Import a satellites file. It will replace the satellites you have now configured. Importa el fichero de satélites. Reemplazará los satélites que tiene ahora configurados. Export your current satellites to a file. Exportar los satélites actuales a un fichero. Select the sat you want to open. Seleccione el satélite que quiere abrir. KLog KLog Do you really want to remove this satellite? ¿Realmente quiere eliminar este satélite? This satellite will not be longer available to be selected ... Este satélite ndejara de estar disponible para ser seleccionado ... Sat has not been removed. (#3) El satélite no ha sido eliminado. (#3) Sat has not been removed. (#2) El satélite no ha sido eliminado. (#2) Sat has not been removed. (#1) El satélite no ha sido eliminado. (#1) ID ID Short Corto Name Nombre Uplink Subida Downlink Bajada Modes Modos An error has occurred showing the following error code: Ha ocurrido un error que muestra el siguiente código de error: KLog - SetupPageSats KLog - Configuración de satélites Open Satellites File Abrir fichero de satélites KLog warning Advertencia de KLog An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Ha ocurrido un error inesperado al importar los datos de satélites. Puede haber sido causado que el fichero que está intentando importar no tiene el formato adecuado. Please check the format or contact the developer for analysis with the error code: Por favor, compruebe el formato o contacte con el desarrollador para que analice el código de error: Save Satellites File Guardar fichero de satélites SetupPageSatsNew Short name Nombre corto Sat name Nombre UpLink Subida DownLink Bajada Modes Modos &Ok &Ok &Cancel &Cancelar Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Introduzca el nombre corto. Trate de usar el nombre corto del LoTW para poder subir los QSO a LoTW después. Enter the name of the satellite. Introduzca el nombre del satélite. Enter the uplink frequencies in this format: 144.300 Introduzca las frecuencias de subida en este formato: 144.300 Enter the downlink frequencies in this format: 144.300 Introduzca las frecuencias de bajada en este formato: 144.300 Enter the modes in this format: USB Introduzca los modos en este formato: USB Some of the data you have entered is not correct, the satellite can't be added. Alguno de los datos introducidos no son correctos, el satélite no puede ser añadido. SetupPageUDP Start UDP Server Arrancar servidor UDP Log automatically QSOs from WSJT-X Registrar automáticamente los QSO llegados de WSJT-X Allow WSJT-X to send logged QSO to KLog Permitir a WSJT-X enviar los QSO resgistrados a KLog KLog will log automatically any QSO coming from WSJT-X without any manual confirmation. KLog registrará automáticamente cualquier QO que venga de WSJT-X sin ninguna confirmación manual. Receive and Update QSO data to KLog Recibir y actualizar datos de QSO a KLog KLog will automatically show and update data coming from WSJT-X (DX callsign, locator, RPT, ...) KLog mostrará y actualizará los datos que lleguen de WSJT-X (Indicativo DX, locator, reporte, ...) QSO notification timeout (milisecs) Tiempo de notificación de QSO(milisegundos) Milliseconds that the notification of QSO received from WSJTX will be shown. Milisegundos que se mostrará la notificación de QSO recibida de WSJTX. Miliseconds that the notification of QSO received from WSJTX will be shown. Milisegundos que se mostrará la notificación de QSO recibido desde WSJT-X Make sure it is the same port where the other programs are sending the data to. Default port is 2237. Asegúrese de que es el mismo puerto al que los otrosprogramas están enviando datos. El puerto predeterminado es el 2237. QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected Los QSO hechos en WSJT-X serán enviados a KLog y KLog preguntará antes de guardarlo en KLog salvo que se seleccione "%1" UDP port number where the UDP Server will listen for packets. Puerto UDP donde el servidor UDP espera los paquetes. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. El servidor UDP recibirá los QSO enviados desde otros programas como WSJT-X permitiendo registrar en KLog los contactos automáticamente desde esos programas. UDP Port Puerto UDP SetupPageUserDataPage &Personal data Personal data Datos &personales Station &data Station data &Datos de la estación &Name Name &Nombre &Address Address &Dirección Cit&y City Ci&udad &Zip Code Zip Code Código &postal Pro&v/State Prov/State Pro&v/Estado Countr&y Country Paí&s Enter your information for rig Introduzca la información de su equipo/radio Enter your information for antenna Introduzca la información de su antena Enter your name. Introducir el nombre. Enter your address - 1st line. Introducir la dirección - linea 1. Enter your address - 2nd line. Introducir la dirección - linea 2. Enter your address - 3rd line. Introducir la dirección - linea 3. Enter your address - 4th line. Introducir la dirección - linea 4. Enter your city. Introducir la ciudad. Enter your zip code. Introducir el código postal. Enter your province or state. Introducir la provincia o estado. Enter your country. Introducir el país. Enter your power information. Introducir la información sobre la potencia. &Rig 1 &Equipo 1 R&ig 2 E&quipo 2 Ri&g 3 Eq&uipo 3 Antenna &1 Antena &1 Antenna &2 Antena &2 Antenna &3 Antena &3 Po&wer Po&tencia Enter the station callsign that will be used for logging. Introducir el indicativo de la estación que se usará en el log. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Introduzca el locator de su estación. De forma alternativa, KLog puede proporcionarle uno aproximado basado en su indicativo. &QRZ &QRZ &Operators &Operadores &CQ Zone Zona &CQ &ITU Zone Zona &ITU &Locator &Locator &Locator (not valid) &Locator (no válido) Enter the operators (comma separated if more than one). Introduzca los operadores (separados por comas si hay más de uno). SetupPageWorldEditor KLog will not be able to show entities information. KLog no podrá mostrar información de entidades. Prefix Prefijo Entity Entidad An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Se ha detectado un fichero de información de entidades (cty.csv) en su carpeta de KLog y se utilizará. Add Añadir Delete Borrar Edit Editar Export World Exportar mundo Import World Importar mundo Still not implemented. Sin implementar. Import a new cty.csv file Importar un nuevo fichero cty.csv No entities information file (cty.csv) has been detected in your KLog folder. No se ha detectado en su carpeta de KLog ningún fichero de información de entidades (cty.csv). ARRL ID ARRL ID Continent Continente CQ Zone Zona CQ ITU Zone Zona ITU UTC UTC Latitude Latitud Longitude Longitud Deleted Eliminado Since Date Desde fecha To Date Hasta fecha Open File Abrir fichero BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. La información de entidades ha sido actualizada. Entities information has not been updated. La información de entidades no ha sido actualizada. ShowErrorDialog KLog Message Mensaje de KLog SoftwareUpdateDialog Ok Ok KLog update Actualización de KLog Congratulations! ¡Enhorabuena! Your KLog has been updated. Su KLog ha sido actualizado. You already have the latest version. Ya cuenta con la última versión. StartWizard KLog - The free hamradio logging program KLog - El programa libre de log de radioaficionados Quit Setup Salir Setup is not complete yet. Are you sure you want to quit setup? La configuración no está completa. ¿Está seguro de querer salir de la configuración? StatisticsWidget QSO per year QSO por año DXCC per year Entidades DXCC por año CQ zones per year Zonas CQ por año QSO per band QSOs por banda QSO per mode QSOs por modo QSO per DXCC QSOs por DXCC QSO per Continent QSO por Continente QSO per hour QSOs por hora QSO per month QSO por mes Worked / Confirmed status Estado Trabajado / Confirmado Worked / Sent status Estado Trabajado / Enviado Sent / Confirmed status Estado Enviado / Confirmado StatsCQZPerYearBarChartWidget CQ Zones per year Zonas CQ por año Reading data ... Leyendo datos ... Abort reading Cancelar lectura CQ zones Zonas CQ CQ zones per year Zonas CQ por año Reading data ... Leyendo datos ... Years: %1/%2 Años: %1/%2 StatsEntitiesPerYearBarChartWidget Chart title Título del gráfico Reading data ... Leyendo datos ... Abort reading Cancelar lectura DXCC Entities Entidades DXCC DXCC Entities per year Entidades DXCC por año Reading data ... Leyendo datos ... Entities: Entidades: StatsQSOsPerBandBarChartWidget QSOs per band QSOs por banda Reading data ... Leyendo datos ... Abort reading Cancelar lectura Bands Bandas QSO per band distribution Distribubución de QSO por banda Reading data ... Leyendo datos ... Bands: Bandas: StatsQSOsPerContinentBarChartWidget QSOs per continent QSOs por continente Reading data ... Leyendo datos ... Abort reading Cancelar lectura Continents Continentes Reading data ... Leyendo datos ... Hours: Horas: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSOs por DXCC Reading data ... Leyendo datos ... Abort reading Cancelar lectura Reading data... Leyendo datos ... Entity: Entidad: DXCC DXCC Top ten DXCC per QSO Top 10 de DXCC por QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSOs por hora Reading data ... Leyendo datos ... Abort reading Cancelar lectura Hours Horas QSOs at hour QSO por hora Reading data ... Leyendo datos ... Hours: Horas: StatsQSOsPerModeBarChartWidget QSOs per mode QSOs por modo Reading data ... Leyendo datos ... Abort reading Cancelar lectura Modes Modos QSO per mode distribution Distribución QSO por modo Reading data ... Leyendo datos ... Modes: Modos: StatsQSOsPerMonthBarChartWidget QSOs per month QSOs por mes Reading data ... Leyendo datos ... Abort reading Cancelar lectura Jan Ene Feb Feb Mar Mar Apr Abr May May Jun Jun Jul Jul Ago Ago Sep Sep Oct Oct Nov Nov Dec Dic Aug Ago Months Meses QSOs at Month QSOs en mes Reading data ... Leyendo datos ... Months: Meses: StatsQSOsPerYearBarChartWidget Chart title Título del gráfico Reading data ... Leyendo datos ... Abort reading Cancelar lectura QSOs QSOs QSOs per year QSOs por año Reading data ... Leyendo datos ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Enviado - %1 Confirmed - %2 Confirmado - %2 StatsWorkedConfirmedPieChartWidget Worked - %1 Trabajado - %1 Worked, not confirmed - %1 Trabajados, no confirmados - %1 Confirmed - %2 Confirmado - %2 StatsWorkedSentPieChartWidget Worked - %1 Trabajado - %1 Sent - %2 Enviado - %2 UpdateSatsData Reading Satellites data file... Leyendo fichero de datos satélites ... Abort reading Cancelar lectura The Satellites information has been updated. Se ha actualizado la información de los satélites. Open File Abrir fichero Sat Data Datos de satélites World Entity Entidad Continent Continente Abort reading Cancelar lectura Reading cty.csv... Leyendo cty.csv... eLogClubLog Host not found! ¡Máquina no encontrada! Timeout error! ¡Error de tiempo excedido! KLog - ClubLog KLog - clublog KLog - ClubLog Undefined error... Error no definido... Callsign missing Falta indicativo Invalid callsign Indicativo no válido Skipping SWL callsign Saltando indicativo SWL Callsign is your own call Callsign is your ow call El indicativo es su propio indicativo Invalid callsign with no DXCC mapping Indicativo no válido sin correspondencia con DXCC Updated QSO QSO actualizado Invalid ADIF record Registro ADIF no válido Missing ADIF record Falta registro ADIF Test mode - parameters ok, no action taken Modo Test - parámetros OK, sin acción It seems to be a PASSWORD ERROR; check your password. Parece haber un error de contraseña, revísela. It seems that your ClubLog password is not correct. Parece que su contraseña de ClubLog no es correcta. Please check your password in the setup. ClubLog uploads will be disabled. Revise su contraseña en las preferencias. Se deshabilitará la sincronización con ClubLog. Excessive API Usage Uso excesivo de API Internal Error Error interno Rejected Rechazado QSO Duplicate QSO duplicado QSO Modified QSO modificado Missing Login Falta login QSO OK QSO OK Upload denied Subida rechazada No callsign selected No se seleccionó indicativo No match found Sin coincidencia Dropped QSO QSO eliminado OK OK Login rejected Login rechazado Rejected: Callsign is your own call Rechazado: El indicativo es su propio indicativo klog-0.9.8.1/translations/klog_ja.ts0000644000175000017500000073247113532572307016327 0ustar develdevel AboutDialog About KLog KLogについて You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. バグレポートやちょっとしたコードを書いて送ってくれたり、他にもアイデアとか KLog をよりよくするとあなたが思うことを何でも送ってくれることで手助けとなります. Authors 作者 By Please know that this is an BETA release and it may contain many bugs.<br>Backup your data before using this software! このリリースはまだベータバージョンで、多くのバグを含んでいる可能性があります.<br>このソフトウェアを使い始める前に、まずデータのバックアップを取ってください! Author 作者 KLog has been fully rewritten from the 0.6.2 to be able to provide a cross-platform application that runs in the main operating systems (Linux, macOS & Windows) and provide new functionalities that KLog was not providing. KLogは主要なオペレーティングシステム (Linux mac OS & Windows)上でクロスプラットフォーム実行が可能なように、また以前のKLogに備わっていなかった新機能を提供するために、バージョン0.6.2以降、大幅に書き換えられました. KLog is a free logbook for hamradio operators. KLogはアマチュア無線家のためのフリーなログソフトです. Please provide your review in KLog's eHam review page: eHamのレビューページにKLogのレビューをぜひ投稿してください: Find more information and the latest release at より詳しい情報や、最新のリリースは以下の場所で入手できます.<br> today 現在 Main developer メイン開発者 KLog is developed by a very small team and you are invited to join! KLogはとても小さなチームによって開発されており、あなたの参加が望まれています! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account user's needs ユーザーの需要を考慮した開発の方向性を定めるために、どのバージョンがどれくらいインストールされたかを知るという目的に限定してユーザー情報をKLogサーバーに送信する機能が取り込まれました. At present, the data that is provided is the following: 今のところ、提供いただく情報は以下のものです: Be aware that you can enable/disable this feature from the Misc tab in the Setup page この機能は「設定」ページの「その他」タブで、有効・無効を切り替えることができます Translators bring KLog into your language. They are really an important part of the KLog development team. 翻訳者はKLogをあなたの言語で使えるようにします. 翻訳者はKLog開発チームの中でもとりわけ重要な役割を担います. If you want to provide support you are welcome to join the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Translators 翻訳者 Privacy advisory プライバシーについての勧告 Callsign コールサイン KLog version KLogのバージョン Operating system OSの情報 KLog Privacy プライバシー BarChartStats Abort reading 読込みの中止 QSOs QSO総数 Bands バンド Modes モード CTYPage Country data download エンティティーデータのダウンロード KLog needs country data... KLogではエンティティーデータを利用します... &Download ダウンロード(&D) &Ignore 無視(&I) Country data needed エンティティデータが必要です KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC information. KLogはDXCC情報取得のため、http://www.country-files.com/ で配布される cty.csv ファイルを利用します. You need to download the cty.csv file if you want KLog to show you the countries, locator, ... of the QSOs you do. あなたが交信したQSOのエンティティやグリッドロケーターを表示させるには、cty.csvファイルをダウンロードする必要があります. Click on Download to download now. ダウンロードを開始するために、「ダウンロード」ボタンをクリックしてください. KLog I can't find the host. Please check your network and try again Do you want to try again? 接続先が見つかりません. ネットワーク接続を確認して、再度トライしてみてください. もう一度行いますか? DXCCStatusWidget Update 更新 ID Entity エンティティ Pref: CQ: ITU: Beam: Entity not worked in this band. DXClusterWidget Click on Connect to connect to the DX-Cluster server 接続ボタンをクリックするとDXクラスターに接続します。 Connect 接続 Clear クリア Click on connect to connect to the DX-Cluster 接続ボタンをクリックするとDXクラスターに接続します。 Trying to connect to the server サーバーに接続しています KLog DXCluster KLog DXクラスター The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. 接続できませんでした。DXクラスターが稼働していることを確かめてください。また、ホスト名、ポート番号の設定が正しいことを確認してください。 The following error occurred: %1. 次のエラーが発生しました: %1 Connected to server サーバーに接続しました。 KLog message KLog メッセージ Enter your callsign to connect to the cluster: DXクラスターに接続するためのコールサインを入力してください: Enter your password to connect to the cluster: (Just hit enter for no password) DXクラスターに接続するためのパスワードを入力してください。 (カラのパスワードについてはエンターだけ押してください。) Not logged on, you may need to enter your callsign again. ログオンしていません. もう一度、コールサインを入力してみてください. Enter here the commands to be sent to the DX-Cluster server. Disconnect 切断 The host was not found. Please check: - your network connection; - the host name and port settings. Connection closed by the server サーバーによって接続が切られました。 Click on Connect to connect to the DX-Cluster server. Send 送信 DataProxy_SQLite Software version in DB is null No query failed Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Sporadic E Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Terrestrial or atmospheric repeater or transponder Rain scatter Common term in hamradio, do not translate if not sure Satellite サテライト通信 Bureau Common term in hamradio, do not translate if not sure Manager Common term in hamradio, do not translate if not sure All QSOs have been updated with a DXCC and the Continent. Field Aligned Irregularities Common term in hamradio, do not translate if not sure F2 Reflection Common term in hamradio, do not translate if not sure Trans-equatorial Common term in hamradio, do not translate if not sure Tropospheric ducting Common term in hamradio, do not translate if not sure Yes No Requested Ignore/Invalid Validated Queued Uploaded Do not upload Modified Direct ダイレクト Electronic KLog DXCC DownLoadCTY Download of cty.csv failed with the following error code: cty.csv のダウンロード、失敗. エラーコード: Download of cty.csv done. cty.csv のダウンロード、完了. There is already a cty.csv file in the folder but it will be replaced with the new one. フォルダーにすでに cty.csv ファイルがありますが、最新のもので置き換えます. Could not open %1 for writing FileManager Writing ADIF file... ADIFファイルを書き込んでいます... Abort writing 書込みの中止 Writing ADIF file... QSO: ADIFファイルを書き込んでいます... QSO: Writing Cabrillo file... Cabrilloファイルを書き込んでいます... KLog: Cabrillo Log Export not implemented KLog: Cabrillo Log Exportは未実装 I am sorry but the Cabrillo Export To File feature has still not been implemented. 申し訳ありません. Cabrillo形式ログのエクスポート機能はまだ実装されていません. You have canceled the file export. The file will be removed and no data will be exported. ファイルのエクスポートが中断されました. 出力先のファイルは削除され、データはエクスポートされません. No station callsign has been selected and therefore no log will be exported Do you still want to cancel? 本当に中止しますか? QSO: Reading ADIF file... ADIFファイルを読みこんでいます... Abort reading 読込みの中止 The log that you have selected contains more than just one station callsign. Station Callsign: Define Station Callsign You have selected no callsign. KLog will export QSOs without a station callsign defined and those with the call you are entering here. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Exporting LoTW ADIF file... Reading LoTW file... This QSO is not including the minimum data to consider a QSO as valid!. Please edit the ADIF file and make sure that it include at least: and This QSO had: Do you want to continue with the current file? This log seems to lack of RST-TX information. Click on Yes to add a default 59 to all QSO with a similar problem. If you select NO, the QSO may not be imported. This log seems to lack of RST-RX information. - The band missing and the following call: There is more than one log in this logfile. All logs will be imported into the current log. Do you want to continue? Importing ADIF file... You have cancelled the file import. The file will be removed and no data will be imported. It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Please select the station callsign you want to export the log from: - The call missing but was done at this time: - The mode missing and the following call: - The date missing and the following call: - The time missing and the following call: KLog: Not all required data found! KLog; データの不足が見つかりました! KLog: No RST TX found! KLog: RST TXが見つかりません! KLog: No RST RX found! KLog: RST RXが見つかりません! InfoWidget 10M 15M 20M 40M 80M 160M 2M 6M 12M 17M 30M 70CM Continent 大陸名 Prefix プリフィクス CQ ITU Short Path ショートパス Long Path ロングパス Deg Miles マイル Km IntroPage Welcome to KLog! KLogにようこそ! Welcome to KLog! - brought to you under the terms of the GPL! ようこそ、KLogに! - GPL条項にもとづいてお届けします! Welcome to KLog KLog にようこそ <html><head> <title>KLogにようこそ</title> </head><body> <p>このコンピューターでKLogを実行するのは初めてのようです.</p> <p>KLogは、Linux, mac OSやWindowsで実行可能なフリーなアマチュア無線用ロギングソフトウェアです. DXやコンテストでのロギングなど、一般的な使用方法でお使いいただけるようデザインされています.</p> <p>ADIF形式やCabrillo形式でのデータのインポート、エクスポート、またQSLカードの管理など、多くの機能をサポートしています.</p> <p>KLogをスタートする前に、以下の質問にお答えください. <ul> <li>ライセンス条項への同意</li> <li>KLogの実行方法の設定</li> <li>コールサイン、CQゾーン、その他、多くの設定項目</li> </ul> </p> <p>KLogをお楽しみください. ご提案などがあれば、開発チームにご連絡ください.</p> <p><h3>73 de EA4TV</h3></p> </body></html> This looks like it's the first time you've run KLog on this computer. このコンピューターでKLogを実行するのは初めてのようです. KLog is a free hamradio logging program that can run on Linux macOS and Windows. KLogは、Linux, mac OSやWindowsで実行可能なフリーなアマチュア無線用ロギングソフトウェアです. It is designed to provide general purpose, DX and contest logging. DXやコンテストでのロギングなど、汎用な使い方ができるようデザインされています. It supports QSL management, import and export of ADIF ADIF形式やCabrillo形式でのデータのインポート、エクスポート、 and Cabrillo file formats and many other features... またQSLカードの管理など、多くの機能をサポートしています... Before you can start using KLog, you will be asked to: KLogを使い始める前に、以下の質問にお答えください: Acknowledge to the terms of the license. ライセンス条項への同意. Download the DX entities information. ライセンス条項への同意 Enter your callsign, CQ zone, etc. and main configuration. コールサイン、CQゾーン、その他、多くの設定項目 Enjoy KLog and contact the development team if you have any suggestions! KLogをお楽しみください. ご提案などがあれば、開発チームにご連絡ください! LicPage KLog License information KLogライセンス情報 Welcome to KLog!- brought to you under the terms of the GPL! ようこそ、KLogに! - GPL条項にもとづいてお届けします! Acknowledge 同意します Be aware that KLog is free software. KLogはフリーソフトウェアです. LogModel Date 日付 Time 時刻 QRZ コールサイン Band バンド Mode モード RSTtx 送信RST RSTrx 受信RST Comment コメント LogWindow QSL Send QSLカードの送付 QSL Rcvd QSL受領状況 &Delete 削除(&D) Delete a QSO QSOのレコードを削除します &Edit QSO QSOの編集(&E) Edit this QSO QSOのレコードを編集します Via &bureau ビューロー経由(&b) Send this QSL via bureau QSLカードをビューロー経由で送ります D&irect ダイレクト(&i) Send this QSL via direct QSLカードをダイレクトで送ります Via bureau ビューロー経由 QSL &received via bureau QSLカードをビューロー経由で受け取りました。(&r) Direct ダイレクト QSL received via direc&t QSLカードをダイレクトで受け取りました。(&t) You have requested to delete this QSO. このQSOを削除しようとしています。 Are you sure? 本当に削除しますか? MainWindow Recalculate Click to recalculate the award status. Starting KLog &Add &Clear クリア(&C) Status bar... DX Entity &Log Window &Score Window Watts MHz KLog Annual Ready An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: You have selected an entity: that is different from the KLog proposed entity: Click on the prefix of the correct entity or Cancel to edit the QSO again. Click on the prefix of the right entity or Cancel to correct. QRZ of the QSO. TX RST. RX RST. TX Exchange. Band of the QSO. Mode of the QSO. Date of the QSO. Time of the QSO. Add the QSO to the log. Clear the box. Input RSTrx 受信RST RSTtx 送信RST QRZ コールサイン STX SRX NEW MULT Invalid characters used in the QRZ Ready... &File &New... &Open... &Import from ADIF... Import an ADIF file into the current log. &Save As... Export to ADIF... Export the current log to an ADIF logfile. Export all logs to ADIF... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Export Requested QSL to ADIF... Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a QSL tag printing program). Export ADIF for LoTW... Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before uploading to LoTW! &Print Log... Print your log. KLog folder Opens the data folder of KLog. E&xit &Tools Fill in QSO data Go through the log reusing previous QSOs to fill missing information in other QSOs. Fill in DXCC data Go through the log filling QSOs without a DXCC defined. QSL tools... &Find QSO to QSL Shows QSOs for which you should send your QSL and request the DX QSL. Find My-QSLs pending to send Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! &Find DX-QSLs pending to receive Shows the DX-QSL that has been requested or QSLs has been sent with no answer. &Find requested pending to receive Shows the DX-QSL that has been requested. LoTW tools... Queue all QSL to be sent of this log Mark all non sent QSOs in this log as queued to be uploaded. Queue all QSL to be sent Mark all non sent QSOs as queued to be uploaded. Mark as sent all queued QSO of this log Mark all queued QSOs in this log as sent to LoTW. Mark all queued QSO as sent Mark all queued QSOs as sent to LoTW. &Update cty.csv For updated DX-Entity data, update cty.csv. &Update Satellite Data Stats Show the statistics of your radio activity. &Setup &Setup... &Help Check updates... &About... About Qt... KLog LoTW All pending QSO of this log has been marked as queued for LoTW! Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. There was a problem to mark all pending QSO of this log as queued for LoTW! All pending QSO has been marked as queued for LoTW! The log that you have selected contains more than just one station callsign. Please select the station callsign you want to mark as sent to LoTW: Station Callsign: Define Station Callsign You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the call you are entering here. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: No station callsign has been selected and therefore no log will be marked All queued QSO of this log has been marked as sent for LoTW! There was a problem to mark all queued QSO of this log as sent for LoTW! All queued QSO has been marked as sent to LoTW! There was a problem to mark all queued QSO of this log as sent to LoTW! About... KLog update checking result Congratulations! おめでとうございます! You already have the latest version. 最新のバージョンを入手しました. Nothing has been saved. You have to select a valid file type. Save File ファイルに保存 ADIF file Cabrillo files Any file You can find the KLog data folder here: DUPE start stop It seems that there are no QSO in the database. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. TX Frequency in MHz. RX Frequency in MHz. Power used by the DX. Logging operator's callsign. ログを記入したオペレーターのコールサイン Callsign used over the air. 交信に用いたコールサイン My QTH locator. 自局QTHのグリッドロケーター Name of the DX. QTH of the DX. Locator of the DX. Filling DXCC in QSOs... QSO: TX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. Frequency is not in a hamradio band! QSO logged from WSJT-X: RX Exchange. The logfile has been modified. Do you want to save your changes? UDP Server error The UDP server failed to %1. start or stop Clears the QSO entry. Number of confirmed DXCC entities. Number of worked DXCC entities. Number of confirmed WAZ zones. Number of worked WAZ zones. Number of confirmed local references. Number of worked local references. Number of confirmed QSOs. Number of worked QSOs. Number of QSOs worked on the selected year. Number of DXCC worked on the selected year. Number of CQ Zones worked on the selected year. Score for the DXMarathon on the selected year. Select the year you want to check. Status of the DX entity. Name of the DX entity. Name QTH Locator Power(rx) RST(tx) RST(rx) Freq TX Freq RX QSO QSL eQSL Comment コメント Others My Data 自局の情報 Satellite サテライト通信 QSOs QSO総数 DXCC CQ Score DX-Marathon Info Award Confirmed コンファーム済 Worked WAZ Local Awards Search Log DX-Cluster DXクラスター Save ADIF File LoTW logfile has been properly exported! Remember to: Before uploading: sign the LoTW log; and After uploading: mark as sent all the queued QSO (LoTW Tools). There was no QSO to be exported. If you think that some QSO should have been exported, please look for them and ensure that the eQSL LoTW QSL sent box is marked as: Q - Queued There was an error while exporting the LoTW. The log has not been exported! Save Cabrillo File Open File ファイルを開く &Modify - Needed for DXMarathon Filling QSOs... Abort filling Number Date 日付 Time 時刻 Band バンド Mode モード Print Log Printing the log... Abort printing Printing the log... QSO: KLog QSO received The following QSO data has been received from WSJT-X to be logged: Call Freq Time On Time Off RST TX RST RX DX-Grid Comments コメント TX Pwr Operator オペレーター Local-Grid If the received mode is correct, please contact KLog development team and request support for that mode Do you want to keep receiving this alerts? (disabling this alerts will prevent that non-valid modes are detected) A new mode not supported by KLog has been received from an external software or radio: A duplicated satellite has been detected in the file and will not be imported. Please check the satellite information file and ensure it is properly populated. Now you will see a more detailed error that can be used for debugging... An unexpected error ocurred!! If the problem persists, please contact the developers for analysis: Error in function Error code Error text Failed query Recomendation: Export, periodically, your data to ADIF to prevent a potential data loss. Do you want to keep showing errors? MainWindowInputComment Add a comment for this QSO. MainWindowInputEQSL Date of the ClubLog upload. ClubLogにアップロードした日付 Date of the eQSL sending. eQSLを送付した日付 Date of the eQSL reception. eQSLを受領した日付 Date of the LoTW sending. Date of the LoTW reception. Status of the LoTW sending. Status of the LoTW reception. LoTW Sent LoTW Rec Status on ClubLog. ClubLogの状況 Status of the eQSL sending. eQSLの送付状況 Status of the eQSL reception. eQSLの受領状況 ClubLog eQSL Sent eQSL送付 eQSL Rec eQSL受領 MainWindowInputOthers Primary Div Secondary Div IOTA Entity エンティティ Propagation mode 伝播モード Select the primary division for this QSO. Select the secondary division for this QSO. Select the entity for this QSO. Select the propagation mode for this QSO. Select the IOTA continent for this QSO. Select the IOTA reference number for this QSO. Not Identified 不明 Not - Not Identified Not - 不明 MainWindowInputQSL QSL Sent QSL送付 QSL Rec QSL受領 QSL Via QSL Msg Status of the QSL sending. QSLカードの送付状況 Status of the QSL reception. QSLカードの受領状況 QSL sending information. QSLカードの送付先の情報 QSL reception information. QSLカードの受領元の情報 Date of the QSL sending. QSLカードを送付した日付 Date of the QSL reception. QSLカードを受領した日付 Message of the QSL. QSLカードのメッセージ QSL via information. QSLカード経由先などの情報 MainWindowMyDataTab Watt W Keep this data このデータを保持 Data entered in this tab will be copied into the next QSO. Power used for the QSO in watts. Logging operator's callsign. ログを記入したオペレーターのコールサイン Callsign used over the air. 交信に用いたコールサイン My QTH locator. 自局QTHのグリッドロケーター Power 送信出力 Operator オペレーター Station Callsign 無線局のコールサイン My Locator 自局のグリッドロケーター MainWindowSatTab Keep this data このデータを保持 Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Satellite mode used. Select the satellite you are using. UpLink band. DownLink band. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. UpLink アップリンク DownLink ダウンリンク Satellite サテライト通信 Mode モード DX Locator Other その他 MHz Not Sat QSO 衛星QSOではない KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. 識別不可能な衛星の名称が入力されているのを発見しました. 別の名称でも呼ばれており、その名称がリストにあるならば、その名称を使ってください. もしくは開発チームにこの新しい衛星の名称を加えるよう連絡してください. Please know that the satellite name will not be saved if it is not in the list so that information may be lost! リストにない衛星の名称は保存できません. したがって情報が失われてしまうことをご承知おきください! Other - Sat not in the list その他、リストにない衛星 Data entered in this tab will be copied into the next QSO. The satellite you have in your QSO is: QSO情報に記録された衛星の名称は以下のものです: QObject Database Error データベース エラー KLog DB needs to be upgraded. KLog DBを更新する必要があります. Do you want to upgrade it now? いま更新しますか? If DB is not upgraded KLog may not work properly. DBを更新しないとKLogは正しく動作しない可能性があります. KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. DBの中に以前のバージョンのログを発見しました。すべてのデータを新しく作成されるDXタイプのログに移行します。 KLog: Enter Station callsign KLog: 無線局のコールサインを入力してください Enter the station callsign used in this log このログで使用する無線局のコールサインを入力してください Station Callsign 無線局のコールサイン All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is OK. すべてのデータが正しく移行できました. メニューのSetup->Preferences->Logsから、問題ないことを確認してください. QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? 更新を中止するとデータに矛盾が生じたり、データが失われる可能性があります.  更新を中止しますか? Progress: 進捗状況: Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... Updating mode information... モードの情報を更新しています... Abort updating 更新の中止 Updating bands information... バンドの情報を更新しています... Updating bands information in %1 status... %1 用のバンドの情報を更新しています... Updating mode information in %1 status... %1 用のモードの情報を更新しています... New One, work it! New Oneです. 交信すべし! Needed, work it! 交信すべし! Worked but not confirmed 交信済だけど未コンファーム Confirmed コンファーム済 Not identified 不明 Install wizard was canceled before completing... インストールウィザードは操作完了前に中断されました... Do you want to remove the KLog dir from your disk? KLog ディレクトリーをディスクドライブから削除しますか? Your KLog dir has been removed KLog ディレクトリは削除されました I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. KLog ディレクトリーが削除できませんでした. ハードディスクから削除したい場合は手動で削除してください. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. KLog ディレクトリーが削除できませんでした. ハードディスクから削除したい場合は手動で削除してください. Remember that your KLog dir is on your system... KLog ディレクトリーはシステム中に残ったままです... Thank you for running KLog! KLogを使用してくださりありがとうございます! Updating DXCC and Continent information... SearchWidget &Clear クリア(&C) &Select All すべて選択(&S) &Search 検索(&S) All すべてのログ &Export Highlighted 選択した項目をエクスポート(&E) Clear the searches. 検索結果をクリアします. Export the search result to an ADIF file. 検索結果をADIFファイルにエクスポートします. Select/Unselect all the QSOs shown. 表示されたQSOすべてを選択・選択解除します. Search in the log. ログを検索します. Search in all logs. すべてのログを検索します. Enter the QRZ to search for. 検索するコールサインを入力してください. Search results. 検索結果. QRZ コールサイン Date/Time 日付/時刻 Band バンド Mode モード QSL Sent QSL送付 QSL Rcvd QSL受領状況 Station Callsign 無線局のコールサイン ID &Clear selection 選択をクリア(&C) Save File ファイルに保存 QSL Send QSLカードの送付 &Delete 削除(&D) Delete a QSO QSOのレコードを削除します &Edit QSO QSOの編集(&E) Edit this QSO QSOのレコードを編集します Via &bureau ビューロー経由(&b) Send this QSL via bureau QSLカードをビューロー経由で送ります D&irect ダイレクト(&i) Send this QSL via direct QSLカードをダイレクトで送ります &Request my QSL 自分のQSLカードがリクエストされた (&R) Mark my QSL as requested QSLカードがリクエストされているとマークします Via Direct && mark DX QSL as requested ダイレクトで送付、相手局にリクエスト Send this QSL via direct & mark DX QSL as requested QSLカードをダイレクトで送ったこと、および相手のQSLカードにリクエストのマークをします Via Bureau && mark DX QSL as requested ビューロー経由で送付、相手局にリクエスト Send this QSL via bureau & mark DX QSL as requested QSLカードをビューロー経由で送ったこと、および相手のQSLカードにリクエストのマークをします &Request the QSL QSLカードがリクエストされた (&R) Mark the QSL as requested QSLカードがリクエストされていることをマークします Via bureau && mark my QSL as requested ビューロー経由で受領 && 自分のQSLはリクエスト QSL received via bureau & mark my QSL as requested QSLカードをビューロー経由で受け取ったこと、および自分のQSLカードがリクエストされていることをマークします Via bureau ビューロー経由 QSL received via bureau QSLカードをビューロー経由で受け取りました Direc&t && mark as my QSL requested ダイレクトを受領、QSLカードがリクエストされた (&t) QSL received via direct & mark my QSL as requested QSLカードをダイレクトで受け取ったこと、および自分のQSLカードがリクエストされていることをマークします Direc&t ダイレクト(&t) QSL received via direct QSLカードをダイレクトで受け取りました You have requested to delete the QSO with: %1 Are you sure? 本当に削除しますか? Needed QSO to send the QSL QSLカード送付の必要があるQSO My QSL requested to be sent 自分のQSLカードがリクエストされている DX QSL pending to be received 相手局のQSLカードをまだ受け取っていない SetupDialog My Data 自局の情報 Bands/Modes バンドとモード DX-Cluster DXクラスター Colors 表示色 Misc その他 World Editor ワールドエディター Logs ログ Satellites HamLib Cancel キャンセル OK Config Dialog 設定 User data ユーザー情報 D&X-Cluster D&Xクラスター ClubLog WSJT-X You need to enter at least one log in the Logs tab. 「ログ」タブで少なくともひとつログを入力してください. World ワールド Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Go to the User tab and enter valid QRZ. You need to enter at least a valid QRZ. 少なくともひとつ適切なコールサインを入力してください. DB has not been moved to new path DBは新しいパスに移動されていません You have not selected the kind of log you want. ログの種類が選択されていません. You will be redirected to the Log tab. Please add and select the kind of log you want to use. この後、「ログ」タブに誘導されます. 使用したいログの種類を選択・追加してください. SetupEntityDialog Entity エンティティ CQ ITU Latitude 緯度 Longitude 経度 UTC Main prefix 主なプリフィクス ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... その他の使用される可能性のあるプリフィクスをコンマで区切って入力. 例 JA1, JA2,... Prefixes その他のプリフィクス Name of the Entity. CQ zone. ITU zone. Longitude of the Entity. Local time difference to UTC. Main prefix of the entity. ARRL ID. Date of the deletion. Deleted 消滅 Cancel キャンセル OK Entity Dialog エンティティ設定ウィンドウ SetupPageBandMode Bands バンド Modes モード SetupPageClubLog &Callsign コールサイン(&C) ClubLog &password ClubLogパスワード(&p) ClubLog &email ClubLog &email Enter the email you used to register in ClubLog. ClubLogに登録したemailを入力してください. Enter the callsign you used to register in ClubLog. ClubLogに登録したコールサインを入力してください. Enter your password in ClubLog. ClubLogのパスワードを入力してください. &Send QSOs in real time QSOデータをリアルタイムで送信(&S) &Activate ClubLog ClubLogサポート機能を使う(&A) Use QSO Station &Callsign QSOの際のコールサインを使用(&C) Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Starts the ClubLog support in KLog. Use the Station Callsign defined in each QSO instead of the one defined here. SetupPageColors New One Needed in this band このバンドで未交信 Worked in this band このバンドで交信済 Confirmed in this band このバンドでコンファーム済 Default デフォルト Choose a color 色の選択 SetupPageDxCluster Add 追加 Delete 削除 Show &HF spots Show HF spots &HFスポット情報を表示 Show V/&UHF spots Show V/UHF spots V/&UHFスポット情報を表示 Show W&ARC spots Show WARC spots W&ARCスポット情報を表示 Show &worked spots Show worked spots 交信済のスポット情報を表示(&w) Show &confirmed spots Show confirmed spots コンファーム済のスポット情報を表示(&c) Show ANN/&FULL messages Show ANN/FULL messages ANN/&FULLメッセージを表示 Show WW&V messages Show WWV messages WW&Vメッセージを表示 Show WC&Y messages Show WCY messages WC&Yメッセージを表示 DX Spots DXスポット Messages メッセージ KLog: Add a DXCluster server KLog: DXクラスターサーバーを追加 Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: アドレスとポート番号を指定 例: dxfun.com: 8000 ポート番号の指定がないときは、デフォルトで41112を使用 SetupPageHamLib Activate HamLib Activates the hamlib support that will enable the connection to a radio. Radio Select your rig. Defines the interval to pool the radio in msecs. Pool interval Port Select the serial port. Only the serial ports that are detected are shown. Scan Click to identify the serial ports available in your computer. Bauds Select the serial port speed. 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None Hardware Software XON/XOFF Flow control Select the serial flow control No parity Even Odd Space Mark Parity Select the serial parity. 1 bit 1.5 bits 2 bits Stop bits Select the serial stop bits. SetupPageLogs &New New 新規ログ(&N) &Edit 編集(&E) &Remove 削除(&R) KLog Do you really want to remove this log? このログを本当に削除しますか? All the QSOs from this log will be also deleted... このログに含まれるすべてのQSOデータが削除されます... Operators An error has occurred showing the following error code: 次のエラーコードが発生しました: Log has not been removed. (#3) ログが削除されませんでした(#3) Log has not been removed. (#2) ログが削除されませんでした(#2) Log has not been removed. (#1) ログが削除されませんでした(#1) KLog - SetupPageLogs Date 日付 Add a new log. Edit the selected log. Remove the selected log. Select the log you want to open. ID Station Callsign 無線局のコールサイン Comments コメント Type タイプ SetupPageLogsNew &Ok &Cancel キャンセル(&C) Select categories カテゴリーの選択 &Date 日付(&D) &Station Callsign 無線局のコールサイン(&S) &Operators オペレーター(&O) Comm&ent コメント(&e) Callsign used for this log. Comma separated list of operators: callsign1, callsign2. コンマで区切られたオペレーターのリスト: callsign1, callsign2. {1,?} Start date of this log. Add a comment about this log. &Type of Operation 運用のタイプ(&T) Select the kind of operation for this log. &Mode Category モードカテゴリー(&M) Select the mode category. O&perators Category オペレーターカテゴリー(&p) Select the operators category. &Assisted Category アシステッドカテゴリー(&A) Select the assisted category. Po&wer Category 送信出力カテゴリー(&w) Select the power category. &Bands Category バンドカテゴリー(&B) Select the bands category. O&verlay オーバーレイ(&v) Select the Overlay category. Categories not OK 不適切なカテゴリー選択 You need to enter a valid QRZ in the Station Callsign box. The log will not be opened. 無線局のコールサイン欄に適切なコールサインを入力してください。 ログは作成されません。 You selected an invalid combination. The log will not be opened. 適切な組み合わせが選択されていません。 ログは作成されません。 Categories OK 適切なカテゴリー選択 SetupPageMisc &Imperial system Imperial system インチ・ヤード表記(&I) &Log in real time Log in real time 現在時刻でログを記録(&L) &Time in UTC Time in UTC 時刻のUTC表記(&T) &Save ADIF on exit Save ADIF on exit 終了時にADIFを保存(&S) Use this &default filename Use this default filename 次のデフォルトのファイル名を使用(&d) Mark &QSO to send QSL when QSL is received Mark QSO to send QSL when QSL is received &QSLカード受領時に発送にマークする Complete QSO with previous data 以前のデータを使ってQSOの項目を埋める Manage DX-Marathon Check it for Imperial system (Miles instead of Kilometers). Select to use the following name for the logfile without being asked for it again. ログファイルには次のファイル名を用い、以後、尋ねられないようにするには、チェックをいれてください. Select if you want to manage DX-Marathon. This is the default file where ADIF data will be saved. ADIF形式でファイルを保存するときのデフォルトのファイル名. Please specify an existing directory where the database (logbook.dat) will be saved. データベース (logbook.dat) が保存される既存のディレクトリーを指定してください. The search box will show also the callsign on the air to do the QSO. 検索結果にそのQSOのときに使用したコールサインもあわせて表示します All the data from the My Data tab will be used or data from the previous QSO will be maintained. チェックすれば自局のデータ欄の情報で上書きします。チェックしなければ直前のQSOのときの情報を保持します。 If new version checking is selected, KLog will send the developer your callsign, KLog version & Operating system to help in improving KLog. 新しいバージョンのチェックを選択している場合、KLogは改良の手助けとなる情報(コールサイン、KLogのバージョン、OSの種類)を開発者に送信します. Show the Station &Callsign used in the search box 検索結果に使用した無線局のコールサインも表示する(&C) &Check for new versions automatically 新しいバージョンを自動でチェックする (&C) QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. 相手局のQSLカードを受領して、かつ自分のQSLカードを送付していなければ、QSLカードの送付待ちとしてマークをします. Check if there is a new release of KLog available every time you start KLog. KLogの起動時に新しいバージョンがリリースされているかをチェックします. &Provide Info for statistics 統計情報を提供する (&P) &Reset to My Data for all QSOs すべてQSOに自局のデータを設定(&R) Move DB DBを移動 Select to use real time. 現在時刻のログ記入を行う場合、チェックをいれてください Select to use UTC time. 時刻のUTC表記を行う場合、チェックを入れてください Select if you want to save to ADIF on exit. 終了時にADIF形式で保存したい場合、チェックをいれてください Complete the current QSO with previous QSO data. 現在のQSOの各項目を埋めるのに、以前のQSOのデータを使用します. This is the directory where the database (logbook.dat) will be saved. このディレクトリーにデータベース (logbook.dat) が保存されます. Click to change the path of the database. データベースのパスを変更するにはクリック. This is the directory where DB (logbook.dat) will be saved. このディレクトリーにDB (logbook.dat) が保存されます. Click to change the default ADIF file. デフォルトのADIFファイルを変更するにはクリックしてください. Click to move the DB to the new directory. DBを新しいディレクトリーに移動するにはクリックしてください. Select Directory ディレクトリーを選択 File moved ファイルを移動しました File copied ファイルをコピーしました File NOT copied ファイルがコピーされませんでした The target directory does not exist. Please select an existing directory. 移動先のディレクトリーが存在しません. 既存のディレクトリーを指定してください. Browse 参照 Open File ファイルを開く SetupPageSats &New 新規ログ(&N) &Edit 編集(&E) &Remove 削除(&R) &Import E&xport Add a new satellite. Edit the selected satellite. Remove the selected satellite. Import a satellites file. It will replace the satellites you have now configured. Export your current satellites to a file. Select the sat you want to open. KLog Do you really want to remove this satellite? This satellite will not be longer available to be selected ... Sat has not been removed. (#3) Sat has not been removed. (#2) Sat has not been removed. (#1) ID Short Name Uplink Downlink Modes モード An error has occurred showing the following error code: 次のエラーコードが発生しました: KLog - SetupPageSats Open Satellites File KLog warning An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Please check the format or contact the developer for analysis with the error code: Save Satellites File SetupPageSatsNew Short name Sat name UpLink アップリンク DownLink ダウンリンク Modes モード &Ok &Cancel キャンセル(&C) Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Enter the name of the satellite. Enter the uplink frequencies in this format: 144.300 Enter the downlink frequencies in this format: 144.300 Enter the modes in this format: USB Some of the data you have entered is not correct, the satellite can't be added. SetupPageUDP Start UDP Server Log automatically QSOs from WSJT-X Allow WSJT-X to send logged QSO to KLog QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will log automatically any QSO coming from WSJT-X without any manual confirmation. Receive and Update QSO data to KLog KLog will automatically show and update data coming from WSJT-X (DX callsign, locator, RPT, ...) Make sure it is the same port where the other programs are sending the data to. Default port is 2237. UDP port number where the UDP Server will listen for packets. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP Port QSO notification timeout (milisecs) Milliseconds that the notification of QSO received from WSJTX will be shown. SetupPageUserDataPage &Personal data Personal data 個人の情報(&P) Station &data Station data 無線局の情報(&d) &Name Name 名前(&N) &Address Address 住所(&A) Cit&y City 市町村(&y) &Zip Code Zip Code 郵便番号(&Z) Pro&v/State Prov/State 厳密にはProv/Stateじゃないですけど 都道府県(&v) Countr&y Country 国(&y) Enter your information for rig リグの情報を入力してください Enter your information for antenna アンテナの情報を入力してください Enter your name. Enter your address - 1st line. Enter your address - 2nd line. Enter your address - 3rd line. Enter your address - 4th line. Enter your city. Enter your zip code. Enter your province or state. Enter your country. Enter your power information. &Rig 1 リグ 1(&R) R&ig 2 リグ 2(&i) Ri&g 3 リグ 3(&g) Antenna &1 アンテナ &1 Antenna &2 アンテナ &2 Antenna &3 アンテナ &3 Po&wer 送信出力(&w) Enter the station callsign that will be used for logging. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. 自局のグリッドロケーターを入力してください. 入力されなければKLogはコールサインの情報をもとにグリッドロケーターを推測して表示します. &QRZ コールサイン(&Q) &Operators オペレーター(&O) &CQ Zone CQゾーン(&C) &ITU Zone ITUゾーン(&I) &Locator グリッドロケーター(&L) &Locator (not valid) グリッドロケーター(不適合)(&L) Enter the operators (comma separated if more than one). オペレーター名を入力してください。(複数の場合はコンマで区切って入力してください。) SetupPageWorldEditor Add 追加 Delete 削除 Edit Export World Import World Still not implemented. Import a new cty.csv file An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. DXCC情報取得のファイル (cty.csv) がKLogフォルダーに見つかりました. ファイルをロードします. No entities information file (cty.csv) has been detected in your KLog folder. DXCC情報取得のファイル (cty.csv) がKLogフォルダーに見つかりません. KLog will not be able to show entities information. KLogはDXCC情報の表示ができません. Prefix プリフィクス Entity エンティティ ARRL ID Continent 大陸名 CQ Zone CQゾーン ITU Zone ITUゾーン UTC Latitude 緯度 Longitude 経度 Deleted 消滅 Since Date 交信有効期間はじめ To Date 交信有効期間おわり Open File ファイルを開く BigCTY (*.csv) Entities information has been updated. DXCC情報が更新されました. Entities information has not been updated. DXCC情報が更新されませんでした. ShowErrorDialog KLog Message SoftwareUpdateDialog Ok KLog update KLogの更新 Congratulations! おめでとうございます! Your KLog has been updated. お使いの KLog は更新されました. You already have the latest version. 最新のバージョンを入手しました. StartWizard KLog - The free hamradio logging program フリーなアマチュア無線用ログソフト KLog Quit Setup 設定の中止 Setup is not complete yet. Are you sure you want to quit setup? 設定は完了していません。本当に設定を中止しますか? StatisticsWidget QSO per year DXCC per year CQ zones per year QSO per band QSO per mode QSO per DXCC QSO per Continent QSO per hour QSO per month Worked / Confirmed status Worked / Sent status Sent / Confirmed status StatsCQZPerYearBarChartWidget CQ Zones per year Reading data ... Abort reading 読込みの中止 CQ zones CQ zones per year Reading data ... Years: %1/%2 StatsEntitiesPerYearBarChartWidget Chart title Reading data ... Abort reading 読込みの中止 DXCC Entities DXCC Entities per year Reading data ... Entities: StatsQSOsPerBandBarChartWidget QSOs per band Reading data ... Abort reading 読込みの中止 Bands バンド QSO per band distribution Reading data ... Bands: StatsQSOsPerContinentBarChartWidget QSOs per continent Reading data ... Abort reading 読込みの中止 Continents Reading data ... Hours: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC Reading data ... Abort reading 読込みの中止 Reading data... Entity: DXCC Top ten DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour Reading data ... Abort reading 読込みの中止 Hours QSOs at hour Reading data ... Hours: StatsQSOsPerModeBarChartWidget QSOs per mode Reading data ... Abort reading 読込みの中止 Modes モード QSO per mode distribution Reading data ... Modes: StatsQSOsPerMonthBarChartWidget QSOs per month Reading data ... Abort reading 読込みの中止 Jan Feb Mar Apr May Jun Jul Sep Oct Nov Dec Aug Months QSOs at Month Reading data ... Months: StatsQSOsPerYearBarChartWidget Chart title Reading data ... Abort reading 読込みの中止 QSOs QSO総数 QSOs per year Reading data ... QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Confirmed - %2 StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Confirmed - %2 StatsWorkedSentPieChartWidget Worked - %1 Sent - %2 UpdateSatsData Reading Satellites data file... Abort reading 読込みの中止 The Satellites information has been updated. Open File ファイルを開く Sat Data World Entity エンティティ Continent 大陸名 Abort reading 読込みの中止 Reading cty.csv... cty.csvを読みこんでいます… eLogClubLog Host not found! ホストが見つかりません! Timeout error! タイムアウトエラー! KLog - ClubLog Undefined error... 未定義のエラー... Callsign missing コールサインがない Invalid callsign 正しくないコールサイン Skipping SWL callsign SWLナンバーをスキップ Callsign is your own call コールサインが自分自身のコールサイン Invalid callsign with no DXCC mapping DXCCで割り当てされていないコールサイン Updated QSO 更新されたQSO Invalid ADIF record 正しくないADIFレコード Missing ADIF record ADIFレコードがない Test mode - parameters ok, no action taken テストモード - パラメータはOK.、動作は行われません It seems to be a PASSWORD ERROR; check your password. パスワードがエラーのようです. パスワードを再確認してください. It seems that your ClubLog password is not correct. ClubLogのパスワードが正しく設定されていないようです Please check your password in the setup. ClubLog uploads will be disabled. パスワード設定を再確認してください. ClubLogアップロード機能は停止します. Excessive API Usage API呼び出しが過剰 Internal Error 内部エラー Rejected 拒否 QSO Duplicate QSOが重複 QSO Modified QSO内容が変更 Missing Login ログインしていない QSO OK Upload denied アップロードが拒否 No callsign selected コールサインが選択されていない No match found 一致するものが見つからない Dropped QSO OK Login rejected ログインが拒否 Rejected: Callsign is your own call 拒否: コールサインが自分自身のコールサイン klog-0.9.8.1/translations/klog_hr.ts0000644000175000017500000073762313532572307016352 0ustar develdevel AboutDialog About KLog O KLogu You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Također nam možete pomoći šaljući izvješća o greškama ili malih doprinosa u programskom kodu ili bilo što što mislite da može unaprijediti KLog. Authors Autori By Od Please know that this is an BETA release and it may contain many bugs.<br>Backup your data before using this software! Molim primite na znanje da je ovo BETA inačica i da može imati puno programskih grešaka.<br>Napravite sigurnosnu kopiju vaših podataka prije korištenja ovog softvera! Author Autor KLog has been fully rewritten from the 0.6.2 to be able to provide a cross-platform application that runs in the main operating systems (Linux, macOS & Windows) and provide new functionalities that KLog was not providing. KLog je bio u potpunosti iznova napisan u inačici 0.6.2 kako bi postao višeplatformska aplikacija koja se izvršava na glavnim operacijskim sustavima (Linux, macOS i Windows) i pružio funkcionalnost koju KLog nije pružao. KLog is a free logbook for hamradio operators. KLog je slobodna dnevnička aplikacija za radio-amatere operatere. Please provide your review in KLog's eHam review page: Molimo ocijenite KLog na eHamovoj stranici za ocjene: Find more information and the latest release at Potražite više informacija i najnoviju inačicu na today danas Main developer Glavni razvijatelj programa KLog is developed by a very small team and you are invited to join! Klog razvija vrlo mali tim i pozvani ste da se pridružite! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account user's needs KLog razvijatelji programskog koda razvili su opciju koja šalje neke korisničke podatke na KLogov poslužitelj kojima je osnovna svrha identificiranje broja instaliranih inačica, kako bi razvoj mogao biti usmjeren u jednom ili drugom smijeru, uzevši u obzir korisnikove potrebe At present, the data that is provided is the following: Trenutno, podaci koji se šalju su: Be aware that you can enable/disable this feature from the Misc tab in the Setup page Budite svjesni da možete omogućiti/onemogućiti ovu funkcionalnost na kartici Razno u stranici Postavke Translators bring KLog into your language. They are really an important part of the KLog development team. Prevoditelji donose KLog u vaš jezik. Oni su važan dio tima koji razvija KLog. If you want to provide support you are welcome to join the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Translators Prevoditelji Privacy advisory Upozorenje o privatnosti Callsign Pozivni znak KLog version Inačica KLoga Operating system Operacijski sustav KLog KLog Privacy Privatnost BarChartStats Chart title Naslov dijagrama Abort reading Prekini čitanje Reading data ... Učitavam podatke ... QSOs QSOi QSOs per year QSOi po godini DXCC Entities DXCC Entiteti DXCC Entities per year DXCC Entiteti po godini CQ zones CQ zone CQ zone per year CQ zone po godini Bands Frekvencijski pojasevi QSO per band distribution Raspodjela QSOa po opsezima Reading data ... Učitavam podatke ... Entities: Entiteti: Bands: Pojasevi: Modes Načini rada QSO per mode distribution Raspodjela QSOa po načinu rada Reading data... Učitavam podatke ... Modes: Načini rada: Entity: Entitet: DXCC DXCC Top ten DXCC per QSO Gornjih deset DXCCa po QSOu Hours Sati QSOs at hour QSOa po satu Hours: Sati: CTYPage Country data download Preuzmi podatke o zemljama KLog needs country data... KLog treba podatke o zemljama... &Download &Preuzmi &Ignore &Zanemari Country data needed Potrebni su potaci o zemljama KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC information. KLog koristi cty.csv datoteku s http://www.country-files.com/ za dobivanje DXCC informacije. You need to download the cty.csv file if you want KLog to show you the countries, locator, ... of the QSOs you do. Trebate preuzeti cty.csv datoteku ako želite da vam KLog prikaže zemlje, lokator,...QSOa koje radite. Click on Download to download now. Kliknite na Preuzmi za trenutno preuzimanje. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Ne mogu naći stroj. Molim provjerite mrežu i pokušajte ponovo Želite li probati ponovo? DXCCStatusWidget Update Ažuriraj ID ID Entity Entitet Pref: CQ: ITU: Beam: Entity not worked in this band. Entitet nije rađen na ovom pojasu. DXClusterWidget Connect Spoji Clear Izbriši Click on connect to connect to the DX-Cluster Kliknite spoji za spajanje na DX-Cluster Trying to connect to the server Pokušavam se spojiti na poslužitelj KLog DXCluster Kontest DXCluster KLog DXCluster Click on Connect to connect to the DX-Cluster server Kliknite Spoji za spajanje na DX-Cluster poslužitelj The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Stroj odbija spajanje. Osigurajte da DXCluster poslužitelj radi i provjerite jesu li ime stroja i port ispravni. The following error occurred: %1. Dogodila se greška: %1. Connected to server Spojen na poslužitelj KLog message Kontest message Poruka KLoga Enter your callsign to connect to the cluster: Unesite pozivni znak za spajanje na klaster: Enter your password to connect to the cluster: (Just hit enter for no password) Unesite zaporku za spajanje na klaster: (samo Enter ako nemate zaporke) Not logged on, you may need to enter your callsign again. Niste prijavljeni, možda ćete trebati ponovo unijeti svoj pozivni znak. Enter here the commands to be sent to the DX-Cluster server. Unesite naredbu za poslati DX-Clusteru. Disconnect Odspoji The host was not found. Please check: Poslužitelj nije pronađen. Molim provjerite: - your network connection; - the host name and port settings. - vaš spoj na mrežu; - ime poslužitelja i port. Connection closed by the server Poslužitelj je prekinuo vezu Click on Connect to connect to the DX-Cluster server. Kliknite Spoji za spajanje na DX-Cluster poslužitelj. Send Pošalji DataProxy_SQLite Software version in DB is null Inačica softvera u bazi je null No query failed Niti jedan upit nije neuspio Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Sporadic E Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Terrestrial or atmospheric repeater or transponder Rain scatter Common term in hamradio, do not translate if not sure Satellite Satelit Bureau Common term in hamradio, do not translate if not sure Manager Common term in hamradio, do not translate if not sure All QSOs have been updated with a DXCC and the Continent. Field Aligned Irregularities Common term in hamradio, do not translate if not sure F2 Reflection Common term in hamradio, do not translate if not sure Trans-equatorial Common term in hamradio, do not translate if not sure Tropospheric ducting Common term in hamradio, do not translate if not sure Yes No Requested Ignore/Invalid Validated Queued Uploaded Do not upload Modified Direct Izravno Electronic KLog DXCC KLog DXCC DownLoadCTY Download of cty.csv failed with the following error code: Preuzimanje cty.csv je neuspjelo s kodom greške: Download of cty.csv done. Preuzimanje cty.csv završeno. There is already a cty.csv file in the folder but it will be replaced with the new one. Postojeća cty.csv datoteka u mapi bit će zamijenjena s novom. Could not open %1 for writing FileManager Reading ADIF file... Čitam ADIF datoteku... Abort reading Prekini čitanje The log that you have selected contains more than just one station callsign. Dnevnik koji ste izabrali sadrži više od jednog pozivnog znaka. Station Callsign: Pozivni znak postaje: Define Station Callsign If this sentence ought to be read as imperative, the first word should say "Odredite" Odrediti pozivni znak postaje You have selected no callsign. KLog will export QSOs without a station callsign defined and those with the call you are entering here. Niste izabrali pozivni znak. Klog će izvesti QSOe bez definiranog pozivnog znaka postaje i one s pozivnim znakom unešenim ovdje. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Unesite pozivni znak za ovaj dnevnik ili ga ostavite praznim za QSO bez definiranog pozivnog znaka postaje: Writing ADIF file... Zapisujem ADIF datoteku... Abort writing Prekini pisanje Exporting LoTW ADIF file... Izvozim LoTW ADIF datoteku... Writing ADIF file... QSO: Zapisujem ADIF datoteku ... QSO: Reading LoTW file... Čitam LoTW datoteku... Do you want to continue with the current file? Želite li nastaviti s trenutnom datotekom? This log seems to lack of RST-TX information. Izgleda da u ovoj datoteci nedostaje RST-TX informacija. Click on Yes to add a default 59 to all QSO with a similar problem. Kliknite na Da kako bi primjenili uobičajeni 59 na sve QSOe sa sličnim problemom. If you select NO, the QSO may not be imported. Ako izaberete Ne, QSO možda neće biti uvezen. This log seems to lack of RST-RX information. Izgleda da u ovoj datoteci nedostaje RST-RX informacija. - The band missing and the following call: - Frekvencijski pojas nedostaje i sljedeći pozivni znak: - The call missing but was done at this time: - Pozivni znak nedostaje ali je urađen sada: - The mode missing and the following call: - Način rada nedostaje i sljedeći pozivni znak: - The date missing and the following call: - Datum nedostaje i sljedeći pozivni znak: - The time missing and the following call: - Vrijeme nedostaje i sljedeći pozivni znak: You have canceled the file export. The file will be removed and no data will be exported. Prekinuli ste izvoz datoteke. Datoteka će biti izbrisana i podaci neće biti izvezeni. Do you still want to cancel? Želite li još uvijek prekinuti? QSO: QSO: Please select the station callsign you want to export the log from: Molim izaberite pozivni znak postaje za koju želite izvesti dnevnik: No station callsign has been selected and therefore no log will be exported Niti jedan pozivni znak nije izabran i kao takav niti jedan dnevnik neće biti izvezen Writing Cabrillo file... Zapisujem Cabrillo datoteku... KLog: Cabrillo Log Export not implemented Kontest: Cabrillo Log Export not implemented KLog: Izvoz dnevnika u Cabrillo format nije implementiran I am sorry but the Cabrillo Export To File feature has still not been implemented. Na žalost izvoz Cabrillo dnevnika u datoteku još nije implementiran. There is more than one log in this logfile. U ovoj dnevničkoj datoteci nalazi se više od jednog dnevnika. All logs will be imported into the current log. Svi dnevnici bit će uvezeni u trenutni dnevnik. Do you want to continue? Želite li nastaviti? Importing ADIF file... Uvozim ADIF datoteku... You have cancelled the file import. The file will be removed and no data will be imported. Prekinuli ste uvoz datoteke. Datoteka će biti izbrisana i nijedan podatak neće biti uvezen. It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Izgleda da imate duplikate QSOa u ADIF datoteci koju uvozite. Želite li nastaviti? (Duplicirani QSOi neće biti uvezeni) This QSO is not including the minimum data to consider a QSO as valid!. Ovaj QSO ne sadrži minimalne podatke za valjan QSO!. Please edit the ADIF file and make sure that it include at least: Molim uredite ADIF datoteku tako da uključuje barem: and i This QSO had: Ovaj QSO je imao: KLog: Not all required data found! KLog: Nisu pronađeni svi obavezni podaci! KLog: No RST TX found! KLog: Nije nađen RST TX! KLog: No RST RX found! KLog: Nije nađen RST RX! InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70Cm Continent Kontinent Prefix Prefiks CQ CQ ITU ITU Short Path Kratki put Long Path Dugi put Deg Stu Miles Milje Km Km IntroPage Welcome to KLog! Welcome to Kontest! Dobrodošli u KLog! Welcome to KLog! - brought to you under the terms of the GPL! Dobrodošli u KLog! - vama pružen pod odredbama GPLa! Welcome to KLog Dobrodošli u KLog This looks like it's the first time you've run KLog on this computer. Izgleda da je ovo prvi put da ste pokrenuli KLog na ovom računalu. KLog is a free hamradio logging program that can run on Linux macOS and Windows. KLog je slobodan radioamaterski dnevnički program koji se može izvršavati na Linuxu maOSu i Windowsu. It is designed to provide general purpose, DX and contest logging. Namijenjen je općenitom, DX i zapisivanju kontesta. It supports QSL management, import and export of ADIF Podržava baratanje QSLima, uvoz i izvoz ADIF and Cabrillo file formats and many other features... i Cabrilo datotečnih formata i mnoge druge funkcije... Before you can start using KLog, you will be asked to: Prije nego počnete koristiti KLog bit ćete upitani da: Acknowledge to the terms of the license. Prihvatite uvjete licence. Download the DX entities information. Preuzmete listu DX entiteta. Enter your callsign, CQ zone, etc. and main configuration. Unesete vaš pozivni znak, CQ zonu, itd. i glavnu konfiguraciju. Enjoy KLog and contact the development team if you have any suggestions! Uživajte u KLogu i javite se razvojnom timu ako imate kakvih prijedloga! LicPage KLog License information KLog podaci o licenci Welcome to KLog!- brought to you under the terms of the GPL! Dobrodošli u KLog! - vama pružen pod odredbama GPLa! Acknowledge Prihvati Be aware that KLog is free software. Uzmite u obzir da je KLog slobodan softver. LogModel Date Datum Time Vrijeme QRZ QRZ Band Pojas Mode Način rada RSTtx RSTtx RSTrx RSTrx Comment Komentar LogWindow QSL Send QSL Poslana QSL Rcvd QSL Primljena &Delete Iz&briši Delete a QSO Izbriši QSO &Edit QSO &Uredi QSO Edit this QSO Uredi ovaj QSO Via &bureau Preko &biroa Send this QSL via bureau Pošalji ovu QSL preko ureda D&irect &Izravno Send this QSL via direct Pošalji ovu QSL izravno Via bureau Preko biroa QSL &received via bureau QSL p&rimljena preko biroa Direct Izravno QSL received via direc&t QSL primljena &izravno You have requested to delete this QSO. Zatražili ste brisanje ovog QSOa. Are you sure? Jeste li sigurni? MainWindow Recalculate Preračunaj Click to recalculate the award status. Kliknite za preračunavanje statusa priznanja. Starting KLog Pokrećem KLog &Add &Dodaj &Clear &Izbriši Status bar... Statusna traka... DX Entity DX entitet &Log Window &Dnevnički prozor &Score Window &Rezultatski prozor Watts Wata MHz MHz KLog KLog Annual Ready Spreman An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Dogodila se neočekivana pogreška prilikom dodavanja QSOa u vaš dnevnik. Ako se ovaj problem opetuje, molim kontaktirajte razvijatelje softvera radi analize: You have selected an entity: Izabrali ste entitet: that is different from the KLog proposed entity: koji se razlikuje od entiteta predloženog u KLogu: Click on the prefix of the correct entity or Cancel to edit the QSO again. Kliknite na prefiks ispravnog entiteta ili Poništi kako bi ponovo uređivali QSO. Click on the prefix of the right entity or Cancel to correct. "right" translated as in "correct"/"valid" (rather than "to the right of") Kliknite na prefiks ispravnog entiteta ili Poništi za ispravku. QRZ of the QSO. QRZ QSOa. TX RST. TX RST. RX RST. RX RST. TX Exchange. TX izmjena. Band of the QSO. Frekvencijski pojas QSOa. Mode of the QSO. Način rada QSOa. Date of the QSO. Datum QSOa. Time of the QSO. Vrijeme QSOa. Add the QSO to the log. Dodaj QSO u dnevnik. Clear the box. Izbriši polje. Input translated as infinitive, rather than a verb Unos RSTrx RSTrx RSTtx RSTtx QRZ QRZ STX STX SRX SRX NEW MULT NOVI MNOŽ Invalid characters used in the QRZ Nevaljani znakovi korišteni za QRZ Ready... Spreman... &File &Datoteka &New... &Nova... &Open... &Otvori... &Import from ADIF... &Uvezi iz ADIF... Import an ADIF file into the current log. Uvezi ADIF datoteku u trenutni dnevnik. &Save As... &Spremi kao... Export to ADIF... Izvezi u ADIF... Export the current log to an ADIF logfile. Izvezi trenutni dnevnik u ADIF dnevničku datoteku. Export all logs to ADIF... Izvezi sve dnevnike u ADIF... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Izvezi SVE QSOe u jednu ADIF datoteku, ujedinjujući QSOe iz svih datoteka. Export Requested QSL to ADIF... Izvezi traženi QSL u ADIF... Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a QSL tag printing program). Izvezi sve QSOe sa traženim QSLkama u ADIF datoteku (npr. za uvoz u program za ispisivanje QSL naljepnica). Export ADIF for LoTW... Izvezi ADIF za LoTW... Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before uploading to LoTW! Izvezi ADIF datoteku za slanje na LoTW. Sjetite se da ih potpišete TQSLom prije učitavanja u LoTW! &Print Log... &Ispiši dnevnik... Print your log. Ispišite vaš dnevnik. KLog folder KLog mapa Opens the data folder of KLog. Otvara mapu s KLog podacima. E&xit &Izlaz &Tools &Alati Fill in QSO data Popuni QSO podatke Go through the log reusing previous QSOs to fill missing information in other QSOs. Prođi kroz dnevnik i iskoristi prijašnje QSOe kako bi popunio podatke koji nedostaju u drugim QSOima. Fill in DXCC data Popuni DXCC podatke Go through the log filling QSOs without a DXCC defined. Prođi kroz dnevnik popunjavajući QSOe bez DXCCa. QSL tools... QSL alati... &Find QSO to QSL &Nađi QSO za QSL Shows QSOs for which you should send your QSL and request the DX QSL. Prikazuje QSOe za koje trebate poslati vašu QSLku i zatražiti DX QSLku. Find My-QSLs pending to send Nađi Moje-QSL za koje je slanje neodlučeno Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Prikazuje QSOe sa neodlučenim zahtjevima za slanje QSLke. Trebali biste ovaj red držati prazim! &Find DX-QSLs pending to receive &Nađi DX-QSL za koje je prijem neodlučen Shows the DX-QSL that has been requested or QSLs has been sent with no answer. Prikazuje DX QSL za koje je QSL bio zatražen ili je bio poslan ali odgovor još nije stigao. &Find requested pending to receive &Nađi zatražene neodlučene za prijem Shows the DX-QSL that has been requested. Prikaži DX QSL koji je bio zatražen. LoTW tools... LoTW alati... Queue all QSL to be sent of this log Stavi u red za slanje sve QSLe iz ovog dnevnika Mark all non sent QSOs in this log as queued to be uploaded. Označi sve ne-poslane QSOe u ovom dnevniku kao poredane za učitavanje. Queue all QSL to be sent Poredaj sve QSLe za slanje Mark all non sent QSOs as queued to be uploaded. Označi sve ne-poslane QSOe kao poredane za učitavanje. Mark as sent all queued QSO of this log Označi kao poslane sve poredane QSOe u ovom dnevniku Mark all queued QSOs in this log as sent to LoTW. Označi sve poredane QSOe u ovom dnevniku kao poslane u LoTW. Mark all queued QSO as sent Označi sve poredane QSOe kao poslane Mark all queued QSOs as sent to LoTW. Označi sve poredane QSOe kao poslane u LoTW. &Update cty.csv &Osvježi cty.csv For updated DX-Entity data, update cty.csv. Za osvježene podatke o DX entitetima, osvježite cty.csv. &Update Satellite Data &Osvježi potatke o satelitima Stats Statistike Show the statistics of your radio activity. Prikazuje statistike vaše radio aktivnosti. &Setup &Postavke &Setup... &Postavke... &Help &Pomoć Check updates... Provjeri za nadopune... &About... &O... About Qt... O Qt... KLog LoTW KLog LoTW All pending QSO of this log has been marked as queued for LoTW! Svi poredani QSOi u ovom dnevniku označeni su kao poredani za LoTW! Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. Sada možete ići u izbornik Datoteka kako bi izveli LoTW datoteku i učitali je u LoTW. There was a problem to mark all pending QSO of this log as queued for LoTW! Nastao je problem prilikom označavanja svih porednih QSOa u ovom dnevniku kao poredanih za LoTW! All pending QSO has been marked as queued for LoTW! Svi poredani QSOi su označeni kao poredani za LoTW! The log that you have selected contains more than just one station callsign. Dnevnik koji ste izabrali sadrži više od samo jednog pozivnog znaka. Please select the station callsign you want to mark as sent to LoTW: Molim izaberite pozivni znak postaje za koju želite označiti kao poslano u LoTW: Station Callsign: Pozivni znak postaje: Define Station Callsign Odrediti pozivni znak postaje You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the call you are entering here. Niste izabrali pozivni znak. Klog će označiti QSOe bez definiranog pozivnog znaka postaje i one s pozivnim znakom unešenim ovdje. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Unesite pozivni znak za ovaj dnevnik ili ga ostavite praznim za QSO bez definiranog pozivnog znaka postaje: No station callsign has been selected and therefore no log will be marked Niti jedan pozivni znak nije izabran i kao takav niti jedan dnevnik neće biti označen All queued QSO of this log has been marked as sent for LoTW! Svi poredani QSOi u ovom dnevniku označeni su kao poslani u LoTW! There was a problem to mark all queued QSO of this log as sent for LoTW! Nastao je problem prilikom označavanja svih porednih QSOa u ovom dnevniku kao poslanih za LoTW! All queued QSO has been marked as sent to LoTW! Svi poredani QSOi su označeni kao poslani u LoTW! There was a problem to mark all queued QSO of this log as sent to LoTW! Nastao je problem prilikom označavanja svih porednih QSOa u ovom dnevniku kao poslanih za LoTW! About... O... KLog update checking result Rezultat provjere nadopune KLoga Congratulations! Čestitke! You already have the latest version. Već imate najnoviju inačicu. Nothing has been saved. You have to select a valid file type. Ništa nije bilo spremljeno. Izaberite ispravan tip datoteke. Save File Spremi Datoteku ADIF file ADIF datoteka Cabrillo files Cabrillo datoteka Any file Bilo koja datoteka You can find the KLog data folder here: KLog mapa s podacima je ovdje: DUPE DUPLI start pokrenuti stop zaustaviti It seems that there are no QSO in the database. Izgleda da u bazi podatake nema QSOa. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Ako ste sigurni da baza podataka sadrži QSOe i KLog ih nije uspio pronaći, molimo kontaktirajte razvijatelje programa (vidite O Klogu) za pomoć. TX Frequency in MHz. TX frekvencija u MHz. RX Frequency in MHz. RX frekvencija u MHz. Power used by the DX. Snaga koju je koristio DX. Logging operator's callsign. Snimam operaterov pozivni znak. Callsign used over the air. Pozivni znak korišten u eteru. My QTH locator. Moj QTH lokator. Name of the DX. Ime DXa. QTH of the DX. QTH DXa. Locator of the DX. Lokator DXa. Filling DXCC in QSOs... QSO: TX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. Frequency is not in a hamradio band! QSO logged from WSJT-X: RX Exchange. RX izmjena. The logfile has been modified. Do you want to save your changes? UDP Server error The UDP server failed to %1. start or stop Clears the QSO entry. Izbriši unos QSOa. Number of confirmed DXCC entities. Broj potvrđenih DXCC entiteta. Number of worked DXCC entities. Broj rađenih DXCC entiteta. Number of confirmed WAZ zones. Broj potvrđenih WAZ zona. Number of worked WAZ zones. Broj rađenih WAZ zona. Number of confirmed local references. Broj potvrđenih lokalnih referenci. Number of worked local references. Broj rađenih lokalnih referenci. Number of confirmed QSOs. Broj potvrđenih QSOa. Number of worked QSOs. Broj rađenih QSOa. Number of QSOs worked on the selected year. Broj QSOa rađenih u izabranoj godini. Number of DXCC worked on the selected year. Broj DXCCa rađenih u izabranoj godini. Number of CQ Zones worked on the selected year. Broj CQ zona rađenih u izabranoj godini. Score for the DXMarathon on the selected year. Zbroj za DXMarathon u izabranoj godini. Select the year you want to check. Izaberite godinu koju želite provjeriti. Status of the DX entity. Status DX entiteta. Name of the DX entity. Ime DX entiteta. Name Ime QTH QTH Locator Lokator Power(rx) Snaga(rx) RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Frekv TX Freq RX Frekv RX QSO QSO QSL QSL eQSL eQSL Comment Komentar Others Drugi My Data Moji podaci Satellite Satelit QSOs QSOi DXCC DXCC CQ CQ Score Zbroj DX-Marathon DX-Marathon Info Podaci Award Priznanje Confirmed Potvrđeno Worked Rađeno WAZ WAZ Local Lokalno Awards Priznanja Search Traži Log Dnevnik DX-Cluster DX-Cluster Save ADIF File Spremi ADIF datoteku LoTW logfile has been properly exported! LoTW dnevnička datoteka je uspješno izvezena! Remember to: Sjetite se: Before uploading: sign the LoTW log; and Prije učitavanja: potpišite LoTW dnevničku datoteku; i After uploading: mark as sent all the queued QSO (LoTW Tools). Poslije učitavanja: označite kao poslane sve poredane QSOe (LoTW alati). There was no QSO to be exported. Nije bilo QSOa za izvoz. If you think that some QSO should have been exported, please look for them and ensure that the eQSL LoTW QSL sent box is marked as: Ako mislite da je neki QSO trebao biti izvezen, molim potražite ih i osigurajte da je eQSL LoTW QSL poslana kućica označena kao: Q - Queued Q - Poredana There was an error while exporting the LoTW. The log has not been exported! Dogodola se greška prilikom izvoza u LoTW. Dnevnik nije bio izvezen! Save Cabrillo File Spremi Cabrillo datoteku Open File Otvori datoteku &Modify &Promijeni - Needed for DXMarathon - Potrebno za DXMarathon Filling QSOs... Ispunjavam QSOe... Abort filling Prekini ispunjavanje Filling QSOs... QSO: Ispunjavam QSOe... QSO: Number Broj Date Datum Time Vrijeme Band Pojas Mode Način rada Print Log Ispiši dnevnik Printing the log... Ispisujem dnevnik... Abort printing Prekini ispis Printing the log... QSO: Ispisujem dnevnik... QSO: KLog QSO received KLog QSO primljen The following QSO data has been received from WSJT-X to be logged: QSO sa slijedećim podacima je primljen iz WSJT-Xa kako bi bilo zapisan u dnevnik: Call Znak Freq Frekv Time On Vrijeme početka Time Off Vrijeme kraja RST TX RST TX RST RX RST RX DX-Grid DX koordinata Comments Komentari TX Pwr TX snaga Operator Operater Local-Grid Lokalna koordinata A new mode not supported by KLog has been received from an external software: Novi način rada koji nije podržan u KLogu primljen je iz vanjskog softvera: If the received mode is correct, please contact KLog development team and request support for that mode Ako je ovaj način rada valjan, molimo javite razvijateljima KLoga i zatražite podršku za ovaj način rada Do you want to keep receiving this alerts? (disabling this alerts will prevent that non-valid modes are detected) Želite li nastaviti primati ovu obavijest? (ako onemogućite ovu obavijest nećete moći otkriti nevažeće načine rada) A new mode not supported by KLog has been received from an external software or radio: A duplicated satellite has been detected in the file and will not be imported. Please check the satellite information file and ensure it is properly populated. Now you will see a more detailed error that can be used for debugging... An unexpected error ocurred!! Dogodila se nepredviđena greška!! If the problem persists, please contact the developers Ako problem i dalje traje, molimo javite razvijateljima programa for analysis: za analizu: Error in function Greška u funkciji Error code Kod greške Error text Tekst greške Failed query Neuspio upit Recomendation: Export, periodically, your data to ADIF to prevent a potential data loss. Do you want to keep showing errors? Želite li nastaviti viđati greške? MainWindowInputComment Add a comment for this QSO. Dodaj komentar za ovaj QSO. MainWindowInputEQSL Date of the ClubLog upload. Datum ClubLog učitavanja. Date of the eQSL sending. Datum slanja eQSLa. Date of the eQSL reception. Datum prijema eQSLa. Date of the LoTW sending. Datum slanja LoTWa. Date of the LoTW reception. Datum prijema LoTWa. Status of the LoTW sending. Status slanja LOTWa. Status of the LoTW reception. Status prijema LoTWa. LoTW Sent LoTW Posl LoTW Rec LoTW Prim Status on ClubLog. Status u ClubLogu. Status of the eQSL sending. Status eQSL slanja. Status of the eQSL reception. Status eQSL prijema. ClubLog ClubLog eQSL Sent eQSL poslana eQSL Rec eQSL primljena MainWindowInputOthers Primary Div Primarni Pod Secondary Div Sekundarni Pod IOTA IOTA Entity Entitet Propagation mode Propagacijski mod Select the primary division for this QSO. Izaberi primarnu podjelu za ovaj QSO. Select the secondary division for this QSO. Izaberi sekundrnu podjelu za ovaj QSO. Select the entity for this QSO. Izaberi entitet za ovaj QSO. Select the propagation mode for this QSO. Izaberi propagaciju za ovaj QSO. Select the IOTA continent for this QSO. Izaberi IOTA kontinent za ovaj QSO. Select the IOTA reference number for this QSO. Izaberi IOTA referentni broj za ovaj QSO. Not Identified Nije identificiran Not - Not Identified Nije - Nije identificiran MainWindowInputQSL QSL Sent QSL Poslana QSL Rec QSL Prim QSL Via QSL Preko QSL Msg QSL Por Status of the QSL sending. Status slanja QSLa. Status of the QSL reception. Status prijema QSLa. QSL sending information. Informacija slanja QSLa. QSL reception information. Informacija prijema QSLa. Date of the QSL sending. Datum slannja QSLa. Date of the QSL reception. Datum prijema QSLa. Message of the QSL. QSL poruka. QSL via information. QSL preko podaci. MainWindowMyDataTab Watt Wat Keep this data Spremiti ove podatke Data entered in this tab will be copied into the next QSO. Podaci uneseni u ovu karticu biti će kopirani u sljedeći QSO. Power used for the QSO in watts. Snaga korištena za QSO u watima. Logging operator's callsign. Zapisujem operaterov pozivni znak. Callsign used over the air. Pozivni znak korišten u eteru. My QTH locator. Moj QTH lokator. Power Snaga Operator Operater Station Callsign Pozivni znak postaje My Locator Moj lokator MainWindowSatTab Keep this data Spremiti ove podatke Other - Sat not in the list Drugo - Satelit nije na listi Data entered in this tab will be copied into the next QSO. Podaci uneseni u ovu karticu biti će kopirani u sljedeći QSO. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Satellite mode used. Satelitski način rada korišten. Select the satellite you are using. Izaberite satelit koji koristite. UpLink band. UpLink frekvencijski pojas. DownLink band. DownLink frekvencijski pojas. Locator of the DX station. This box is syncronized with the Locator box in the QSO tab. Lokator DX postaje. Ova kućica sinkronizirana je sa kućicom Lokator u QSO odjeljku. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. UpLink UpLink DownLink DownLink Satellite Satelit Mode Način rada DX Locator DX lokator Other Drugo MHz MHz Not Sat QSO Nije satelitski QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog je otkrio satelit čije ime ne poznaje. Ako je riječ o nekom od poznatih satelita, molim izaberite ga s liste. Inače, molim kontaktirajte razvojni tim da dodaju ime novog satelita. Please know that the satellite name will not be saved if it is not in the list so that information may be lost! Uočite da ime satelita neće biti spremljeno ako nije na listi pa će tako doći do gubitka podataka! The satellite you have in your QSO is: Satelit kojeg imate u QSOu je: QObject Database Error Greška baze podataka KLog DB needs to be upgraded. Klog baza treba se nadograditi. Do you want to upgrade it now? Želite li nadograditi sada? If DB is not upgraded KLog may not work properly. Ako baza podataka nije nadograđena KLog možda neće ispravno raditi. KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog je otkrio prijašnji dnevnik u bazi. Svi podaci bit će prenešeni u novi dnevnik DX tipa. KLog: Enter Station callsign KLog: Unesite pozivni znak postaje Enter the station callsign used in this log Unesite pozivni znak koji će biti korišten u ovom dnevniku Station Callsign Pozivni znak postaje All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is OK. Svi podaci su ispravno prenešeni. Idite u Postavljanje->Postavke->Dnevnici i provjerite da je sve u redu. QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Prekid ove nadogradnje proizvest će nekonzistentne podatke i mogući gubitak podataka. Želite li još uvijek prekinuti? Progress: Napredak: Updating DXCC award information... Ažuriram podatke o DXCC nagradama... Updating DXCC Award information... Ažuriram podatke o DXCC nagradama... Updating WAZ award information... Ažuriram podatke o WAZ nagradama... Updating WAZ Award information... Ažuriram podatke o WAZ nagradama... Updating mode information... Ažuriram podatke o načinu rada... Abort updating Prekini ažuriranje Updating bands information... Ažuriram podatke o frekvencijskim pojasevima... Updating bands information in %1 status... Ažuriram podatke o frekvencijskim pojasevima za %1 status... Updating mode information in %1 status... Ažuriram podatke o načinu rada za %1 status... New One, work it! nNew One, work it! Novi, odradite! Needed, work it! Treba, odradite! Worked but not confirmed Rađen ali nije potvrđen Confirmed Potvrđeno Not identified Nije identificiran Install wizard was canceled before completing... Instalacijski čarobnjak prekinut je prije kraja... Do you want to remove the KLog dir from your disk? Želite li izbrisati KLog mapu s vašeg diska? Your KLog dir has been removed Vaša KLog mapa je uklonjena I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Nisam mogao ukloniti vašu KLog mapu. Izbrišite je ručno ako je želite ukloniti s vašeg čvrstog diska. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Vaša KLog mapa nije mogla biti izbrisana. Učinite to ručno ako je želite ukloniti s vašeg čvrstog diska. Remember that your KLog dir is on your system... Podsjetite se da je vaša KLog mapa na vašem sustavu... Thank you for running KLog! Hvala što koristite KLog! Updating DXCC and Continent information... SearchWidget &Clear &Izbriši &Select All Označi &sve &Search &Traži All Svi &Export Highlighted Izv&ezi označeno Clear the searches. Očisti potrage. Export the search result to an ADIF file. Izvezi rezultat potraga u ADIF datoteku. Select/Unselect all the QSOs shown. Označi/neoznači sve prikazane QSOe. Search in the log. Traži u dnevniku. Search in all logs. Traži u svim dnevnicima. Enter the QRZ to search for. Unesite QRZ za traženje. Search results. Rezultati potrage. QRZ QRZ Date/Time Datum/Vrijeme Band Pojas Mode Način rada QSL Sent QSL Poslana QSL Rcvd QSL Primljena Station Callsign Pozivni znak postaje ID ID &Clear selection &Izbriši selekciju Save File Spremi Datoteku QSL Send Pošalji QSL &Delete Iz&briši Delete a QSO Izbriši QSO &Edit QSO &Uredi QSO Edit this QSO Uredi ovaj QSO Via &bureau Preko &biroa Send this QSL via bureau Pošalji ovu QSL preko ureda D&irect &Izravno Send this QSL via direct Pošalji ovu QSL izravno &Request my QSL Za&traži moju QSL Mark my QSL as requested Označi moju QSL kao zatraženu Via Direct && mark DX QSL as requested Izravno i označi DX QSL kao zatraženu Send this QSL via direct & mark DX QSL as requested Pošalji ovu QSL izravno i označi DX QSL kao zatraženu Via Bureau && mark DX QSL as requested Preko ureda i označi DX QSL kao zatraženu Send this QSL via bureau & mark DX QSL as requested Pošalji ovu QSL izravno i označi DX QSL kao zatraženu &Request the QSL Za&traži QSL Mark the QSL as requested Označi QSL zatraženom Via bureau && mark my QSL as requested Preko biroa i označi moju QSL kao zatraženu QSL received via bureau & mark my QSL as requested QSL primljena izravno i označi moju QSL kao zatraženu Via bureau Preko biroa QSL received via bureau QSL primljena preko biroa Direc&t && mark as my QSL requested &Izravno & označi moju QSL zatraženom QSL received via direct & mark my QSL as requested QSL primljena izravno i označi moju QSL kao zatraženu Direc&t &Izravno QSL received via direct QSL primljena izravno You have requested to delete the QSO with: %1 Are you sure? Jeste li sigurni? Needed QSO to send the QSL QSO za koji treba poslati QSL My QSL requested to be sent Moj QSL zatražen za slanje DX QSL pending to be received Prijem DX QSLa neodlučen SetupDialog User data Korisnički podaci Bands/Modes Frekvencijski pojasevi/Načini rada My Data Moji podaci DX-Cluster DX-Cluster Colors Boje Misc Razno World Editor Urednik svijeta Satellites HamLib ClubLog ClubLog Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Go to the User tab and enter valid QRZ. Cancel Poništi OK OK Config Dialog Postavke D&X-Cluster D&X-Cluster WSJT-X WSJT-X You need to enter at least one log in the Logs tab. Trebate unijeti barem jedan dnevnik na kartici Dnevnici. You need to enter at least a valid QRZ. Trebate unijeti barem važeći QRZ. DB has not been moved to new path baza podataka nije bila maknuta na novu lokaciju You have not selected the kind of log you want. Niste izabrali kakvu vrstu dnevnika želite. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Bit ćete preusmjereni na karticu Dnevnici. Izaberite vrstu dnevnika kakvu želite koristiti. Logs Dnevnici World Svijet SetupEntityDialog Entity Entitet CQ CQ ITU ITU Latitude Zemljopisna širina Longitude Zemljopisna dužina UTC UTC Main prefix Glavni prefiks ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... Mogući prefiksi odvojeni zarezom, npr. EA1, EA2, ... Prefixes Prefiksi Name of the Entity. Ime entiteta. CQ zone. CQ Zona. ITU zone. ITU Zona. Longitude of the Entity. Zemljopisna dužina entiteta. Local time difference to UTC. Razlika lokalnog vremena od UTCa. Main prefix of the entity. Primarni prefiks entiteta. ARRL ID. ARRL ID. Date of the deletion. Datum brisanja. Deleted Izbrisan Cancel Poništi OK Ok Entity Dialog Dialog entiteta SetupPageBandMode Bands Frekvencijski pojasevi Modes Načini rada SetupPageClubLog &Callsign Pozivni &znak ClubLog &password ClubLog za&porka ClubLog &email ClubLog &email Enter the email you used to register in ClubLog. Unesite e-mail s kojim ste registrirani u ClubLogu. Enter the callsign you used to register in ClubLog. Unesite pozivni znak s kojim ste registrirani u ClubLogu. Enter your password in ClubLog. Unesite zaporku za ClubLog. &Send QSOs in real time Šalji QSOe u &stvarom vremenu &Activate ClubLog &Aktiviraj ClubLog Use QSO Station &Callsign Koristi &pozivni znak QSO postaje Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Šalji svaki QSO u ClubLog u realnom vremenu, kako su dodavani (ili mijenjani) u KLogu. Starts the ClubLog support in KLog. Pokreće ClubLog podršku u KLogu. Use the Station Callsign defined in each QSO instead of the one defined here. Koristi pozivni znak postaje određen u svakom QSOu umjesto onog određenog ovdje. SetupPageColors New One Novi Needed in this band Potrebno na ovom frekvencijskom pojasu Worked in this band Rađen na ovom frekvencijskom pojasu Confirmed in this band Confirmed Potvrđeno na ovom frekvencijskom pojasu Default Zadano Choose a color Izaberite boju SetupPageDxCluster Add Dodaj Delete Izbriši Show &HF spots Show HF spots Prikazati &HF zapažanja Show V/&UHF spots Show V/UHF spots Prikazati V/&UHF zapažanja Show W&ARC spots Show WARC spots Prikazati W&ARC zapažanja Show &worked spots Show worked spots Prikazati od&rađena zapažanja Show &confirmed spots Show confirmed spots Prikazati p&otvrđena zapažanja Show ANN/&FULL messages Show ANN/FULL messages Prikazati ANN/&FULL poruke Show WW&V messages Show WWV messages Prikatati &WWV poruke Show WC&Y messages Show WCY messages Prikazati WC&Y poruke DX Spots DX zapažanja Messages Poruke KLog: Add a DXCluster server Kontest: Add a DXCluster server KLog: Dodaj DX-Cluster poslužitelj Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default.: Dodaj adresu iza koje je :port Primjer: dxfun.com:8000 Ako ne dodate port, 41112 se podrazumijeva: SetupPageHamLib Activate HamLib Activates the hamlib support that will enable the connection to a radio. Radio Select your rig. Defines the interval to pool the radio in msecs. Pool interval Port Select the serial port. Only the serial ports that are detected are shown. Scan Click to identify the serial ports available in your computer. Bauds Select the serial port speed. 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None Hardware Software XON/XOFF Flow control Select the serial flow control No parity Even Odd Space Mark Parity Select the serial parity. 1 bit 1.5 bits 2 bits Stop bits Select the serial stop bits. SetupPageLogs Type Vrsta &New New &Novo &Edit Ur&edi &Remove Izb&risati KLog KLog Do you really want to remove this log? Želite li zaista ukloniti ovaj dnevnik? All the QSOs from this log will be also deleted... Svi QSOi iz ovog dnevnika će također biti izbrisani... Operators Operateri An error has occurred showing the following error code: Nastupila je greška sa sljedećim kodom: Log has not been removed. (#3) Dnevnik nije bio izbrisan (#3) Add a new log. Dodaj novi dnevnik. Edit the selected log. Uredi izabrani dnevnik. Remove the selected log. Izbriši izabrani dnevnik. Select the log you want to open. Označite dnevnik koji želite otvoriti. Log has not been removed. (#2) Dnevnik nije bio izbrisan (#2) Log has not been removed. (#1) Dnevnik nije bio izbrisan (#1) KLog - SetupPageLogs KLog - SetupPageLogs ID ID Station Callsign Pozivni znak postaje Comments Komentari Date Datum SetupPageLogsNew &Ok &Ok &Cancel &Poništi Select categories Izaberite kategorije &Date &Datum &Station Callsign Pozivni znak po&staje &Operators &Operateri Comm&ent Kom&entar Callsign used for this log. Pozivni znak korišten za ovaj dnevnik. Comma separated list of operators: callsign1, callsign2. Lista operatera odvojenih zarezom: pozivni1, pozivni2. Start date of this log. Datum početka ovog dnevnika. Add a comment about this log. Dodaj napomenu o ovom dnevniku. &Type of Operation Vrs&ta operacije Select the kind of operation for this log. Izaberi vrstu djelovanja za ovaj dnevnik. &Mode Category Način &rada Select the mode category. Izaberi kategoriju načina rada. O&perators Category Kategorija O&peratera Select the operators category. Izaberi kategoriju operatera. &Assisted Category Potpomognut&a kategorija Select the assisted category. Izaberi kategoriju potpomognutog rada. Po&wer Category Kategorija &Snage Select the power category. Izaberi kategoriju snage. &Bands Category Kategorija &frekventnih pojaseva Select the bands category. Izaberi kategoriju frekventnih pojaseva. O&verlay Prekri&vač Select the Overlay category. Izaberi kategoriju prekrivanja. Categories not OK Kategorije nisu OK You need to enter a valid QRZ in the Station Callsign box. The log will not be opened. You need to enter a valid QRZ in the Station Callsign box The log will not be opened. Trebate unijeti važeći QRZ u kućicu Pozivni znak postaje. Dnevnik neće biti otvoren. You selected an invalid combination. The log will not be opened. You selected an invalid combination The log will not be opened. Izabrali ste nevažeću kombinaciju. Dnevnik neće biti otvoren. Categories OK Kategorije su OK SetupPageMisc &Imperial system Imperial system &Imperialni sustav &Log in real time Log in real time &Dnevnik u stvarnom vremenu &Time in UTC Time in UTC Vrijeme u U&TC &Save ADIF on exit Save ADIF on exit &Spremi ADIF Datoteku pri izlasku Use this &default filename Use this default filename Koristi ovu &podrazumijevanu datoteku Mark &QSO to send QSL when QSL is received Mark QSO to send QSL when QSL is received Označi &QSO za slanje QSL kad je QSL primljena Complete QSO with previous data Popuni QSO prijašnjim podacima &Reset to My Data for all QSOs &Ponovo namjesti Moje Podatke za sve QSOe Manage DX-Marathon Move DB Makni bazu podataka If new version checking is selected, KLog will send the developer your callsign, KLog version & Operating system to help in improving KLog. Ako je označena provjera nove inačice, KLog će poslati razvijatelju vaš pozivni znak, inačicu KLoga i operacijski sustav kako bi pomogao u poboljšavanju KLoga. Check it for Imperial system (Miles instead of Kilometers). Označite za imperijalni sustav (milje umjesto kilometara). Select to use the following name for the logfile without being asked for it again. Označite za korištenje sljedećeg imena za dnevničku datoteku bez da ste za to ponovo upitani. Select if you want to manage DX-Marathon. This is the default file where ADIF data will be saved. Ovo je zadana datoteka u koju će se spremati ADIF podaci. This is the directory where the database (logbook.dat) will be saved. Ovo je mapa u koju će se spremiti baza podataka (logbook.dat). Click to change the path of the database. Kliknite za promjenu putanje baze podataka. Please specify an existing directory where the database (logbook.dat) will be saved. Molim odaberite postojeću mapu gdje će baza podataka (logbook.dat) biti spremljena. This is the directory where DB (logbook.dat) will be saved. Ovo je mapa u koju će baza podataka (logbook.dat) biti spremljena. Click to change the default ADIF file. Kliknite za promjenu zadane ADIF datoteke. Click to move the DB to the new directory. Kliknite za micanje baze podataka u novu mapu. Select Directory Izaberite mapu File moved Datoteka maknuta File copied Datoteka kopirana File NOT copied Datoteka NIJE kopirana The target directory does not exist. Please select an existing directory. Ciljna mapa ne postoji. Molim izaberite postojeću mapu. The search box will show also the callsign on the air to do the QSO. Ova kućica za pretraživanje će vam također pokazati pozivni znak u eteru za QSO. Show the Station &Callsign used in the search box Pokazati pozivni znakl &postaju korištenu u kućici za pretraživanje All the data from the My Data tab will be used or data from the previous QSO will be maintained. Svi podaci sa kartice Moji Podaci će biti korišteni ili sačuvaj podatje prijašnjih QSOa. &Check for new versions automatically &Provjeri za nove verzije automatski QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSOi će biti označeni kao neriješeni za slanje QSLke ako primite DX QSLku a niste poslali vašu. Check if there is a new release of KLog available every time you start KLog. Provjeri je li dostupna nova inačica KLoga svaki put kad pokreneš KLog. &Provide Info for statistics &Pruži podatke za statistiku Select to use real time. Označite da koristite stvarno vrijeme. Select to use UTC time. Izaberite za korištenje UTC vremena. Select if you want to save to ADIF on exit. Označite ako želite snimiti u ADIF formatu prije izlaska. Complete the current QSO with previous QSO data. Popuni trenutni QSO podacima prijašnjeg QSOa. Browse Razgledavanje Open File Otvori datoteku SetupPageSats &New &Novo &Edit Ur&edi &Remove Izb&risati &Import E&xport Add a new satellite. Edit the selected satellite. Remove the selected satellite. Import a satellites file. It will replace the satellites you have now configured. Export your current satellites to a file. Select the sat you want to open. KLog KLog Do you really want to remove this satellite? This satellite will not be longer available to be selected ... Sat has not been removed. (#3) Sat has not been removed. (#2) Sat has not been removed. (#1) ID ID Short Name Ime Uplink Downlink Modes Načini rada An error has occurred showing the following error code: Nastupila je greška sa sljedećim kodom: KLog - SetupPageSats Open Satellites File KLog warning An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Please check the format or contact the developer for analysis with the error code: Save Satellites File SetupPageSatsNew Short name Sat name UpLink UpLink DownLink DownLink Modes Načini rada &Ok &Ok &Cancel &Poništi Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Enter the name of the satellite. Enter the uplink frequencies in this format: 144.300 Enter the downlink frequencies in this format: 144.300 Enter the modes in this format: USB Some of the data you have entered is not correct, the satellite can't be added. SetupPageUDP Start UDP Server Pokreni UDP poslužitelj Log automatically QSOs from WSJT-X Automatski zapiši QSOe iz WSJT-Xa Allow WSJT-X to send logged QSO to KLog Dozvoli WSJT-Xu da šalje zapisani QSO KLogu QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will log automatically any QSO coming from WSJT-X without any manual confirmation. KLog će automatski upisati svaki QSO koji dolazi iz WSJT-Xa bez ikakve ručne potvrde. Receive and Update QSO data to KLog Primi i osvježi QSO podatke u KLogu KLog will automatically show and update data coming from WSJT-X (DX callsign, locator, RPT, ...) KLog će automatski pokazati i osvježiti podatke koji dolaze iz WSJT-Xa (DX pozivni znak, lokator, izvještaj, ...) Make sure it is the same port where the other programs are sending the data to. Default port is 2237. Provjerite da je to isti port na koji i drugi programi šalju podatke. Uobičajena vrijednost je 2237. UDP port number where the UDP Server will listen for packets. UDP port na kojem će UDP poslužitelj slušati za pakete. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP poslužitelj će primiti QSOe poslane iz drugih programa kao na primjer WSJT-X što će vam omogućiti automatsko zapisivanje iz tih programa u KLog. UDP Port UDP Port QSO notification timeout (milisecs) Vrijeme trajanja QSO obavijesti (milisekundi) Milliseconds that the notification of QSO received from WSJTX will be shown. Miliseconds that the notification of QSO received from WSJTX will be shown. Milisekunde koliko će trajati prikaz obavijesti za QSO primljen iz WSJTXa. SetupPageUserDataPage &Personal data Personal data Osobni &podaci Station &data Station data Podaci &postaje &Name Name &Ime &Address Address &Adresa Cit&y City &Grad &Zip Code Zip Code &Poštanski kod Pro&v/State Prov/State Županija/&Regija Countr&y Country &Zemlja Enter your information for rig Unesite podatke o vašoj postaji Enter your information for antenna Unesite podatke o vašoj anteni Enter your name. Unesite vaše ime. Enter your address - 1st line. Unesite vašu adresu - 1. red. Enter your address - 2nd line. Unesite vašu adresu - 2. red. Enter your address - 3rd line. Unesite vašu adresu - 3. red. Enter your address - 4th line. Unesite vašu adresu - 4. red. Enter your city. Unesite vaš grad. Enter your zip code. Unesite vaš poštanski kod. Enter your province or state. In Croatian language both "country" and "state" translate to "država", there is no concept similar to that of US states as being parts of the country. Unesite vašu pokrajinu ili županiju. Enter your country. Unesite vašu državu. Enter your power information. Unesite potatke o vašoj snazi. &Rig 1 &Radio uređaj 1 R&ig 2 R&adio uređaj 2 Ri&g 3 Ra&dio uređaj 3 Antenna &1 Antena &1 Antenna &2 Antena &2 Antenna &3 Antena &3 Po&wer &Snaga Enter the station callsign that will be used for logging. Unesite pozivni znak postaje koji će biti korišten za zapisivanje dnevnika. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Unesite lokator vaše postaje. Alternativno, KLog može koristiti približan lokator na osnovu vašeg pozivnog znaka. &QRZ &QRZ &Operators &Operatori &CQ Zone &CQ Zona &ITU Zone &ITU Zona &Locator &Lokator &Locator (not valid) &Lokator (neispravan) Enter the operators (comma separated if more than one). Unesite operatere (odvojene zarezom ako je više od jednog). SetupPageWorldEditor KLog will not be able to show entities information. KLog neće moći prikazati podatke o entitetima. Prefix Prefiks Entity Entitet An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Datoteka s podacima o entitetima (cty.csv) pronađena u vašoj KLog mapi bit će učitana. Add Dodaj Delete Izbriši Edit Export World Import World Still not implemented. Import a new cty.csv file No entities information file (cty.csv) has been detected in your KLog folder. Datoteka s podacima o entitetima (cty.csv) ne postoji u vašoj KLog mapi. ARRL ID ARRL ID Continent Kontinent CQ Zone CQ Zona ITU Zone ITU Zona UTC UTC Latitude Širina Longitude Dužina Deleted Izbrisano Since Date Od datuma To Date Do datuma Open File Otvori datoteku BigCTY (*.csv) VelikiCTY (*.csv) Entities information has been updated. Podaci o entitetima su ažurirani. Entities information has not been updated. Podaci o entitetima nisu ažurirani. ShowErrorDialog KLog Message KLog poruka SoftwareUpdateDialog Ok Ok KLog update KLog nadogradnja Congratulations! Čestitke! Your KLog has been updated. Vaš KLog je ažuriran. You already have the latest version. Već imate najnoviju inačicu. StartWizard KLog - The free hamradio logging program KLog - slobodna dnevnička aplikacija za radio-amatere Quit Setup Izađi iz postavljanja Setup is not complete yet. Are you sure you want to quit setup? Postavljanje nije završeno. Jeste li sigurni da želite izaći iz postavljanja? StatisticsWidget QSO per year QSOi po godini DXCC per year DXCC po godini CQ zones per year CQ zone po godini QSO per band QSOi po frekv. pojasu QSO per mode QSOi po načinu rada QSO per DXCC QSOi po DXCCu QSO per Continent QSO per hour QSOi po satu QSO per month Worked / Confirmed status Worked / Sent status Sent / Confirmed status StatsCQZPerYearBarChartWidget CQ Zones per year Reading data ... Učitavam podatke ... Abort reading Prekini čitanje CQ zones CQ zone CQ zones per year CQ zone po godini Reading data ... Učitavam podatke ... Years: %1/%2 StatsEntitiesPerYearBarChartWidget Chart title Naslov dijagrama Reading data ... Učitavam podatke ... Abort reading Prekini čitanje DXCC Entities DXCC Entiteti DXCC Entities per year DXCC Entiteti po godini Reading data ... Učitavam podatke ... Entities: Entiteti: StatsQSOsPerBandBarChartWidget QSOs per band Reading data ... Učitavam podatke ... Abort reading Prekini čitanje Bands Frekvencijski pojasevi QSO per band distribution Raspodjela QSOa po opsezima Reading data ... Učitavam podatke ... Bands: Pojasevi: StatsQSOsPerContinentBarChartWidget QSOs per continent Reading data ... Učitavam podatke ... Abort reading Prekini čitanje Continents Reading data ... Učitavam podatke ... Hours: Sati: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC Reading data ... Učitavam podatke ... Abort reading Prekini čitanje Reading data... Učitavam podatke ... Entity: Entitet: DXCC DXCC Top ten DXCC per QSO Gornjih deset DXCCa po QSOu StatsQSOsPerHourBarChartWidget QSOs per hour Reading data ... Učitavam podatke ... Abort reading Prekini čitanje Hours Sati QSOs at hour QSOa po satu Reading data ... Učitavam podatke ... Hours: Sati: StatsQSOsPerModeBarChartWidget QSOs per mode Reading data ... Učitavam podatke ... Abort reading Prekini čitanje Modes Načini rada QSO per mode distribution Raspodjela QSOa po načinu rada Reading data ... Učitavam podatke ... Modes: Načini rada: StatsQSOsPerMonthBarChartWidget QSOs per month Reading data ... Učitavam podatke ... Abort reading Prekini čitanje Jan Feb Mar Apr May Jun Jul Sep Oct Nov Dec Aug Months QSOs at Month Reading data ... Učitavam podatke ... Months: StatsQSOsPerYearBarChartWidget Chart title Naslov dijagrama Reading data ... Učitavam podatke ... Abort reading Prekini čitanje QSOs QSOi QSOs per year QSOi po godini Reading data ... Učitavam podatke ... QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Confirmed - %2 StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Confirmed - %2 StatsWorkedSentPieChartWidget Worked - %1 Sent - %2 UpdateSatsData Reading Satellites data file... Učitavam podatke o satelitima... Abort reading Prekini čitanje The Satellites information has been updated. Open File Otvori datoteku Sat Data Sat podaci World Entity Entitet Continent Kontinent Abort reading Prekini čitanje Reading cty.csv... Čitam cty.csv... eLogClubLog Host not found! Stroj nije nađen! Timeout error! Greška prekoračenja vremena! KLog - ClubLog KLog - clublog KLog - ClubLog Undefined error... Nedefinirana pogreška... Callsign missing Nedostaje pozivni znak Invalid callsign Nevaljali pozivni znak Skipping SWL callsign Preskačem SWL pozivni znak Callsign is your own call Callsign is your ow call Pozivni znak je vaš vlastiti pozivni znak Invalid callsign with no DXCC mapping Nevaljali pozivni znak bez DXCC veze Updated QSO QSO ažuriran Invalid ADIF record Nevaljali ADIF zapis Missing ADIF record Nedostajeći ADIF zapis Test mode - parameters ok, no action taken Test način rada - parametri su u redu, nikakva akcija nije poduzeta It seems to be a PASSWORD ERROR; check your password. Izgleda kao problem s lozinkom; provjerite vašu lozinku. It seems that your ClubLog password is not correct. Izgleda da vaša ClubLog lozinka nije ispravna. Please check your password in the setup. ClubLog uploads will be disabled. Molim provjerite lozinku u postavkama. ClubLog učitavanja će biti onemogućena. Excessive API Usage Prekomjereno korištenje APIa Internal Error Interna pogreška Rejected I am not sure about the context, this is the masculine version of "rejected" Odbačen QSO Duplicate Duplicirani QSO QSO Modified QSO ažuriran Missing Login Nedostaje Login QSO OK QSO OK Upload denied Snimanje podataka na poslužitelj odbijeno No callsign selected Niti jedan pozivni znak nije označen No match found Ništa podudarajuće nije nađeno Dropped QSO Ispušten QSO OK OK Login rejected Login odbijen Rejected: Callsign is your own call Odbijeno: pozivni znak je vaš vlastiti pozivni znak klog-0.9.8.1/utilities.h0000644000175000017500000000721513532572307014003 0ustar develdevel#ifndef UTILITIES_H #define UTILITIES_H /*************************************************************************** utilities.h - description ------------------- begin : jun 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ /* This class implements general use utilities that can be used from any other class Anything that is not directly related with a class itself and could be used from different classes should be here */ #include #include #include #include "locator.h" #include class Utilities { public: Utilities(); ~Utilities(); int getProgresStepForDialog(int totalSteps); bool trueOrFalse(const QString _s); // reads a String and return true if s.upper()== TRUE :-) QString checkAndFixASCIIinADIF(const QString _data); QString getAgent(const QString _klogversion); //Devel or debug functions - Not adding any feature to the user void printQString(const QStringList _qs); QString getKLogDBFile(); //QString getKLogDatabaseFile(const QString _file); bool isDBFileExisting(); bool isDBFileExisting(const QString _file); QString getHomeDir(); QString getCfgFile(); QString getCTYFile(); void setVersion(const QString _v); QString getVersion(); double getVersionDouble(); QDate getDefaultDate(); int getNormalizedDXCCValue(const int _dxcc); // Validations bool isValidDate(const QDate _d); bool isValidDateTime(const QString _d); bool isValidCall(const QString _c); bool isValidTime(const QString _t); bool isValidBandId(const int _b); bool isValidModeId(const int _m); bool isValidFreq(const QString _b); bool isValidGrid(const QString _b); bool isValidRST(const QString _b); bool isValidPower(const QString _b); bool isValidComment(const QString _b); bool isValidName(const QString _b); bool isValidADIFField(const QString _b); QStringList getValidADIFFieldAndData(const QString _b); private: bool processConfigLine(const QString _line); QString getKLogDefaultDatabaseFile(); QString dbPath; QString softwareVersion; }; #endif // UTILITIES_H klog-0.9.8.1/mainwindowmydatatab.h0000644000175000017500000000706213532572307016033 0ustar develdevel#ifndef MAINWINDOWMYDATATAB_H #define MAINWINDOWMYDATATAB_H /*************************************************************************** mainwindowmydatatab.h - description ------------------- begin : jul 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports MY DATA // #include #include //#include "dataproxy.h" //#include "dataproxy_sqlite.h" class MainWindowMyDataTab : public QWidget { Q_OBJECT public: explicit MainWindowMyDataTab(QWidget *parent = 0); ~MainWindowMyDataTab(); void createUI(); void setData(const double _power, const QString _stationQRZ, const QString _operator, const QString _myLocator); void setSetupMyPower(const double _power); void setSetupOperator(const QString _op); void setSetupStationQRZ(const QString _op); void setSetupMyLocator(const QString _op); void setMyPower(const double _power); double getMyPower(); //double getLastPower(); void setOperator(const QString _op); QString getOperator(); //QString getLastOperator(); void setStationQRZ(const QString _op); QString getStationQRZ(); //QString getLastStationQRZ(); void setMyLocator(const QString _op); QString getMyLocator(); //QString getLastMyLocator(); void show(); //Shows the values into the widget void clear(const bool _keepMyData); private: //void setLastOperator(const QString _op); //void setLastStationQRZ(const QString _op); //void setLastMyLocator(const QString _op); //void setLastPower(const double _power); QDoubleSpinBox *myPowerSpinBox; QString stationQRZ, operatorQRZ, myLocator; //Not changed during normal operations. They come from the configuration QString lastOperatorQRZ, lastStationQRZ, lastMyLocator; // Change dinamically during execution double myPower, lastPower; QLineEdit *operatorLineEdit, *stationCallSignLineEdit, *myLocatorLineEdit; QRadioButton *keepThisDataForNextQSORadiobutton; }; #endif // MAINWINDOWMYDATATAB_H klog-0.9.8.1/gpl-3.0-standalone.html0000644000175000017500000011150513532572307015711 0ustar develdevel GNU General Public License v3.0 - GNU Project - Free Software Foundation (FSF)

GNU GENERAL PUBLIC LICENSE

Version 3, 29 June 2007

Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The GNU General Public License is a free, copyleft license for software and other kinds of works.

The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.

To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.

For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.

Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS

0. Definitions.

“This License” refers to version 3 of the GNU General Public License.

“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.

To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.

A “covered work” means either the unmodified Program or a work based on the Program.

To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.

To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.

An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.

1. Source Code.

The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.

A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.

The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.

The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.

The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.

The Corresponding Source for a work in source code form is that same work.

2. Basic Permissions.

All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.

You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.

Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

3. Protecting Users' Legal Rights From Anti-Circumvention Law.

No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.

When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.

4. Conveying Verbatim Copies.

You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.

You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.

5. Conveying Modified Source Versions.

You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:

  • a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
  • b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
  • c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
  • d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.

A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.

6. Conveying Non-Source Forms.

You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:

  • a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
  • b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
  • c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
  • d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
  • e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.

A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.

A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.

“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.

If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).

The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.

Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.

7. Additional Terms.

“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.

When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.

Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:

  • a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
  • b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
  • c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
  • d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
  • e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
  • f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.

All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.

If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.

Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.

8. Termination.

You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).

However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.

9. Acceptance Not Required for Having Copies.

You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.

10. Automatic Licensing of Downstream Recipients.

Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.

An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.

You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.

11. Patents.

A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.

A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.

In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.

If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.

If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.

A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.

Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.

12. No Surrender of Others' Freedom.

If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.

13. Use with the GNU Affero General Public License.

Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.

14. Revised Versions of this License.

The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.

If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.

Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.

15. Disclaimer of Warranty.

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

16. Limitation of Liability.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

17. Interpretation of Sections 15 and 16.

If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>.

The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.

klog-0.9.8.1/dxcluster.h0000644000175000017500000001140113532572307013775 0ustar develdevel#ifndef DXCLUSTER_H #define DXCLUSTER_H /*************************************************************************** dxcluster.h - description ------------------- begin : oct 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include //#include #include #include #include #include "awards.h" #include "world.h" #include "dataproxy.h" class QWidget; class QTcpSocket; class DXClusterWidget : public QWidget { Q_OBJECT public: DXClusterWidget(DataProxy *dp, QWidget *parent ); DXClusterWidget(DataProxy *dp, const QString &clusterToConnect, const int portToConnect, QWidget *parent ); void setColors (const QString _newOne, const QString _needed, const QString _worked, const QString _confirmed, const QString _default); void setDXClusterSpotConfig(bool _showhf, bool _showvhf, bool _showwarc, bool _showworked, bool _showconfirmed, bool _showann, bool _showwwv, bool _showwcy ); void setDXClusterServer(const QString &clusterToConnect, const int portToConnect); void setCurrentLog(const int _log); bool isConnected(); void setMyQRZ(const QString _qrz); void setDXMarathon (const bool _enable); //void sendSpotToCluster(const QString _dx, const QString _freq); ~DXClusterWidget(); private slots: void slotClusterDisplayError(QAbstractSocket::SocketError socketError); void slotClusterDataArrived(); void slotClusterSocketConnected(); void slotClusterSocketConnectionClosed(); void slotClusterSendToServer(); void slotClusterClearLineInput(); void slotClusterInputTextChanged(); void slotClusterDXClusterWidgetItemDoubleClicked( QListWidgetItem * item ); void slotClusterDXClusterWidgetItemEntered( QListWidgetItem * item); void slotClusterDXClusterWidgetItemSelected(); signals: void dxspotclicked(const QStringList _qs); // DXSpotCall, DX-Freq, doubleClicked private: //void TESTADDSPOT(); // Just a test spot void initClass(); void connectToDXCluster(); QStringList readItem(QListWidgetItem * item); bool checkIfNeedsToBePrinted(const QString _DXEntity, const int _band, const int _mode); void addData(); //TO BE DELETED, JUST FOR TESTING PURPOSES QTcpSocket *tcpSocket; QListWidget *dxClusterListWidget; QLineEdit *inputCommand; QPushButton *sendButton; QPushButton *clearButton; bool dxClusterConnected; bool dxClusterAlreadyConnected; QString server; quint16 port; quint16 blockSize; QColor dxSpotColor; World *world; Awards *awards; DataProxy *dataProxy; bool showhf, showvhf, showwarc, showworked, showconfirmed, showann, showwwv, showwcy; bool dxClusterShowHF, dxClusterShowVHF, dxClusterShowWARC, dxClusterShowWorked, dxClusterShowConfirmed, dxClusterShowAnn, dxClusterShowWWV, dxClusterShowWCY; bool showDxMarathon; QString myQrz; int currentLog; int constrid; // Just an id for the constructor to check who is being executed at one specific time }; class dxClusterSpotItem : public QListWidgetItem { public: dxClusterSpotItem( QListWidget* parent, const QString& spot, const QColor& color ); ~dxClusterSpotItem(); protected: QColor spotColor; }; #endif // DXCLUSTER_H klog-0.9.8.1/dxccstatuswidget.cpp0000644000175000017500000005040613532572307015714 0ustar develdevel#include "dxccstatuswidget.h" //#include /* TODO: Adjust the header columns TODO: Add some color to the texts depending on C, W or - TODO: Call the creation of this depending on the bands that the user is using */ DXCCStatusWidget::DXCCStatusWidget(DataProxy *dp, const QString _parentFunction, QWidget *parent) : QWidget(parent) { //qDebug() << "DXCCStatusWidget::DXCCStatusWidget from: " << _parentFunction << endl; dataProxy = dp; locator = new Locator(); awards = new Awards(dataProxy, Q_FUNC_INFO); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-1" << endl; world = new World(dataProxy,Q_FUNC_INFO); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-2" << endl; dxccView = new QTableWidget; //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-3" << endl; dxccView->setMouseTracking(true); dxccView->setSortingEnabled(true); numberOfColumns = 0; logNumber = -1; // -1 means that ALL the logs will be used (if showAllLogsButton is not checked) tempLog = -1; // -1 means that ALL the logs will be used loc = QString(); refreshButton = new QPushButton; bandNames.clear(); validBands.clear(); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-4" << endl; setDefaultBands(); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-5" << endl; createUI(); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget - END" << endl; } DXCCStatusWidget::~DXCCStatusWidget(){} void DXCCStatusWidget::createUI() { //qDebug() << "DXCCStatusWidget::createUI " << endl; // We remove the vertical header hv = dxccView->verticalHeader(); hv->hide(); hv->setStretchLastSection(true); hh = dxccView->horizontalHeader(); //qDebug() << "DXCCStatusWidget::createUI-10" << endl; refreshButton->setText(tr("Update")); //showAllLogsButton->setText("All logs"); //qDebug() << "DXCCStatusWidget::createUI-11" << endl; dxccView->setContextMenuPolicy(Qt::CustomContextMenu); //qDebug() << "DXCCStatusWidget::createUI-12" << endl; dxccView->setColumnCount(numberOfColumns); //qDebug() << "DXCCStatusWidget::createUI-13" << endl; dxccView->horizontalHeader()->setStretchLastSection(true); //qDebug() << "DXCCStatusWidget::createUI-14" << endl; //qDebug() << "DXCCStatusWidget::createUI-15" << endl; dxccView->setRowCount(0); //qDebug() << "DXCCStatusWidget::createUI-20" << endl; QHBoxLayout *bottonLineLayout = new QHBoxLayout; bottonLineLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); bottonLineLayout->addWidget(refreshButton); QVBoxLayout *tabLayout = new QVBoxLayout; tabLayout->addWidget(dxccView); tabLayout->addLayout(bottonLineLayout); setLayout(tabLayout); //qDebug() << "DXCCStatusWidget::createUI-30" << endl; dxccView->resizeColumnsToContents(); dxccView->resizeRowsToContents(); //qDebug() << "DXCCStatusWidget::createUI-90" << endl; connect(refreshButton, SIGNAL(clicked()), this, SLOT(slotRefreshButtonClicked() ) ); //qDebug() << "DXCCStatusWidget::createUI-91" << endl; connect(dxccView, SIGNAL(itemDoubleClicked(QTableWidgetItem *)), this, SLOT(slotItemDoubleClicked(QTableWidgetItem *) ) ); //qDebug() << "DXCCStatusWidget::createUI-92" << endl; connect(dxccView, SIGNAL(itemEntered(QTableWidgetItem *)), this, SLOT(slotItemEntered(QTableWidgetItem *) ) ); //qDebug() << "DXCCStatusWidget::createUI-93" << endl; //dxccView->setSortingEnabled(false); //qDebug() << "DXCCStatusWidget::createUI-END" << endl; } void DXCCStatusWidget::update() { //qDebug() << "DXCCStatusWidget::update " << endl; //int entities = world->getHowManyEntities(); int entities = dataProxy->getMaxEntityID(false); //qDebug() << "DXCCStatusWidget::update: " << QString::number(entities) << " entities to update" << endl; QStringList list; //qDebug() << "DXCCStatusWidget::update: -1" << endl; list.clear(); //qDebug() << "DXCCStatusWidget::update: -2" << endl; QString aux; //qDebug() << "DXCCStatusWidget::update: -3" << endl; if (dxccView->columnCount()>1) { //dxccView->sortByColumn(1, Qt::AscendingOrder); dxccView->clearContents(); tempLog = -1; //qDebug() << "DXCCStatusWidget::update pre FOR" << endl; for (int i=1; i<=entities; i++) { //qDebug() << "DXCCStatusWidget::update in FOR " << QString::number(i) << endl; aux = world->getEntityName(i); //qDebug() << "DXCCStatusWidget::update in FOR aux: " << aux << endl; list.clear(); if (aux.length()>2) // Not all integers refers to an entity. { list << QString::number(i) << aux << bandNames; addEntity(list); } } } //qDebug() << "DXCCStatusWidget::update END" << endl; } void DXCCStatusWidget::addEntity(QStringList const _ent) { //qDebug() << "DXCCStatusWidget::addEntity: " << _ent.at(1) << " / " << QString::number(_ent.length()) << endl; // DXCC id, Entity Name, bandName1, bandName2, ... if (_ent.length() != numberOfColumns) { //qDebug() << "DXCCStatusWidget::addEntity: ERROR: in number of columns" << QString::number(_ent.length()) << "/" << QString::number(numberOfColumns) << endl; return; } int status = -1; int ent = (_ent.at(0)).toInt(); int bandid = 0; QString entName = _ent.at(1); if (entName.length()<2) { //qDebug() << "DXCCStatusWidget::addEntity: ERROR: entname too short!" << endl; return; } QString flagSt; flagSt.clear(); QString aux; aux = dataProxy->getISOName(ent); if (aux.length()>1) { flagSt = ":/" + aux + ".png"; } else { flagSt.clear(); } flagSt = ":/flags/" + aux + ".png"; QIcon flagIcon(flagSt); //qDebug() << "DXCCStatusWidget::addEntity: Flag: " << flagSt << endl; dxccView->insertRow(dxccView->rowCount()); //qDebug() << "DXCCStatusWidget::addEntity: rowCount: " << QString::number(dxccView->rowCount()) << endl; QTableWidgetItem *newItemID = new QTableWidgetItem(_ent.at(0)); newItemID->setTextAlignment(Qt::AlignCenter); newItemID->setFlags(Qt::NoItemFlags); dxccView->setItem(dxccView->rowCount()-1, 0, newItemID); for (int i=2; i < _ent.length(); i++) { bandid = dataProxy->getIdFromBandName(_ent.at(i)); QTableWidgetItem *newItem = new QTableWidgetItem(awards->getDXCCStatusBand(ent, bandid, tempLog)); newItem->setTextAlignment(Qt::AlignCenter); //newItem->setFlags(Qt::NoItemFlags); newItem->setFlags(Qt::ItemIsEnabled); //newItem->setFont(font); if (newItem->text()=="C") { newItem->setTextColor(Qt::blue); newItem->setBackgroundColor(Qt::green); status = 1; } else if (newItem->text()=="W") { if (status < 0) { status = 0; } newItem->setTextColor(Qt::red); newItem->setBackgroundColor(Qt::yellow); } else { } dxccView->setItem(dxccView->rowCount()-1, i, newItem); //qDebug() << "DXCCStatusWidget::addEntity: rowCount-2: " << QString::number(dxccView->rowCount()) << "/" << QString::number(i) << " / " << newItem->text() << endl; } QTableWidgetItem *newItemName = new QTableWidgetItem(entName); newItemName->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); newItemName->setFlags(Qt::ItemIsEnabled); //newItemName->setFlags(Qt::ItemIsUserCheckable); newItemName->setIcon(flagIcon); if (status == 1) { newItemName->setTextColor(Qt::blue); //newItemName->setTextColor(Qt::blue); //newItemName->setBackgroundColor(Qt::green); } else if (status == 0) { newItemName->setTextColor(Qt::darkRed); } else { newItemName->setTextColor(Qt::red); } dxccView->setItem(dxccView->rowCount()-1, 1, newItemName); //qDebug() << "DXCCStatusWidget::addEntity: END" << endl; } void DXCCStatusWidget::setBands(QStringList const _ent, const bool _creating) {// Receives the list of band names //qDebug() << "DXCCStatusWidget::setBands: " << endl; //qDebug() << "DXCCStatusWidget::setBands: " << QString::number(_ent.length()) << endl; //if (_creating) //{ //qDebug() << "DXCCStatusWidget::setBands (creating true) " << QString::number(_ent.length()) << endl; //} //else //{ //qDebug() << "DXCCStatusWidget::setBands (creating false) " << QString::number(_ent.length()) << endl; //} QStringList qs; qs.clear(); //qDebug() << "DXCCStatusWidget::setBands - 01" << endl; qs << dataProxy->sortBandNamesBottonUp(_ent); //qDebug() << "DXCCStatusWidget::setBands - 02: Lenght qs: " << QString::number(qs.size()) << endl; if (qs.length()<0) { //qDebug() << "DXCCStatusWidget::setBands no bands received here " << endl; return; } QString testBand; testBand.clear(); bandNames.clear(); //bandNames << "Id" << "Entity"; //qDebug() << "DXCCStatusWidget::setBands - 03 " << endl; validBands.clear(); //validBands << dataProxy->getBands(); validBands << dataProxy->getBandNames(); //qDebug() << "DXCCStatusWidget::setBands - 04 " << endl; //dxccView->clearContents(); dxccView->clearSelection(); dxccView->clear(); // for (int x = 0; x < dxccView->columnCount(); x++) // { // dxccView->removeColumn(x); // } //bands.clear(); for (int i = 0; isetColumnCount(0); numberOfColumns = dxccView->columnCount(); //qDebug() << "DXCCStatusWidget::setBands 5 to Remove: " << QString::number(dxccView->columnCount()) << endl; //for (int i=0; icolumnCount(); i++) //{ // dxccView->removeColumn(i); // //qDebug() << "DXCCStatusWidget::setBands: Still pending: " << QString::number(i) << endl; //} //dxccView->clear(); while(dxccView->columnCount()>0) { //qDebug() << "DXCCStatusWidget::setBands: Still pending: " << QString::number(dxccView->columnCount()) << endl; dxccView->removeColumn(0); } numberOfColumns = dxccView->columnCount(); //qDebug() << "DXCCStatusWidget::setBands: -6 All removed: " << QString::number(numberOfColumns) << endl; //qDebug() << "DXCCStatusWidget::setBands - 7 " << endl; numberOfColumns = 2 + bandNames.length(); //qDebug() << "DXCCStatusWidget::setBands - 7.1 - columnCount: " << QString::number(dxccView->columnCount()) << endl; //qDebug() << "DXCCStatusWidget::setBands - 7.1 - numberOfColumns: " << QString::number(numberOfColumns) << endl; dxccView->setColumnCount(numberOfColumns); //qDebug() << "DXCCStatusWidget::setBands - 7.2 " << endl; dxccView->setRowCount(0); //qDebug() << "DXCCStatusWidget::setBands - 7.3 " << endl; QStringList headerqs; //qDebug() << "DXCCStatusWidget::setBands - 7.4 " << endl; headerqs.clear(); //qDebug() << "DXCCStatusWidget::setBands - 7.5 " << endl; headerqs << tr("ID") << tr("Entity") << bandNames; //qDebug() << "DXCCStatusWidget::setBands - 8 " << endl; dxccView->setHorizontalHeaderLabels(headerqs); //qDebug() << "DXCCStatusWidget::setBands - 9 PRE-END" << endl; if (!_creating) { //qDebug() << "DXCCStatusWidget::setBands: 9.1 !_creating" << endl; update(); } //qDebug() << "DXCCStatusWidget::setBands: END" << endl; } void DXCCStatusWidget::setDefaultBands() { //qDebug() << "DXCCStatusWidget::setDefaultBands" << endl; /* Default bands: 160M 80M 40M 30M 20M 17M 15M 12M 10M 6M 4M 2M 70CM 28 27 25 24 23 22 21 12 19 18 17 16 14 */ bandNames.clear(); bandNames << "160M" << "80M" << "40M" << "30M" << "20M" << "17M" << "15M" << "12M" << "10M" << "6M" << "4M" << "2M" << "70CM"; setBands(bandNames, true); //qDebug() << "DXCCStatusWidget::setDefaultBands - END" << endl; } void DXCCStatusWidget::slotRefreshButtonClicked() { //qDebug() << "DXCCStatusWidget::slotRefreshButtonClicked" << endl; //TODO: Define a way to show the status of the selected log or all the logs in the DB if (dxccView->rowCount()<1) { return; } QStringList _bands = bandNames; setBands(_bands); //emit updateAwards(); //update(); } void DXCCStatusWidget::refresh() { //qDebug() << "DXCCStatusWidget::refresh" << endl; //update(); slotRefreshButtonClicked(); } void DXCCStatusWidget::setCurrentLog(const int _logN) { //qDebug() << "DXCCStatusWidget::setCurrentLog: " << QString::number(_logN) << endl; if (dataProxy->doesThisLogExist(_logN)) { logNumber = _logN; } else { logNumber = -1; } } void DXCCStatusWidget::slotItemEntered(QTableWidgetItem * item ) { //qDebug() << "DXCCStatusWidget::slotItemEntered: " << ((item->data(0)).toString()).simplified() << endl; //qDebug() << "DXCCStatusWidget::slotItemEntered: " << item->text() << endl; //qDebug() << "DXCCStatusWidget::slotItemEntered: " << endl; if (dxccView->rowCount()<1) { return; } QString tip; tip.clear(); int row = -1; int column = -1; int bandi = -1; QString band = QString(); if (item) { row = dxccView->row(item); column = dxccView->column(item); //qDebug() << "DXCCStatusWidget::slotItemEntered: row: " << QString::number(row) << endl; //qDebug() << "DXCCStatusWidget::slotItemEntered: hrow: " << dxccView->verticalHeaderItem(row)->text() << endl; row = (dxccView->item(row,0)->text()).toInt(); //qDebug() << "DXCCStatusWidget::slotItemEntered: column: " << QString::number(column) << endl; if (column == 1) { int _enti = dataProxy->getEntityIdFromName(item->text()) ; tip = tr("Pref: ") + dataProxy->getEntityMainPrefix(_enti) + " - "; tip = tip + tr("CQ: ") + QString::number(dataProxy->getCQzFromEntity(_enti)) + " - "; tip = tip + tr("ITU: ") + QString::number(dataProxy->getITUzFromEntity(_enti)) + " - "; QString dxLoc = locator->getLocator(dataProxy->getLongitudeFromEntity(_enti), dataProxy->getLatitudeFromEntity(_enti)) ; tip = tip + tr("Beam: ") + QString::number(locator->getBeamBetweenLocators(loc, dxLoc)); //qDebug() << "DXCCStatusWidget::slotItemEntered: myLoc: " << loc << endl; //qDebug() << "DXCCStatusWidget::slotItemEntered: DXLoc: " << dxLoc << endl; } else if (column >= 2) { if (item->text() == "-") { tip = tr("Entity not worked in this band."); } else { band = dxccView->horizontalHeaderItem(column)->text(); //qDebug() << "DXCCStatusWidget::slotItemEntered: band: " << band << endl; bandi = dataProxy->getIdFromBandName(band); //qDebug() << "DXCCStatusWidget::slotItemEntered: band: " << QString::number(bandi) << endl; tip = awards->getQSOofAward(row, bandi); //qDebug() << "DXCCStatusWidget::slotItemEntered: tip: " << tip << endl; if (tip.length()>3) { tip = "QSO: " + tip; } else { //tip = tr("Text TBD."); tip = tr(""); } } } else { //tip = tr("ADD: Pref: Bearing, CQ & ITU."); tip = ""; // TODO define a text to be shown when no band column is selected (maybe Continent & bearing or a link to wikipedia or whatever!) } item->setToolTip(tip); //qDebug() << "DXCCStatusWidget::slotItemEntered: tip: " << tip << endl; } else {} //qDebug() << "DXCCStatusWidget::slotItemEntered: END " << endl; } void DXCCStatusWidget::slotItemDoubleClicked(QTableWidgetItem * item ) { //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: " << ((item->data(0)).toString()).simplified() << endl; //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: " << item->text() << endl; //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked - start" << endl; if (dxccView->rowCount()<1) { return; } int row = -1; int column = -1; int qsoId = -1; int bandi = -1; int columns = dxccView->columnCount(); int _entiNumb = -1; //Read the ENtity number that the user is selecting. QString band = QString(); //QString entityName = QString(); QList qsos; qsos.clear(); QTableWidgetItem * it = new QTableWidgetItem(0); //it->setText(item->data(Qt::DisplayRole)); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - 01" << endl; if (item) { row = dxccView->row(item); column = dxccView->column(item); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: row: " << QString::number(row) << endl; //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: column: " << QString::number(column) << endl; //if (column == 1) if (true) { //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column = 1" << endl; //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column header: " << dxccView->horizontalHeaderItem(column)->text() << endl; _entiNumb = ((dxccView->item(row,0))->text()).toInt(); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - EntityNumber: " << QString::number(_entiNumb) << endl; for (int i = 2; i < columns; ++i) { //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column: " << QString::number(i) << endl; //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column header: " << (dxccView->horizontalHeaderItem(i))->text() << endl; //entityName = (dxccView->item(row,i))->text() ; //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - item: " << endl; it->setText(dxccView->item(row,i)->text()); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column-txt: " << it->text() << endl; band = dxccView->horizontalHeaderItem(i)->text(); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: band: " << band << endl; bandi = dataProxy->getIdFromBandName(band); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: band: " << QString::number(bandi) << endl; qsoId = awards->getQSOIdofAward(_entiNumb, bandi); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: QSOid: " << QString::number(qsoId) << endl; if (qsoId>0) { qsos.append(qsoId); } } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - END of for" << endl; if (qsos.length()>0) { //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - qsos.length = " << QString::number(qsos.length()) << endl; emit showQsos(qsos); } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - END of column == 1" << endl; } else { //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column != 1" << endl; //tip = ""; // TODO define a text to be shown when no band column is selected (maybe Continent & bearing or a link to wikipedia or whatever!) } } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: END " << endl; } void DXCCStatusWidget::setMyLocator(const QString _loc) { //qDebug() << "DXCCStatusWidget::setMyLocator: " << _loc << endl; QString l = _loc; if ( locator->isValidLocator(l.toUpper()) ) { loc = l.toUpper(); } } klog-0.9.8.1/tips-for-devel.txt0000644000175000017500000000046513532572307015220 0ustar develdevelSQLite http://www.w3schools.com/sql/default.asp Transfer or populate sqlite table to another table INSERT INTO TABLE2 (COL1, COL2, COL3) SELECT COL1, COL4, COL7 FROM TABLE1 Select only different DXCC select count (distinct dxcc) from log DELETED ENTITIES: http://www.ng3k.com/Dxcc/dxccde.html klog-0.9.8.1/softwareupdatedialog.h0000644000175000017500000000435313532572307016205 0ustar develdevel#ifndef SOFTWAREUPDATEDIALOG_H #define SOFTWAREUPDATEDIALOG_H /*************************************************************************** softwareupdatedialog.h - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include class SoftwareUpdateDialog: public QDialog { Q_OBJECT public: SoftwareUpdateDialog(); ~SoftwareUpdateDialog(); void setVersion(const QString tversion, const bool updateNeeded); private slots: void slotAcceptButtonClicked(); private: void keyPressEvent(QKeyEvent *event); QTextBrowser *textBrowser; QString text; QString _version; }; #endif // SOFTWAREUPDATEDIALOG_H klog-0.9.8.1/TODO0000644000175000017500000004415113532572307012307 0ustar develdevelRC-BUGS: TODO: Check if dxccStatusWidget in logwindow is useful and remove it if not. NONE TBD - 0.9.8 Hamlib: COMports in Windows must follow the format: \\.\com14 for ports highet than 9 but it works also for lower so ALL should be managed that way. For next release: TODO: - Some warnings removed from compilation time. TODO: - The log can be now updated with a LoTW ADIF file import. TODO: - Add a warning or periodically ADIF export so data is backup. TODO: - Isolate the Awards tab and create a widget with it. TODO: - ADD A TIP ON the DXCC tab stating Prefix, CQ, ITU & Bearing. TODO: Rework the band & mode hash tables to optimize queries (not sql queries) TODO: Rework the DXCC & WAZ hash table sto optimize queries (not SQL queries) TODO: - Add an option to disable DX-Marathon support. TODO: - Check if the save to adif on exit is working properly TODO: Import LOTW (MainWindow::slotADIFImport) TODO: Remove the Querys from void SetupPageLogs:: TODO: Create a Widget with the WAZ status (copying the DXCC Status widget) Working: TODO: ADD A TIP ON the DXCC tab stating Prefix, CQ, ITU & Bearing TODO: Check how to implement qInstallMessageHandler SAT DB: https://db.satnogs.org/api/ This is a kind of roadmap for KLog development. It is not fixed... new features may be prioritized or not added without any notice ;-) Feel free to request any roadmap change if you have any suggestion. TODO: To add the support to import/export the following ADIF fields that are already existing in DB AWARD_SUBMITTED AWARD_GRANTED DARC_DOK FISTS FISTS_CC GUEST_OP "hrdlog_qso_upload_date VARCHAR(10)," "hrdlog_qso_upload_status VARCHAR(1)," "my_antenna VARCHAR," "my_dxcc INTEGER, " "my_fists INTEGER, " "my_itu_zone INTEGER ," "my_postal_code VARCHAR ," "my_sota_ref VARCHAR, " "my_usaca_counties VARCHAR, " "my_vucc_grids VARCHAR, " "silent_key VARCHAR(1), " "region VARCHAR, " "qrzcom_qso_upload_date VARCHAR(10), " "qrzcom_qso_upload_status VARCHAR(1), " "skcc VARCHAR, " "sota_ref VARCHAR, " "uksmg INTEGER, " "usaca_counties VARCHAR, " "ve_prov VARCHAR, " "vucc_grids VARCHAR, " TODO: Add a warning or periodically ADIF export so data is backup TODO: Create a function to look for QSO without a DXCC and ask the user to confirm the DXCC. TODO: Isolate the QSO input tab and create a widget with it. TODO: Isolate the Main QRZ box and create a widget with it. TODO: Isolate the Awards tab and create a widget with it. TODO: Add an option to save the DXCluster data to a file (file based on name or so) TODO: Think if it is possible to create a function in the Widgets(i.e. MainWindowInputQSL) to read the data and enter it in the DB automatically when the user clicks on "enter" It would help to "isolate" it and make it more "independant" TODO: Review the color management in MainWindowInputOthers::setIOTA (and maybe others) (completewithPrevious of MainWindow) TODO: Check if in mainwindow (read formUI and modify the eQSL/LOTW REC/SENT values are correct TODO: If no QSL sent via or rec via are defined, KLog shows as direct? It should be bureau TODO: Add a cheking to the list of bureaus and propose the bureau for QSL via when there is an existing one and propose direct when no bureau is existing. (http://www.iaru.org/qsl-bureaus.html) TODO: Define band limits for CW/SSB/RTTY... so when a click on the cluster is done, the right mode is proposed. TODO: Add in the setup/Band/mode a combobox showing all the active band/modes so the user can select the default band/mode from that list. BUG: Potential bug Double click on a QSO in the log on the Mode/Band... you can modifify the value. As it is a double click, the QSO goes to edit and ... Check if: - Only selected modes can be shown there. - If double click on the log we only "quick modify" directly in the log, without editing. BUG: (TNX JL3OXR) The DB is not storing if the time is stored in UTC or local so that info is lost. If a user changes the configuration from time to time, the user will loose the real time when the QSO was made. Solution: - Consider the DB is only storing UTC QSO. - Read config from user (or simply ask) and convert all the DB to UTC if needed (only one time when new version is installed to upgrade the DB) Always: - When entering data from the UI, check the user config and store only UTC time. - TODO: Think how to show the data in the log or search box as data is stored in UTC and showed directly (specially log widget) - Solution: Maybe changing the header to UTC may solve this and provide the info to the user that UTC is being used for storage It may be weird for the user to see the log in UTC when working in local time... in the rest of the functions... TODO: void DXCCStatusWidget::slotRefreshButtonClicked()//TODO: Define a way to show the status of the selected log or all the logs in the DB BUG: Optimize the KLog start BUG: If logbook.dat is not existing but klogrc it is, KLog does not start. TODO: Add a tip on the DXCC Status showing some info: bearing, DXCC status (worked or not...) TODO: Add a link or action on DXCCStatus items to doubleclick and search the QSOs that provide such status. TODO: Show the flag of the worked QRZ on the top right,close to the Entity Name TODO: Add the flags to the DXCluster TODO: Click on an Entity name will select all the QSO of that Entity on the search box Debian: Time in UTC: (not to be fixed) https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=654325 BUG: Check the options that are marked in QSL when rightbutton. i.e.: Is myQSL sent marked as requested when it should be the DX-QSL? TODO GUI: To add the CQ/ITU box or make them editable TODO: checkIfNewBandOrMode() is not being used. Code should be removed... BUG: Clublog: void MainWindow::slotQRZReturnPressed() _x = elogClublog->deleteQSO(clublogPrevQSO); _x = elogClublog->sendQSO(dataProxy->getClubLogRealTimeFromId(modifyingQSO)) It runs so fast and not serialized that at the end sometimes the QSO is deleted but not created afterwards TODO: Add the possibility to the user to select from the setup a call to be used in clublog or use the one comming from the station callsign lineedit TODO: In slotQsoUploadFinished, if QSO is not uploaded. mark it as not uploaded in the log If qsoToEdit, nothing is modified and OK. (Clublog returns QSO DUPE) Again qsoToEdit, nothing is modified and OK (Clublogs returns QSO DROPPED, and QSO is dropped!) TODO: Check the values that clublog is returning to manage errors and show messages to the user TODO: To add the possibility to upload a modified QSO to clublog. TODO: If there is an error in password/username or whatever, disable clublog in KLog TODO: Upload a logfile to clublog // Ideas: https://code.google.com/p/datacod-qt-tools/source/browse/upcoder/uploader.h // https://code.google.com/p/datacod-qt-tools/source/browse/upcoder/uploader.cpp TODO: Define a maximum QSO upload rate to clublog to avoid excesive API usage. KLog 0.9.4 TODO: Some Entities are not recognized by ARRL (I, IG9, IT9 are the same ARRL id entities but different ones). Maybe I should not be working with ARRLid or maybe I should detect special ones and "id+10000" so >10000 ids are special ones. KLog 0.9.3 TODO: Support CQ WW SSB (Including Cabrillo Import/Export) TODO: Support CQ WW CW (Including Cabrillo Import/Export) KLog 0.9.4 TODO: Hamlib support (Linux). KLog 0.9.5 TODO: Support CQ WPX SSB (Including Cabrillo Import/Export) TODO: Support CQ WPX CW (Including Cabrillo Import/Export) KLog 0.9.6 WORLDEDITOR Dialog TODO: WorldEditor is not updated when the CTY.CSV file is updated TODO: World Editor: Create a way to add an entity. TODO: World Editor: Create a way to remove an entity. TODO: World Editor: Create a way to edit an entity. KLog 0.9.7 TODO: Integrate with www.clublog.org (http://www.clublog.org/docs/pages/viewpage.action?pageId=1638482) KLog 0.9.8 TODO: Integrate with eqsl.cc https://www.eqsl.cc/qslcard/ADIFContentSpecs.cfm KLog 0.9.9 TODO: Server to log all the QSO in real time (through the network) from N1MM http://n1mm.hamdocs.com/tiki-index.php?page=UDP+Broadcasts&structure=N1MM+Logger+Documentation KLog 0.9.10 TODO: Integrate with FLIGI real time logging (req by AA5VI) KLog 0.9.11 - Cluster release TODO: DXCluster: Add flags to the DXCluster widget TODO: DXCluster: UI: Modify the DX-Cluster tab to show the data in a table?: DX de/Freq/DX/Comment/Time/Loc TODO: DXCluster: Add the DXMarathon information to the spots TODO: DXCLuster: Create a band map (including a "to-be-worked") TODO: Working on the dxCluster: Tool to save the DXCluster in a file (for further analysis). KLog 0.9.12 TODO: Add the awards functionality (to manage awa files, TPEA, WAS, ...) KLog 0.9.13 TODO: Mobile interface. Create a mobile UI. TODO: Check if the data has been modified (only memory) and save the data! TODO BUG: When modifying allow deleting data (as in KLog 0.5.8) DONE BUG: Worked DXCC and WAZ are not updated until confirmed :-? TODO: When importing an ADIF file with several logs, create automatically the logs as detected. TODO: HelpHelpDialog TODO: HelpAboutDialog TODO: setuppagelogs.cpp TODO: Remove references to DataBase from all classes except DataProxySQLite TODO: DXCluster: Lines that are not a DX should not be in another color than default. TODO: Add a default DX Cluster server TODO: Make a tool to mark and export QSO from the right button. (i.e. To mark several QSO to print and export the ADIF file with just those QSO) TODO: Add all the Entity Info to the slotClear to clear everything. TODO: Add a list of previous QSO with the same station, if any. (Done in the search box) TODO: Create something like a void Awards::setAwardsOfAllQSO to read ALL QSO and set the Awards at once instead of adding one QSO per QSO KLOG TODO: TODO: To create a function tha runs the log and marks "N" if QSL has not been sent or received. TODO: Create a setup page to configure a default prop_mode per band (ie 6m = ES) TODO: CTY.DAT update TODO: Award tabs: center/bold tabs TODO: Add export to cabrillo to the logfile SETUP: TODO: Show progress when doing actions TODO: Open this file when opening TODO: DXCLuster: Show HF activity TODO: DXCLuster: Show WARC TODO: DXCLuster: Show VHUF TODO: DXCLuster: Show confirmed TODO: DXCLuster: Show SSB TODO: DXCLuster: Show CW TODO: DXCLuster: Show Ann/full TODO: DXCLuster: Show WCY TODO: DXCLuster: Show WWV TODO: DXCLuster: Double click on a spot, add it to log TODO: DXCLuster: Add Cluster servers DONE: TODO: Colors: Confirmed, Worked, Needed band, New, Default TODO: Require mandatory fields in all QSO TODO: Awards: Add Award TODO: Awards: Remove Award ===================== TODO: Sats: Create a way to update the list of supported satellites. Maybe another tab in the setup dialog as the World Editor TODO: Sats: https://www.eqsl.cc/qslcard/ADIFContentSpecs.cfm TODO: Sats: https://lotw.arrl.org/lotw/faq#sats TODO: Sat Modes: http://www.amsat.org/amsat/intro/sats_faq.html#RTFToC5 http://www.sckans.edu/~sireland/radio/amsat.html A - This mode requires a 2 meter SSB/CW transmitter and a 10 meter SSB/CW receiver and supports CW and voice. B - This mode requires a 70 cm SSB/CW transmitter and a 2 meter SSB/CW receiver and supports CW and voice. Some satellites also support RTTY and SSTV in this mode. J -> V Uplink and U downlink JA - This mode stands for J Analog and requires a 2 meter SSB/CW transmitter and a 70 cm SSB/CW receiver and supports CW, voice. JD - This mode stands for J Digital and requires a 2 meter FM transmitter and a 70 cm SSB/CW receiver and supports packet. K - This mode requires a 15 meter SSB/CW transmitter and a 10 meter SSB/CW receiver and supports CW and voice. This mode is unique in that it can be done with a simple HF rig. S - This mode requires a 70 cm SSB/CW transmitter and a 2.4 GHz SSB/CW receiver and supports CW and voice. Many people use a 2.4 GHz to 2 meter converter with a 2 meter SSB/CW receiver instead of buying a 2.4 GHz SSB/CW receiver. T - This mode requires a 15 meter SSB/CW transmitter and a 2 meter SSB/CW receiver and supports CW and voice. KT, KA, BS, Some satellites have dual modes that operate simultaneously. For example, AO-13 can operate in mode BS which means that it can do both mode B and mode S simultaneously. Other common dual modes are KT and KA. Mode V Mode U Mode U/V -> B TODO: Code a way to sort the bands/modes in the "setuppagebandsmodes.cpp TODO: Create an "updateKLog" class to manage all the release updates so there is a way to detect the version of KLog and upgrade the DB to the latest. TODO: The following fields may add information, even if the qsl has not been rcvd/sent B B TODO: showStatusOfDXCC should be executed when band change. TODO: Add color support: messages for slotQRZTextChanged TODO: SetupPageColors: Check the style in the buttons as the rounds are lost when I change the color!! TODO: MainWindow::processConfigLine: add support for the cluster data. TODO: Check when to connect the DXCluster and when no, it tries twice or more... TODO: Awards: make a function to calculate the total. TODO: Color support: Add needed, worked, confirmed, neutral colors to the configuration dialog. TODO: Color support: Support the bar when a QRZ is entered. TODO: Color support: Calculate a color for the log. TODO: World::getDXStatus: Calculate the algorithm to know the different status for a DXCC (confirmed, worked, confirmed in another band, ,...) TODO: World:: Maybe the color should be returned from the World class TODO: Check the readDataFromUI. QSO are not added when in contest. TODO: Check that New Log, Open, ... somewhere the log table is removed from the DB! TODO: The confirmed WAZ number is not properly calculated. TODO: GUI: Add in the input box a combobox to change the CQZ TODO: GUI: Add in the input box a combobox to change the ITUZ TODO: In CQWWSSB, when editing QSO the SRX, Points, multiplier, ... are not sent to the edit so after "OK", those data are lost. TODO: MainWindow::slotQsoDeleteFromLog: Add the CALL to the message before detele a QSO. TODO: Search GUI: add multi-selection QSO to do the same actions inmultiple QSO. TODO: When importing ADIF, update the logview sometimes... just to show the progress. TODO: When importing ADIF: Only shows the ProgresDialog when the number is low >1000 <14000 investigate TODO: Import Cabrillo TODO: To check how can I order the columns in the log or in the search QTableView. Now the order depends only on the order of the SQL table. TODO: When modifying a cell directly in the log, it is possible to select a mode/band that is not actually active in the configuration. TODO: Slot: If (only)eqsl/lotw is sent/rec, the QSL_RCVD_VIA should be E TODO: Code a Tool to get statistcs for the contests, some kind of post contest tool. http://www.qsl.net/3v4-002/Contests/2011%20CQ-WW-SSB%203V8SS/index.htm TODO: Be able to send scores to: http://www.cqcontest.ru/help/developers.jsp TODO: Create an update CTY.DAT without overwriting the current data. Just Adding and correcting (asking) if data is already there but different. TODO: Create an export CTY.DAT file to create a CTY.DAT file with ALL the data in the current "world". FILEMANAGER TODO: adifLogExportToFile: Count the marked QSO and adjust the numberOfQsos TODO: FileManager::adifReadLog: Optimize the dialog (maybe updating only each 100 or as in KLog) TODO: FileManager::adifReadLog: Add a semaphore/lock or similar to avoid running the same method twice or more at the same time... or at least the same file. It seems that now it "serializes" the import... TODO: Check that FileManager::adifLogExportToFile is exporting ALL the DB fields. TODO: FileManager::adifLogExportToFile code a progress dialog for exporting. TODO: When importing ADIF: Check if all the QSO have all the mandatory fields and warn the user if not. Optimization: The ADIF import is very slow. Optimization is recommended. IMPROVEMENT: Improve the result of the log printing. DONE: TODO: Working on the DB version update functions DONE: MainWindow::showAwards Remove "empty CQZ" when counting to avoid having 41 CQ zones DONE: Code the color configuration for status of an entity (needed/worked/confirmed). DONE: Color support: Calculate a color for the search results. DONE: Color support: Calculate a color for the DXCluster. DONE: TODO: Colors: Reconfigure the colors needs KLog to be restarted. DONE: Working on the dxCluster: Color support, identify the different kind of lines... DX de, normal spots, comments, ... DONE: Working on setAwardDXCC: When adding if a pair is already entered but we are going to add a confirmed status, modify it. DONE: Right click on log to show a to edit QSO. DONE: Right click on log to show a QSL received. DONE: Right click on log to remove a QSO. DONE: Right click on log to show a QSL sent. TODO: Right click on search to remove a QSO. DONE: Right click on search to show a QSL reception. DONE: Right click on search to show a QSL sent. DONE: Right click on search to show to edit QSO. DONE: Added a select/unselect all button to the search QSO tab. DONE: Search QSO to send DONE: Add a button to export to ADIF the content of searchResultsTreeWidget DONE: When importing ADIF, if the CQZ/ITUZ/DXCC is empty, calculate and add it. DONE: Not export ADIF fields if "N": DONE: Print the log. DONE: TODO: Time in UTC DONE: TODO: Log in real time DONE: Double click on cluster to select DONE: TODO: When double clicking on a DX-Spot, frequency should be also copied to inputbox DONE: TODO: When a DX-Spot is selected, the DX-Entity and status should be shown. DONE: TODO: DXCluster: Connect, disconnect and connect again does not work DONE: TODO: Add a field in Mainwindow to manage RX_PWR DONE: TODO: slotclearbuttons->Colors to default DONE: GUI: Add in the input box a combobox to change the DXCC klog-0.9.8.1/setuppagesatseditor.cpp0000644000175000017500000002542313532572307016423 0ustar develdevel#include "setuppageworldeditor.h" SetupPageWorldEditor::SetupPageWorldEditor(DataProxy *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageWorldEditor::SetupPageWorldEditor" << endl; //worldPanel = new QWidget; dataProxy = dp; world = new World(dataProxy); util = new Utilities(); setupEntityDialog = new SetupEntityDialog(); worldModel = new QSqlRelationalTableModel(this); worldView = new QTableView; worldView->setContextMenuPolicy(Qt::CustomContextMenu); worldView->setSortingEnabled(true); createWorldModel(); createWorldPanel(); worldView->setCurrentIndex(worldModel->index(0, 0)); addEntityPushButton = new QPushButton; delEntityPushButton = new QPushButton; editEntityPushButton = new QPushButton; exportWorldPushButton = new QPushButton; loadWorldPushButton = new QPushButton; addEntityPushButton->setText("Add"); delEntityPushButton->setText("Delete"); editEntityPushButton->setText("Edit"); exportWorldPushButton->setText("Export World"); loadWorldPushButton->setText("Import World"); addEntityPushButton->setEnabled(false); delEntityPushButton->setEnabled(false); editEntityPushButton->setEnabled(false); addEntityPushButton->setToolTip("Still not implemented."); delEntityPushButton->setToolTip("Still not implemented."); editEntityPushButton->setToolTip("Still not implemented."); exportWorldPushButton->setEnabled(false); loadWorldPushButton->setEnabled(true); exportWorldPushButton->setToolTip("Still not implemented."); loadWorldPushButton->setToolTip("Import a new cty.csv file"); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(exportWorldPushButton); buttonsLayout->addWidget(loadWorldPushButton); buttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); buttonsLayout->addWidget(addEntityPushButton); buttonsLayout->addWidget(editEntityPushButton); buttonsLayout->addWidget(delEntityPushButton); /* QHBoxLayout *wbuttonsLayout = new QHBoxLayout; wbuttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); wbuttonsLayout->addWidget(exportWorldPushButton); wbuttonsLayout->addWidget(loadWorldPushButton); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addLayout(wbuttonsLayout); buttonsLayout->addLayout(ebuttonsLayout); */ QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(worldView); layout->addLayout(buttonsLayout); setLayout(layout); createActions(); if (isWorldEmpty()) { QString ctyfile = util->getCTYFile(); QMessageBox msgBox; if (QFile::exists(ctyfile)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("An entities information file (cty.csv) has been detected in your KLog folder and will be loaded.")); msgBox.exec(); world->recreate(ctyfile); worldModel->select(); //slotImportWorldButtonClicked(); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("No entities information file (cty.csv) has been detected in your KLog folder.")); msgBox.setInformativeText(tr("KLog will not be able to show entities information.")); msgBox.exec(); } } //qDebug() << "SetupPageWorldEditor::SetupPageWorldEditor - END" << endl; } SetupPageWorldEditor::~SetupPageWorldEditor() { //qDebug() << "SetupPageWorldEditor::~SetupPageWorldEditor" << endl; } void SetupPageWorldEditor::createWorldPanel() { worldView->setModel(worldModel); QString stringQuery = QString("SELECT * FROM entity"); QSqlQuery query(stringQuery); QSqlRecord rec = query.record(); // Number of columns int columns = rec.count(); for (int i = 0; i < columns; i++ ){ worldView->setColumnHidden(i, true); } columns = rec.indexOf("mainprefix"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("name"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("dxcc"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("continent"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("cqz"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("ituz"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("utc"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("latitude"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("longitude"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("deleted"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("sincedate"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("todate"); worldView->setColumnHidden(columns, false); worldView->setItemDelegate(new QSqlRelationalDelegate(this)); worldView->setSelectionMode( QAbstractItemView::SingleSelection); worldView->setSelectionBehavior(QAbstractItemView::SelectRows); worldView->resizeColumnsToContents(); worldView->horizontalHeader()->setStretchLastSection(true); } void SetupPageWorldEditor::createWorldModel() { /* WORLD_DXCCid = 0, WORLD_Nameid = 1, WORLD_MainPrefix = 2, WORLD_CQZ = 3, WORLD_ITUZ = 4, WORLD_Cont = 5 */ QString stringQuery = QString("SELECT * FROM entity"); QSqlQuery q(stringQuery); QSqlRecord rec = q.record(); int nameCol; //worldModel = new QSqlRelationalTableModel(this); worldModel->setTable("entity"); worldModel->setEditStrategy(QSqlTableModel::OnFieldChange); nameCol = rec.indexOf("mainprefix"); worldModel->setSort(nameCol, Qt::AscendingOrder); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Prefix")); nameCol = rec.indexOf("name"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Entity")); nameCol = rec.indexOf("dxcc"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("ARRL ID")); nameCol = rec.indexOf("continent"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Continent")); nameCol = rec.indexOf("cqz"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("CQ Zone")); nameCol = rec.indexOf("ituz"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("ITU Zone")); nameCol = rec.indexOf("utc"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("UTC")); nameCol = rec.indexOf("latitude"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Latitude")); nameCol = rec.indexOf("longitude"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Longitude")); nameCol = rec.indexOf("deleted"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Deleted")); nameCol = rec.indexOf("sincedate"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Since Date")); nameCol = rec.indexOf("todate"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("To Date")); worldModel->select(); } void SetupPageWorldEditor::createActions() { //qDebug() << "SetupPageWorldEditor::createActions" << endl; connect(addEntityPushButton, SIGNAL(clicked()), this, SLOT(slotAddButtonClicked()) ); connect(delEntityPushButton, SIGNAL(clicked()), this, SLOT(slotDelButtonClicked()) ); connect(editEntityPushButton, SIGNAL(clicked()), this, SLOT(slotEditButtonClicked()) ); connect(loadWorldPushButton, SIGNAL(clicked()), this, SLOT(slotImportWorldButtonClicked()) ); connect(worldView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickEntity( const QModelIndex& ) ) ); //SIGNAL received from the setupEntityDialog // void entityAdded(const QStringList _qs); // entity connect(setupEntityDialog, SIGNAL(entityAdded(QStringList)), this, SLOT(slotAnalyzeEntityAddedSignal(QStringList) ) ); } void SetupPageWorldEditor::slotAnalyzeEntityAddedSignal(const QStringList _qs) { /* //qDebug() << "SetupPageWorldEditor::slotAnalyzeEntityAddedSignal\n" << _qs.at(0) << "\n" << _qs.at(1) << "\n" << _qs.at(2) << "\n" << _qs.at(3) << "\n" << _qs.at(4) << "\n" << _qs.at(5) << "\n" << _qs.at(6) << "\n" << _qs.at(7) << "\n" << _qs.at(8) << "\n" << _qs.at(9) << "\n" << _qs.at(10) << "\n" << endl; */ } bool SetupPageWorldEditor::isWorldEmpty() { // I need to check if the world is empty and I have the CTY.CSV file if (world->getHowManyEntities()<1) { return true; } else { return false; } return true; } void SetupPageWorldEditor::slotAddButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotAddButtonClicked" << endl; setupEntityDialog->exec(); //TODO } void SetupPageWorldEditor::slotDelButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotDelButtonClicked" << endl; //TODO } void SetupPageWorldEditor::slotEditButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotEditButtonClicked" << endl; //TODO } void SetupPageWorldEditor::slotDoubleClickEntity( const QModelIndex & index) { //qDebug() << "SetupPageWorldEditor::slotDoubleClickEntity" << endl; //TODO QSqlQuery query; QString queryString; //int row = index.row(); //qDebug() << "SetupPageWorldEditor::slotDoubleClickEntity: ARRLid: " << QString::number((worldModel->index(row, 8)).data(0).toInt()) << endl; } void SetupPageWorldEditor::slotImportWorldButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked" << endl; QString klogDir; klogDir = util->getHomeDir(); QString worldFile; worldFile.clear(); worldFile = QFileDialog::getOpenFileName(this, tr("Open File"), klogDir, tr("BigCTY (*.csv)")); QMessageBox msgBox; //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked: " << worldFile << endl; if (world->recreate(worldFile) ) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Entities information has been updated.")); worldModel->select(); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Entities information has not been updated.")); } msgBox.exec(); //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked - END" << endl; } klog-0.9.8.1/udpserver.h0000644000175000017500000000261313532572307014004 0ustar develdevel#ifndef UDPSERVER_H #define UDPSERVER_H #include #include #include #include class UDPServer : public QObject { Q_OBJECT public: explicit UDPServer(QObject *parent = 0); bool start(); bool stop(); bool isStarted(); void setLogging(const bool _t); void setRealTimeUpdate(const bool _t); //void setAddress(const QString _address); void setPort(const int _port); private: void readPendingDatagrams(); void parse(const QByteArray &msg); QUdpSocket *socketServer; QHostAddress groupAddress; //QString address; int port; bool logging, realtime; signals: void status_update (const int _type, const QString _dxcall, const double _freq, const QString _mode, const QString report, const QString de_call, const QString de_grid, const QString dx_grid, const QString sub_mode); void logged_qso (const int _type, const QString _dxcall, const double _freq, const QString _mode, const QString _dx_grid, const QString _time_off, const QString _report_sent, const QString _report_rec, const QString _tx_power, const QString _comments, const QString _name, const QString _time_on, const QString _de_call, const QString _de_grid); private slots: void slotReadPendingDatagrams(); }; #endif // UDPSERVER_H klog-0.9.8.1/statisticswidget.cpp0000644000175000017500000001017013532572307015713 0ustar develdevel#include "statisticswidget.h" StatisticsWidget::StatisticsWidget(DataProxy *dp, QWidget *parent): QWidget(parent) { dataProxy = dp; statisticToShowComboBox = new QComboBox(); logComboBox = new QComboBox(); barChartStats = new BarChartStats(dp, this); //donutChartStats = new DonutChartStats(dp, this); //chartView = new QChartView(this); //graphWidget = new QWidget(this); statisticsToShowList.clear(); createUI(); connect(statisticToShowComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotChartComboBoxChanged() ) ) ; connect(logComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotLogComboBoxChanged() ) ) ; barChartStats->prepareChart(1); } StatisticsWidget::~StatisticsWidget() { } void StatisticsWidget::clear() { //qDebug() << "StatisticsWidget::clear()" << endl; } void StatisticsWidget::closeEvent(QCloseEvent *event) { //qDebug() << "StatisticsWidget::closeEvent" << endl; //barChartStats->clear(); event->accept(); } void StatisticsWidget::showEvent(QShowEvent *event) { //qDebug() << "StatisticsWidget::showEvent" << endl; barChartStats->clear(); fillLogCombo(); event->accept(); } void StatisticsWidget::slotChartComboBoxChanged() { //qDebug() << "StatisticsWidget::slotChartComboBoxChanged: " << statisticToShowComboBox->currentText() << endl; //QString text = statisticToShowComboBox->currentText(); //text.truncate(2); //qDebug() << "StatisticsWidget::slotChartComboBoxChanged: SelectedGrapth: " << text << endl; //barChartStats->prepareChart(text.toInt()); updateChart(); statisticToShowComboBox->setFocus(); } void StatisticsWidget::slotLogComboBoxChanged() { } void StatisticsWidget::updateChart() { QString text = statisticToShowComboBox->currentText(); text.truncate(2); int log = ((logComboBox->currentText()).left((logComboBox->currentText()).indexOf('-')+1)).toInt(); barChartStats->prepareChart(text.toInt(), log); } void StatisticsWidget::createUI() { statisticsToShowList << "01-" + tr("QSO per year"); statisticsToShowList << "02-" + tr("DXCC per year"); statisticsToShowList << "03-" + tr("CQ zones per year"); statisticsToShowList << "04-" + tr("QSO per band"); statisticsToShowList << "05-" + tr("QSO per mode"); statisticsToShowList << "06-" + tr("QSO per DXCC"); statisticsToShowList << "07-" + tr("QSO per Continent"); statisticsToShowList << "08-" + tr("QSO per hour"); statisticsToShowList << "09-" + tr("QSO per month"); statisticsToShowList << "10-" + tr("Worked / Confirmed status"); statisticsToShowList << "11-" + tr("Worked / Sent status"); statisticsToShowList << "12-" + tr("Sent / Confirmed status"); statisticToShowComboBox->addItems(statisticsToShowList); fillLogCombo(); QHBoxLayout *hLayout = new QHBoxLayout; hLayout->addWidget(statisticToShowComboBox); hLayout->addWidget(logComboBox); QVBoxLayout *layout = new QVBoxLayout; layout->addLayout(hLayout); //layout->addWidget(statisticToShowComboBox); //layout->addWidget(graphWidget); layout->addWidget(barChartStats); setLayout(layout); resize(420,300); } void StatisticsWidget::fillLogCombo() { QStringList ids; ids.clear(); ids << dataProxy->getListOfManagedLogs(); QStringList logs; logs.clear(); for (int i = 0; i < ids.size(); ++i) { //cout << fonts.at(i).toLocal8Bit().constData() << endl; logs<< ids.at(i) + "-" + dataProxy->getLogDateFromLog((ids.at(i)).toInt()) + "-" + dataProxy->getStationCallSignFromLog((ids.at(i)).toInt()); } logComboBox->clear(); logComboBox->addItems(logs); /* QStringList getListOfManagedLogs(); int getMaxLogNumber(); QString getStationCallSignFromLog(const int _log); QStringList getStationCallSignsFromLog(const int _log); QString getOperatorsFromLog(const int _log); QString getCommentsFromLog(const int _log); QString getLogDateFromLog(const int _log); QString getLogTypeNFromLog(const int _log); bool addNewLog (const QStringList _qs); bool doesThisLogExist(const int _log); */ } klog-0.9.8.1/setuppagelogsnew.cpp0000644000175000017500000010052113532572307015711 0ustar develdevel/*************************************************************************** setuppagelogsnew.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new log // #include "setuppagelogsnew.h" SetupPageLogsNew::SetupPageLogsNew(DataProxy *dp, QWidget *parent) { //qDebug() << "SetupPageLogsNew::SetupPageLogsNew" << endl; dataProxy = dp; editing = false; checking = false; bCass = false; bCOp = false; bCMo = false; bCPo = false; bCBa = false; bCOv = false; bCTy = false; logData.clear(); stationCallsignFilled = false; operatorsFilled = true; stationCallsign = QString(); operators = QString(); comment = QString(); dateString = QString(); typeContest = 0; contestCatMode = 0; contestCatOperators = 0; contestCatAssisted = 0; contestCatPower = 0; contestCatBands = 0; contestBands = 0; contestCatOverlay = 0; typeContestSelected = 0; typeConteststr = QString(); stationCallsignLineEdit = new QLineEdit; operatorsLineEdit = new QLineEdit; dateEdit = new QDateEdit; dateEdit->setDate(QDate::currentDate ()); commentLineEdit = new QLineEdit; typeComboBox = new QComboBox; contestCatModeComboBox = new QComboBox; contestCatOperatorsComboBox = new QComboBox; contestCatAssistedComboBox = new QComboBox; contestCatPowerComboBox = new QComboBox; contestCatBandsComboBox = new QComboBox; contestBandsComboBox = new QComboBox; contestCatOverlayComboBox = new QComboBox; contestCatModeComboBox = new QComboBox; catAsLabel = new QLabel(); typeLabel = new QLabel(); catOpLabel = new QLabel(); catModeLabel = new QLabel(); catPowerLabel = new QLabel(); catBandsLabel = new QLabel(); overlayLabel = new QLabel(); validCats = new QLabel(); dateLabel = new QLabel(tr("&Date")); stationCallsignLabel = new QLabel(tr("&Station Callsign")); operatorsLabel = new QLabel(tr("&Operators")); commentLabel = new QLabel(tr("Comm&ent")); okButton = new QPushButton(tr("&Ok"), this); cancelButton = new QPushButton(tr("&Cancel"), this); createWidget(); okButton->setEnabled(false); //qDebug() << "SetupPageLogsNew::SetupPageLogsNew - END" << endl; } void SetupPageLogsNew::clear() { stationCallsignLineEdit->clear(); operatorsLineEdit->clear(); dateEdit->setDate(QDate::currentDate ()); typeComboBox->setCurrentIndex(0); contestCatModeComboBox->setCurrentIndex(0); contestCatOperatorsComboBox->setCurrentIndex(0); contestCatAssistedComboBox->setCurrentIndex(0); contestCatPowerComboBox->setCurrentIndex(0); contestCatBandsComboBox->setCurrentIndex(0); contestBandsComboBox->setCurrentIndex(0); contestCatOverlayComboBox->setCurrentIndex(0); contestCatModeComboBox->setCurrentIndex(0); typeContest = 0; contestCatMode = 0; contestCatOperators = 0; contestCatAssisted = 0; contestCatPower = 0; contestCatBands = 0; contestBands = 0; contestCatOverlay = 0; typeContestSelected = 0; } void SetupPageLogsNew::createWidget() { //qDebug() << "SetupPageLogsNew::createWidget" << endl; stationCallsignLabel->setWordWrap(true); operatorsLabel->setWordWrap(true); commentLabel->setWordWrap(true); dateLabel->setBuddy(dateEdit); stationCallsignLabel->setBuddy(stationCallsignLineEdit); operatorsLabel->setBuddy(operatorsLineEdit); commentLabel->setBuddy(commentLineEdit); catAsLabel->setBuddy(contestCatAssistedComboBox); typeLabel->setBuddy(typeComboBox); catOpLabel->setBuddy(contestCatOperatorsComboBox); catModeLabel->setBuddy(contestCatModeComboBox); catPowerLabel->setBuddy(contestCatPowerComboBox); catBandsLabel->setBuddy(contestCatBandsComboBox); overlayLabel->setBuddy(contestCatOverlayComboBox); validCats->setText(tr("Select categories")); validCats->setWordWrap(true); stationCallsignLineEdit->setToolTip(tr("Callsign used for this log.")); operatorsLineEdit->setToolTip(tr("Comma separated list of operators: callsign1, callsign2.")); dateEdit->setToolTip(tr("Start date of this log.")); commentLineEdit->setToolTip(tr("Add a comment about this log.")); typeLabel->setText(tr("&Type of Operation")); typeLabel->setWordWrap(true); //nameLabel->setWordWrap(true); dateLabel->setWordWrap(true); typeComboBox->setToolTip(tr("Select the kind of operation for this log.")); QStringList _qs; _qs.clear(); _qs.append(dataProxy->getContestNames()); typeComboBox->addItems(_qs); //qDebug() << "SetupPageLogsNew::createWidget - contestNames: " << _qs.at(0) << endl; catModeLabel->setText(tr("&Mode Category")); catModeLabel->setWordWrap(true); contestCatModeComboBox->setToolTip(tr("Select the mode category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(6)); contestCatModeComboBox->addItems(_qs); //QLabel *catOpLabel = new QLabel(tr("Operators Category")); catOpLabel->setText(tr("O&perators Category")); catOpLabel->setWordWrap(true); contestCatOperatorsComboBox->setToolTip(tr("Select the operators category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(1)); contestCatOperatorsComboBox->addItems(_qs); catAsLabel->setText(tr("&Assisted Category")); catOpLabel->setWordWrap(true); contestCatAssistedComboBox->setToolTip(tr("Select the assisted category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(2)); contestCatAssistedComboBox->addItems(_qs); //QLabel *catPowerLabel = new QLabel(tr("Power Category")); catPowerLabel->setText(tr("Po&wer Category")); catPowerLabel->setWordWrap(true); contestCatPowerComboBox->setToolTip(tr("Select the power category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(3)); contestCatPowerComboBox->addItems(_qs); //QLabel *catBandsLabel = new QLabel(tr("Bands Category")); catBandsLabel->setText(tr("&Bands Category")); catBandsLabel->setWordWrap(true); contestCatBandsComboBox->setToolTip(tr("Select the bands category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(4)); contestCatBandsComboBox->addItems(_qs); overlayLabel->setText(tr("O&verlay")); overlayLabel->setWordWrap(true); contestCatOverlayComboBox->setToolTip(tr("Select the Overlay category.")); _qs.clear(); _qs.append(dataProxy->getContestOverlays()); contestCatOverlayComboBox->addItems(_qs); connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotStationCallSignTextChanged() ) ); connect(operatorsLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotOperatorsTextChanged() ) ); connect(typeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotTypeComboBoxChanged() ) ) ; connect(contestCatModeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatModeComboBoxChanged() ) ) ; connect(contestCatAssistedComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatAssistedComboBoxChanged() ) ) ; connect(contestCatOperatorsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatOperatorsComboBoxChanged() ) ) ; connect(contestCatPowerComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatPowerComboBoxChanged() ) ) ; connect(contestCatBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatBandsComboBoxChanged() ) ) ; connect(contestCatOverlayComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatOverlayComboBoxChanged() ) ) ; //connect(typeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotTypeComboBoxChanged() ) ) ; //connect(contestCatModeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatModeComboBoxChanged() ) ) ; //connect(contestCatAssistedComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatAssistedComboBoxChanged() ) ) ; //connect(contestCatOperatorsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatOperatorsComboBoxChanged() ) ) ; //connect(contestCatPowerComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatPowerComboBoxChanged() ) ) ; //connect(contestCatBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatBandsComboBoxChanged() ) ) ; //connect(contestCatOverlayComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatOverlayComboBoxChanged() ) ) ; connect(contestBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotBandsComboBoxChanged() ) ) ; //connect(contestCatModeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatModeComboBoxChanged() ) ) ; connect(okButton,SIGNAL(clicked()), this, SLOT(slotOKButtonClicked() ) ); connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelButtonClicked() ) ); QGridLayout *callsLayout = new QGridLayout; // Widget, row, column callsLayout->addWidget(stationCallsignLabel, 0, 0); callsLayout->addWidget(stationCallsignLineEdit, 0, 1); callsLayout->addWidget(dateLabel, 1, 0); callsLayout->addWidget(dateEdit, 1, 1); callsLayout->addWidget(operatorsLabel, 2, 0); callsLayout->addWidget(operatorsLineEdit, 2, 1); callsLayout->addWidget(commentLabel, 3, 0); callsLayout->addWidget(commentLineEdit, 3, 1); /* callsLayout->addWidget(typeLabel, 3, 0); callsLayout->addWidget(typeComboBox, 3, 1); callsLayout->addWidget(catModeLabel, 4, 0); callsLayout->addWidget(contestCatModeComboBox, 4, 1); callsLayout->addWidget(catOpLabel, 5, 0); callsLayout->addWidget(contestCatOperatorsComboBox, 5, 1); callsLayout->addWidget(catAsLabel, 6, 0); callsLayout->addWidget(contestCatAssistedComboBox, 6, 1); callsLayout->addWidget(catPowerLabel, 7, 0); callsLayout->addWidget(contestCatPowerComboBox, 7, 1); callsLayout->addWidget(catBandsLabel, 8, 0); callsLayout->addWidget(contestCatBandsComboBox, 8, 1); callsLayout->addWidget(contestBandsComboBox, 8, 2); callsLayout->addWidget(overlayLabel, 10, 0); callsLayout->addWidget(contestCatOverlayComboBox, 10, 1); */ QHBoxLayout *buttonsLayout = new QHBoxLayout; //buttonsLayout->addWidget(validCats); buttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(cancelButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(callsLayout); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); clear(); //page->setLayout(callsLayout); } void SetupPageLogsNew::slotOperatorsTextChanged() { //qDebug() << "SetupPageLogsNew::slotOperatorsTextChanged" << endl; // connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT( ) ); if ((operatorsLineEdit->text()).length()<1) { return; } int cursorP = operatorsLineEdit->cursorPosition(); QString currentQrz = operatorsLineEdit->text(); if ((currentQrz.at(cursorP-1)).isSpace()) { currentQrz = currentQrz.remove(cursorP-1, 1); cursorP--; operatorsLineEdit->setText(currentQrz); } operatorsLineEdit->setText(((operatorsLineEdit->text())).simplified()); operatorsLineEdit->setText((operatorsLineEdit->text()).toUpper()); operatorsLineEdit->setCursorPosition(cursorP); if (currentQrz.length()>=3) {//TODO: Add a check of the format (comma separated) operatorsFilled= true; } } void SetupPageLogsNew::slotStationCallSignTextChanged() { //qDebug() << "SetupPageLogsNew::slotStationCallSignTextChanged" << endl; // connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT( ) ); if ((stationCallsignLineEdit->text()).length()<1) { showNOK(); return; } int cursorP = stationCallsignLineEdit->cursorPosition(); QString currentQrz = stationCallsignLineEdit->text(); if ((currentQrz.at(cursorP-1)).isSpace()) { currentQrz = currentQrz.remove(cursorP-1, 1); cursorP--; stationCallsignLineEdit->setText(currentQrz); } stationCallsignLineEdit->setText(((stationCallsignLineEdit->text())).simplified()); stationCallsignLineEdit->setText((stationCallsignLineEdit->text()).toUpper()); stationCallsignLineEdit->setCursorPosition(cursorP); if (currentQrz.length()>=3) { stationCallsignFilled = true; } showOK(); } void SetupPageLogsNew::slotTypeComboBoxChanged() { //qDebug() << "SetupPageLogsNew::slotTypeComboBoxChanged" << endl; // connect(typeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotTypeComboBoxChanged() ) ) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { typeLabel->setStyleSheet("QLabel {color : red; }"); validCats->setText(tr("Categories not OK")); validCats->setStyleSheet("QLabel {color : red; }"); okButton->setEnabled(false); } else { typeLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageLogsNew::slotCatAssistedComboBoxChanged() { //qDebug() << "SetupPageLogs:slotCatAssistedComboBoxChanged: " << QString::number(contestCatAssistedComboBox->currentIndex()) << endl; //connect(contestCatAssistedComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatAssistedComboBoxChanged() ) ) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { catAsLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catAsLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageLogsNew::slotCatOperatorsComboBoxChanged() { //qDebug() << "SetupPageLogsNew::slotCatOperatorsComboBoxChanged(): " << QString::number(contestCatOperatorsComboBox->currentIndex()) << endl; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { catOpLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catOpLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageLogsNew::slotCatPowerComboBoxChanged() { //qDebug() << "SetupPageLogsNew::slotCatPowerComboBoxChanged(): " << QString::number(contestCatPowerComboBox->currentIndex()) << endl; //connect(contestCatPowerComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatPowerComboBoxChanged() ) ) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { catPowerLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catPowerLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageLogsNew::slotCatBandsComboBoxChanged() { //qDebug() << "SetupPageLogsNew::slotCatBandsComboBoxChanged(): " << QString::number(contestCatBandsComboBox->currentIndex()) << endl; //connect(contestCatBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatBandsComboBoxChanged() ) ) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { catBandsLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catBandsLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageLogsNew::slotBandsComboBoxChanged() { //qDebug() << "SetupPageLogsNew::slotBandsComboBoxChanged(): " << QString::number(contestBandsComboBox->currentIndex()) << endl; //connect(contestBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotBandsComboBoxChanged() ) ) ; } void SetupPageLogsNew::slotCatOverlayComboBoxChanged() { //qDebug() << "SetupPageLogsNew::slotCatOverlayComboBoxChanged(): " << QString::number(contestCatOverlayComboBox->currentIndex()) << endl; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); //qDebug() << "SetupPageLogsNew::slotCatOverlayComboBoxChanged(): typeContest = " << QString::number(typeContest) << endl; if (typeContest < 0) { overlayLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { overlayLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageLogsNew::slotCatModeComboBoxChanged() { //qDebug() << "SetupPageLogsNew::slotCatModeComboBoxChanged(): " << QString::number(contestCatModeComboBox->currentIndex()) << endl; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); //qDebug() << "SetupPageLogsNew::slotCatModeComboBoxChanged(): " << QString::number(typeContest) << endl; if (typeContest < 0) { catModeLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catModeLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageLogsNew::slotOKButtonClicked() { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked" << endl; stationCallsign = stationCallsignLineEdit->text(); if (stationCallsign.length()<3) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You need to enter a valid QRZ in the Station Callsign box.\nThe log will not be opened.")); msgBox.exec(); return; } operators = operatorsLineEdit->text(); //TODO: Check if operators is really including a comma separated list of QRZ comment = commentLineEdit->text(); dateString = dateEdit->date().toString("yyyy/MM/dd"); //typeContest, contestCatOperators, contestCatAssisted, contestCatPower, //contestCatBands, contestCatOverlay, contestCatMode if (typeComboBox->isEnabled()) { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked ENA: type" << endl; typeContestSelected = typeComboBox->currentIndex(); typeConteststr = typeComboBox->currentText(); } else { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked NOT ENA: type" << endl; typeContestSelected = 0; typeConteststr = QString(); } if (contestCatModeComboBox->isEnabled()) { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked ENA: mode" << endl; contestCatMode = contestCatModeComboBox->currentIndex(); } else { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked NOT ENA: mode" << endl; contestCatMode = 0; } if (contestCatOperatorsComboBox->isEnabled()) { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked ENA: oper" << endl; contestCatOperators = contestCatOperatorsComboBox->currentIndex(); } else { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked NOT ENA: oper" << endl; contestCatOperators = 0; } if (contestCatAssistedComboBox->isEnabled()) { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked ENA: ass" << endl; contestCatAssisted = contestCatAssistedComboBox->currentIndex(); } else { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked NOT ENA: ass" << endl; contestCatAssisted = 0; } if (contestCatPowerComboBox->isEnabled()) { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked ENA: pwr" << endl; contestCatPower = contestCatPowerComboBox->currentIndex(); //qDebug() << "SetupPageLogsNew::slotOkButtonClicked ENA: pwr - " << contestCatPowerComboBox->currentText() << endl; } else { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked NOT ENA: pwr" << endl; contestCatPower = 0; } if (contestCatBandsComboBox->isEnabled()) { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked ENA: Cbands" << endl; contestCatBands = contestCatBandsComboBox->currentIndex(); } else { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked NOT ENA: Cbands" << endl; contestCatBands = 0; } if (contestBandsComboBox->isEnabled()) { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked ENA: bands" << endl; contestBands = contestBandsComboBox->currentIndex(); } else { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked NOT ENA: bands" << endl; contestBands = 0; } if (contestCatOverlayComboBox->isEnabled()) { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked ENA: over" << endl; contestCatOverlay = contestCatOverlayComboBox->currentIndex(); } else { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked NOT ENA: over" << endl; contestCatOverlay = 0; } //typeContest, contestCatOperators, contestCatAssisted, contestCatPower, //contestCatBands, contestCatOverlay, contestCatMode typeContest = getSelectedTypeContest(); if (typeContest < 0) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You selected an invalid combination.\nThe log will not be opened.")); msgBox.exec(); } else { gatherAndSend(); close(); } } void SetupPageLogsNew::gatherAndSend() { //qDebug() << "SetupPageLogsNew::gatherAndSend: " << typeConteststr << endl; // The following lines will be removed once more contest types have been added contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay = contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); // The previous lines will be removed once more contest types have been added logData.clear(); logData << stationCallsign << operators << comment << dateString << typeConteststr << QString::number(contestCatMode) << QString::number(contestCatOperators) << QString::number(contestCatAssisted) << QString::number(contestCatPower) << QString::number(contestCatBands) << QString::number(contestBands) << QString::number(contestCatOverlay) << QString::number(typeContest); if (editing) { logData << "1"; editing = false; } else { logData << "0"; } //logData << QString::number(typeContest) // Update the SetupPageLogs::slotAnalyzeNewLogData if you add or remove any field (Today 12) //qDebug() << "SetupPageLogsNew::gatherAndSend: EMITED" << endl; emit newLogData(logData); } void SetupPageLogsNew::slotCancelButtonClicked() { //qDebug() << "SetupPageLogsNew::slotCancelButtonClicked" << endl; logData.clear(); emit cancelled(true); close(); } QStringList SetupPageLogsNew::getValidCatOptions(const int _currentCat, const int _higherCat) {// currentCat is the current category and highercat is the category we want to know the information // being: // 1 - contestcatoperator // 2 - contestcatassisted // 3 - contestcatpower // 4 - contestcatband // 5 - contestcatoverlay // 6 - contestcatmode //qDebug() << "SetupPageLogsNew::getValidCatOptions: " << QString::number(_currentCat) <<"/"<< QString::number(_higherCat) << endl; //return dataProxy->getValidCatOptions(_currentCat, _higherCat); return QStringList(); } void SetupPageLogsNew::setStationCallSign(const QString _st) { stationCallsign = _st; stationCallsignLineEdit->setText(stationCallsign.toUpper()); } void SetupPageLogsNew::setOperators(const QString _st) { operators = _st; operatorsLineEdit->setText(operators.toUpper()); } void SetupPageLogsNew::setComment(const QString _st) { comment = _st; commentLineEdit->setText(comment.toUpper()); } void SetupPageLogsNew::setDateString(const QString _st) { dateString = _st; dateEdit->setDate(QDate::fromString(dateString, "yyyy/MM/dd")); } void SetupPageLogsNew::setType(const QString _st) { typeConteststr = _st; //typeConteststr = typeComboBox->currentText(); typeComboBox->setCurrentIndex(typeComboBox->findText(typeConteststr, Qt::MatchExactly)); //findText ( const QString & text, Qt::MatchFlags flags = static_cast ( Qt::MatchExactly | Qt::MatchCaseSensitive ) ) const } void SetupPageLogsNew::setCMode(const int _n) { contestCatMode = _n; contestCatModeComboBox->setCurrentIndex(contestCatMode); } void SetupPageLogsNew::setCOperators(const int _n) { contestCatOperators = _n; contestCatOperatorsComboBox->setCurrentIndex(contestCatOperators); } void SetupPageLogsNew::setCAssisted(const int _n) { contestCatAssisted = _n; contestCatAssistedComboBox->setCurrentIndex(contestCatAssisted); } void SetupPageLogsNew::setCPower(const int _n) { contestCatPower = _n; contestCatPowerComboBox->setCurrentIndex(contestCatPower); } void SetupPageLogsNew::setCBands(const int _n) { contestCatBands = _n; contestCatBandsComboBox->setCurrentIndex(contestCatBands); } void SetupPageLogsNew::setBands(const int _n) { contestBands = _n; contestBandsComboBox->setCurrentIndex(contestBands); } void SetupPageLogsNew::setCOverlay(const int _n) { contestCatOverlay = _n; contestCatOverlayComboBox->setCurrentIndex(contestCatOverlay); } void SetupPageLogsNew::setEditing(const bool b) { editing = b; if (!editing) { clear(); } } int SetupPageLogsNew::getSelectedTypeContest() { //qDebug() << "SetupPageLogsNew::getSelectedTypeContest: " << endl; //is/contest/catoperator/catassisted/catpower/catband/catoverlay/catmode int i = dataProxy->getContestTypeN(typeContestSelected, contestCatOperators, contestCatAssisted, contestCatPower, contestCatBands, contestCatOverlay, contestCatMode); //qDebug() << "SetupPageLogsNew::getSelectedTypeContest: " << QString::number(i) << endl; return i; } void SetupPageLogsNew::setTypeN(const int _n) { //qDebug() << "SetupPageLogsNew::setTypeN: " << QString::number(_n) << endl; typeContestSelected = _n; fillWithType(typeContestSelected); } void SetupPageLogsNew::fillWithType(const int _n) { //qDebug() << "SetupPageLogsNew::fillWithType - n = " << QString::number(_n) << endl; typeContestSelected = _n; QStringList contestData; contestData << dataProxy->getDataFromContestType(_n); //qDebug() << "SetupPageLogsNew::fillWithType-1 (length = " << QString::number(contestData.length()) << ")" << endl; if (contestData.length()== 8) { //qDebug() << "SetupPageLogsNew::fillWithType-2" << endl; setCOperators ((contestData.at(1)).toInt()); setCAssisted ((contestData.at(2)).toInt()); setCPower ((contestData.at(3)).toInt()); setCOverlay ((contestData.at(4)).toInt()); setCMode ((contestData.at(5)).toInt()); setType(contestData.at(6)); setCBands((contestData.at(7)).toInt()); //qDebug() << "SetupPageLogsNew::fillWithType: " << contestData.at(6) << endl; } else { //qDebug() << "SetupPageLogsNew::fillWithType-3" << endl; return; } } void SetupPageLogsNew::updateAllCats() { //qDebug() << "SetupPageLogsNew::updateAllCats" << endl; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); } void SetupPageLogsNew::showOK() { validCats->setText(tr("Categories OK")); validCats->setStyleSheet("QLabel {color : black; }"); okButton->setEnabled(true); } void SetupPageLogsNew::showNOK() { validCats->setText(tr("Categories not OK")); validCats->setStyleSheet("QLabel {color : red; }"); okButton->setEnabled(false); } klog-0.9.8.1/setuppagehamlib.h0000644000175000017500000000753413532572307015146 0ustar develdevel#ifndef SETUPPAGEHAMLIB_H #define SETUPPAGEHAMLIB_H /*************************************************************************** setuppagehamlib.h - description ------------------- begin : feb 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include //#include #include #include "hamlibclass.h" #include "dataproxy.h" #include class SetupPageHamLib : public QWidget { Q_OBJECT public: explicit SetupPageHamLib(DataProxy *dp, QWidget *parent = nullptr); QString getData(); bool setRigType(const QString _radio); bool setSerialPort(const QString _port); bool setSerialSpeed(const QString _speed ); void setActive(const QString _active); void setRTS(const QString _state); void setDTR(const QString _state); void setDataBits(const QString _st); void setFlowControl(const QString _st); void setParity(const QString _st); void setStopBits(const QString _st); void setPoolInterval(const QString _st); signals: public slots: void slotScanPorts(); private: void createUI(); void setRig(); void setDefaults(); void fillSerialPortsComboBox(); //static int addRigToList(const struct rig_caps* caps, void* data); QStringList getAvailableSerialPorts(); QString getDataBits(); QString getFlowControl(); QString getParity(); QString getStopBits(); QString getPoolInterval(); /* DataBits { Data5, Data6, Data7, Data8, UnknownDataBits } FlowControl { NoFlowControl, HardwareControl, SoftwareControl, UnknownFlowControl } Parity { NoParity, EvenParity, OddParity, SpaceParity, MarkParity, UnknownParity } StopBits { OneStop, OneAndHalfStop, TwoStop, UnknownStopBits } */ QPushButton *scanSerialPortButton; QComboBox *rigTypeComboBox, *serialBaudsComboBox, *serialPortComboBox, *dataBitsComboBox, *flowControlComboBox, *parityComboBox, *stopBitsComboBox; //QSpinBox *serialBaudsSpinBox; QLineEdit *serialPort; QSpinBox *poolIntervalQSpinBox; HamLibClass *hamlib; //RIG *my_rig; // handle to rig (instance) //freq_t freq; //rig_model_t myrig_model; QStringList strings, serialPorts; QCheckBox *activateHamlibCheckBox; //, *RTSCheckBox, *DTRCheckBox; //int defaultPortSpeed; }; #endif // SETUPPAGEHAMLIB_H klog-0.9.8.1/contest_cqwwdxssb.h0000644000175000017500000001033213532572307015546 0ustar develdevel#ifndef CONTESTCQWWDXSSB_H #define CONTESTCQWWDXSSB_H /*************************************************************************** contestcqwwdxssb.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include "contest.h" class ContestCQWWDXSSB : public Contest { public: ContestCQWWDXSSB(); ContestCQWWDXSSB(const QStringList _qs); ~ContestCQWWDXSSB(); bool isMultiplier(const QStringList _qs); // Receives: QStringList _qs; //_qs << DX-Entity << DXCQz << DX-band; int getQSOPoints(const QStringList _qs); // Receives: QStringList _qs; //_qs << DX-Entity << DX-Continent bool saveFileToSend(const QString& _fileName); int getTotalScore(); int getMultipliers(); int getPoints(); // NA in the constructor is North America for scoring purposes signals: void queryError(QString functionFailed, QString errorCodeS, int errorCodeN); // To alert about any failed query execution private: QString myEntity, myCQz, myContinent, NA, thiscontest, mycategory, arrlSection, stationQrz, claimedScore, name, address, operators, soapbox, club, createdby; bool isValidCQz(const QString _cqz); bool isValidEntity(const QString _ent); int constrid; // Just an id for the constructor to check who is being executed at one specific time }; /* V. MULTIPLIER: Two types of multiplier will be used. A multiplier of one (1) for each different zone contacted on each band. A multiplier of one (1) for each different country contacted on each band. Stations are permitted to contact their own country and zone for multiplier credit. The CQ Zone Map, DXCC country list, WAE country list, and WAC boundaries are standards. Maritime mobile stations count only for a zone multiplier. VI. POINTS: Contacts between stations on different continents are worth three (3) points. Contacts between stations on the same continent but different countries, one (1) point. Exception: For North American stations only, contacts between stations within the North American boundaries count two (2) points. Contacts between stations in the same country are permitted for zone or country multiplier credit but have zero (0) point value. VII. SCORING: All stations: the final score is the result of the total QSO points multiplied by the sum of your zone and country multipliers. Example: 1000 QSO points 100 multiplier (30 Zones + 70 Countries) = 100,000 (final score). */ #endif // CONTESTCQWWDXSSB_H klog-0.9.8.1/klog.qrc0000644000175000017500000002155213532572307013262 0ustar develdevel img/klog_512x512.png img/klog_256x256.png img/klog_logo.png img/klog.ico flags/ad.png flags/ae.png flags/af.png flags/ag.png flags/ai.png flags/al.png flags/am.png flags/an.png flags/ao.png flags/ar.png flags/as.png flags/at.png flags/au.png flags/aw.png flags/ax.png flags/az.png flags/ba.png flags/bb.png flags/bd.png flags/be.png flags/bf.png flags/bg.png flags/bh.png flags/bi.png flags/bj.png flags/bm.png flags/bn.png flags/bo.png flags/bq.png flags/br.png flags/bs.png flags/bt.png flags/bv.png flags/bw.png flags/by.png flags/bz.png flags/ca.png flags/canary.png flags/cc.png flags/cd.png flags/cf.png flags/cg.png flags/ch.png flags/ci.png flags/ck.png flags/cl.png flags/cm.png flags/cn.png flags/co.png flags/cr.png flags/cs.png flags/cu.png flags/cv.png flags/cw.png flags/cx.png flags/cy.png flags/cz.png flags/de.png flags/dj.png flags/dk.png flags/dm.png flags/do.png flags/dz.png flags/ec.png flags/ee.png flags/eg.png flags/eh.png flags/england.png flags/southbritish.png flags/er.png flags/es.png flags/balear.png flags/ceuta.png flags/et.png flags/europeanunion.png flags/fam.png flags/fi.png flags/fj.png flags/fk.png flags/fm.png flags/fo.png flags/fr.png flags/ga.png flags/gb.png flags/gd.png flags/ge.png flags/gf.png flags/gh.png flags/gi.png flags/gl.png flags/gm.png flags/gn.png flags/gp.png flags/gq.png flags/gr.png flags/gs.png flags/gt.png flags/gu.png flags/gw.png flags/gy.png flags/hk.png flags/hm.png flags/hn.png flags/hr.png flags/ht.png flags/hu.png flags/id.png flags/ie.png flags/il.png flags/in.png flags/io.png flags/iq.png flags/ir.png flags/is.png flags/it.png flags/jm.png flags/jo.png flags/jp.png flags/ke.png flags/kg.png flags/kh.png flags/ki.png flags/km.png flags/kn.png flags/kp.png flags/kr.png flags/kw.png flags/ky.png flags/kz.png flags/la.png flags/lb.png flags/lc.png flags/li.png flags/lk.png flags/lr.png flags/ls.png flags/lt.png flags/lu.png flags/lv.png flags/ly.png flags/ma.png flags/marquesas.png flags/mc.png flags/md.png flags/me.png flags/mg.png flags/mh.png flags/mk.png flags/ml.png flags/mm.png flags/mn.png flags/mo.png flags/mp.png flags/mq.png flags/mr.png flags/ms.png flags/mt.png flags/mu.png flags/mv.png flags/mw.png flags/mx.png flags/my.png flags/mz.png flags/na.png flags/nc.png flags/ne.png flags/nf.png flags/ng.png flags/ni.png flags/nl.png flags/no.png flags/northernireland.png flags/np.png flags/nr.png flags/nu.png flags/nz.png flags/om.png flags/pa.png flags/pe.png flags/pf.png flags/pg.png flags/ph.png flags/pk.png flags/pl.png flags/pm.png flags/pn.png flags/pr.png flags/ps.png flags/pt.png flags/pw.png flags/py.png flags/qa.png flags/re.png flags/ro.png flags/rs.png flags/ru.png flags/rw.png flags/sa.png flags/sardinia.png flags/sb.png flags/sc.png flags/scotland.png flags/sd.png flags/se.png flags/sg.png flags/sh.png flags/si.png flags/sj.png flags/sk.png flags/sl.png flags/sm.png flags/smh.png flags/sn.png flags/so.png flags/sr.png flags/ss.png flags/st.png flags/sv.png flags/sy.png flags/sz.png flags/tc.png flags/td.png flags/tf.png flags/tg.png flags/th.png flags/tj.png flags/tk.png flags/tl.png flags/tm.png flags/tn.png flags/to.png flags/tr.png flags/tt.png flags/tv.png flags/tw.png flags/tz.png flags/ua.png flags/ug.png flags/um.png flags/un.png flags/us.png flags/uy.png flags/uz.png flags/va.png flags/vc.png flags/ve.png flags/vg.png flags/vi.png flags/vn.png flags/vu.png flags/wales.png flags/wf.png flags/ws.png flags/xk.png flags/ye.png flags/yt.png flags/za.png flags/zm.png flags/zw.png klog-0.9.8.1/logmodel.h0000644000175000017500000000517413532572307013574 0ustar develdevel#ifndef LOGMODEL_H #define LOGMODEL_H /*************************************************************************** logmodel.h - description ------------------- begin : june 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy.h" class LogModel : public QSqlRelationalTableModel { Q_OBJECT public: LogModel(DataProxy *dp, QObject *parent); void createlogModel(const int _i); private: void setColumnsToDX(); //QSqlRelationalTableModel *logModel; DataProxy *dataProxy; signals: void queryError(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); // To alert about any failed query execution }; #endif // LOGMODEL_H /* class MyModel : public QAbstractTableModel { Q_OBJECT public: MyModel(QObject *parent); int rowCount(const QModelIndex &parent = QModelIndex()) const ; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; }; */ klog-0.9.8.1/setuppageuserdata.h0000644000175000017500000001226213532572307015514 0ustar develdevel#ifndef SETUPPAGEUSERDATA_H #define SETUPPAGEUSERDATA_H /*************************************************************************** setuppageuserdata.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include //#include #include "world.h" #include "locator.h" #include "dataproxy.h" class SetupPageUserDataPage : public QWidget { Q_OBJECT public: SetupPageUserDataPage(DataProxy *dp, QWidget *parent=0); ~SetupPageUserDataPage(); QString getStationQrz(); QString getOperators(); QString getStationLocator(); int getCQz(); int getITUz(); QString getName(); QStringList getAddress(); QString getAddress1(); QString getAddress2(); QString getAddress3(); QString getAddress4(); QString getCity(); QString getZipCode(); QString getProvince(); QString getCountry(); bool setName (const QString _aux); bool setAddress1 (const QString _aux); bool setAddress2 (const QString _aux); bool setAddress3 (const QString _aux); bool setAddress4 (const QString _aux); bool setAddress (const QStringList _aux); bool setCity (const QString _aux); bool setZipCode (const QString _aux); bool setProvince (const QString _aux); bool setCountry (const QString _aux); bool setStationQrz(const QString _qrz); bool setOperators(const QString _aux); bool setStationLocator(const QString _loc); bool setCQz(const int _cqz); bool setITUz(const int _ituz); QString getRig1(); QString getRig2(); QString getRig3(); QString getAntenna1(); QString getAntenna2(); QString getAntenna3(); QStringList getRigs(); QStringList getAntennas(); QString getPower(); bool setRigs(const QStringList _aux); bool setAntennas(const QStringList _aux); bool setPower(const QString _aux); bool setRig1 (const QString _aux); bool setRig2 (const QString _aux); bool setRig3 (const QString _aux); bool setAntenna1 (const QString _aux); bool setAntenna2 (const QString _aux); bool setAntenna3 (const QString _aux); signals: void stationCallSignal (const QString _p); void operatorsSignal (const QString _p); void enterKey(); private slots: void slotMyLocatorTextChanged(); void slotOperatorsChanged(); void slotEnterKeyPressed(); void slotQRZTextChanged(); // void slotContestOverLayChanged(int i); private: bool checkOperatorsLineQString(const QString _auxLine); QTabWidget *tabWidget; QLineEdit *qrzLineEdit; // Station Callsign QLineEdit *operatorsLineEdit; //Operators QLineEdit *cqzLineEdit; QLineEdit *ituzLineEdit; QLineEdit *myLocatorLineEdit; QLabel *myLocatorLabel; //Personal Tab QLineEdit *nameLineEdit; QTextEdit *addressTextEdit; QLineEdit *address1LineEdit; QLineEdit *address2LineEdit; QLineEdit *address3LineEdit; QLineEdit *address4LineEdit; QLineEdit *cityLineEdit; QLineEdit *zipLineEdit; QLineEdit *provinceLineEdit; QLineEdit *countryLineEdit; // Station Tab QLineEdit *rig1LineEdit; QLineEdit *rig2LineEdit; QLineEdit *rig3LineEdit; QLineEdit *ant1LineEdit; QLineEdit *ant2LineEdit; QLineEdit *ant3LineEdit; //QLineEdit *powerLineEdit; QDoubleSpinBox *myPowerSpinBox; QPalette *defaultPalette, *wrongPalette; QColor redColor; Locator *locator; World *world; DataProxy *dataProxy; bool operatorsOK; bool operatorOK; }; #endif // SETUPPAGEUSERDATA_H klog-0.9.8.1/dataproxy_sqlite.h0000644000175000017500000002750213532572307015365 0ustar develdevel#ifndef DATAPROXY_SQLITE_H #define DATAPROXY_SQLITE_H /*************************************************************************** dataproxy_sqlite.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include //#include #include "dataproxy.h" #include "database.h" class DataProxy_SQLite : public DataProxy { Q_OBJECT public: DataProxy_SQLite(const QString _softVersion, const QString _parentFunction); ~DataProxy_SQLite(); QString getSoftVersion(); QString getDBVersion(); bool reconnectDB(); void createLogModel(); void createLogPanel(); bool haveAtLeastOneLog(); QStringList getColumnNamesFromTableLog(); int getIdFromModeName(const QString& _modeName); int getIdFromBandName(const QString& _bandName); int getSubModeIdFromSubMode(const QString _subModeName); int getModeIdFromSubModeId(const int _sm); QStringList getBands(); QStringList getModes(); QStringList sortBandNamesBottonUp(const QStringList _qs); QStringList getBandIDs(); QStringList getModesIDs(); QStringList getBandsInLog(const int _log); QStringList getModesInLog(const int _log); int getMostUsedBand(const int _log); int getMostUsedMode(const int _log); QString getNameFromBandId (const int _id); QString getNameFromModeId (const int _id); QString getNameFromSubModeId (const int _id); QString getSubModeFromId (const int _id); QString getNameFromSubMode (const QString _sm); // Checks if a submode is deprecated TODO: CHeck if really needed //QString getNameFromSubMode (const QString _sm); // DEPRECATED bool isModeDeprecated (const QString _sm); QString getFreqFromBandId(const int _id); int getBandIdFromFreq(const double _n); QString getBandNameFromFreq(const double _n); double getLowLimitBandFromBandName(const QString _sm); double getLowLimitBandFromBandId(const QString _sm); bool isThisFreqInBand(const QString _band, const QString _fr); int getLastQSOid(); bool addQSOFromWSJTX(const QString _dxcall, const double _freq, const QString _mode, const QString _dx_grid, const QString _time_off, const QString _report_sent, const QString _report_rec, const QString _tx_power, const QString _comments, const QString _name, const QString _time_on, const int _dxcc, const QString _opQrz, const QString _stQrz, const QString _myLoc, const int _logN); bool deleteQSO(const int _qsoId); int isWorkedB4(const QString _qrz, const int _currentLog); bool isThisQSODuplicated(const QString _qrz, const QString _date, const QString _time, const int _band, const int _mode); int getDuplicatedQSOId(const QString _qrz, const QString _date, const QString _time, const int _band, const int _mode); bool isDXCCConfirmed(const int _dxcc, const int _currentLog); bool isQSLReceived(const int _qsoId); bool isQSLSent(const int _qsoId); bool qslSentViaDirect(const int _qsoId, const QString _updateDate); bool qslSentViaBureau(const int _qsoId, const QString _updateDate); bool qslRecViaBureau(const int _qsoId, const QString _updateDate); bool qslRecViaBureau(const int _qsoId, const QString _updateDate, const bool _queueSentQSL); bool qslRecViaDirect(const int _qsoId, const QString _updateDate); bool qslRecViaDirect(const int _qsoId, const QString _updateDate, const bool _queueSentQSL); bool qslSentAsRequested(const int _qsoId, const QString _updateDate); bool qslRecAsRequested(const int _qsoId, const QString _updateDate); bool setClubLogSent(const int _qsoId, const QString _st, const QString _updateDate); bool isHF(const int _band); bool isWARC(const int _band); bool isVHF(const int _band); bool isUHF(const int _band); int getBandFromId(const int _qsoId); int getModeFromId(const int _qsoId); int getDXCCFromId(const int _qsoId); int getCQZFromId(const int _qsoId); QString getCallFromId(const int _qsoId); QStringList getClubLogRealTimeFromId(const int _qsoId); // Complete with previous QString getNameFromQRZ(const QString _call); QString getQTHFromQRZ(const QString _call); QString getLocatorFromQRZ(const QString _call); QString getIOTAFromQRZ(const QString _call); QString getQSLViaFromQRZ(const QString _call); // /Complete with previous bool updateAwardDXCC(); bool updateAwardWAZ(); //LOTW int getContinentIdFromContinentShortName(const QString _n); QString getContinentShortNameFromEntity(const int _n); int getContinentIdFromEntity(const int _n); QStringList getContinentShortNames(); bool isValidContinentShortName(const QString _n); int getCQzFromPrefix(const QString _p); int getCQzFromEntity(const int _n); int getITUzFromEntity(const int _n); int getITUzFromPrefix(const QString _p); QString getEntityNameFromId(const int _n); int getEntityIdFromName(const QString _e); QString getEntityMainPrefix(const int _entityN); bool isNewCQz(int _c); bool isNewEntity(int _e); double getLongitudeFromEntity(const int _e); double getLatitudeFromEntity(const int _e); int getDXCCFromPrefix(const QString _p); QString getEntityPrefixes(const int _enti); QStringList getEntitiesNames(); QStringList getEntitiesIds(); int getHowManyEntities(); int getMaxEntityID(bool limit = true); // limit = true implies that it will only shouw ARRL valid DXCC (i.e. will not count Sicily) QStringList getOperatingYears(const int _currentLog); void compressDB(); bool unMarkAllQSO(); // Unmarks all the marked QSO bool lotwSentQueue(const QString _updateDate, const int _currentLog); // Mark LOTW QSL SENT as Q (Queued) bool lotwSentYes(const QString _updateDate, const int _currentLog, const QString _station); // Update LOTW QSL SENT marked as Q as Y (Queued) bool clearLog(); // Stats int getQSOonYear(const int _year, const int _logNumber); int getDXCConYear(const int _year, const int _logNumber); int getCQzonYear(const int _year, const int _logNumber); int getQSOsWithDXCC(const int _dxcc, const int _logNumber); int getQSOsAtHour(const int _hour, const int _log); int getQSOsAtHourOnBand(const int _hour, const int _band ,const int _log); int getQSOsOnMonth(const int _month, const int _log); int getHowManyQSOInLog(const int _log); int getHowManyConfirmedQSLInLog(const int _log); int getHowManyQSLSentInLog(const int _log); int getQSOsWithContinent(const QString _cont, const int _logNumber); int getQSOsInBand(const QString _band, const int _log); int getQSOsInMode(const QString _mode, const int _log); // Stats - end bool newDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber); QStringList getContestNames(); QStringList getContestCat(const int _catn); QStringList getContestOverlays(); int getContestTypeN(const int _co, const int _catop, const int _catas, const int _catpo, const int _catba, const int _catov, const int _catmo); QStringList getDataFromContestType(const int _n); int getLogTypeNumber(const QString _logType); QString getLogTypeName(const int _logType); QString getLogTypeOfUserLog(const int _logN); int getLogNumberFromQSOId(const int _qsoId); QStringList getBandNames(); QStringList getPropModeList(); bool clearSatList(); bool addSatellite(const QString _arrlId, const QString _name, const QString _downLink, const QString _upLink, const QString _mode, int id = -1); int getDBSatId(const QString _arrlId); QStringList getSatellitesList(); QString getSatelliteUplink(const QString _sat); QString getSatelliteDownlink(const QString _sat); QString getSatelliteMode(const QString _sat); QString getSatelliteFullUplink(const QString _sat); QString getSatelliteFullDownlink(const QString _sat); QString getSatelliteFullMode(const QString _sat); QString getSatelliteName(const QString _sat); QString getSateliteArrlIdFromId(const int _id); QStringList getQSLRcvdList(); QStringList getQSLSentList(); QStringList getClubLogStatusList(); QStringList getQSLViaList(); QStringList getValidCatOptions(const int _currentCat, const int _lowerCa); bool fillEmptyDXCCInTheLog(); int getNumberOfManagedLogs(); QStringList getListOfManagedLogs(); int getMaxLogNumber(); QString getStationCallSignFromLog(const int _log); QStringList getStationCallSignsFromLog(const int _log); QString getOperatorsFromLog(const int _log); QString getCommentsFromLog(const int _log); QString getLogDateFromLog(const int _log); QString getLogTypeNFromLog(const int _log); bool addNewLog (const QStringList _qs); bool doesThisLogExist(const int _log); bool updateISONames(); // Update the entities ISO 3166names for the flags QString getISOName(const int _n); bool setDXCCAwardStatus(const int _qsoId); bool setWAZAwardStatus(const int _qsoId); void getFoundInLog(const QString _txt, const int _log=-1); //bool queryPrepare(const QString _query); //bool queryBind(const QString _field, const QString value); //bool queryExec(); private: bool dbCreated; DataBase *db; QStringList sortBandIdBottonUp(const QStringList _qs); double getFreqFromRange(QString _fr); //May even receive: 145.900-146.00 and should return the mid in the range (145.950) QStringList getColumnNamesFromTable(const QString _tableName); int getPrefixId(const QString _qrz); QString changeSlashAndFindPrefix(const QString _qrz); bool searching; int executionN; Utilities *util; //QSqlQuery preparedQuery; //QSqlRelationalTableModel *logModel; signals: void qsoFound(const QStringList _qs); // Each: QString with format: Fieldname:value void queryError(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); // To alert about any failed query execution }; #endif // DATAPROXY_SQLITE_H klog-0.9.8.1/statisticswidget.h0000644000175000017500000000174713532572307015372 0ustar develdevel#ifndef STATISTICSWIDGET_H #define STATISTICSWIDGET_H #include #include #include "dataproxy.h" #include #include "charts/barchartstats.h" //#include "charts/donutchartstats.h" class StatisticsWidget : public QWidget { Q_OBJECT public: explicit StatisticsWidget(DataProxy *dp, QWidget *parent = nullptr); ~StatisticsWidget(); void clear(); protected: void closeEvent(QCloseEvent *event); void showEvent(QShowEvent *event); private slots: void slotChartComboBoxChanged(); void slotLogComboBoxChanged(); private: void createUI(); void fillLogCombo(); void updateChart(); // void paintQSOperOtherBarChart(const int _i); DataProxy *dataProxy; //QWidget *graphWidget; QChartView *chartView; BarChartStats *barChartStats; //DonutChartStats *donutChartStats; QComboBox *statisticToShowComboBox, *logComboBox; QStringList statisticsToShowList; }; #endif // STATISTICSWIDGET_H klog-0.9.8.1/mainwindowsattab.cpp0000644000175000017500000006214013532600317015665 0ustar develdevel /*************************************************************************** mainwindowsattab.cpp - description ------------------- begin : Jul 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mainwindowsattab.h" /* This class implements the Satellite TAB of the MainWindow */ MainWindowSatTab::MainWindowSatTab(DataProxy *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowSatTab::MainWindowSatTab" << endl; satNameComboBox = new QComboBox; satNameLineEdit = new QLineEdit; satModeLineEdit = new QLineEdit; satDXLocatorLineEdit = new QLineEdit; satOtherLabel = new QLabel; satBandTXComboBox = new QComboBox; satBandRXComboBox = new QComboBox; txFreqSpinBox = new QDoubleSpinBox; rxFreqSpinBox = new QDoubleSpinBox; keepThisDataForNextQSORadiobutton = new QRadioButton; dataProxy = dp; locator = new Locator; createUI(); populateSatComboBox(); //txBandBeingChanged = false; //rxBandBeingChanged = false; txFreqBeingAutoChanged = false; rxFreqBeingAutoChanged = false; //txBandsBeingChanged = false; updatingBands = false; satNameLineEdit->setEnabled(false); satOtherLabel->setEnabled(false); palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); setDefaultBands(); //TODO: Check how the bands are included not to create an inconsistence with the selected (in the setup) bands //qDebug() << "MainWindowSatTab::MainWindowSatTab - END" << endl; } MainWindowSatTab::~MainWindowSatTab(){} void MainWindowSatTab::createUI() { connect(satNameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSatNameTextChanged() ) ); connect(satModeLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSatModeTextChanged() ) ); connect(satDXLocatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSatDXLocTextChanged() ) ); connect(satNameComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotSatNameComboBoxChanged() ) ) ; connect(satBandRXComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotSatBandRXComboBoxChanged()) ) ; connect(satBandTXComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotSatBandTXComboBoxChanged()) ) ; connect(txFreqSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotSatFreqTXChanged()) ) ; connect(rxFreqSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotSatFreqRXChanged()) ) ; QLabel *keepLabel = new QLabel(); keepLabel->setText(tr("Keep this data")); keepLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); keepLabel->setToolTip(tr("Data entered in this tab will be copied into the next QSO.")); keepThisDataForNextQSORadiobutton->setToolTip(tr("Data entered in this tab will be copied into the next QSO.")); QString othersat = tr("Other - Sat not in the list"); QString aux; aux.clear(); aux = QString(tr("Name of the Satellite if not in the list. Select: \"%1\" to enable this box. (format like AO-51).").arg(othersat)); satNameLineEdit->setToolTip(aux); //satNameLineEdit->setToolTip(tr("Name of the Satellite if not in the list. Select Other Sat (format like AO-51)")); satModeLineEdit->setToolTip(tr("Satellite mode used.")); satNameComboBox->setToolTip(tr("Select the satellite you are using.")); satBandTXComboBox->setToolTip(tr("UpLink band.")); satBandRXComboBox->setToolTip(tr("DownLink band.")); satDXLocatorLineEdit->setToolTip(tr("Locator of the DX station. This box is synchronized with the Locator box in the QSO tab.")); QLabel *upLinkLabel = new QLabel(); upLinkLabel->setText(tr("UpLink")); upLinkLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *downLinkLabel = new QLabel(); downLinkLabel->setText(tr("DownLink")); downLinkLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *satNameLabel = new QLabel(); satNameLabel->setText(tr("Satellite")); satNameLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *satModeLabel = new QLabel(); satModeLabel->setText(tr("Mode")); satModeLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *satDXLocLabel = new QLabel(); satDXLocLabel->setText(tr("DX Locator")); satDXLocLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); //QLabel *satOtherLabel = new QLabel(); satOtherLabel->setText(tr("Other")); satOtherLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); txFreqSpinBox->setDecimals(3); txFreqSpinBox->setMaximum(99999); txFreqSpinBox->setSuffix(" " + tr("MHz")); rxFreqSpinBox->setDecimals(3); rxFreqSpinBox->setMaximum(99999); rxFreqSpinBox->setSuffix(" " + tr("MHz")); QHBoxLayout *keepLayout = new QHBoxLayout; keepLayout->addWidget(keepLabel); keepLayout->addWidget(keepThisDataForNextQSORadiobutton); QHBoxLayout *lastlineLayout = new QHBoxLayout; //lastlineLayout->addWidget(satModeLabel); lastlineLayout->addWidget(satModeLineEdit); lastlineLayout->addWidget(satDXLocLabel); lastlineLayout->addWidget(satDXLocatorLineEdit); QGridLayout *tabLayout = new QGridLayout; tabLayout->addWidget(satNameLabel,0,0); tabLayout->addWidget(upLinkLabel,1,0); tabLayout->addWidget(downLinkLabel,2,0); tabLayout->addWidget(satModeLabel,3,0); tabLayout->addLayout(lastlineLayout,3,1); tabLayout->addWidget(satNameComboBox,0,1); tabLayout->addWidget(satBandTXComboBox,1,1); tabLayout->addWidget(satBandRXComboBox,2,1); //tabLayout->addWidget(satModeLineEdit,3,1); //tabLayout->addWidget(satModeLineEdit,3,1,1,-1); tabLayout->addWidget(satNameLineEdit,0,2); tabLayout->addWidget(txFreqSpinBox,1,2); tabLayout->addWidget(rxFreqSpinBox,2,2); tabLayout->addLayout(keepLayout,3,2); setLayout(tabLayout); } void MainWindowSatTab::slotSatNameComboBoxChanged() { int i = satNameComboBox->currentIndex(); //qDebug() << "MainWindowSatTab::slotSatNameComboBoxChanged: " << QString::number(i) << endl; //QString _pm = (((satNameComboBox->currentText()).split(' ')).at(0)).simplified(); satNameLineEdit->clear(); if (i == 0) { emit setPropModeSat("Not"); satNameLineEdit->setEnabled(false); satOtherLabel->setEnabled(false); } else if(i == 1) { emit setPropModeSat("SAT"); satNameLineEdit->setEnabled(true); satOtherLabel->setEnabled(true); } else { emit setPropModeSat("SAT"); satNameLineEdit->setEnabled(false); satOtherLabel->setEnabled(false); setBandsOfSat(satNameComboBox->currentText()); //dataProxy->getSatelliteMode(satNameComboBox->currentText()) } } void MainWindowSatTab::slotSatNameTextChanged() { //qDebug() << "MainWindowSatTab::slotSatNameTextChanged: " << satNameLineEdit->text() << endl; satNameLineEdit->setText((satNameLineEdit->text()).toUpper()); if ((satNameLineEdit->text()).length()>0) { emit setPropModeSat("SAT"); } else if ((satModeLineEdit->text()).length()<1) { emit setPropModeSat("Not"); } } void MainWindowSatTab::slotSatModeTextChanged() { //qDebug() << "MainWindowSatTab::slotSatModeTextChanged: " << satModeLineEdit->text() << endl; /* satModeLineEdit->setText((satModeLineEdit->text()).toUpper()); if ((satModeLineEdit->text()).length()>0) { emit setPropModeSat("SAT"); } else if ((satNameLineEdit->text()).length()<1) { emit setPropModeSat("Not"); } */ } void MainWindowSatTab::setLocator(const QString _t) { //qDebug() << "MainWindowSatTab::setLocator: " << _t << endl; satDXLocatorLineEdit->setText(_t.toUpper()); } void MainWindowSatTab::slotSatDXLocTextChanged() { //qDebug() << "MainWindowSatTab::slotSatDXLocTextChanged: " << satDXLocatorLineEdit->text() << endl; satDXLocatorLineEdit->setText((satDXLocatorLineEdit->text()).toUpper()); if ( locator->isValidLocator((satDXLocatorLineEdit->text()).toUpper()) ) { emit dxLocatorChanged((satDXLocatorLineEdit->text()).toUpper()); } else { return; } } QString MainWindowSatTab::getSatName() { // Sat name must follow the format CC-NN to make it compatible with LOTW // C = Character // N = Number /* QString satName; satName = satNameLineEdit->text(); //TODO: Check that the format is OK return satName; */ QString _pm = QString(); QString satName = QString(); //qDebug() << "MainWindowSatTab::getSatName:" << satNameComboBox->currentText() << endl; _pm = (((satNameComboBox->currentText()).split(' ')).at(0)).simplified(); //qDebug() << "MainWindowSatTab::satNameComboBox: " << _pm << endl; if (satNameComboBox->currentIndex() == 0) { return QString(); } else if(satNameComboBox->currentIndex() == 1) { satName = satNameLineEdit->text(); if (satName.length()>0) { return satName; } else { return QString(); } } else { return _pm; } } void MainWindowSatTab::setSatName(const QString _t) { //TODO: Check that the format is OK //qDebug() << "MainWindowSatTab::setSatName: " << _t << endl; //satNameLineEdit->setText(_t); if (getSatIndex(_t) > 0) { setSatelliteCombo(_t); } else { satNameComboBox->setCurrentIndex(1); satNameLineEdit->setText(_t); } } QString MainWindowSatTab::getSatMode() { return satModeLineEdit->text(); } void MainWindowSatTab::setSatMode(const QString _t) { //qDebug() << "MainWindowSatTab::setSatMode: " << _t << endl; if (_t == "-CLEAR-") { satModeLineEdit->clear(); } else { satModeLineEdit->setText(_t); } } bool MainWindowSatTab::getRepeatThis() { return keepThisDataForNextQSORadiobutton->isChecked(); } void MainWindowSatTab::setRepeatThis(const bool _t) { keepThisDataForNextQSORadiobutton->setChecked(_t); } void MainWindowSatTab::clear() { //qDebug() << "MainWindowSatTab::clear" << endl; if (keepThisDataForNextQSORadiobutton->isChecked()) { satDXLocatorLineEdit->clear(); return; } else { satModeLineEdit->clear(); satNameComboBox->setCurrentIndex(0); satNameLineEdit->clear(); //txFreqSpinBox->setValue(0); //rxFreqSpinBox->setValue(0); //satBandRXComboBox->setCurrentIndex(0); //satBandTXComboBox->setCurrentIndex(0); } } void MainWindowSatTab::refreshData() { populateSatComboBox(); } void MainWindowSatTab::populateSatComboBox() { //qDebug() << "MainWindowSatTab::populateSatComboBox: " << endl; QString nosat = tr("Not Sat QSO"); QString othersat = tr("Other - Sat not in the list"); satellitesList.clear(); satellitesList = dataProxy->getSatellitesList(); satellitesList.prepend(othersat); satellitesList.prepend("No-SAT - " + nosat); if (satellitesList.size()>1) { satNameComboBox->clear(); satNameComboBox->addItems(satellitesList); } else { //TODO: Check how to do it better... now I could simply remove the if satNameComboBox->addItems(satellitesList); } } void MainWindowSatTab::setSatelliteCombo(const QString _p) { //qDebug() << "MainWindowsatTab::setSatelliteCombo: " << _p << endl; QString aux = QString(); int indexC = getSatIndex(_p); //int indexC = satNameComboBox->findText(_p, Qt::MatchContains); //qDebug() << "MainWindowsatTab::setSatelliteCombo: N=" << QString::number(indexC) << endl; if (indexC>0) { satNameComboBox->setCurrentIndex(indexC); } else { satNameComboBox->setCurrentIndex(0); if (_p.length()>0) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); aux = tr("KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name.") + "\n\n"; msgBox.setText(aux + tr("The satellite you have in your QSO is: ") + _p + "\n\n" + tr("Please know that the satellite name will not be saved if it is not in the list so that information may be lost!")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } } } } void MainWindowSatTab::setOtherSatName(const QString _t) { //qDebug() << "MainWindowsatTab::setOtherSatName: " << _t << endl; satNameLineEdit->setText(_t); } QString MainWindowSatTab::getOtherSatName() { return QString(); } int MainWindowSatTab::getSatIndex(const QString _p) { return satNameComboBox->findText(_p, Qt::MatchContains); } void MainWindowSatTab::addBands(QStringList _bands) { //qDebug() << "MainWindowSatTab::addBands: " << QString::number(_bands.length()) << endl; updatingBands = true; QString _txBand = satBandTXComboBox->currentText(); QString _rxBand = satBandRXComboBox->currentText(); //txBandsBeingChanged = true; satBandRXComboBox->clear(); satBandTXComboBox->clear(); satBandTXComboBox->addItems(_bands); satBandRXComboBox->addItems(_bands); satBandTXComboBox->setCurrentIndex(satBandTXComboBox->findText(_txBand, Qt::MatchCaseSensitive)); satBandRXComboBox->setCurrentIndex(satBandRXComboBox->findText(_rxBand, Qt::MatchCaseSensitive)); //txBandsBeingChanged = false; updatingBands = false; //qDebug() << "MainWindowSatTab::addBands - END" << endl; } void MainWindowSatTab::setDefaultBands() {//Defines the default bands for SAT communications: 10m/2m/70cm/23CM only if they exist on the selected bands //qDebug() << "MainWindowsatTab::setDefaultBands: " << endl; QStringList _b; _b.clear(); _b << "10M" << "2M" << "70CM" << "23CM"; satBandRXComboBox->addItems(_b); satBandTXComboBox->addItems(_b); } void MainWindowSatTab::slotSatBandRXComboBoxChanged() { //qDebug() << "MainWindowsatTab::slotSatBandRXComboBoxChanged" << endl; if (updatingBands) { return; } bool freqInBand = dataProxy->isThisFreqInBand(satBandRXComboBox->currentText(), QString::number(rxFreqSpinBox->value())); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band rxFreqSpinBox->setValue(dataProxy->getLowLimitBandFromBandName(satBandRXComboBox->currentText())); } //qDebug() << "MainWindowsatTab::slotSatBandRXComboBoxChanged-END" << endl; } void MainWindowSatTab::slotSatFreqRXChanged() { //qDebug() << "MainWindowsatTab::slotSatFreqRXChanged: " << QString::number(rxFreqSpinBox->value()) << endl; int bandId = dataProxy->getBandIdFromFreq(rxFreqSpinBox->value()); if (bandId<1) { //This prevent that a non-hamradio frequency is used on TX //qDebug() << "MainWindowsatTab::slotSatFreqRXChanged: Not in band, exiting... " << endl; rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.\nFrequency is not in a hamradio band!")); rxFreqSpinBox->setPalette(palRed); } else { rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.")); rxFreqSpinBox->setPalette(palBlack); bool freqInBand = dataProxy->isThisFreqInBand(satBandRXComboBox->currentText(), QString::number(rxFreqSpinBox->value())); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band satBandRXComboBox->setCurrentIndex(satBandRXComboBox->findText(dataProxy->getBandNameFromFreq(rxFreqSpinBox->value()), Qt::MatchCaseSensitive)); } } if (!rxFreqBeingAutoChanged) { emit satRxFreqChanged(rxFreqSpinBox->value()); } //qDebug() << "MainWindowsatTab::slotSatFreqRXChanged-END" << endl; } void MainWindowSatTab::slotSatBandTXComboBoxChanged() { //qDebug() << "MainWindowsatTab::slotSatBandTXComboBoxChanged:" << endl; if (updatingBands) { return; } bool freqInBand = dataProxy->isThisFreqInBand(satBandTXComboBox->currentText(), QString::number(txFreqSpinBox->value())); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band txFreqSpinBox->setValue(dataProxy->getLowLimitBandFromBandName(satBandTXComboBox->currentText())); //setUpLinkFreq(dataProxy->getLowLimitBandFromBandName(satBandTXComboBox->currentText())); } //qDebug() << "MainWindowsatTab::slotSatBandTXComboBoxChanged-END" << endl; } void MainWindowSatTab::slotSatFreqTXChanged() { //qDebug() << "MainWindowsatTab::slotSatFreqTXChanged: " << QString::number(txFreqSpinBox->value()) << endl; // user changes TX Freq // If band is real and band is configured, bandcombo is selected // If band is real and not configured, we launch the band config and select the band. // if band is real emit the band int bandId = dataProxy->getBandIdFromFreq(txFreqSpinBox->value()); if (bandId<1) { //This prevent that a non-hamradio frequency is used on TX //qDebug() << "MainWindowsatTab::slotSatFreqTXChanged: Not in band, exiting... " << endl; txFreqSpinBox->setToolTip(tr("TX Frequency in MHz.\nFrequency is not in a hamradio band!")); txFreqSpinBox->setPalette(palRed); } else { txFreqSpinBox->setToolTip(tr("TX Frequency in MHz.")); txFreqSpinBox->setPalette(palBlack); bool freqInBand = dataProxy->isThisFreqInBand(satBandTXComboBox->currentText(), QString::number(txFreqSpinBox->value())); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band satBandTXComboBox->setCurrentIndex(satBandTXComboBox->findText(dataProxy->getBandNameFromFreq(txFreqSpinBox->value()), Qt::MatchCaseSensitive)); //setUpLinkFreq(dataProxy->getLowLimitBandFromBandName(satBandTXComboBox->currentText())); } } if (!txFreqBeingAutoChanged) { emit satTxFreqChanged(txFreqSpinBox->value()); } //qDebug() << "MainWindowsatTab::slotSatFreqTXChanged-END" << endl; } void MainWindowSatTab::setUpLink(const QString _t) { //qDebug() << "MainWindowsatTab::setUpLink: " << _t << endl; int index = satBandTXComboBox->findText(_t, Qt::MatchCaseSensitive); int indexRX; if (index>=0) { satBandTXComboBox->setCurrentIndex(index); //if ((dataProxy->isVHF(dataProxy->getIdFromBandName(_t))) && !(dataProxy->isUHF(dataProxy->getIdFromBandName(_t))) ) if ( dataProxy->getIdFromBandName("2M") == dataProxy->getIdFromBandName(_t) ) { //qDebug() << satNameComboBox->currentText() << endl; if (satNameComboBox->findText("AO-7 - AMSAT-OSCAT 7", Qt::MatchCaseSensitive)) { indexRX = satBandRXComboBox->findText("10M", Qt::MatchCaseSensitive); } else { indexRX = satBandRXComboBox->findText("70CM", Qt::MatchCaseSensitive); } satBandRXComboBox->setCurrentIndex(indexRX); } //else if(dataProxy->isUHF(dataProxy->getIdFromBandName(_t))) else if ( dataProxy->getIdFromBandName("70CM") == dataProxy->getIdFromBandName(_t) ) //else { indexRX = satBandRXComboBox->findText("2M", Qt::MatchCaseSensitive); satBandRXComboBox->setCurrentIndex(indexRX); } } } void MainWindowSatTab::setUpLinkFreq(const double _t) { //qDebug() << "MainWindowsatTab::setUpLinkFreq: " << QString::number(_t) << endl; txFreqBeingAutoChanged = true; txFreqSpinBox->setValue(_t); txFreqBeingAutoChanged = false; //qDebug() << "MainWindowsatTab::setUpLinkFreq END" << endl; } void MainWindowSatTab::setDownLinkFreq(const double _t) { //qDebug() << "MainWindowsatTab::setDownLinkFreq: " << QString::number(_t) << endl; rxFreqBeingAutoChanged = true; rxFreqSpinBox->setValue(_t); rxFreqBeingAutoChanged = false; //qDebug() << "MainWindowsatTab::setDownLinkFreq END" << endl; } void MainWindowSatTab::setBandsOfSat(const QString _p) { // Until the data is in the DB, this function tries to solve data of active sats from: http://www.amsat.org/status/ // This functio: // - identifies the freqs & bands that the sat is using //qDebug() << "MainWindowSatTab::setBandsOfSat: " << _p << " - Short: " << _p.section(' ', 0, 0) << endl; //"AO-7 - AMSAT-OSCAT 7" //2M/10M << 2M/70CM double upLink = 0.0; upLink = (dataProxy->getSatelliteUplink(_p.section(' ', 0, 0))).toDouble(); double downLink = 0.0; downLink = (dataProxy->getSatelliteDownlink(_p.section(' ', 0, 0))).toDouble(); //qDebug() << "MainWindowSatTab::setBandsOfSat upLink: " << QString::number(upLink)<< endl; if (upLink>0) { //qDebug() << "MainWindowSatTab::setBandsOfSat upLink: emitting: " << QString::number(upLink)<< endl; emit satTXFreqNeeded(upLink); //qDebug() << "MainWindowSatTab::setBandsOfSat upLink: emitted: " << QString::number(upLink)<< endl; } else { satBandTXComboBox->setCurrentIndex(0); } if (downLink>0) { //qDebug() << "MainWindowSatTab::setBandsOfSat downLink: emitting: " << QString::number(downLink)<< endl; emit satRXFreqNeeded(downLink); //qDebug() << "MainWindowSatTab::setBandsOfSat downLink: emitted: " << QString::number(downLink)<< endl; } else { satBandRXComboBox->setCurrentIndex(0); } //qDebug() << "MainWindowSatTab::setBandsOfSat downLink: emiting: " << QString::number(downLink)<< endl; //emit satRxFreqChanged(downLink); /* emit satRXFreqNeeded(downLink); rxFreqSpinBox->setValue(downLink); if (downLink>0) { QString downLinkBand = dataProxy->getBandNameFromFreq(downLink); int indexRX = satBandRXComboBox->findText(downLinkBand, Qt::MatchCaseSensitive); if (indexRX>0) { satBandRXComboBox->setCurrentIndex(indexRX); } else { addNewBand(downLinkBand); indexRX = satBandRXComboBox->findText(downLinkBand, Qt::MatchCaseSensitive); satBandRXComboBox->setCurrentIndex(indexRX); } } else { satBandRXComboBox->setCurrentIndex(0); } */ //qDebug() << "MainWindowSatTab::setBandsOfSat: " << _p << " - END " << endl; } void MainWindowSatTab::addNewBand(const QString _p) { //qDebug() << "MainWindowSatTab::addNewBand: " << _p << endl; if (dataProxy->getIdFromBandName(_p)<0) { //qDebug() << "MainWindowSatTab::addNewBand: Id: " << QString::number(dataProxy->getIdFromBandName(_p)) << endl; return; } QStringList bands; bands.clear(); //qDebug() << "MainWindowSatTab::addNewBand: RX Id: " << QString::number(satBandRXComboBox->count()) << endl; //qDebug() << "MainWindowSatTab::addNewBand: TX Id: " << QString::number(satBandTXComboBox->count()) << endl; for (int i = 0; i < satBandTXComboBox->count(); i++) { bands << satBandTXComboBox->itemText(i); for (int ii = 0; ii < satBandRXComboBox->count(); ii++) { bands << satBandRXComboBox->itemText(ii); } } bands << _p; //bands.removeDuplicates(); emit newBandsToBeAdded(bands); //addBands(bands); //qDebug() << "MainWindowSatTab::addNewBand: 2 RX Id: " << QString::number(satBandRXComboBox->count()) << endl; //qDebug() << "MainWindowSatTab::addNewBand: 2 TX Id: " << QString::number(satBandTXComboBox->count()) << endl; } klog-0.9.8.1/dxccstatuswidget.h0000644000175000017500000000674713532572307015372 0ustar develdevel#ifndef DXCCSTATUSWIDGET_H #define DXCCSTATUSWIDGET_H /*************************************************************************** dxccstatuswidget.h - description ------------------- begin : feb 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include //#include #include "awards.h" #include "world.h" #include "dataproxy.h" #include "locator.h" //TODO: Creating the widget to show the DXCC status class DXCCStatusWidget : public QWidget { Q_OBJECT public: explicit DXCCStatusWidget(DataProxy *dp, const QString _parentFunction, QWidget *parent = nullptr); ~DXCCStatusWidget(); void update(); //void awardsUpdated(); void setBands(const QStringList _ent, const bool _creating = false); // Receives the list of bandIDs void setCurrentLog(const int _logN); void setMyLocator(const QString _loc); void refresh(); signals: void showQso(const int _qsoid); // identified QSO double clicking on DXCC void showQsos(QList _qsos); //void updateAwards(); public slots: //void slotSearchLineEditTextChanged(); void slotRefreshButtonClicked(); void slotItemEntered(QTableWidgetItem * item ); void slotItemDoubleClicked(QTableWidgetItem * item ); private: void createUI(); void setDefaultBands(); void addEntity(QStringList const _ent); // DXCC id, bandid, bandid, ... //QStringList sortBandNamesBottonUp(const QStringList _qs); QTableWidget *dxccView; Awards *awards; World *world; DataProxy *dataProxy; Locator *locator; QHeaderView *hv, *hh; //QLineEdit *searchLineEdit; QPushButton *refreshButton; //QRadioButton *showAllLogsButton; int numberOfColumns; // Columns will be number Of Bands + 2 (Id + Name) QStringList bandNames, validBands; int logNumber, tempLog; // log in use in the log / log to be used in the widget QString loc; // The locator of the user. }; #endif // DXCCSTATUSWIDGET_H klog-0.9.8.1/world.h0000644000175000017500000001345613532572307013123 0ustar develdevel#ifndef WORLD_H #define WORLD_H /*************************************************************************** world.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include #include #include #include #include #include #include #include "locator.h" #include "dataproxy.h" //#include "awards.h" class QStringList; enum { Entity_Name = 1, Entity_Continent = 2 }; class World : public QWidget { //friend class Awards; Q_OBJECT public: World(DataProxy *dp, const QString _parentFunction); World(DataProxy *dp, const QString _klogDir, const QString _parentFunction); World(DataProxy *dp, const QString _klogDir, const QString _kontestVer, const QString _parentFunction); ~World(); bool create(const QString _worldFile); bool recreate(const QString _worldFile); QString getQRZEntityName(const QString _qrz); QString getEntityName(const int _entityN); QString getQRZEntityMainPrefix(const QString _qrz); QString getEntityMainPrefix(const int _entityN); QString getQRZContinentNumber(const QString _qrz); // Returns the continent id number int getContinentNumber(const int _enti); // Returns the continent id number QString getQRZContinentShortName(const QString _qrz); // Returns the continent shortName (EU, AF, ...) QString getContinentShortName(const int _enti); QString getQRZLocator(const QString _qrz); // Returns the entity locator QString getLocator(const int _entityN); // Returns the entity locator double getQRZLongitude(const QString _qrz); // Returns the longitude of the Entity double getLongitude(const int _enti); // Returns the longitude of the Entity double getQRZLatitude(const QString _qrz); // Returns the latitude of the Entity double getLatitude(const int _enti); // Returns the latitude of the Entity int getEntityCqz(const int _enti); int getQRZCqz(const QString _qrz); //int getPrefixCQz(const QString _p); int getQRZItuz(const QString _qrz); int getEntityItuz(const int _enti); int getQRZARRLId(const QString _qrz); //Returns the ARRL id of the Entity from a QRZ & Returns -1 if not found. bool isNewCQz(const int _cqz); bool isNewEntity(const int _entityN); //int getBandIdFromFreq(const QString fr); QString getQRZEntityPrefixes(const QString _qrz); QString getEntityPrefixes(const int _enti); bool checkQRZValidFormat(const QString _qrz); QStringList getEntitiesNames(); int getHowManyEntities(); private slots: private: //void identifyOS(); int getPrefixId(const QString _qrz); //bool readCTYDAT(); bool readCTYCSV(const QString _worldFile); QStringList processLine(const QString _line); QStringList processLineP(const QString _line, const int _processingEntity); void createWorldModel(); QStringList readZones(const QString &pref, const int _cq, const int _itu); QString changeSlashAndFindPrefix(const QString _qrz); // Changes the \ into / and find the country prefix int progressBarPosition; bool created; QString klogDir, kontestVersion; int cqz, ituz, numberOfEntities; QString entityName; QString currentPrefix; // Used in the progressBar bool ret; QStringList list, prefixAndZones; QString continentName, prefix; int continentId; double lat, lon, utc; //QString line; //bool readingDataOfAnEntity; int nullValue; QSqlRelationalTableModel *worldModel; //QProgressBar *progressBar; Locator *locator; DataProxy *dataProxy; int constrid; // Just an id for the constructor to check who is being executed at one specific time //Awards *awards; //FLAGS //QString flagsDir; //FLAGS-END signals: //void qsoFound(const QStringList _qs); // Each: QString with format: Fieldname:value void queryError(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); // To alert about any failed query execution }; #endif // WORLD_H klog-0.9.8.1/setuppagedxcluster.h0000644000175000017500000000741313532572307015723 0ustar develdevel#ifndef SETUPPAGEDXCLUSTER_H #define SETUPPAGEDXCLUSTER_H /*************************************************************************** setuppagedxcluster.h - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include //#include //#include //#include #include class SetupPageDxCluster : public QWidget { Q_OBJECT public: SetupPageDxCluster(QWidget *parent=0); ~SetupPageDxCluster(); QStringList getDxclusterServersComboBox(); void setDxclusterServersComboBox(const QStringList t); QString getSelectedDxClusterServer(); void setSelectedDxClusterServer(const QString t); QString getShowHFRadiobutton(); QString getShowVHFRadiobutton(); QString getShowWARCRadiobutton(); QString getShowWorkedRadiobutton(); QString getShowConfirmedRadiobutton(); QString getShowANNRadiobutton(); QString getShowWWVRadiobutton(); QString getShowWCYRadiobutton(); void setShowHFRadiobutton(const QString t); void setShowVHFRadiobutton(const QString t); void setShowWARCRadiobutton(const QString t); void setShowWorkedRadiobutton(const QString t); void setShowConfirmedRadiobutton(const QString t); void setShowANNRadiobutton(const QString t); void setShowWWVRadiobutton(const QString t); void setShowWCYRadiobutton(const QString t); private slots: void slotAddButtonClicked(); void slotDeleteButtonClicked(); private: void createActions(); bool checkIfValidDXCluster (const QString &tdxcluster); bool checkIfNewDXCluster (const QString &tdxcluster); QComboBox *dxclusterServersComboBox; QPushButton *addClusterButton; QPushButton *deleteClusterButton; QRadioButton *showHFRadiobutton; QRadioButton *showVHFRadiobutton; QRadioButton *showWARCRadiobutton; QRadioButton *showWorkedRadiobutton; QRadioButton *showConfirmedRadiobutton; QRadioButton *showANNRadiobutton; QRadioButton *showWWVRadiobutton; QRadioButton *showWCYRadiobutton; QRadioButton *saveAllDXClusterDataRadiobutton; //QStringList dxClusterServers; }; #endif // SETUPPAGEDXCLUSTER_H klog-0.9.8.1/INSTALL-win.txt0000644000175000017500000000014713532572307014256 0ustar develdevelInstalling KLog on a Windows system is easy. Just double-click on the installer and follow the steps. klog-0.9.8.1/setuppagesatsnew.h0000644000175000017500000000700713532572307015371 0ustar develdevel#ifndef SETUPPAGESATSNEW_H #define SETUPPAGESATSNEW_H /*************************************************************************** setuppagesatsnew.h - description ------------------- begin : dec 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new satellite // #include "dataproxy.h" #include #include #include //TODO: Read the data when the user clicks the OK button //TODO: Fill the data from the list of sats when the user wants to edit a sat class SetupPageSatsNew : public QDialog { Q_OBJECT public: SetupPageSatsNew(DataProxy *dp, QWidget *parent = 0); void setEditing(const bool b); void setShortName(const QString st); void setName(const QString st); void setUpLink(const QString st); void setDownLink(const QString st); void setModes(const QString st); void clear(); private slots: void slotOKButtonClicked(); void slotCancelButtonClicked(); void slotShortNameTextChanged(); void slotNameTextChanged(); void slotUpLinkTextChanged(); void slotDownLinkTextChanged(); void slotModesTextChanged(); signals: void newSatData(const QStringList _qs); // void cancelled(const bool _c); // Cancel button is clicked private: //bool isThereAnyNotManagedSat(); void createUI(); void gatherAndSend(); bool isItAFreq(const QString _st); //void fillWithType(const int _n); //void updateAllCats(); //void showOK(); //void showNOK(); //void clear(); DataProxy *dataProxy; QLineEdit *shortNameLineEdit, *nameLineEdit; QLineEdit *uplinkLineEdit, *downlinkLineEdit; QLineEdit *modesLineEdit; QLabel *shortNameLabel, *nameLabel; QLabel *uplinkLabel, *downlinkLabel; QLabel *modesLabel; QString shortName, name, uplink, downlink, modes; bool hasShortName, hasName, hasUplink, hasDownlink, hasModes; QPushButton *okButton, *cancelButton; QStringList satData; bool editing; }; #endif // SETUPPAGESATSNEW_H klog-0.9.8.1/setupdialog.h0000644000175000017500000001263713532572307014314 0ustar develdevel#ifndef SETUPDIALOG_H #define SETUPDIALOG_H /*************************************************************************** setupdialog.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "setuppageuserdata.h" #include "setuppagebandmode.h" #include "setuppagemisc.h" #include "setuppagedxcluster.h" #include "setuppagecolors.h" #include "setuppagelogs.h" #include "setuppageworldeditor.h" #include "setuppageclublog.h" #include "setuppageudp.h" #include "setuppagesats.h" #include "setuppagehamlib.h" #include "utilities.h" #include "locator.h" class QListWidget; class QListWidgetItem; class QStackedWidget; class SetupDialog : public QDialog { Q_OBJECT public: SetupDialog(DataProxy *dp, const bool _firstTime=true); SetupDialog(DataProxy *dp, const QString _configFile, const QString _softwareVersion, const int _page=0, const bool _firstTime = true); ~SetupDialog(); void setData(const QString _configFile, const QString _softwareVersion, const int _page, const bool _firstTime=true); void setClubLogActive(const bool _b); void checkIfNewBandOrMode(); public slots: signals: void exitSignal(const int status); // 1 = OK, -1 = NOK, 2 = Cancel clicked void queryError(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); // To alert about any failed query execution //void newLogRequested(const bool _s); // true show new log private slots: void changePage(QListWidgetItem *current, QListWidgetItem *previous); void slotReadConfigData(); void slotOkButtonClicked(); void slotCancelButtonClicked(); void slotAnalyzeNewLogData(const QStringList _qs); // We receive the station callsign and operators from the logs tab void slotSetStationCallSign(const QString _p); // We receive te station callsign from the userData tab to fill the new log void slotSetOperators(const QString _p); // We receive te station operators from the userData tab to fill the new log void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, int errorCodeN, QString failedQuery); private: void setConfigFile(const QString _configFile); void setSoftVersion(const QString _softwareVersion); void setConfigured(const bool _configured); void setPage(const int _page); void connectActions(); void createIcons(); bool processConfigLine(const QString _line); void setDefaults(); void readActiveBands (const QString actives); void readActiveModes (const QString actives); bool isValidBand (const QString b); bool isValidMode (const QString b); QString checkAndFixASCIIinADIF(const QString _data); bool haveAtleastOneLog(); bool firstTime; // To know if we are calling it from the Start wizard or not bool nolog; // If there is no log being managed QString dxClusterServerToUse; QStringList dxClusterServers; QTabWidget *tabWidget; int logsPageTabN; QListWidget *contentsWidget; QStackedWidget *pagesWidget; SetupPageUserDataPage *userDataPage; SetupPageBandMode *bandModePage; SetupPageDxCluster *dxClusterPage; SetupPageMisc *miscPage; SetupPageColors *colorsPage; SetupPageLogs *logsPage; SetupPageWorldEditor *worldEditorPage; SetupPageClubLog *clubLogPage; SetupPageUDP *UDPPage; SetupPageSats *satsPage; SetupPageHamLib *hamlibPage; int pageRequested; // The page on the Dialog that is requested to be shown when you call it //QString klogDir; QString configFileName, version; QStringList bands, modes; Locator *locator; DataProxy *dataProxy; Utilities *util; int constrid; // Just an id for the constructor to check who is being executed at one specific time }; #endif // SETUPDIALOG_H klog-0.9.8.1/elogclublog.cpp0000644000175000017500000003664413532572307014631 0ustar develdevel#include "elogclublog.h" #include #include #include #include //#include eLogClubLog::eLogClubLog() : QObject(nullptr) { //qDebug() << "eLogClubLog::eLogClubLog" << endl; call= QString(); email = QString(); pass = QString(); api = "9467beee93377e82a276b0a777d388b5c933d044"; currentQSO = -1; useQSOStationCallsign = false; stationCallsign = QString(); //qDebug() << "eLogClubLog::eLogClubLog - END" << endl; } eLogClubLog::~eLogClubLog() { //qDebug() << "eLogClubLog::~eLogClubLog" << endl; } void eLogClubLog::slotQsoUploadFinished(QNetworkReply *data) { //qDebug() << "eLogClubLog::slotQsoUploadFinished" << endl; result = data->error(); //qDebug() << "eLogClubLog::slotQsoUploadFinished - Result = " << QString::number(result) << endl; const QByteArray sdata = data->readAll(); QString text = QString(); if (currentQSO>0) { emit actionReturnDownload(result, currentQSO); currentQSO = -1; } if (result == QNetworkReply::NoError) { text = "ClubLog: " + prepareToTranslate(sdata); //qDebug() << sdata; } else if (result == QNetworkReply::HostNotFoundError) { //qDebug() << "eLogClubLog::slotQsoUploadFinished - Result = Host Not found! = " << QString::number(result) << endl; text = "ClubLog: " + tr("Host not found!"); //TODO: Mark the previous QSO as not sent to clublog } else if (result == QNetworkReply::TimeoutError) { //qDebug() << "eLogClubLog::slotQsoUploadFinished - Result = Time out error! = " << QString::number(result) << endl; text = "ClubLog: " + tr("Timeout error!"); //TODO: Mark the previous QSO as not sent to clublog } else if (result == 202) { //qDebug() << "eLogClubLog::slotQsoUploadFinished - Result = Password Error! = " << QString::number(result) << endl; text = "ClubLog: " + tr("It seems to be a PASSWORD ERROR; check your password."); int ret = QMessageBox::warning(0, tr("KLog - ClubLog"), tr("It seems that your ClubLog password is not correct.") + "\n" + tr("Please check your password in the setup. ClubLog uploads will be disabled."), QMessageBox::Ok); emit disableClubLogAction(true); //TODO: Mark the previous QSO as not sent to clublog } else { //qDebug() << "eLogClubLog::slotQsoUploadFinished - Result = UNDEFINED = " << QString::number(result) << endl; text = "ClubLog: " + tr("Undefined error..."); //TODO: Mark the previous QSO as not sent to clublog } //qDebug() << "eLogClubLog::slotQsoUploadFinished - Result = " << QString::number(result) << endl; //emit done(); emit showMessage(text); } void eLogClubLog::slotFileUploadFinished(QNetworkReply *data) { //qDebug() << "eLogClubLog::slotFileUploadFinished" << endl; result = data->error(); //qDebug() << "eLogClubLog::slotFileUploadFinished - Result = " << QString::number(result) << endl; const QByteArray sdata = data->readAll(); QString text = QString(); if (result == QNetworkReply::NoError) { text = "ClubLog: " + prepareToTranslate(sdata); //qDebug() << "eLogClubLog::slotFileUploadFinished - Result = NoError = " << QString::number(result) << endl; //qDebug() << sdata; } else if (result == QNetworkReply::HostNotFoundError) { //qDebug() << "eLogClubLog::slotFileUploadFinished - Result = Host Not found! = " << QString::number(result) << endl; text = "ClubLog: " + tr("Host not found!"); } else if (result == QNetworkReply::TimeoutError) { //qDebug() << "eLogClubLog::slotFileUploadFinished - Result = Time out error! = " << QString::number(result) << endl; text = "ClubLog: " + tr("Timeout error!"); } else { //qDebug() << "eLogClubLog::slotFileUploadFinished - Result = UNDEFINED = " << QString::number(result) << endl; text = "ClubLog: " + tr("Undefined error..."); } //qDebug() << "eLogClubLog::slotFileUploadFinished - Result = " << QString::number(result) << endl; //emit done(); emit showMessage(text); } void eLogClubLog::downloadProgress(qint64 received, qint64 total) { //qDebug() << "eLogClubLog::downloadProgress: " << QString::number(received) << "/" << QString::number(total) << endl; //qDebug() << received << total; emit actionShowProgres(received, total); } void eLogClubLog::slotErrorManagement(QNetworkReply::NetworkError networkError) { //qDebug() << "eLogClubLog::slotErrorManagement: " << QString::number(networkError) << endl; result = networkError; if (result == QNetworkReply::NoError) { } else if (result == QNetworkReply::HostNotFoundError) { //qDebug() << "eLogClubLog::slotErrorManagement: Host not found" << endl; } else { //qDebug() << "eLogClubLog::slotErrorManagement: ERROR!" << endl; } //actionError(result); } int eLogClubLog::sendQSO(QStringList _qso) { //qDebug() << "eLogClubLog::sendQSO: " << call <<"/"<< email << "/" << pass << "/" << api << endl; //qDebug() << "eLogClubLog::sendQSO:: length = " << QString::number(_qso.length()) << endl; // First Data in the QStringList is the QSO id, not to be sent to clublog but used in the signal actionReturnDownload(const int _i, const int _qsoId); if (_qso.length()!=18) { return -1; } currentQSO = (_qso.at(0)).toInt(); _qso.removeFirst(); stationCallsign = QString(); if (useQSOStationCallsign) { stationCallsign = _qso.last(); } //qDebug() << "eLogClubLog::sendQSO (stationCallsign = " << _qso.last() << ")" << endl; _qso.removeLast(); QString qso = getClubLogAdif(_qso); //qDebug() << "eLogClubLog::sendQSO: " << qso << endl; return sendData(qso); } int eLogClubLog::sendData(const QString _q) { //qDebug() << "eLogClubLog::sendData: " << _q << endl; //Posiblemente tenga que usar una de estas: void QUrlQuery::addQueryItem(const QString & key, const QString & value) QUrl serviceUrl = QUrl("https://secure.clublog.org/realtime.php"); QByteArray postData; //QByteArray postData; /* QUrl params; params.addQueryItem("email",email); params.addQueryItem("password",pass); if ((useQSOStationCallsign) && (stationCallsign.length()>2)) { params.addQueryItem("callsign",stationCallsign); //qDebug() << "eLogClubLog::sendData - callsign 1: " << stationCallsign << endl; } else { params.addQueryItem("callsign",call); //qDebug() << "eLogClubLog::sendData - callsign 2: " << call << endl; } params.addQueryItem("api",api); params.addQueryItem("adif",_q); postData = params.encodedQuery(); */ QUrlQuery params; params.addQueryItem("email",email); params.addQueryItem("password",pass); if ((useQSOStationCallsign) && (stationCallsign.length()>2)) { params.addQueryItem("callsign",stationCallsign); //qDebug() << "eLogClubLog::sendData - callsign 1: " << stationCallsign << endl; } else { params.addQueryItem("callsign",call); //qDebug() << "eLogClubLog::sendData - callsign 2: " << call << endl; } params.addQueryItem("api",api); params.addQueryItem("adif",_q); postData = params.query(QUrl::FullyEncoded).toUtf8(); //postData = params.encodedQuery(); // Call the webservice QNetworkAccessManager *networkManager = new QNetworkAccessManager(this); QNetworkRequest request(serviceUrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotQsoUploadFinished(QNetworkReply*))); networkManager->post(request, postData); return -1; } QString eLogClubLog::getClubLogAdif(const QStringList _q) { //qDebug() << "eLogClubLog::getClubLogAdif: " << QString::number(_q.length()) << endl; // _qso must include 16 ordered fields than can be empty or contain data. This function builds the ADIF QSO /* http://clublog.freshdesk.com/support/solutions/articles/53202-which-adif-fields-does-club-log-use- ClubLog only accepts the following ADIF fields: •QSO_DATE •TIME_ON •QSLRDATE •QSLSDATE •CALL •OPERATOR •MODE •BAND •BAND_RX •FREQ •QSL_RCVD •LOTW_QSL_RCVD •QSL_SENT •DXCC •PROP_MODE •CREDIT_GRANTED */ if (_q.length()!=16) { return QString(); } QString qso, aux1; qso.clear(); aux1 = _q.at(0); if ((aux1.length()) == 10){ aux1.remove(QChar('-'), Qt::CaseInsensitive); aux1.remove(QChar('/'), Qt::CaseInsensitive); qso = "" + aux1 + " "; } //qso = "" + _q.at(0) + " "; qso = qso + "" + _q.at(1) + " "; //qDebug() << "eLogClubLog::getClubLogAdif: 10" << endl; qso = qso + "" + _q.at(2) + " "; //qDebug() << "eLogClubLog::getClubLogAdif: 20" << endl; qso = qso + "" + _q.at(3) + " "; //qDebug() << "eLogClubLog::getClubLogAdif: 30" << endl; qso = qso + "" + _q.at(4) + " "; //qDebug() << "eLogClubLog::getClubLogAdif: 40" << endl; qso = qso + "" + _q.at(5) + " "; //qDebug() << "eLogClubLog::getClubLogAdif: 50" << endl; qso = qso + "" + _q.at(6) + " "; //qDebug() << "eLogClubLog::getClubLogAdif: 60" << endl; qso = qso + "" + _q.at(7) + " "; //qDebug() << "eLogClubLog::getClubLogAdif: 70" << endl; if ((_q.at(8)).length()> 2) { qso = qso + "" + _q.at(8) + " "; } if ((_q.at(9)).length()> 2) { qso = qso + "" + _q.at(9) + " "; } //qDebug() << "eLogClubLog::getClubLogAdif: 90" << endl; qso = qso + "" + _q.at(10) + " "; //qDebug() << "eLogClubLog::getClubLogAdif: 100" << endl; qso = qso + "" + _q.at(11) + " "; //qDebug() << "eLogClubLog::getClubLogAdif: 110" << endl; qso = qso + "" + _q.at(12) + " "; //qDebug() << "eLogClubLog::getClubLogAdif: 120" << endl; if ((_q.at(13)).toInt()> 0) { qso = qso + "" + _q.at(13) + " "; } //qDebug() << "eLogClubLog::getClubLogAdif: 130'" << endl; qso = qso + "" + _q.at(14) + " "; //qDebug() << "eLogClubLog::getClubLogAdif: 140" << endl; qso = qso + "" + _q.at(15) + " "; //qDebug() << "eLogClubLog::getClubLogAdif: 150" << endl; qso = qso + ""; // //qDebug() << "eLogClubLog:: - QSO: " << qso << endl; //qDebug() << "eLogClubLog::getClubLogAdif: 100" << endl; return qso; } void eLogClubLog::setCredentials(const QString _call, const QString _email, const QString _pass, const bool _useQSOStationCall) { //qDebug() << "eLogClubLog::setCredentials" << endl; call = _call; email = _email; pass = _pass; useQSOStationCallsign = _useQSOStationCall; } int eLogClubLog::deleteQSO(QStringList _qso) { //qDebug() << "eLogClubLog::deleteQSO: length = " << QString::number(_qso.length()) << endl; if (_qso.length()!=17) { return -1; } _qso.removeFirst(); //http://clublog.freshdesk.com/support/solutions/articles/54908-using-adif-to-update-or-delete-qsos //VP9NO2007090321330030MCWGH6UW QString replaceCall = "" + call + " " + ""; QString qso = getClubLogAdif(_qso); qso.replace("", replaceCall); //qDebug() << "eLogClubLog::deleteQSO: ready to send = " << qso << endl; return sendData(qso); } QString eLogClubLog::prepareToTranslate(const QString _m) { //qDebug() << "eLogClubLog:: = prepareToTranslate" << _m << endl; if (_m == "Callsign missing") { return tr("Callsign missing"); } else if (_m == "Invalid callsign") { return tr("Invalid callsign"); } else if (_m == "Skipping SWL callsign") { return tr("Skipping SWL callsign"); } else if (_m == "Callsign is your own call") { return tr("Callsign is your own call"); } else if (_m == "Invalid callsign with no DXCC mapping") { return tr("Invalid callsign with no DXCC mapping"); } else if (_m == "Updated QSO") { return tr("Updated QSO"); } else if (_m == "Invalid ADIF record") { return tr("Invalid ADIF record"); } else if (_m == "Missing ADIF record") { return tr("Missing ADIF record"); } else if (_m == "Test mode - parameters ok, no action taken") { return tr("Test mode - parameters ok, no action taken"); } else if (_m == "Excessive API Usage") { return tr("Excessive API Usage"); } else if (_m == "Internal Error") { return tr("Internal Error"); } else if (_m == "Rejected") { return tr("Rejected"); } else if (_m == "QSO Duplicate") { return tr("QSO Duplicate"); } else if (_m == "QSO Modified") { return tr("QSO Modified"); } else if (_m == "Missing Login") { return tr("Missing Login"); } else if (_m == "QSO OK") { return tr("QSO OK"); } else if (_m == "Upload denied") { return tr("Upload denied"); } else if (_m == "No callsign selected") { return tr("No callsign selected"); } else if (_m == "No match found") { return tr("No match found"); } else if (_m == "Dropped QSO") { return tr("Dropped QSO"); } else if (_m == "OK") { return tr("OK"); } else if (_m == "Login rejected") { return tr("Login rejected"); } else if (_m == "Upload denied") { return tr("Upload denied"); } else if (_m == "Rejected: Callsign is your own call") { return tr("Rejected: Callsign is your own call"); } else { return _m; } } int eLogClubLog::modifyQSO (QStringList _oldQSO, QStringList _newQSO) { int x = -1; x = deleteQSO(_oldQSO); x = sendQSO(_newQSO); return x; } klog-0.9.8.1/softwareupdate.h0000644000175000017500000000647013532572307015027 0ustar develdevel#ifndef SOFTWAREUPDATE_H #define SOFTWAREUPDATE_H /*************************************************************************** softwareupdate.h - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include //#include //#include //#include #include //#include #include "utilities.h" #include "softwareupdatedialog.h" class QSslError; class SoftwareUpdate: public QObject { Q_OBJECT public: SoftwareUpdate(const QString _klogVersion); ~SoftwareUpdate(); void addCall(const QString _call); void needToUpdate(bool _showWithoutVersion=false); void setVersion(const QString _klogVersion); private slots: void slotReadyRead(); void slotError(int _p); //void slotSslErrors(QList _p); //void replyFinished(QNetworkReply *data); void slotDownloadFinished(QNetworkReply *reply); signals: void updateNeededSignal(const bool _q); // Will be TRUE if updated if needed and FALSE if we already have the latest version private: void connectToURL(const QString _url); bool checkUpdates(QIODevice *data); void updateNeeded(QString _newVer); void setTheURL(QString _url); void setHeader(); Utilities *util; QString klogVersion, latestVersion, callsign; QString urld; QUrl *url; //QNetworkAccessManager *manager; QNetworkRequest request; SoftwareUpdateDialog *updateDialog; //int result; //bool toUpdate; bool repositoryFound; // True when the versions have been checked to prevent multiple qmessagebox due to redirections bool messageShown; }; #endif // SOFTWAREUPDATE_H klog-0.9.8.1/.qmake.stash0000644000175000017500000000132513532577077014044 0ustar develdevelQMAKE_CXX.INCDIRS = \ /usr/include/c++/8 \ /usr/include/i386-linux-gnu/c++/8 \ /usr/include/c++/8/backward \ /usr/lib/gcc/i686-linux-gnu/8/include \ /usr/local/include \ /usr/lib/gcc/i686-linux-gnu/8/include-fixed \ /usr/include/i386-linux-gnu \ /usr/include QMAKE_CXX.LIBDIRS = \ /usr/lib/gcc/i686-linux-gnu/8 \ /usr/lib/i386-linux-gnu \ /usr/lib \ /lib/i386-linux-gnu \ /lib QMAKE_CXX.QT_COMPILER_STDCXX = 201402L QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 8 QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 3 QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 0 QMAKE_CXX.COMPILER_MACROS = \ QT_COMPILER_STDCXX \ QMAKE_GCC_MAJOR_VERSION \ QMAKE_GCC_MINOR_VERSION \ QMAKE_GCC_PATCH_VERSION klog-0.9.8.1/locator.h0000644000175000017500000000636013532572307013433 0ustar develdevel/*************************************************************************** locator.h - description ------------------- begin : vie feb 7 2003 copyright : (C) 2003 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #ifndef LOCATOR_H #define LOCATOR_H #include #include const double PI = 3.141592654; //http://en.wikipedia.org/wiki/Pi const bool LATITUDE = false; const bool LONGITUDE = true; const double EARTH_RADIUS = 6371; //http://en.wikipedia.org/wiki/Earth_radius const bool RADIAN = 180.0/PI; const double DEG_TO_RAD = PI/180.0; const double KM_IN_A_MILE = 1.609344; class Locator{ public: Locator(); ~Locator(); bool isValidLocator(const QString& tlocator); double getLat(const QString& tlocator); double getLon(const QString& tlocator); QString getLocator(const double lon1, const double lat1) const; int getBeam(const double lon1, const double lat1, const double lon2, const double lat2); int getBeamBetweenLocators (const QString& tlocator1, const QString& tlocator2); int getDistance(const double lon1, const double lat1, const double lon2, const double lat2, const bool _imperialSystem); int getDistanceBetweenLocators (const QString& tlocator1, const QString& tlocator2, const bool _imperialSystem); //int getDistanceMilles(const double lon1, const double lat1, const double lon2, const double lat2); void degTodms(const double deg); double dmsTodeg (int deg, int min, int sec); bool checkCoords(const double lon1, const double lat1); private: //bool valid; QString myLocator; QString testLocator; QString otherLocator; QChar theChar; //double my_lon, my_lat, other_lon, other_lat, beam, testNumb; int ideg, imin, isec; }; #endif klog-0.9.8.1/logmodel.cpp0000644000175000017500000000670113532572307014124 0ustar develdevel#include "logmodel.h" LogModel::LogModel(DataProxy *dp, QObject *parent):QSqlRelationalTableModel(parent) { //qDebug() << "LogModel::LogModel " << endl; //logModel = new QSqlRelationalTableModel(this); dataProxy = dp; setTable("log"); setEditStrategy(QSqlTableModel::OnFieldChange); //qDebug() << "LogModel::LogModel - END" << endl; } void LogModel::createlogModel(const int _i) { /* Log_Id = 0, Log_Name = 1, Log_BandId = 2, Log_ModeId = 3, Log_DateId = 4, Log_TimeId = 5 setRelation ( int column, const QSqlRelation & relation ) model->setTable("employee"); model->setRelation(2, QSqlRelation("city", "id", "name")); The setRelation() call specifies that column 2 in table employee is a foreign key that maps with field id of table city, and that the view should present the city's name field to the user. */ /* This should be coherent with the logview */ //qDebug() << "LogModel::createlogModel: log: " << QString::number(_i) << endl; QString contestMode = dataProxy->getLogTypeOfUserLog(_i); //qDebug() << "LogModel::createlogModel - contestMode: " << contestMode << endl; QString stringQuery = QString("lognumber='%1'").arg(_i); QSqlQuery query(stringQuery); setFilter(stringQuery); //if (contestMode.compare("DX")) if (contestMode == "DX") { //qDebug() << "LogModel::createlogModel: found type DX" << endl; setColumnsToDX(); } else if (contestMode == "CQ-WW-SSB") { //qDebug() << "LogModel::createlogModel: found type CQ-WW-SSB" << endl; } else { // THIS POINT SHOULD NOT BE REACHED. It means that there is a kind of contest not supported. // Maybe the way should be to move ALL the actions from DX here. //qDebug() << "LogModel::createlogModel: log type NOT found" << endl; } select(); } void LogModel::setColumnsToDX() { //qDebug() << "LogModel::setColumnsToDX" << endl; QSqlQuery q; QString stringQuery = QString("SELECT * from log LIMIT 1"); QSqlRecord rec; // = q.record(); int nameCol; bool sqlOK = q.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, q.lastError().databaseText(), q.lastError().number(), q.lastQuery()); } q.next(); rec = q.record(); // Number of columns //qDebug() << "LogModel::createlogModel - columns: " << QString::number(rec.count()) << endl; nameCol = rec.indexOf("bandid"); setRelation(nameCol, QSqlRelation("band", "id", "name")); nameCol = rec.indexOf("modeid"); setRelation(nameCol, QSqlRelation("mode", "id", "submode")); nameCol = rec.indexOf("id"); setSort(nameCol, Qt::AscendingOrder); nameCol = rec.indexOf("qso_date"); setHeaderData(nameCol, Qt::Horizontal, tr("Date")); nameCol = rec.indexOf("time_on"); setHeaderData(nameCol, Qt::Horizontal, tr("Time")); nameCol = rec.indexOf("call"); setHeaderData(nameCol, Qt::Horizontal,tr("QRZ")); nameCol = rec.indexOf("bandid"); setHeaderData(nameCol, Qt::Horizontal, tr("Band")); nameCol = rec.indexOf("modeid"); setHeaderData(nameCol, Qt::Horizontal, tr("Mode")); nameCol = rec.indexOf("rst_sent"); setHeaderData(nameCol, Qt::Horizontal, tr("RSTtx")); nameCol = rec.indexOf("rst_rcvd"); setHeaderData(nameCol, Qt::Horizontal, tr("RSTrx")); nameCol = rec.indexOf("comment"); setHeaderData(nameCol, Qt::Horizontal, tr("Comment")); } klog-0.9.8.1/setuppageudp.cpp0000644000175000017500000002114513532572307015027 0ustar develdevel#include "setuppageudp.h" SetupPageUDP::SetupPageUDP(QWidget *parent) : QWidget(parent) { logFromWSJTXCheckbox = new QCheckBox(this); realDataFromWSJTXCheckbox = new QCheckBox(this); logAutomaticallyWSJTXCheckbox = new QCheckBox(this); UDPServerCheckBox = new QCheckBox(tr("Start UDP Server"), this); UDPServerPortSpinBox = new QSpinBox; miliSecsSpinBox = new QSpinBox; //wsjtxIPAddress = new QLineEdit(this); //wsjtxPortNumber = new QLineEdit(this); //logFromWSJTx = false; //autoLogFromWSJTx = false; //realDataFromWSJTx = false; defaultport = 2237; // Default WSJTX port defaultTimer = 2000; // 2 secs createUI(); createActions(); } SetupPageUDP::~SetupPageUDP(){ //qDebug() << "SetupPageUDP::~SetupPageUDP" << endl; } void SetupPageUDP::createUI() { QString msgAuto = QString(tr("Log automatically QSOs from WSJT-X")); logFromWSJTXCheckbox->setText(tr("Allow WSJT-X to send logged QSO to KLog")); logFromWSJTXCheckbox->setToolTip(tr("QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless \"%1\" is selected").arg(msgAuto)); logAutomaticallyWSJTXCheckbox->setText(msgAuto); logAutomaticallyWSJTXCheckbox->setToolTip(tr("KLog will log automatically any QSO coming from WSJT-X without any manual confirmation.")); realDataFromWSJTXCheckbox->setText(tr("Receive and Update QSO data to KLog")); realDataFromWSJTXCheckbox->setToolTip(tr("KLog will automatically show and update data coming from WSJT-X (DX callsign, locator, RPT, ...)")); UDPServerCheckBox->setChecked(false); logFromWSJTXCheckbox->setChecked(false); logAutomaticallyWSJTXCheckbox->setChecked(false); realDataFromWSJTXCheckbox->setChecked(false); logFromWSJTXCheckbox->setEnabled(false); logAutomaticallyWSJTXCheckbox->setEnabled(false); realDataFromWSJTXCheckbox->setEnabled(false); QVBoxLayout *checkLayout = new QVBoxLayout; checkLayout->addWidget(logFromWSJTXCheckbox); checkLayout->addWidget(logAutomaticallyWSJTXCheckbox); checkLayout->addWidget(realDataFromWSJTXCheckbox); QString labelTip = tr("UDP port number where the UDP Server will listen for packets.") + "\n" + tr("Make sure it is the same port where the other programs are sending the data to. Default port is 2237."); UDPServerCheckBox->setToolTip(tr("UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs.")); UDPServerPortSpinBox->setToolTip(labelTip); UDPServerPortSpinBox->setMinimum(0); UDPServerPortSpinBox->setMaximum(65535); UDPServerPortSpinBox->setValue(defaultport); QLabel *udpPortLabel = new QLabel(tr("UDP Port")); udpPortLabel->setBuddy(UDPServerPortSpinBox); udpPortLabel->setToolTip(labelTip); udpPortLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); udpPortLabel->setEnabled(true); QHBoxLayout *UDPLayout1 = new QHBoxLayout; UDPLayout1->addWidget(udpPortLabel); UDPLayout1->addWidget(UDPServerPortSpinBox); miliSecsSpinBox->setMinimum(0); miliSecsSpinBox->setMaximum(30000); miliSecsSpinBox->setValue(defaultTimer); QLabel *miliSecsSpinBoxLabel = new QLabel(tr("QSO notification timeout (milisecs)")); miliSecsSpinBox->setToolTip(tr("Milliseconds that the notification of QSO received from WSJTX will be shown.")); miliSecsSpinBoxLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); miliSecsSpinBoxLabel->setEnabled(true); miliSecsSpinBox->setEnabled(false); QHBoxLayout *UDPLayout = new QHBoxLayout; UDPLayout->addWidget(UDPServerCheckBox); UDPLayout->addLayout(UDPLayout1); UDPLayout->addWidget(miliSecsSpinBoxLabel); UDPLayout->addWidget(miliSecsSpinBox); //QLabel *IPAddressLabel = new QLabel(tr("WSJT-x IP address")); //QLabel *portLabel = new QLabel(tr("UDP port to listen")); //IPAddressLabel->setBuddy(wsjtxIPAddress); //portLabel->setBuddy(wsjtxPortNumber); //QHBoxLayout *IPALayout = new QHBoxLayout; //IPALayout->addWidget(wsjtxIPAddress); //IPALayout->addWidget(IPAddressLabel); //QHBoxLayout *portLayout = new QHBoxLayout; //portLayout->addWidget(wsjtxPortNumber); //portLayout->addWidget(portLabel); QVBoxLayout *layout = new QVBoxLayout; layout->addLayout(UDPLayout); layout->addLayout(checkLayout); setLayout(layout); } void SetupPageUDP::createActions() { connect(logFromWSJTXCheckbox, SIGNAL(clicked () ), this, SLOT(slotLogFromWSJTCheckBoxClicked() ) ); //connect(logAutomaticallyWSJTXCheckbox, SIGNAL(clicked () ), this, SLOT(slotAutoLogFromWSJTCheckBoxClicked() ) ); //connect(realDataFromWSJTXCheckbox, SIGNAL(clicked () ), this, SLOT(slotRealFromWSJTCheckBoxClicked() ) ); connect(UDPServerCheckBox, SIGNAL(clicked () ), this, SLOT(slotUDPServerCheckBoxClicked() ) ); } void SetupPageUDP::slotUDPServerCheckBoxClicked() { //qDebug() << "SetupPageUDP::slotUDPServerCheckBoxClicked" << endl; if (UDPServerCheckBox->isChecked()) { logFromWSJTXCheckbox->setEnabled(true); logFromWSJTXCheckbox->setChecked(true); logAutomaticallyWSJTXCheckbox->setEnabled(true); realDataFromWSJTXCheckbox->setEnabled(true); miliSecsSpinBox->setEnabled(true); } else { logFromWSJTXCheckbox->setChecked(false); logAutomaticallyWSJTXCheckbox->setChecked(false); realDataFromWSJTXCheckbox->setChecked(false); logFromWSJTXCheckbox->setEnabled(false); logAutomaticallyWSJTXCheckbox->setEnabled(false); realDataFromWSJTXCheckbox->setEnabled(false); miliSecsSpinBox->setEnabled(false); } } void SetupPageUDP::slotLogFromWSJTCheckBoxClicked() { //qDebug() << "SetupPageUDP::slotLogFromWSJTCheckBoxClicked" << endl; if (logFromWSJTXCheckbox->isChecked()) { logAutomaticallyWSJTXCheckbox->setEnabled(true); } else { logAutomaticallyWSJTXCheckbox->setEnabled(false); logAutomaticallyWSJTXCheckbox->setChecked(false); } } QString SetupPageUDP::getUDPServer() { if (UDPServerCheckBox->isChecked()) { return "True"; } else { return "False"; } } void SetupPageUDP::setUDPServer(const QString t) { //qDebug() << "SetupPageUDP::setUDPServer: " << t << endl; if ( (t.toUpper()) == "FALSE") { UDPServerCheckBox->setChecked(false); } else { UDPServerCheckBox->setChecked(true); } slotUDPServerCheckBoxClicked(); } void SetupPageUDP::setUDPServerPort(const QString t) { if ( (t.toInt()>=0) && (t.toInt()<=65535)) { UDPServerPortSpinBox->setValue(t.toInt()); } else { UDPServerPortSpinBox->setValue(defaultport); } } QString SetupPageUDP::getUDPServerPort() { int t = UDPServerPortSpinBox->value(); if ( (t>=0) && (t<=65535) ) { return QString::number(t); } else { return QString::number(defaultport); } } void SetupPageUDP::setTimeout(const QString t) { if ( (t.toInt()>=0) && (t.toInt()<=30000)) { miliSecsSpinBox->setValue(t.toInt()); } else { miliSecsSpinBox->setValue(defaultTimer); } } QString SetupPageUDP::getTimeout() { int t = miliSecsSpinBox->value(); if ( (t>=0) && (t<=30000) ) { return QString::number(t); } else { return QString::number(defaultTimer); } } QString SetupPageUDP::getLogFromWSJTx() { if (logFromWSJTXCheckbox->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageUDP::getAutoLogFromWSJTx() { if (logAutomaticallyWSJTXCheckbox->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageUDP::getReaDataFromWSJTx() { if (realDataFromWSJTXCheckbox->isChecked()) { return "True"; } else { return "False"; } } void SetupPageUDP::setLogFromWSJTx(const QString t) { if (t.toUpper() == "TRUE") { logFromWSJTXCheckbox->setChecked(true); } else { logFromWSJTXCheckbox->setChecked(false); } slotLogFromWSJTCheckBoxClicked(); } void SetupPageUDP::setAutoLogFromWSJTx(const QString t) { if (t.toUpper() == "TRUE") { logAutomaticallyWSJTXCheckbox->setChecked(true); } else { logAutomaticallyWSJTXCheckbox->setChecked(false); } } void SetupPageUDP::setReaDataFromWSJTx(const QString t) { if (t.toUpper() == "TRUE") { realDataFromWSJTXCheckbox->setChecked(true); } else { realDataFromWSJTXCheckbox->setChecked(false); } } klog-0.9.8.1/aboutdialog.h0000644000175000017500000000411413532572307014255 0ustar develdevel#ifndef ABOUTDIALOG_H #define ABOUTDIALOG_H /*************************************************************************** aboutdialog.h - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ class QEvent; #include #include class AboutDialog : public QDialog { Q_OBJECT public: explicit AboutDialog(const QString tversion, QWidget *parent = 0); ~AboutDialog(); bool event(QEvent *event); private: QTabWidget *tabw; QWidget *tab1, *tab2, *tab3, *tab4; }; #endif // ABOUTDIALOG_H klog-0.9.8.1/klog.ico0000644000175000017500000063355213532572307013260 0ustar develdevel ݢ& gPNG  IHDRx IDATxw|[ϹWxŎAv&IB ZVi@I-RJo[:e]e8@ aF;qbdIG؎mI~;tdK<<B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B;!H2G *>`7o& !ڂBt.yp ddff7--|Ǔ#%%zx<zzu]hp8ZD"B BD?T0T`ЊD"p8Be`$ UVVD" L lK.K!p/7`i999233{g呛KnnSSS Ät8&H8L$ю(qGG׀([}-K[m梨R++UEE]^^n~KYYǎ| 6+k@48طo}ӷO>v~~ݻ&`0HWPH}$u] nlߌۛ^m_WE)eY(e2#8nYYvyy⋊B̈q)H D ə2tc <4x߯TVV`0H*TW5Wmءv7fR ˶eێu=k{$???~ĉ'袵*))L^әTF)RH$ݻSTDQQ{H- ڔ˪f,f:9ZlT3] DRʦ̝; Z={TEEE߯Q ٶmw(WDo;hAHlFh32L|q>Srpf@%*FΞ= .{֞/v͛ٺe ;v2W+ @7ۀ m̼a…O
U\\\stN!]vef6l={Ftn] ǯUB4$謾7dȐ,X7i$k]j_II6ة~׶m ٸa6l`ӦM888 U.TsL R|[%!/iz?;n;UEyy:lcka:"֯_u(-/KDr3P SzX@tyuǏOWۭ`0RѫWJ)lf]ukRȰhS@`S86ItaeYVwu &O|gEw[PTWucwڵkٰ~=aוN_h Pzzql$I'%% ƏE,=EEV8nP]~߰~=ׯ'8鋸N TbfWE? $f×viʶ,hn~XP]g|WTVUI/FL@ "p)PVN,۫W_vi)YYޝ;wڑ-b_EE/`4I$:19D77##7't;oT'f~"az6l@u%{_$*e-G"I 3fLAK@t :ԩ,/OB L^B*0EǹI"yV|>}UV#7BHVǹ="AI b>{;p8 =Pwu]~?ĵBt6rU!h/NMMfzz ]g DE(D;I  1$m?^Rq|0/v!Dpo#---QH" 8; @V n!B, Y1 ( ġP# 2)M*HP`i$Dhš8  tB$> y NsDȞ*N^ PZ"XMӀ 87It09i bC2$DR̨]8<$'nRTU"ɹP*5xGt DK LTi/ލBA1KE'&h-``4 !^t@ PL*$ю$0kr,ȕdħ͕p|tM*fXs ɃYud)9$e`/p$oDq 1/˲8y] 81w5D0|uGla6gB@ Q`}8mɊ: REtIV1IXQ&[NPa` :y(` !f_.ZiW+P]G?߶0dKSa=N|?P9aG?-Y{r$ ¼""՛FDGT4`HBӎ`]HЩH4f>h#ю>k;-Z=\ yo>$d6_cNȝ]O`&(ȋ~=, 0?Kߛ̈A r^kK1#AN$4"sݘdMg^P} Wb:1W[0#.;d2n?08 S҇ "2#ȹPT.0؁)D#W-~$ه0}*-Lgx3T/V_X`(pf D;JZ I vcghޔ9ArKEjE vţH/W 1Q87G" $_} X7M Nt$ob:Ւq71.X=mMNMNmrjsXD׹腙{NuEѫftũy1WLmLĈ.,a(dߵY6@^Ջѫf>oNtp0=R RںS1p 07O]܇@eE~~P0 3/00E`G{^.w{DIu}I E2uG0Ѕ58SȨ*&I]=Mqnh! s-W1k$||Gc 0gn4y0T]x2^n(֕u|dOCq*p 0 &v1SLH @2x"cLFޢs 4 W!Z6fzL S۬-#' ){ӮERVX⺮ϲ.(X&';Lnj t~tsnuM"uIpK̅~Yɕap+*9-[,Ŝs1#L$0$E+0'/mU):ٷJ1[VNt]I3PS87db6O;,/}sRJ[R⦎_bhcorڡ]J` f߁ ˬHZ.Fpc BF:~]8G@?N15.?ĉ8neY|'en|@?@Ae43!ײڸ]RLgׁb׌$%H1S"HйhUVvD`:;ܬ3ЮΝK(TۯXŮ]x'HwjԿAkzmKӀ Kd,`f"bHй [9\9])?#lذat^e'5elSH$)Kp f ׌ܦS&`ssH!bBJ%Y`!B9R&u4Oށڣ)YYtB;n8L޽KJcg̘c;zR|`vf r`9&a- c)J=Ww(Ve%цCdG "L)2ՎYZ^$u?隔,zqC.ǨdvV */lf|[^aÇ8Xm[oaaVLZ%G)'5 tc-zhƽݦNb:ہ,IB"٬3!]_Ϙǘ1q{,׋ݖM +r<$Zվ?]urE=6ue$(Zj̲`tORDw \ Gѱd PunDǜ.s:,>7LߩSqЮSUժhSV1#EE{[Gz^u]nM/_ײ< ˲vndWAM]%pM5H;Fdj1ͤHF߿#$~8S?%яVTDU@k*ǫ+Ucǎ?o\oFF?O^;1\szR~ rC3{/LD; - M +:oOb s -McƝ1 QުJm}z mGl`{,E{NG+n=o>O)u+0KBC t_/vSwb$m*Eb:sܤt$f-9 /㩓V2nu}ÆwD,WwQ}{kx>ouKO-(_iP&){ r"Zנ'I\(% C4UCv͵!/!t_тο[,|q-]v/}ۡڲюv.Zȩ|W\'ŕh{a R[o :喕5VSJ2#UDF$',::W=}}:ݺusha?o6pZ7vӚ/И?Jetk_Ż=]$Lw5W1C] E : r3qюCJ^'zرH1e{LƃQ 'ėwS{ޓ'I&-fǎ?v &) a] IDAT+bn,].\/4(jS+bVtn @l{r\:Y7bǝ|{̼Wx|oKs$P 72땇wiɏًBr0K]/u]nYnL0z9wb!d8Zk(QJZRPUe;S4R;NEt&(6hCW0d⠊e2MۇG;:|@<^|1G\mⅦN)mnH'Ooi82 ÀW_%6mǦ-[}?eѯ_?Oȑ#ԡP( jxAAAwtවcnRTPLF31+ZBvaHv&@rvYfÇblf27wJ٘)[o(\/DJp liiiL0>}Z~uwc\b>̔MsUK FuNB p!Mԝ-aܙH/Y7deotc1A@>S瞋x+H[6^zͧFضoûMo1WK1妹T{)&Gˤ%͂܎]P(eYؾT*7zq(9 83|7` 0z:==\c^)[ 1hZ݇9Wށv Vʹn@rXL֭[3NSmsKR:O矅9?G :cp?cUW'$#;#;5Rއ.'6f신]H @)f+VbaH)ƍٹsWSw5fmtc7v]c=Noh -z9ޞ0z/-6`*u+3]hhRSEO?E֠mR+ff=$o[ UU=E*uqaFu&gM81˲f30 ,F~f7k{t֎:d0|p0SR@R+[9SO믾jk&r_2Yaͣ#D*u֙p}k `Ga:9+o躼Mߚ={֋;[q| .Pْy6rH+PO{gsnS܆Ht떦89=teY׏׭;T@43ubN ~ y̹~rFL+喨*ˇK e=aW*RAu,Ǐ~'jㆍU|̪цd@b,:_^}h,S, ۶,޽{s4ua*%{Ōu3礇dҥ))Iw_N}7ڱ[))vÂej _|a65y"RYIjn.'? }8 <g6m+ nxNkDVgރ rG~k[iף's  ġDgNc cM:-Ͷyqø['k4H ?f@45HJ,֭/NM=}tĨܹbKQX:%<7&iBq@2=^>GJV_=(v%z"MVs\RPr-Z;0^[PlDN" rk,ᮻnp`-P\ ލ*d q1|ЬsfwKKaEPPcYWXXXѲg_ A+fuΙCo4~u]\qǡotL½6% $H .ʲuy}z|>WwW\q;} (1lΩ9ţZrkeƛ,]o|\@u~weg4? c`DhcWӻ'y?XӧtV{Rh Ӧro0]klyYl_wHRRÇn䝫Ol˛ ʾ s.,ˢ_.5bY}FCʲMOĿS}1c}t `'eee1CEРJyN>mNSR<#btp{6  qrGblۮco /^_{) +W0W8{!fIKc8/!G.Nl٫Ks]LZ~3)qBo}>J?W\WصΊD(˦z',o.۶o'l{L&(&c/p/[^u~f„gc~;v /EmdN-_\r`/9m6mj.SR-H8@#g{܌Դn5WɓyWVZjO/U>SO;Ĭm'Yby%L8sՔ}5*%MHe%g3KRRZ.Hee(_P0`VM@c5q뫘x0nWMݕ,t5lH)`TXS)Slw[U_]e#ʟ,5ع߻_>qUGgܿR, KKkH~?_ I6e۬ӟsl}y*l!wx<_t.7>U{)߰4K DzuYdvXǛEp*7ll8̯y f.Twf3E8npPﺚg}R0nK/dgvvvAGܷti j\&}^ <.}C\rIi9]wy2(_\: #'dן:'q=\Ljt;{_/?Gu&xC$LRJKy'?JIAYֳNЪc0 9e*7߾WmdkQ@z~qȝ6kܹ,dF"[Hmq 0StBqq1o٬=O=:<ǚs'zk3g̚=fϞ5YO8aVٳ疽ګɳqE\;v\ 'PJ YcSR| voUaa"|7n$Ix}q]pYi8S뺄B!/^̂ oذa:Yy0nA}0If? (]o٠׎/7×\EstE\e+Byx|ܺyu]}~A'eYhWSC@6 '-wF0qc"~>"t^>p~~~VUUյ˖xׁYrZ닁 MHn/(XLx zժU}?x/ԭPs׎ڪWoL;-XgЮM=znu]ƍdz>cq[rИ\ԟ]: QˢlZ8|<qaŸѣ&ébÏWRr`3x c<3U8hmъ;[u ۳=V/߯޼y׍z~_pܛnJeddԜTVV]vLNx?d#Sr=^Ůtrrr@ iS&=(gpO8LPUBM޻o+T߷x-[ȝ4ɬ[?V@)ϟGBLH2Z?ٵjt5s7p]3m_i)۶ծ$К)G+*˾ny˳%f+@;oSw ;ܲgz0q{^)u?_ 49e YfSTGckx)O%Hб~cAO\xj48-bۀ'H5a7>X)^&-Y;$Gnʫlzf+ۦb&GMx蝫RH;5sc(߸-[ZWާۀcdo\;Ue)0` ʶlb۶>d~~;Ch`Tss sw,9sbg0hp~ |ueЭt5tSrՒ+{%ntε)ZkΝ˙gsہ:mf@ >y1KּsՒ3S#kppٍDHeS>z?VO ("XT >_.dmT@$-Cqzbg;r$şNV+Rs/첂AG0 l5k[ɼİXop':gq%5w/&%iH@yomŐiS3;;.=z`֭W\q~`fdpfo5T-g<?;|CJLt1ѣfx[kS3 Tǟ`ݟB 22t 9l jJ_a/1)GX;u*Æ5vj*@/~-!S!N9eӧOLJƜG v/Zb4̡y`i-jDb}zz`Μ׍M7T^l$BF:s@ss ]{ril?vD` vbM=d0pO;='LHM6lmsX26>63qތCv2yGIS~!?ʫx2EkȨr>Kww1x̏Gs.NO#\^N_4o׃>F5k>oۥƎ-,,<{03c ;cn[̐mk֬q?P(H@Zj7O{߯T#W0$hOяɫy.saΜ9;JKK` $k15{@JV3~K&]yEtftvZKYAr9(ۦq^/[GюCθX))mg <-[(߰MgoRd Lel~QF=f/kױO{ɵP25RS<>ϧl&ʷx#3>5ɘχ@ycGͮka}%$Ǐ1s꯳mcJGrC0ޘ97?vZ7|=Us IDATR㏗=AnZUV ,JCy*<9Ç$ftZkܪ*JK׏H 0Z7y2b7lm] (C< =z9thTӎ/' N&w})U{>QвaEut= _nnRVJ ]Eݓnزe+ {C**+SDSNJi0=rv0Gp_þOޜtIumÓO>_ sp \6bY1mx݇H ;{l~M]R^~;cF_E$h_9駝b۞Ҿe~vdŋ`tx˛ǃI{iA̺]z n(dى^/~. ?eYHBu^ϛKlv5W(Z!C֧E%hF;.2SIуVU*`~n6TV}>_'q`YB;ws.>h nt?(ZXA;C0jYRfjԸq=zt}<cD gϺ{ 6Hc^UJoX33#R49jIKFiZE$0I'@8_>)7tSy5裏f֬Y;KKKŬNDaOiAsw?Yji_ZϞt++|[?nTHrr|74}}NHqt7q~}ihm~PG׿df=rdA]Dkpl88ɹ=F{n=kL h7HMM91B` `YPolk^(֪[^p{Gb;)C ;;4o{_ɪ&sꎉ؃wwI~S~srrx˯Ry~N l{7sx"FJ)Ŷ7+]{yϯqwJefÏMCyϔ!󎓪:;*(( "`&&hgJM-kT;( 6TKY}-ǹ,* ;">~Vv;޹s[y9gTU b'hj42G+ Ccꘑ/-fw+oӔI;Q( Sq#_}7֌s*wuPxw8ǔ)<=o]n!=ZQ^H݄(oVL B"H\,b[ewqG͢둼VɎ/_}ro/~_~c_k!iҥK{%HB{'OyE8itEI{TdKKő# l鰢ѣsti.\ĪkX#l5 4Q`؆';_F1Ǡ:v;UE4.ۻ!i/$Ã=W^A(V?!U%UJ 1DIkRTw0HC44XSS}ߪs=I&ot'o%ԫ@N2E̿}z )h„ En^UUՏnߗSme˗0L70 XI?\;ܜ켦y[2%_0O<dn x /~(_|ƵY]uYˬ{cF゛7ڹHv¶n 9'i#2 rHF3)4޽pfvv&!bMw3P\[uV֭[#++ ]4}w{ƌu-(3chYK:gza9w ׯ?wСB}u{"-5 ݭ,^Z\K}qvesϿ`6.˗GMVVw/ F6)m~尿>*ݴB*=piiC==>Cx(cV=m8S0~]AKvM6 {64,iʦe hHk/Z +²^y4})0bpro#ȃ;nϱmM`d_v+]Mw***VWWt 1``YWVon߶5Qqν}! D=6/ 2-۶m a 4(**bҤI9>Rc|60Vt3ɯLް]ڷ+<g}8wj|R {²Hޝn'PjJO m30!2 @ q #FhXີR y*V,FO( izaZ%iFCSt/.5aP\0&g5wu{e%"߲8xΜ9/ٖe]V^^{챾h,e[eΟr}lYx=^:w. ̞Q-ɫt<^^/@`UU~SnN|(mxBBrW[ `o_RtZ+s ۽(hU~T?z 9u ( CP4q"f,JúuL.Sx %|+%Ԟ=Q]zl)v85KLШ8:J}|i/Iٺπ2HtFNl[GvYƍL1h' %EQW<#e رc?3gNGhjҥ&NeؖiYؖe;VBآHIIAQ\ughތX-eC?p8^x(݃RtK/dvEr27eCIOkhIחUUU}UU]'QSC;8]zimMc&Ջ'o8-wdfֿ_t:Ͳذ P <߶aٷ//HmVMnn.⚦mxjhh"+3K۷r8Mm˵jnpnv/Jdj`<${mG'߀wo<-¶,& e;?o>8Leo0 }v{8u*i]4;!н>f_1HyYCu&N?mp\: l/pRz ?!7J~}j'~ gr2 0Qcgާ}>-hO=MtfƬQS˼'cv_¶)5gEƍ&?4KQ4M{3g\vj͙3gqc/cGүgܸ͙3'Ԛkܹsd𫄳6N޾)xԵ~݆2^}-wyiK$ɦ|D~{Eݐy)i noSm3}j5}݃8fdč7hZDQZaoPed_N_yeB( Yhn7]Sk!;)<<,O=if /0 i$aRS~}z)=vRq֬ˮ`o 2irކiT}9~HlG<;/J@ Oz:x)BFϖYYYgCBu^ze벑EdZv~`meIoj]g˔kpH׍%Bt '.&'#2ɟ~8\oGZ? 223=)9²m+';ud)hB0ֿ-R.]o{ː?$sA Fs7ތ%6 f_1 #Բqu`VG(+Xk|cSR2vlE{Cqn7Ǝ%D o(IxyKEt.0M<c8DH+dln4kΎ[ru7no#R~TUYavd[o5ض`kV/.Cv?CזN85 ʸ??I~?WWwòZߟx}ybMxM/WX^yu}t0A wB;sV= |7Db##eO X 3b[eeQo0T%W^MhC19ل#Q`SaEQbqF eG[ZYtxޓKuZ5Inm`>1UUxMЫ{>'Dҫo:vkYeZ}#BF XڵB{!@V؎ H(uə{NfA~'n7>׋咽%h`8D<C4GOZ]1l_; )ۂ>?睇j!J^<>rOiĈ(#XRBW_f{Rp行}_P؉gdS&QSt]>(vux2>TXe%q?s硨JR8KF jYC>Pt?FŻm ^ya $&R^ΗƦYHOOkC0 w rm(>C~M7|nMlϢo<|MFŒ+!KM~n4ŢDQLӠ ŗ᪪R e+22޼/?SqU{dge(ض!ӌl( bUU֠(Ku۲?w]  1聬{=55jrswj \p?⸮GݨN1-sRbE486Mx!V]͚-3f"l+y/[Qqyt;D]k7%>oH E({}?7EX@ bNe:9|;>]Ν#G:tmF0n8 ;/OJ~vӫW/21Marv!PEH+SUS% ð IǴ:wks=ԣ]}"C8Q a"mcZ읿oPml--2-^~|鑷^spܚzN̈o“ˮ@zyc~&;iW0 yl6̜IŢE?o(J1i2N<OZZ3PUTMc_ꁇhX-3_S?^={ҹs` "(B`(Nd9l##?Rf0(}耫ݺu<䣅)8@4]ͣy|׬\rx\. ׯC eذa `Yzu7bHi{BAvLj.>Cps^/|s=dʾZ@U?|2hhtD0$ۑ:iy um&CNvDmcտ9 K6!e޷/Cd XPT5MbGBUZ+ K5c7q}L?眳3TUa=wegsBZ.H(LyE9 ATU%55. ]w=dݻ9mWJr3۳=::}DOH{(ڽpi~O1N3$\V֡l||tM R{f3+kDQ nwXXRiBely\)v$'Ѝ7`D P׮ Y3P5kڒT/&_wuEݻwSꇮ뎳%SK?y GO`ȑ4x4ǻ!e[:oD{ts_i%Rے^͛y8s8BM? 9fnTUUx[oG~Am-,Ԕ͝GJ Tc'@x3 &=<=r;@\))̹wIBvJco[J3 _?T 0Զ/ouU?Oͪ82Q6;Sd1V4檨*-[(6jB۞p<):fM깪*v,FyT|))ݻo304>fkRO{g3/ɢ{M|+!.G{?أS#'so #P]E}Cۍ'?7/|a Kظ]b^WܶMl5|ֵp܋؟ 999.˴L-]0x23p{7~j*h P__i0躋tz-&=tTmG] `6f* #H]h(}i:vB/x;dEŷ)s=ڂT~9mt>Ȏi:%r?jECxk)ud)^24Dy);@.i"ٛMדO$kWjW¨M9iD6ofka#dt /;a.7{Xu }vdb,YFC(Ddfy4 HލꕫH44$3CUU{ό;6y q uk)G}4OFkE^=8U_UU.Xih#;;ٳgӫw/S =-9x`{_܏Hp!0sd2 8e.H@CTTEknn6 blĥ\B0!HϞ=D#ض~P(T|A+juoz 3gΝ93bߝ€sA+ xS׷8ΓɱOcm߃,8n"9B݊ĶmK*Dzul}V$c@<9 "O/|2Gʕ2ddڥL:P஠lؑ[,_2a)-LN'/ ߃m i{TZLj y{88)Oid吭#='r BMIR@Э85U^.̌ |M? PDx}V^kVVV-{>g0{dZ$%-5 ۲pi:|#F Guͥk.uIQEޱ&6`@UJmƟBnyQP0-I2BaaٍjgH΅t̔W^auHֳm,}]u33}:SW+$g t΃ F(C>:߽ 6sr(ԉYgIA"?Ə?*iM]o<탁ei&233pBĈEc$hK[6m5$S1Xg*#rRPRdضT2-Nj祰Ї,O1#Ev;^Ytssx޿kq\rҥNzL:a\\.tC[sB Lom#~:FP˲z }Uz}fg S:¶;l61-d`x22r_94H'yUЦ|~e|?-k[ ➂HvZ`&G-矣Ǥ㒙;|oZj ~۲M/ br2lx,N,pc eۥ^mrG)k )ӯ?>!.MGAZjiqC[u(/@w@ >xP q{HepBzE$`0H`C px401`XX%%m@`9Brg%RҲ0-H((w#7 $˶Ϯ.Ps[RR;P-]7lqv3?cChӱM_nN Ǣ'V]8ov6CFkPl@xxU}FJ~sեc44|ߘTmmowwV4Jjތ|asJ>*,`Šǥ!Ё @DbH5b8]<}#$q58 ΑȖ?% |ke`eGӻ/A,#ljc}wB)i&0-Tȴ-!s( モm@*)7'v x!ü8Чi:UU P0L00 40L3ap~,TDכICC(NIMTUH$XzcFwV"Ak/H8of&y'$9v~f_|.}~u =w) f;аqN[LB"ew kͅeJM d2Vpİ`᫪|8+IoNN¶Iٓ'P|Eǚ%K \id/:a-,>0ItF׳Ϥ'%l]:OF:[oაO[ƻGudZ]tlg]ug}={z6iI4) JvH7!ѸˮeŨkw^XE4VY >P\bYbZ*5X4F(6mM~UGd_d>M$/@ttͅRќX4 L*iB|>1m2dw@BBu4͔fse!C8wH\qL^sM]lyx33%IKiWb"g ɽH¶ f3OX$" 6ַ}_CN(h&炩ttk-o-7 J$Xz ]{-ه CXV2M{7^V4eeCq:oN+ު*/#GQÔkb+BPQQ($L%6EmK]! f@3c8Q LبFzzE`0h@ ڬScIhhx Pp0D(" J~0H!H0(_˟pCp8D,!D8]9N b(>-p,d9I18&@o¶1Q]=K涸qBuv+NJ}B'8Lu_}|g9V.'1WuW,?@)~Uu?y|(X4/Ͽ<3d3;!~"[KK$? !b1DB\5(=&N'JƈA;˥4^aiVcY&Dx,N< O1qq:ǰƐ-yBm& c[&i4$@>^*-ɡHj,C4,vr>2 B!B!pP8up(D86 R]]M4%H/^cI&`;z Jx,!ߕ~gSzM@ٟǬ.%11wosή5 r5۾7߲mD '>da&̀+`^D҆ |r!) f4JZ^Ìog,zJ I`%eMrO<9,!ӠG ض,AQ'HĉbrbDhx,M[”p8,_[ĶLDc1,acۍ/Zsc]PUU²dXL)O G„a;^~1jp 4;P۪+ GBD"0XTZBZ6D6z!ئIѨ#8[{o a4EcPTEz8$m7bDQF# B4%IeaeH$$D|0t%YQBH@᱿׷˾~FEde! Άli6PPO(@(,SUUĢѦ*ŜH$B4YMqaxcYt!. 5њv9.at0asެS63a?/]Ϥ]`Rf3n|LPT>+>z!+qf$^;XW^2LLi, ŋ܌Dt%Chilm,2*@v0LD,NqwRXX,J,!E X<&aTUU'H$0 0D"9F4x}^l)1i=( ChT>iSԹH,JCC=2 53 Nd r^% IʌbDc1)B VzE BDKZ.c2w|>~]矿1q\'4[t[H@KnxTľioFEMr@4ٜטslzMrmS6NKcȭ0?O9hV4ɲAEau8͟ GCvFlYq!d wxWFR ɼmYRV^NCCgYNvf Gj?&UUUjjhw}WOGy'XGm\~?satEIUHxR},]0|8^]ʭ~nc=0[Mb4h)}j]Nƀxھ:izqR|9v<޲eoc㏳oOZ=d[uH]S :(gh|3eY6b{?At@,[-0m͛75ڶ-_5Q3T_u8S€6,Z8B5`26VW'89+ mfjUlmSQ^_~IiYeeei&lق6i77C!֯_ϱN +{{z$_z&YȆ??@sݧ7IJa!/L0^xaO'ZrEZVQ|0h$Bii)_~V_ϝSF=@˝:'d`mUG#>t6mތ(l,gfM rPZZE"ף:Sd*BMm5o|7BWs?i7x0O9EnҭY\b+.k4.D0>9EZ8tj.CfRBl1#(ڶ,h>Ǒ7B7޼-|㫻[n!RNpdɒz 3CVXʕ+w6,xT ØDC S,~'DqY۰(,]U߭BUU"`SVxTWWSXP/ uulں>ݺ( U5Utu[CC }/`#~ xo֊<*++PTY瓞Azz:PzrssU?v:6QQQm .": IDAT<.5 XI]C-=߆xlREn~nN:Y8n򱁺z3d֬]KzZ*%[M\.<!n"0ǸjV.~6dJ[f`";)qq|ÍmyU;Ou?XR촸bRS솿P-ݛQw.> LOV=:nݨ^3N_QP4hY*ps ,EU6c!#j0ԑKJ۫XZk:uļy={A{(>h%>m{5:,@\H/"um۶DaForpr}wGTP .p*) ʪ t] [2$=1p&Z͢#=Vo}+F})*,Dmli;<.i+oa8&c[6E\wȔZ^|'sW UNrӐ_r;kP nٲޠrR;NSQ8L3`QLxw&}sfI+ƖNa+VSS#F< B0p@RTUmZၑү?N=Wu䑍&@RPjy^9Yf?6I3YgRg#pRXsvnt :N#Frv0K8h]s>!ASO!6lUz ? ~֭sϣZk=ÓO>G֥+V7p% ]N;tPijYv{80-9s`&`mx*SNESU2uT]7*I<^F}:}>}/`Fc r]4(h7_~oLLݺu:3dÆ –Nѕ8 ؼjժnkͶ ≸S DS&rܤ.wM( EEL:8 U>;- !Jv=|@w߭{ԍ .čhj7Ox>4MtUM‘ qUז.[ gã6ٚMIIh!*M@(]ĂXg{{W+"Mz^!H(!=[gcvMBe3shh&q_5" K;S;YPYLM#GѨ_c?!srݷ'ޣ(D4oF;}*L` `2zbշW^ڵ9smͽ}, 8v'>gn9??ם jV޽k] L&s/b6oɓC:)+ ๽Zp=8Y@`(}ߴ'w?VI!jo͢ƋDlvkl}x|XrqBAڸkf5{,/H6;w|ZW4Fٳ^cÏ\j-3ݻwr>4AACv8hBH6O!C9yqqqܹիWӺoTݢ@{l@/`]^^+ӎ}}:$Vm,nwg8jnNvny\{s/>?%0Pۯj+Dh4:DQSUx}@@, 4 6ڴmExxyU+XrOSWK]8,\ ٵ&ԩ"C(XwKo ::FywNnADv8PRDEAk2afofX8Tك6oUfk F |\0L6gys.Zo[(T2 U={2и:h4ZoҥjAEL&qqqfF|&Lue.`,peC'7lؐ(Zn~hPKZ-GtԼ k;j/XSj7<\ ɶi &"$(vbxN\MryO#d9-[M9ISHv!5OTź+BdS_#a4:N?P;Zlo׮]OiѢEҿoM*pUATTZz}) l6[y]EWd"//k6f3 ~EQFLJ7mQjQ7 r:ľ}Ҁ:`>e(tg![O H9;w (,ٹe~LQS]K) hu$͚ŞO?|<!4ka#]`G22HV+ C㉏^C u:mo-7~z>q]g̘c=VfT{; Db hU Iرc999ORSV"# dCӇ?tYoQe;KAY9w/K֑Dh1"B厸VCm@ǠH BCi64F 5ʯj;˗ӣGK̙3پD͟tK>PPf&`תZjlddEQDTjF7n(A٠A_N:u$]I(bxgZFM .:HCؿ`}D)Hp_端8oR@Qc%hs +6 ]}̺+Vp…q`K-C UA@v8i2QzNEr].Z3gKN Hdw4YKnS]7&R!U۶ѨQVF>iw…h췫]hHNfOMͤi>~&E 0[8?ʵLD}R+DLBRR&/E2uPPm5k,zh]EQ$,,LhԨx̙ UV59rd弈u1;vLw}fS5=DQʆ `40~Fis(Z-Ξ3ֶ ^~xT(,o gwHFm65*hM&,\_k~Iy䆎U ^OΝl|(L<_<#88ܒKwRje8u&T^ļ/h,p%FwN#))ݻwoYxqA5o(tǗ,YZxxh4Ҍłf+bh4v)>|8Z0 V@݁h3׮Qæ_~bZէ]h8b%k/_ׯ/ZQĖǼ={!$[5BjzٳhԨ?3m۶^ʕ+۷&S/`CjթS'}bqFzYf4`Y(v5kweJk:(Jƍܴiӣ5kF_ۿמ,[?xF-Q%"#9n'eKF_2+EAQAՋ۱f͹D ^QÚ6uWmo6 zN$:f R]ڀR֭cɝwc_}}f͚U2_W^!!![\2@Odlz111J!3$BƍgΜyFIII.ߡ0-bjjPZsfEFFs^vŅl6[0--MY~<|~/k9OgVI2/ڀc+Sf UVOIaXnn , --Mq@u=O,c0w׭[(J#e%"x53~$ l}5 [ 7*|dբ6m+ ht}-wu@z~Ek4ǿ47DZ4rNbٽQ$CtcƌwHII.WfJ:֭K۲elX y,l6 бcG<|ذa&LP ^[\(Ӿ曟BBCC >źV+d%))iΕu{C pBRϪ&i7@p4u'J8V7KΉwDs{zmgAhFh zQ%BEF#IfwpzQHf͚?@ppp7KdddxkݭQyp ܹspo̱y]!XF:lذ~WꜸj}Ԟ9s欄{֭b{ 93 0++3gpqeٲel~ϕuSk*F!y\ٹDWyerFL[ۗvaIO/yP͚Ӌ,u"˗x̖>t=y6MTQDk0Jܹ$͞C_^CNJ Á!4CXSI?p?oW?իiٲewlٲz'&̱Zg?0((H L&S?%sI{z t: 4 ==XK]u3؎}l^[vmwK۹pg͆l&--gϲ{n9!!!NV9` \朅kdBb"sڵgg?;vR-3g,mWP7#pgСCΔz.ްaC `0ܹs+qQWM@QM?o@Np] :~O… =zdeѢEB~~kfFUފ}혗J򯿒BtVnJ ;Bid#lIA@KS{7({4=v5;wz#o`Aņ0|$̚EDTi{A@46O=w pmƘ1c*peÅ 9r$^73iH 2lKHHk2!((U,+p8tBllĉϟJX޸*f4/]=zеsgb0`"g IDATAN8Vu@lԩS?~;w{q=WJ;# !Z7oZ/]nv庈Xxq>lc[;hZN%&sٶs[ $\>Yr|ܹ=|p߈#y)w9NQ[ XGg|9bzR]7h/ W*`Pn~]KZ.+$v3d"f3"9'RX8th@9snlf۴78`_}ٳ'aaaH X,n&^bcc+hԾ#11mb66CJ ɨBgQ:⎮O!44Q;c6a_fgAҕTÇ7oNhh(vG͛4!:* Q`4hZdef'YsrrJ,PE߿7? KӡXf+ΝcOZm$''ZJ_+eaj0E]P-2.8 ջt/ڠ7p_u'ԩ4?~4(! dϞO?-}ZnFv8Z~8C| %Ak42r:tAAJ?͔ 4ǖ/c~5 ڵEJ+BZxWqeC?+s/NCD6'7l.d\@Z:wM-_|4NwܡtQUV熴ShEA f,V;C͛&QVdeeݚ?X(θYE$@ёŪ&BvRRRHLLd˖- dY;]Q 5L8F ]`zF(:=22C['$nSP% ׎))$2kf&ѭZ P(DTۜ7G-j7l'"Z3gX|eԉvMFXu:||Eؾ}2uZ=Ǐ΀(d;VlHHv8:zÆq8x;bȸfEKF'MbόT/߿?cǎEbOv&MTNcɒ%z6ۻKju%v͊f#++Kmnnzė keY^8:33S!\͚nWs\.!UM֭Z̟+NE={|oĈL0A8FEg05X-V Lbpa9ªU䴴Tz.mPKP0ebuS0Z  J^x9eࡂ^Gvfrss"++L223 33]Q tW}׮]'1 #=##iӾ*2CUѭny愄p}fh0`0 X,, ]blظa_OTz`:eʔp'(݁P}dIf߁}$&&… ʚA5>9rO?ɓ'w~GZu]zn޼yxXx5kԸI9ܩCg}pPpqHÁ]r ؝8v)iCe: ġ|:l&eZR֬%~}kV?Q[n|>֖Å8agw";z2c:Q-[Hv!gv'8&Q7qQ@Dhhz^";{ժ,%=&1n1PsbϑF'sR:t(۶mM6"##ݻ78pÁ(t:&NH@wG}Ĝ9sܿV` v¯{L|&&yWV~MiԨQ 6 ]_رh$44 FGSjU6v]]V հjMEݠU*K/j'P'Y|6o,_Iz%]>|)Skٲ6..N $$ׯyy1qfhт`BJ(I8vv dGr4Ν;O5KQ+Z!?CDcnl9kǎ;NJÑ#܉~l6OyūZ͛Pً1'HV+F"᫢6ItĮ>MܭbʺA@~`q䥥d2O?1mڴ|Oһwo, >3Cիf͚PV$IТE ]=B5ݕyY3l-W:Oh^C ǖ/Ě54?]P X2./GߔaEN^ز݋ݻKMNǾfAil{lXZbͪ 9\>@Qu:e?q^zWj[ѣ۷/~T^|E.YxWܺ5MjsKSBI^83gXx3wb[UjU4mBfͨS'N3 PlT^urVFÅp uٲe}-@-[,?rHvmۊJÆ*731PPs=Qe+p|Ujʂ t,{,z"*OE/bdd_/Ұ8]ͩZ*jDDDhnN#7z= H AT'\^jRQ%}l_[Aw=Chs ;;xh0lX.?zߒڽ{u>jc ]DRAc4[5j;0{lODFF^q͛}vE-[rݷ/MBB>@۩c21^=~'Xqk[f&k׬e'y)P0(UTGH:uСÇҳgODdΜ9hzF&ĺ*P}OhTWA;EATJ$('~.֭[0 /ZzNO!9TtTEy`ݿ EQ0Uȣ+?KMcc8]} ;Jf _.o1߇i8jwN\~Evs{=;Ny⧛W0cK?$j+ EAp w+eРA| 2UPI&n2q{:e0 zYe$ V:EDX`bgXNu)ȣh^:!C:tis2偸ɖ%ڵkU(Τ)^H(#XE!,4̌zWppǷh4ع{x':oR Zp=Yek+ t `i;vwpӈyzU">W( NaCiNZͱ8,%얃j֠СtHLQv{ū]jҬ_lbzFe PUy֭Yǽ[h5{իWjժ={KOO_^"#8~V !`0Utş\?(\$Ynѩ] 24͌QFǣ(R<6PPjԼA. iӀ(KBQrLA-o qtwF(b^=(b>wcǰgeV>(к0ZQ;-!J^t7@&;^-Sk>IT[X7iJW]Z--Z(2###)S8nْ5kQ>>VˁtؼNI(TE<=GԨY!$I.v/ EQh޼9)))^zܹsOυA0g :'z䱹~P@Q IYIIE%^EIeW>T0wcbbb۷' *U*( 39E +yLp@g$xj`$>C|v/D͛ܠEڀ4n<yL)^^"ltO=JD5laSOq|J6hЀ~h, zΝ;WH+SNsvabӦLjْ:_^A'N¶m8zF+G:|}FP|E:oС.]^动 q{pU\b#@jjjӭ^ %';ǹAv<\' t&TmVLݺul2]v(XV:G!]0~W\>>9 scX=}ZQFIΒU6AԦn`Z>4ӛ0g/Axo f@.]*p'N0zhOW  i޵+uR\:tf͢8wj/ l6j-}uRh4iӆ 5j-~@pWe+P(9" /3/0 s{ڴiSTR`/P,;:YXND㋸ PJX9~݇#d  Ṽ%1Zg(]_ؗFlawb8<.ԩSŋ3bݰVm۶h޹Z;vW^2gjY׮Xzm`5E K3fZee zp]S=!a%q(F&MСCHpp~EtpF8CN#dEv%|VX ,g^pp@剾h1I0 `,Lܹsڵkk4h@tt‰(rlV5@5/%.q*ѥ7)O_[8op׷d(BO?#}<Z3٥0Vk׎={Vp1plrvƩMWi4wέ͛pc4SqX`-Z}]U_?N<7naѐ%I>%%^maL&w%$lZFXN;oZqȊ\$sҝ8/1P5"""&6m4CTR|zAq^׍'2N{ы6XPdZ+Ÿ| F&j~NTb!a` /xp݋&l{X}nu:ekuzITKfKGź'K9&&ロ p8HMMe…l߾ƍZ/HөUC !!!qq$aTJSj9i63a:¿ۻ$ @,V0j8 }FY/$pŀ$Itԉf͚OjqXp=4x 'ʸ ͆lvnU1׊q_#yDFF5xakvtZ3#@9^CP/o"U )ٟ鉉,s= Q#Q%~H !߽d޽,=s65:u*GxGZ3ՋmЧOn6z[oźu*h𗎌 &OLxx8?8ΜabӦ3nfaaӑ+=s&_%%|"? Oa@KeIhDѓDo9z7oN׮]C//qxB΍,˪a deg(gTzwMZ结P(ȊLpH*nS&..N۴iԜHrl6ZQ,DARByO,VeYy={OPd*VVH6;+`^j a{4: ]p0@t@,}IY*h+AF#'Fɶ7,5i7|3wuk.">3䥗^"))~8pFJ*IooOرLڕH|t:֥?h1os: ?)W H:pYV Pt3VK46lHztk .Ht a˲\/2"p_**:p@k5T%E)B&P~ٜu!}ٙBEfbLdt%*N삙?F=8TE}eg|Joj宏2Y>(j[Dd՗k"`DE0|>d뮏>"o ETV^z֭[9zh3?--{͛sY3/^;&g~Cp^F}E)ό( ΝẁdR$#!&&(:E ~GIh׮'OHIIy;-2( $ߓkEF$2겠{@M/(ʚАP([2[a<٢Ej'&&˟'{ z 1}xxgDH hݺu$ Ap8"^_{(B~~e)* '++[[8A.h4Lx4j(} K3NEj":@?W Ȏy <5Zjtկ: m6U\FXfv%~~js_eDO>wtOW_"eƚxpܯ^z̞=GyB( &ۣht 87|.] rITy> غu+C v| 䧞=|^oߞ \9sss2j3_8@ {ORw-1GŐe֭[ӨQ`#G+ IT,8PdIqV5R+ @Q󙙙EYq;fdEv{Drm5o<^zw b n$AȲ.!,t8_ 8 ͏Jno Ə/^c٘Yȣϧ#jVvϞVV[xH_Z ӫSf5=>/'R҅[zh㥞ٸ֨qYw;߯G-db„ |TZՐ4 k׮΃>ȋ/H ^t:72Λ76mЩS',X@*UXw휸>mAQʇO@agz:s#Ee: v=ƯoP8۔{׫WMc:.ɤEEߕ 2kXW*S3YYY~*W) \?HFB[, WR[% Z T5t_8 PfB+o ZhA>}HOO^z̟?9s0c <)k0wZg=^F{-OZߟ|BS<}z耋eYYf8p lߕeLAA=*~(2١ +dff*BAؿt:u]sw6i$x|̓hӦ ӦM+6?@BBB0`@9w :'rjڔǒiR~},|DܬY X_q3gt Nt. PBCC]65jԨln;$ZtwCv r.qU̐ T߳ /> FQ U¦UR5WB6 Y 3OiUjF . aÂ:V+SNe޼y4iį[gc0.$%!z6^O5tA%0}= &!huk F>93;wz=_DF2|%AQ XT/WCOtgfѶm[)~z;?G<Ə?~}0n`YԆMlzErN*|]~¿_?_|ɮ?+000SҵkW/ ,ӪU+""":d¸ѣsbТEu1m4֬Y@Pؑu Ȳ`w(q*/7m⻤$m72E僪soř 2+BTT 򐔔!vCGӁ^ 0 9sw#"Nݲ\n7gd;rw\PȄZXgJppקVZ(-KCJW[Á(hn/ tI/pY+k/ 3cǎ%88ث(?֭[b [,ZѥKixhx!p(Tؑ~?|ϚǞSr]9~=xHq}iTiҤx䥥hp.b[nCՒ7He5jD5/ ..ɓ'<(ܹs2e _Lmӆ5j;4t:,p8FxMV #yǛ?yE̶BBTEE{8g9J HowiI6ml&n}^}ݙ||+~wBnI&~z֬YІ 'SiM$.Z 1FMgdw^8@iaATiVM;uznrzիUьDMY @S58Q{+ ;+, WUnfz^|E-ZW>c}ƿH.^6k=7UM$!u6mBkMcݴFiLL  `Ȑ!U꠪*M6Ih6>u:L4ٺ3+vޔ'fcI~>ϯX/x-zG98p^B/'0vXGn@6z811޽{ӳgOTUe˖-,^k>,C 6,:٪"+Kr2(%%%A[pTU-5GT`| HHHP=l0q:>k}{׋%POW1Q 38zG9؎P}7OHΝyS'RX|u+/]N%ўc$}B0ڟFǍGiii*at&POwڵkG֭ٶm[+V.++;(Ⱦo15Uãx8#:EiGnw _hF-hٲ%nj@~C_庇v%_WCI!{Su8O;w$qIǂ 6a\/TGRNȰ9\o Ҫ.nݢj11ݰ^$ .Ç-lw/PRRR_UU֭F=ᆪ]vtڕ~|uVAue0uFR?[EEv"jz#6OKcA-5TӍ%}_ MZZW\qiiii, C*_ثxzxd؜ٴ6 {r=f"A%acpQGV1c iii!rcܹY׋,5vBxWf۶m\۲%e]5͚=1˗<|9'x>ZGHg^N0 "F41ȑ#M+F3}6{^IJN=G~{UIDyE Ç(--%!!"`Wh(r/񂁹P#/f -i&hf$ Sr&ZW LnݚaÆ62$IoU7nkioF٠7GJYc*ҪOkrr6mȣpĦ!IMð:(.WԌ=)~˒1PA,< >/:x`:Ē%K(..n/߸q#w{|!UdL:۾=ޝFqqbhΖcǘ~=::&"hPnhg ($2 '7jR݈ٿj!PXg&&rd?3><11x~$#z|Ѓp@#z?6|5!! 4ςiPUU4$0dz#zM@`J=܃f/ȲLAA[fL>7x#"?ot~~<W (XcbHݛ^l" ׋(l-+ѣ9˯m޺uk^~eׯI|*cĈl޼uv:V?΍7HVVV?g޽<̜911<Թ3uEӢWf v"a0GsuMx{`߈096D;`Ɣu?@('zU^/d[qU+>/7(Z;[3 !:f=d$4>g# Vɉ/\HDAAW_}5W^y%SNe޼y{o3EZ\qJ4C04_@YYxC ੧⪫HDLoEff&mڴaڵl߾UUv;dĉ0b4^_e̘1,_uDv6k'}vxv VާQwYttFA[{a"`(SB(-Qn]\.w G}7C`^GCTI`,#7P,tƘFsP)똽7nxxdIBqxς@|HaBBwui1eee8NRSS:zhgь7͛̈́!v:Y#lx-.zi#8Q&j=,}3-hN:1n8RRRtTH=z9|pP7j*4hC'0vXv @tҽ;ddD~_cϮX~_划R,>GA83#Ċ o {}A?vU3 gh6 -p8{TZ)xY+n7¢MnNTrL"LѬY3FGv9s&:uSNl6HЭ[7ϟ|{A={%g.NQ*i_nay&YAxIJJ &SgذapB?Nyy9SN駟fʕ(BS;lnԱEn?.&_ϴqGԐ8"܀phJ v_]vUi,5mAc:[b111q|38oX6iȇX\.iP~`J@xH\i/7At6czZ&>>>ogl]6mbΝtޝ-[Q\\M7ĵ^ĉ#FX5q"^D /(hqzT|+M;v,999G( \|\z̙3[jrA+Ils]pGX5pO4v;N+{7 䳈xx=GD, ,FM(2HOO#1Q!YqR`>X8CL]Lii4S'4 ESer~_/X0' E7 I1x<dY-*I$/ڸgϞwEaaafbxblBϞ=_#ge &yfƏ^_spPz(zzɯרiks˱ X9eKDێ9UUq\QZI766nK.O? 6`صkyyyf׫ǔ^ߤ04%Kէ_F\DWú0k{бe,K~7>6M㶁>0 6у IDATI(**:)w)QDro<R) `1hff~lbvCzBi. i>ւ$,pBŶ Ϧlw}B$V^fQTTiڴ)999$$$$If͚1c ͛?GV䳋.-7g> |d [,86AD֭[Ӿ}4MN:tСg<#<ü~IK32x i"BvfV:C٧1G:xi-#YMGzu},E[iOuueEUU%>>>׌'-uï)#@DG@UK3  ~ܸ^ 2D/`$@#u]GOi]v_-l6̚5k[<ӿ͛W#Y-}Gtf_ch&d|׭cFn瓙nݺUkFiI kǩn+uBBt $'{?gOrL:O_(ELBY@K m6j,p -‹/4Ȳ2V#ꅪV`1DC|||)Ǐ^SΧUPՊ:TU%11rVk\M`>؍l#BO(Qi"9Slذ!F8b2R^rRR#??5kPTTҰK͛ٽ{7]te˖Ȳlψ#8q"+VwKwa[)ҍվw0 ;pGF!Ue1h֯DZcGx*R@kP]H6F5 O3bRO0.c@k믍 &Hcܿ#"UDC $ުSB25VfW{!111ܿUH[Uq4jԈ;wab 2sX,x<.]ʶmѣ 6 t\$$$0m4V^̈́ "vGt@N#9 5Hz缅&+<&,ӽ{wueѣGRRR^Hp8޽ExWoh{sMbhdҥ{V} A#QAuwpB͔Eb%ToߞN9v(NTVeܾ/xmFt2n/ %^o$Bj/E|jp8ݛ 7UVY@_'..ۍ0 y fa`2,SlOSU-8Gsb46_׬Z??!}xN ;vDNUGVV-Z`ܹ3,~w}Gڵ+XO dee1sL>s|͈d]y$(Ir? {͏hۆ ҿ"Ǚ;w.mڴK.8Z;ݻw'&&3f0~xTnOzh; 'y_l@dBŠk9D@1 aUsM!! >_tE?0 Nf>A% ll7L_?2AtqD^Eӊ^|whFHD )U STTD\\̸P7bPU~!Y BT|衇X,9,%Em: Q_z)~bͥm۶Y ʼ8h׮;v;f(--ꫯfȐ!k̙3'Y i9dy]6([;ecv?lу;@X,v޽{&33#;ocǎYޢ/Ҧ^=4;=V+N%K!@?<#Q:ej(jFHS1\wpx4lѣ(,,P d O@ x>vT| L=vYxqDʀs۷oOii).rWyhU%cǪ4tG`'0c JN5H$_mncfp A1l0Zj_ui7Uxn˓fxBZob8ʚӯErr2 ??UVt:C6mĞ={c0#Ø1c9r$/7n ;N=0xL&MsS%6Ǐ8/m۫W/x Yn$6u4UVm6rrrhܸ1P=kfq!{>cx x:; 5.?3Ώʕ,?** oFF8g)8*z.E"Bamh÷OwLyiDEد!nI/j79c :Z: tB wu%fIlȫ(Rmveln¹i1 CKz>H$مsM%A{= {2lDΈS)y[hd 90|'rT*S-$MCU&--+m۶qƐՊaɒ%lݺݻVQVVFÆ yw_4i'|Yɭ[!v7|ag))R^ࢋ.u뒑͛ٺu?cJYY?#уdSj}v>#.] @x҅?eeo֭v-Ew# g"ߟ{oAD HC "_*:YTDllg+kBDG`69pYɞY* Ț28qɀI4133+**%8l4 @'74Xe`jL[!_U#I(^g$SfKn;bG4bgi\YG/dJd` 3"ߊp"ضW>N9$zj<7[?neK֭[w8 (jZ\ʮ{oa˘$q+ZX' ;fEd* СCZ3O}͛ٳgٴj*(?p8L_~>=pPQ6r{IHO?D],Έ6:t(cƌAQB ץ~\veݻSVVfz]dYrzjy4M"I׾=vJX8RRk Q$܀|,}".Á%$O4񗢇c Hfpl6`p:\JJ)Pث yf?S@x ƈb"Mb \{Bz}E*9K|}^*RVaR$* ^tQ]$7py G,C4dYfE .U 4W8+RTilDBB4z;v>e#o4qP(`=Z%S,qByԩSMRU4LȚ&QwN{+VQ$WdEEqq?E7?t8NGű,#fEC:YՋvڱb =X,Y>_$5'bAqj1$aq88cK{ևYvxʊ=j,|ꋗݹiSpߘG웵{7/^&.CCU" g?BzQ\\Hs~Y*^TU2FCtCuTUؠi3H," 01읅sSN~u(IӉ*Uo0Cu)r1R(a%lrp{ܾu+gƇip;7L(QwyPZVjX,rBgK<\c>uJ0KsO$nAǠXdߗno|<;Wx|v3fΜoMyv`儗X9%mKd\t! v%aw(hd) `DIQ l6?i>dMcݤH^ Ãh1 49g6^/hA%ܝ:}]nWUJ>}СV]Cq233ܹ364D( V~#F0iҤdvvQoѪ-, 'O{Q3Vy1}tڶJa$?;G7o1˖񅯒 |C>"_xDuY 4PVV&jUĩl]%T;TM0)fPEQHIIANS.~˹SjpUUINNﯠ&pnXT|To};+aO׵>p-P~{ѡvZN'| ?3nolej=^\ SRր6o @u4<09}.B.b#Ƚ& F'i9}:_K&08o B1# _!:? >J'@= `_'aF9`l|7{`@%!!!2 :'읅suoKD؟j(**b߾}!7nξJ7sT ͔ @jj*7tSg$uV$ɯ7sL֯_Y!XNPܼ x fY,4+xdzOx z4nܘÇӹ?, .e˖1k,=#A+++#77/dYW^=e˖d\.WtH8$]vBfbO['x {3P I ,:t~J_rs~6虉0mz_"H. `ފÿYG P9Ր6UMfPCfy$90`VMQ`a0 kP]'p_P]XŌUUILL8"e622>==J΁EC8FU𗸘dz{].6mdT$IBe6mX,z'n&R ) 2ڼVY_O( 1G)k'1 f#%o Sh IDATҡC:5kV.X PZZf3F59s0|{G,ӡCF\bgf͚ŦMB#éSӂѪYC9Ueq ?:ą_ 28 0}.?ͧNq"gRo|"S ݵgZ3"T@B"[r="pF!R]==!!HաRczuQPPOpA; `{}$I== AvsCLz ɢg8)K/Fe5kݯ,(/¼y8yd)뭔Wv:h6o+(q'trŒh {>$'2.4Mjr2d֭2ϧW:t9sb SO=_kF.]HJJ{F$tN߾}q4u1o<*-G￟ޟrwO૿2|pKaܹD-J5IQ駟8PRMNDI\O9SÈD2[Ĭ?fA"|1w@_գ?eeta,E/ 2PW_3xu5I#j:Nُ5V nW#uAg\`62sGPIT?j :[VV~͛͛M5Nx<~`ߡyѼysrsstH^/ y] P9{֒b ;GXȘ9SஓwJm슜p( :+VrBlݺ{ҥKڶmkںT$}śodժU,YK;[ Bٳ' Yfl߾k׆llX(--eѢE4jԈݻW0cƌѣ}%P$U\̏p]߯2`l_s TխV~[RU#.SD+ޛb}H¬ňZ1&q0DS9: ԊkCߏS,2g. @OD0fKHj7R4jmfN7s.SpR|U4BDChxꩧh޼9餧 h".k,]DجՋ,-[ÇCfq! :wLǎRIU7bn' I$ HɦŇp7_FZkdx<4nܘ믿<6nXr^,<˖-cдiSSA;ӇXN' //={PZZʱc(((*v 33-ZмysP>iӦ -Z`ݺu!'p̎?7|Cܹ֭6^Sm6e whՙ8ȴ|G3Y}u[(,e诇({+apZ7B Bjo%߂/"v>]n!xe SHj0fQpYY>ǝP AY΃\r@ذvZ^}`߸LT0X,J9R]BU5$r!ȌK:{@jj*߫,o׮Zb?~<ѶX`ou./=;^\8))sV\IQQQHb!//[KźJY,$ڃ'.GŗO")j:s bERTT8Q((BNb۷ZYb~'5jDnn.)))!5tNFFM6Ti ˲ "꟥)*} t5MbCVV+Wȑ#!,6;v$33xeY_ t@v{'aJ˔&.Ko%iBo}kg_>5k!߆FIԪS=̜`%8iJ K*[Z~:uBڇYxSO:ebwốPsZ<xWv;=zgϞ~7l3G^Eq;hKk5\Cnnn%)O3 LFJʦ ؊h6,NvEG`rzK.aС$%%Ue#G0w\-[V)1n7. EYY%%%r())W.i;3p@_~=֮]7|$ {ǼyҚ7o{.eWa!:D6b!ui57v G(ׯ3"V2҆L]cR:RٺFj_@5*h9e^1( akTmS[O}-fz j>w#KhР7pCխ[w^lBLLcX5:)Tf'[ym3T/Um|N9{lZhAϞ=q8}YY4Z|MȿpE@ ;mGwԍ& Dyx<$&&r5װ{nVXc?? Mvj UUiԨW]u۷ogÆ JJJȠO>uis<?^^ ?Q~>0Bo2"/#oBKOBh, 1BK~va;54ӘX[1xg5u"ٺ&9KތךE @12+ߟu T]!QJTM ?ݸK#hт+zQ^^*ۆ$iXطQRjErbT\n 룘Ebлwoz>MӰJ#7sKb~4YƛGFG}f;pU&I.&M0rH:vX9 >^r_?A邦im֭ۖ[Un:Le$!.vIE޷K ,ry8p C !111,rg*ĵ D~X89ZHh5*.㎛SP;;И0 ćo}FKt bQ:@!,"Df!Z8fWC|=835`G"@a4 ĵIQF:PS<ИyEEEՆ4MC  4 MUC g'`%JuSbysʦ]v7vۆ$O֫Чr( is-B֭C4MpPTTW_}ůWf٧_b;VhV M?Kl?S.K 8izZ 99ÇӧOVk;Iؾ};3gdΝ>р3l0u,x^KE)26(e4mFY,Zltњm2&D=Q bFFbzdQ:L(G4MCE5:15Pe0XhF"!Pk+@/~2YzwSNپ7HQQQū#tx @Ӆ4ufnV `m['qpb}9.+sSL>k&C:T~ԄVMhӬ%뒘K]5p۱t֤( qqq\q9rEQ^^n7nzIZ^^۶mW^4mڔcj\'+Ɇ*f_G`?}`ƿ)mǭJIg䢨("9ukF =Z0~߁BRjz-يԶ' T5-'{^{w_O}h4Ș1cر#\\AJμyH`]:,V&t =w%SJXU"QC=2˒ X$U"j{ܝ l=6 P N >?P}Z$BBBj)?2APYsgY[%V,#1K.C0Fx|f&3Y%+g'P\Gb6 e*`Zh4 >#F8BT,YBZZ!X,BO&h 9vAi~fBLlZQ(HE2"Wsa4;vdԨQ4oER֯_=zR>(ppۄNF@ԀF# ^}]!xA).TV bm|bb.ۺP/$l[\%$gJ!zNZ 8rh*{\*gxK {:y Ѧ69!;/RZ&ep>@W)Q,Pe e8'(. e&TV&{ +F]9(1H*{d"44cr!lقqh?Nnb7*koefwhoLTZ~-V @KYN1K薯%q !yib$TfQׯmڴaǎwvL,YBVԩHՕBy9e]J<p3 (9%\'G5aͮK|"ww%8Rw(}%wL88m޵d%0 h}dIexݕ!P ܊9 U,v\c0執WkW11ѵ꘳kH+fZ}9oQ $!9+Z%$AB=6"PPPP: MuK :?rs 4O0PneMyZ Ѐ]RRR~;`Wkڴ)_=AAA 'E%Rի9¥ӓ4XДoVo ~c2s6I@h8AiƨsmqvEIIWCĉѥKZlYZcעWiҦ1X׻%Ut(> Kp[ô|_`b[@!%>@<s^<F FlȲ.@RRum߯lT:=d]SZ[؜Bښ4k25jԈӞuV5w;S@`w 8[{6t5wUp$IL>3gry5 ɗ'$:c >>*teQǡ@)loZU1`' Ջc챾=m0##%KYFh(l`Ph,qcY}1F8D%=?WK؁#z`< KV Eo4gԨQoβeɩuXbT x;f9ud \ gsAT+32OH;b eRo>JHݭx(dCCAx̎zSB ,*ݽ F@sbߏ蚭͵4L斆a5R B7s}wW.#ZA]{2`_ZpdTF]lk+/[RRSSyט={v' u -݇$gtؔu[PVSJLLCW5:pQ?>zy_)-yί\ع`f uЬ&z #"(-^`00n<:y ;^يt4`Dlƀ=lOkiXxJJJXrg[`6o̔)SXfE͎ ^#w~1x0-EDQ&_b(>1ç)+@XXcǎGc J͛Yr%\ƈP6c bp~E48DDk:}qc1FDht{b2M bnjmFdddq jL/^޽{nRoz9qύ& w>A5$!ͅKRjsWo ܴ9Ry/E(e7EK?SkQ_F ?補;w1_b/44dd6@|${ٵzHs3Y&wߟɰC),(߿zAק6+v5cu݃{d2} ח;&q}\1CҒ?]z*|nn駟gW_y8xŨ V:rڶDu$Ĕq.ӗK>b ,\ŤwZ[Vh^Te˖7f͚yUjj*6mڄ^wLy\#TFwfdϿ/ 薯b}w&K\ cD${㗙UlP 2o{WT?~Eꨜ'|͛=A$}#'3<." g`QkAI*&|\m(B:MQ(yPUME>Pvf`.J9޷Q_x 믑$^{۩>Ku -߱q+N+ŸOW7WpZ ^U' Iz}953 _~Y p]M`x0M(^9s`0ED+ &wz9 PeX˻fD?SHagRbzz:۶msZ/:.]O>w… -7} 4S4"-Ky}Y&?pQl~#ޛcjFýKxx] h4222Xl{A*LU$PӶM qh( Ge``Ƶl[R&e3tIh l׳t:Ç[nh`'رe˖[lٲjݍq(b7/SP1b(b=(>B 2Tof@Z^uf3o# wݺZb6#I a/ pPw]wEʵr?K \O6ɌpM6Zc!\e$H dsw; :mD@3ZOKJx9I!!!poelO:ū?N wE;Xs<wS\G-- @v%EfQ'TKh T* Ɛ!C]ȑ#~@jc:h|]~${gTF"*jKȱSFbI2F\x}bj۶-Fr(Vf6l@yy9jwUθeH*iOVùy,eE$7<2J^(U:upeE%0E8..YfQVV+R!Lyf.\SԠPoY SP$ץswٕAtg 8>us(U_TAZ%x>BB[Q틸AC0h@ IF6n䘠%Ibnq;ϹBn](ҿVI M@=y*4k噇IvïUYZmY PRTV{8٦M+AVٵ$J*d"f㶠Po@ewBE:!匉^募X]O-[dԩ/mĄ$1-bu$''ТE 4 EEE]7 Idɟ+WR֬1BY8ԡq#uFe0a󳯠[+zL`` r  =! YuQO(}ԽF1Q>@}a>||?t lujH)$[WwO}:#GDպ i|G;ޘh0S%!1.A,Xš@ӧӣG*3A@VԩS25joގ!Yybu;ٸ3_EDd!4m%M&Zn[o??? ;vK,$9O?ovbՄ=90CT]&N#bAR{cӞA]Wwdx6Ν['ܓKFP] @#pc&*)J(o3gΰj*:uTs͘1¦P:ꅐds$II^<*wr*wy5dYF_P>wmڴMQ B,V4i\s Vy{ dT+ŭYe+}/ˊ.h!YݫVǵ3`.e'4iw(yV:)ٜhc::: /ЬY3L{Z͖-[xYn]ՉaL}"K%e~|_˰ x\*Bgpkpi2:`0ɝwInDMJlf֭,_lGJ49?b$9z+FJ7:a A'9˜{$Tv%?C3zhbccX,,]ԫU]I/7$7ۮ<2¯E)3cǎ Ҹq'CW_yk [^_SԋjJ6`$$4@ٵٍ**v#?1z}ysj%6 IR* ?(YVt8pFJfZwٵ""._u_5 8+dEQztgyup~)&: ?˚ŗ*`A#?~Mr3-N9V1 -[^`񄅅yȲ̼yxg9|׾H>4K:>^u%#E3$FQ _ndʶFVZqw;XވŬ[?2?@l`2>yMi ;*cC Çsao;!3ȵ:^ȁk РnPML2_ Y$&O͛E1,JWHC7Fw29`6WS{lEŞt-0NJq, [⯿>=wiBVr*1O /_YR2$GQ +O]M8%iއ(9}̺-zfI.~ }Cf2j|&w?]`ߑJW^̘1#G:*}}9sf/GEÔ vXh%_Khx6hzɨQbx\p˗sNdYv#ywj-l26ldI'`*:B.rJ+؏,d^̪0Wt;~Ɗ~jRdeea ,Џ@f̘J?aР,O~lV>N!mIr"VcPp~܏c Va;+xwH=ca8L$=ŠJ*Ws8j$j̘1nݺyWL<9sx%|"+֭۷CѠrR sw(s|_9UVTg 52tPH@@~'ǏxbRRR* t)4|$voJGv%+dcjaEb 7ZC;jɐ{ȊmPTgjiӦ̛7<&NxE]+))qKy( `QI›u^l- vCSU DAF)TN w*cG?XRc1ߓ)--uh4[oҪU׵("KW8sg zsxrEJ72#0mB,,= V 2X=Ãhs\,::_|+?C`}^0o5kOԤEC蟄zX^/oB@J,}g@ʮ/je/h>̟?~:;51/:,$YիCoP#ǟ~rrrf̜֭9w}x]=|+Vy l)J2*I6y`sŀ)pQ ;-GVe,@n9(|\"0${^(2w\&OP;4ٺmP~۠\ᑊ[swh6^"QQdVZʲ"۪U+ƌCVBwEbV^htx*0b!78\^ I8Yo"j6܆V+&L`[< Qnpu)Z)``x%߮_~޽s7Yy5k8j مӪ]AvAs5g;<j(`!'O\dT$a!رwH2{ FWBVukQwxc[|-F#o@rd-'w^,f3(@xD>p7={S=^:n!WQe$)kw(" !K {$+g1qD@.1Dv!Y<7>JǪh:t`ڵ[V)--孷ޢm۶?mj3&=ft A LPē%@C#_ x8}ѣ[fǎ\xcJEVVK,!99.]TE9PA t22.,6)DQDRVnTwޝ={2fj5F"%%s1|TW 8\r(zP&5(Iv?ǘ1cxINN*]:u*%%|O*ᵄժrTǦP)~_y񇊙[l0!qwԉS4mM7`Æ/1N*f i5Zs7FOٳزyk-T2mrǘX,VF< Gx]< FữC^vgn ^bH6(IHVT35y8uT.]ȑ#>)mSOxHD-=Msڿ#&˺㽞7 QFq 7xbv!21qD=]4+p3-4dpMˉ18Fo>}R5!v&? ڵBa\N8AZZ:uM6Uczd~81qYBUn/*7ӷ7Z#Vǯj%::___~s4Llݺ+W2gJJJ;"g>QĔ1gqQ>P(2@/+.;kPWߡT8q"=: .f;kzd{ * TK@yl"~Yg8s׽LxXpNfO?Q̙3RXXHqq:A~*:冶oJƒ5khUVcI(E5}fx7xꩧ kD^eS"WP_`(PlQ/4x={h4`(7PףחU,3`M8h4^]8(RVV Oc*Egiٲge?=v: H_e IDATHH~~De3g)+ٵ@YYyyy :FEE),2P~^R$ <8ZɡR3ϙ26Y""UKXO>MYY۰߿[Ҹqc"##ΡA8fE%*2_ηiwb-Z=FW-2$%%aZͭVtu&TnEE:?*ZTvFM~!<Kן۳7氊c\e, X^h{;v ڶmKi۶-M6uȤZ$E}0E2pA:߭8µ9Y,V "G҈`q<-9(=o߀}~wQW=5,zgZuÒ5oFBقll6a29%ѤIZGlbxRŰuF^%nƭn}s|||C,S!:'.pE*H ̛25jDl@*sjRSiϼ6j旅iѢ. eҰXL # VM'Τqi\+ٳ[oj+psFEd#6Ѩ!:B͘ DX77n}8#n ,pEN 7܀J"-- vWR0lذӧOӢE ܞ_?7g^̈f Y|8b os0(gΜa͚5? e#ѣ;[4C|&3Nc.~[KyW5K O˷*䲲X~C9:]}bޗqc>*"Yj?ץ;H}Gcұ~48Eqr |v97r0m׮C}8\Hk f͚ž}X,X,~G:ގ;ؿ?wf֭PTTT[niӦѿZJq!vM`5OoW F(SVVR켫\"#߯#jo7L&ٳgkl\C\mӼys!/v@qq1Oj6CҸgЗ?a8++ӧOW++t4,ZUcF3LוeL ˟)( WBA?"">}`ػw/;wDς Gg_#4,-F^_F]Φ]aH!FlBHFQ&dY@XMhDEEZIBB>>>[AQHXYВ1z{p.}EDɮwf {lf:wL>>m-7W@t7@j뽱Uw brv42?<Cf3jP ?Fhr2Ī? "pEJ"551!J`0qFIJJZ%0ef-d^ȗ^I5wiײr殌Er"B,X6.t4mڔ2.]TtuzÇc0HLL<>eN4^R5 Э\NdD |W# !/ j 5.Dƿ/BCCٺu+}jdYfƍ9rߟwΝwNlllr5tRfΜP?P  ZmkLx~~~U g@o@W3aG\Q\\̙t, ZDXP8AH?}6mϏ>}\y|p tcۗ8tȢ/V <<]ׯ<`(?-)\f@/ j֭[ӳgOfJKKiѢ4Fs U?2'Tx@JD'ٸ+Ai9}U$4 ͛7'>>K.Q\\`lyiԨfQ(nD}㍤< q4e0Bz ൗj5 yH/?,?@>q4mڔ;\V93W죡DG9b"7_k{K|^|'|8={xh4V+6mѣ4n!2T?~<5εBgv1+NClb8D.?5I}y9ZXzy 4PUk4@a}w~PH$=IFdVCz缄"fbȑd9j{zZ5н/+61P GLT}B/b&=wMʻeȑtɣ[YǏgڴi̟?fӂxEޕq$8~)}C1[ (εhZodСb4=`4 GeV SEX 0a rR#a-A@Bޗ}""@޺ { ?/h׀oĉ)Ijzc/\.]KwgDbvHf;7]`w+{ko2 "*Z٭ZIrJai8M.ҥK,YRwEr =^`pڵM,4AK02>XSѲeKOHS՘f̙Ì38vW|#ky%MѐD=!Ry=),Qů^s*,v9r$;vt0=y饗 ~Y|*kz8!2c_;!m;!sq|MMFqkhɲJS7~7?kїz@=zy.^q8v/,U*VgopcW h+AjOQedSmk[$;1`tЖjXŌ5_|t(1Ná5|<=$ASArL8NhZ16pgy ׷ѫW/{= /JZNNo6|.\h5f>,:o߉"0( 9>wBD2+:0zh}}}9r=XUmF=}{᱇= ũo}+_}/m~ "j0f0ԬR3ڶmwAyy}WkyyyL>[ׁz,Kߑ'HݿtkJ6XCJOH} Yf^]!P$ h.gťP=V55ÁonٲӧO"""cEQ*>o#A[)O`RƿK(5̼Ob,vT*ڶmK߾}Z7nMV3 ).Fb!4^.!YON=rHe,_On7} 0={rqɓ]Ht:3Q,A[/@KO* /3oQТ9w_"97!;26lVcƌ!99-L¦M<5&-azQkXt hK%fFrZMTdAAAUPTTӧ" p=ו!] gѴijqf_-̢"2e #J dQ\ϕϞ=Gi=N[Q*x;8##ٳgS\\_Յ\*_v2p>ӂ,L` p_ ___uu]GZZxEQ$%%-[jt P~j4"##IHH .NJ sWp/7v+!.Zba<ZK %ТE v! 0ƍ~ݦܹݻwӪUcEhJ Ya̋ra/֭E$G  q5SEΝ;ӧONh"/=:jo5LVC_U=Jb13O?q饗2` \Ԛ5KZX;wOOv6n2C38c^V~ZLTx+_g~rjwZV SO=I'0 0&&~St:5ioa*+]lBͣWqs-eҨ$Z] ٹcb6Ͽ JHH`̘1̚5X IDATr%GQz (])h+Wrӵw4OE2PE?Byy9>`^v4Q'jQb=?s3xRkaG}/ K] Qr2,.M3=կ(Q}+p6k]/rXr%r &LKw-Emm8q-}kS[JݛL2wreq,|;U0gQ.K{dzbN?$ƌɓIKKQW|gL4?ܯ`)ڔ-KT!eqL\.W- )W) |^)'Ɛhգ/YWծ];f̘wߍb[?jR^^3<Ô)StAA(}/2I3/@[R`wAk(OLj̚5[ pMT ֞0jVϜx{1Pׇ p[. Liz P(zz=)\3gҩS'^z饠WV3ӸoTJ\52d`" Vݻ1ky$%Z(+Y r9n=ݚ ;O0tPv_Wf%K#Ʊ>vI/EQ6jX,_[4P,ţ'P 򂯬>!8q@'Nzj>?xڷo08)?,xmN |1VЯw"NٙB'жUc=~QVVƟ鷻aoڶmjLz Vwz˄( 8]p6R5&W#`?ݛtvWT*|hFΝ `;u@Yڧ_ÞLA9Pܣp0.[rh6Coys(Ck">gFiiihܷφ[P^^EҴiS ~.EEQdF%X}/P</!W-M~Q;S}j4@Uv7C37oO> 0۷­s,~9ߞ (.qBޔsNJdT36Ea̙3.]p8N.v-[0m4.]J~~`ȣrx<9=O6.o!?m.gI4i|'nKvӭ.?y%%%1vXx RRR(--[VjGq #ʕa۟P^LF3m68'h2hڢWP:壏Q[rڙ?p_ԥ嵑K"j_w=h&FZ+M:k,D%)BC)0zAV8}¼s7^g~BbD6ՊEUĚ|͊TVXͦk:vDp',X pC$d`hQG`C!k^Cm *`PWت!* OqgQ- ЀJ0 8]'Pgrrr;֭k׮ pr1*s  ;v:xse{J*6.Us3 ..NiYYY̝;ٳg*1':Yi mZi c0Z_oJqTW wx!oILc\ݮpӕq[eӡIǰUjgΜ9t9`a֭[6moF#IV~[ۖo ~ XKai,~4~)fƇS17nSLYf( ˖-dƍp5Ppe(JI Jaz/ غ &Q? wށ([~E9b=2 ?rOԚyb#]0@O4<yOP5?HC1\樺| @SpXC.8}23֭sΌ;xѽk }Ԇ S$V v_ ?R <1?}puq|^5ߏ/ % zɨO۶m]Ȳ4>'33 ŢŊb``XZ?~k`=l2 =y pӉƷ~iҤ gŢ}sg{仓">PʋOyu%55>}ФI~w ?ƍIMMEtڷ/e,~/a"1WcWdU7Z8;p|, ۵kG>}(--?>TU%??u֑M5V]VXO>z^砬m _,ynٹsC~ M/.MRIKKRiU|e21TGmUBvݐυB P粲"PjHM ;Q-|(č;g̘1k.PCƦ*L̇ [r)1L̮ b,,[Ђ #} /pyL̝;~NJ`ԐR?"\9bVz *^0xX Ϟ+vnFOcYYcbbyYjGyzJA\~*ʧKc >wu > 6:욐#*b1EqOUx>b: 7U<.)nl.BỎv /O>ݻ7, >ׂk>a?M|l}\Ȉػs=UU2dO>$۷[VXQl67oG᭷ޢHɩusS^[-c8| T84iLժ! Ma6}1ߕ`wcJJ ƍcĉ$%%9>'{1v&Cc~ e5QQ*Cw:s={LT&#Uh[T4WV=a28 5$5#EmzpV=!~L13QD?@ ֭M65*><9_jAd_ 5o*?,wWWL>.ͿMMҘ8q"{/qqq~UF+O> &~߻+x>܌ =__J&~pvFx(sKӹ 2{t“O>ɐ!C(,,c̙5~6l'v9(vۍ!<㤧t>қDƦI|EnBud^s( 78z\hD ', ^xƍ`.er.՘oWiv펩^:E3~6a-i`p8|ݻ3w\vJKKYd 'Of˖;ok>lÕ}}*gq g 3WE=fI*ݻp>ZԒR#g{f޼yoxC;wdڴi>n]Q*Ѯ-Sy(ϯJFFӧOtxBs-Ţ&ѳ𻼋#5p/@ IQDZWXWfwtєEQP,O*B^^22CWV^OE/(T'\.1K,gϞ+Ӆ3Om1j{SpEMh8qMhTϯSNۗk.XV+|ڵvU=UEN ޟEN,4^IKQ/tb]@=NHUUwgMFF+Zqc3 -xBz× ܯV$&&UN.̯KnTOw˸&q{ EEE I6A.h ;˅Z~&sm jihY \,Z]vqr;вepї*kK ~)Us+Ƿ3)¦*us"Czbbb1bc…޽_߸ ꪫ|5ѫG,Cs,@Q¢'S9B_~_ʎ]~*qR qo9O@͹ٲe :5dȐ!unذ+V:HEh,£h1g70@H 10`,8 Q%ØU8`AxKZjŘ1c7o^W M?(W:PIbvm Ǩ[2uA^}I950|֭:u*7ndҥ2k׮ok_WS66[%/:ika܃2mZhZatu[fs0ɺ7Zq'2k,֮]˩MСvZ0?zsmS>P?Xq7Pf cyXC\aލB;>`l5S,pa҂Cb\?KL z[KZ1~d2[ yKSKIuZ#Xw1:3={ҿ&4MfQVVƫʤI66zKrS+=śѥ˷+-Dܙ?Vƅel>n0H/[^@%k.5Pjc7}v˔qW}\b h޼..`HRЂ1L 5k֐Ą B?*7c-̟GZr XphA{^)sX{+}en)yy¼ :F|4K4#3DA0sLbccywB?*7tn1X- ïKd{|? GA'Liqo~*[IDU2zJ6櫍lϞ=={6SC0ydcW,),iE7?2V}V­hZæ2κr/JfjE!C:wBXd#*qENSSpUix5; Ez(T/骂@5W}ç]pA˔qӵk@f$&N&=Ŗt*+ט(SOsތS/TjX߿?f͢W^hV!`޷ofbܹ8P{é{%baK.DO˖-I&kӦ ƍcر4k֌Z_ƌÆ U^y4>qBs^sHp:S\s0"J7{tDXA/ҿUi"u4zIZZZ/ͦҸqcϤjZQU+6TͦbSm6TUnQi}|x2yW+B?*E.U1-6p}X)+wq٭p85|m)7ݗ7*UVV~z># hԨQu[lɰaԩSXo}y嗹{p*%Qώ4` 򀫀@` @Ϟ=ٱcGXggFhu^N`cV_}__{}I#`ؿ??8#?aN'#G t+e3 b>+Sb `ݗ% ϧ0O||<7t>(ݺu+ngӦM{シvVc̘14 ΑB⣋ /]0.y GڞxZǁxǠFG6 ^G_d IIIa4MrqTvՂSy<: YNFݜբf֬~-SYT}~10vX~aRSS)))PUO>#GQحݻyv?P V˘ O@UU^]n;'@Έ CU0^YU1ȃ@ `Nr\?-['<#˜a4r׎+xz{FMf+y|e1._[¡t '>QUկPjRYY… 8q"Wxh 萍4R!dU\rkH&s*O^aFCB.#LyU9 hF!<5j b>e! 8̉׏^zuְ Πm+>*< xcyyN.= \Ą99QqYth7a*{f\~唗תPvv6ӦMc޼yU\#k֬wH%rD|NPVPA>D0 >쿕PqmG j5N9| ]vn pu g-tY<ٕA~\7GO?BsٷC¦?/@&Mk={6'toѣ#aw{'ju1o5N5yZ1Q#՗=E-|ZmHlv7!@ 0'_yRSS3gNЍw]bƌ{b?KƊ"r]w[wTp5{9/$>7[[2|Xqq}1m4RSS)**T(X,RSSk~8>}:yy~Ey!ЈZaZqX!#bc"78\ =ڃ ^g@E/&SƍqKjΐkXkxkccgEWijTXh&/"]t ghSFߒ zF)$scX֬hZ9sѣ+WdvGt2lذ 2$!#0!X 1?j5\}@RPA&4`'pJnO ;I3R{KE)  zjPEKvʝw۠Z V”9Yv!J୏ 8 eK\7 bccJ8V R`[4BPD!#Ͼ'>rƹKణ }9|u|y衇x?> y8+U6ߝN?9מnNcS*Y~_@rU*YO9sfH7|?,"Ԅa2VsBiup^U1 p{ ]RLV|lBk: c'p9p1AT%\/jqK _ʸLX %\x}:?V܇ǰ}g%]Oc):|x@30DZMaO3Ρ U4^$t)3vUL@㟦V-P/>Gdsg}ƩmFVVVEad6-)IVn; Zmk++qiy$+.1lc+> ee~,ȹ#cUhz1`O3ߺ{ Bʭ'wm$G=$M}.U-)ү}W5:"?( W^y:SOZE+f5烗ZpEq\ث1-lț|.o}T@ 4!Fvv6glP{W#c(.U0O5<^TcZvuH5@  CtkRxX5+61 ыќ !Geqq1<'t˗/YjMѽgoˆҹV^z;*vpu:+ E#jM_ACsIӌ1^kE@lC/cy uL2TM 2BQQ0eotq%AcW_}5_|16m .~]̇RVt0֯_RaDUh*?(E7iw+^m߃ugn~ah0' []*rۮϧޣTU4G0W J~zwV}@cmd|ߞόC-o9awTsTUś}bڛ ׀&m9 $&XYYO Q k>m}pUd,F"8 {\,\Ν;3k,ZFEy >tdTUuKYTh(E`jY6q@; ] p+aSJ&*E B_=plr\oЅFax'QsꩧrP K,aҥ{}p`UUON{&GE.>U2&T0GMŹJџꯍ0S@q8Eeee!)Rp歯2*"@A}v @߾}#R? Rdff2t@ I}4ʂf]Y EE)@cQsS TRRByyyh< 6*XYڤ@Ov߻*֭G 6,˼SRRBFr\VΜ͔j)))C8?"@ͬ*--8$a= uw7ybF y iG5N.UEu=rꫯrI'SOUNƎˏ?go#0!T]<0eHk)--8*?0#@\XXXVXX!r_HZpm7Q .X= XArssyٳ'˗/FoP,\_~9a;N]IVw I~Osy{+$vQQEEEe%b'ņP_ uNĞDѸU9q֭\}\tEuQG 6p2X*kpH|Z,R7IgynBePPPP |K6(eEEEe5KZq/ZӬ 5jͅ|^V`o0'_:#Fo_,Nƍ9rd0Gɛi}I6U3jc oQ sC{STTzV$''477דWgw ]w0<5.F|]&B5푾4N#݁Y{\YYɢE8䓙5k!rjX>. p/"y3nSGgTQ Ӽ!U`@%''mIIɟ/Gh 0f`G;pAտ?p~2`x矃*=4Mko! G/DunCCsBM%ʹC oࡠ( ߿x~a#UXXx)2 ..MFfW|:7B\`(bYg>szIN8q"?6932eJ]wuPBm*l#+JCw(i^O PXXHAA?Hh @`eddgee0tAp] KV10<_$o&cq:ر3fгgOҸKXx1>}:'p7nwG:Bͦs;@1/.T~U׿G ( YYY۷h}D#@`֖~:p@')5] |-5Vr)@C@QQ~)Ç'--:_w`߾}̘1֭[3i$Ce2`]7B1vʭ p{V54kqHa|Znjw^lllj\\ަ2<+LoJs[7`"HH(;UN? }w|w̚5 J袋ѣ;v$--&MHII yyy޽>/JP,pDlwFGI64-6TVVr222w 5P.k\ff Ƶk. wOg>pXvеŜN'۷oge y6OLsKqn'%P1ANVVVz 3+;KV斧{=pz\ ojF_˚P|YޒV8qyvſ XUǥ;[ h0Lx=a322ɩ(,,x%|a!@pܘs^^^eFFx*ժz+*^ _4wo VkD BJz's*rss+6ʎ>{ْ4oe*ۏa[M1^խ^l6['G4.E/3Jcg]hdyUU> `@3R5PAYQ233qٳgz 1d84Ӄ[4lŔ/=aA)zÓ!@{+0(Dw9/2 `<}ogQ74ӦݿGq o޽V2(---ݳgQ)ڻwī5MKlШQ#σ;*-V+(z*╢cb2uqa?H@/膮#HU4/2_pNGП/C}ayӣ@ýk(*װX繄PYYIvvvn^^jPpB 3"??g[jRUզF D 5.K>kHBBNYyGXQ,n Mݟ~x+))_\\EKB51B˻dffrqaOOhuLdM7?ۊ'Ջns߽ZW3?Cp-A!F=*++fǿ?=Ok(27&&#,*MXIoָI].!w1ji+B YAXBS'k{FPp:h|kvaZAZ nM^4j\kyov8Eo:zlz \?ƺ|=0)2᨜`ۍiWw.EXw ==CъQ-լy҉6wPS Myw4m+ݳoC [lGmu8'8]Ӵ`Z'ģ*.]Osp:]ΛpYן42oH%r!:emv*o\c?ScbxÚl[`Ż?5IDATSu,A8lHCoD؀bnDu]wU'tT85 MsMx6E=                                                                                                                                                   DlzIENDB`PNG  IHDRx IDATxw|[ϹWq3$JR6RF)~[. B a&؉C%{ّWb;%RȺґ-B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!BT  #rIҀ{?P|Wd!DS@%ڵ뙚599ix\.+)) CRRvq\v8m8F(qǶm8p`0 *p8 |`8pxPvm1} fI Db t{1.33_zzzvdeeegdd8^`(D(RAB!B BaDz,eYcq"}m}aa8a8e磴LTiiYRRb|>okqqe?e-+m@8 ٵk)]vٵK.fNNӹsg]v~WT* Pض p2?Ŏq]?vEYRҁm2M aYeSRRbJKKKKK)--]1XBq1}=.;;O޽^{;ݻusBeee*(TEUބz,﷣z 0L1LrݶM+\RRBqq~+))ȶ/51+ `$e ƚ9jԨQ{oȐ!IJJrJU0+򦼟jWtBi:Pyy~WII|s H D ə;hРc2dӾ}{林ϧ~?PH88РJ"HM]Y7EYk{ox (jOqJ!Xݻ6hРnj>|8PR\LiYO# $jZ깚T}j]E σa`fP2\` BB#'rN;v윣>:c]n*.*D|>,˂:*ma7؞T zZ l`"im; P(? @ 4hy#F8qD'''‚)--Upђm 1?j0K-p8\sEfWTNԤ ~uF2N]AA}zcP(dB˲AOZ$DLH DfuQ3fLI&9J)GIqTW[]ԷR^HJKK)..⒒Ғ~?A˪u}ѝjצRTd *."D(44*_AG8NE 7}B$x;/k}Çlĉ]'M䔕o>UZRRYA]W놆Sx QPP@aa!+,= ̉]SP{` +P⯍ H B:ty!ZB999לp fΜi8bz'2R p<瓟Ϟ{),( yn֥0* èϪƼ>GoTx=\ DBhN6s;vT߯Huؾ};ywK#o: F蠭^rtπ=Dp'\L;I~5hРOcu Taa*ë+Z;wd׮]l߾;v0cE ;CB- D[1fʔ)͝;{"u5^]ܹ-[mVvޭ[- #@ zؖLIv4wܑ3gδS}cu޽[i&vH^hRл.މ]IZO>7ϙ3'{ԨQFj_aaek`Ti6oĦM84m(\W@ؖJM_z@ #<:+]vFޮ]r}l-%~J???7qJJ;<P( ܄N=,DH ZlÇ_vꩧ4sF @)Ukzk_)iڹ6l`?PKhR":IaeF{۶sG}iyyF0D)UkKʚ~tK׮]lڸmK/]$(w#p#f $ DIJJÇ_3o `@ҩIqˆ} qDH8G[_4!1.SE4I t%%!ɎN4HVƸHI[4o?a2$!{QؖH$9qz8EЭ!DѫSc]2$ 0RAXFtm& VLQI{@d?w $hz@>0(qD3@B4 K&?GŊcp:։z\u9C9 PVrWJ;q-j`)0؋l+*QLwtTl4"g^VmJ"6AZŵ~LG.呋= ܇>ه"/Wy õ+늀TQM^&SNP B(  Z~(')z_YiVy0zw"ȏ t%Y1R A`l@%(@ "XktD=^9П@gd M#"O*0'9HЪHԦ1*D"}9PWlBϵѕs􄬽rk #Gl"g({31HBkMɱtO@E Z +X&92/wtW}}qVVtˮ7D[ Ag0t9 F; U/6pG* [+zѴ}ѽiV$0#diအ% RZWG-W^8hy6CY@ )DCpT$IГTus s`ًHEW#;%っS6X1l"':9ցɥ#80E$ Nd_Unc]ѿQDә[~tno@ DHProے/ : H+?^=v-L~N$G.NDe \LuyD~)c|lHptwfH~=/ڦI`{"{^ΉuyDIv o}=/ėl<΅.DDFQ@DE,qqDI6=L3]lض'@AّɃmjCY$9s.Yp3p&&{%{B @id-ז p4H-3g#;Ƥź0-2_ |܃C\GbGmol2"@d @۠yaǸ<ͪb^dR?t aѢ,_˖-Kmc],'C; G D.[#GtzfZQm͉~"a6-UbyaEn;i.p&d9\;-^iUc1+w x ;*WD~򈃓mxl괨o@].t o;[;K6*RJhQK7ߜ-,k"&*7[7 4 5qo,XGԭU;_DfJG*$;Z`UlK/_6qg83Os hρ -L 48%@6xQavB/C>r5-Us'AJtBEnn9{?ٲeKOFg;<9qǷ5{Rh=;DF;e_d} XR~OѩWG+r"į#m~KFKBQK)[(Ek~R@Zk,51HgZD豷Pk#Zh5ztq"AW,o\7 Y{Bvw@Zo:Ko9-mket L? @T6PY1p$Vҁߣ[Pwaq^۶ܯrL|rw]|m0m d Ik#c&zؖE469;wK8@&*Et}=3a8#;<{RDZk]yM7r뭷t-g)nCaV0.j G'\ *ȆH^ӢCCv͵7C۩ S:wf0n"a4K`'Q՞ q Dzp,r^aeJt >B}pmfBi|/nuy}{ ڲ̆7a)CQN)E 1)`idxD*Oc[3N&7*d䥗r0dT]p\I8FW_)\>PALW_ũoAyRG_ggg?nYև}x݅Ǵm =IJƆ'ƕO&@b :Ё`d]~"3[8?aРf ҵ2MXQUZZZ> jp%%:>>AyЧT[.Xa}ME߹lٲ!?·8GM ѶP 2$W 71-HzO*px#]e@oN.[zsMkd 6{c#X-@ZZyO>7D!\^N~_LӟH֭^w1GsTJ)R۵k?47w9+ܯA{PK.׋ :q6ޮ+i >7 Ko[kw~'zO1i2C~~6!nꌤ$v<"ҒRR.PHgORAzϜ_g驻r1cƌs|>w+AA˖- dz[+؄ e>ЉD ۵Vt?n"e%~*]PKwj*B߹sC!p5!?$yyر|a`+"T\;Ja(C1K4>lx?~<)))UZII|!pn/g|\ Jfc޿A/Xl>#~K<\l| IDAT%XrIoC[;]m|M*s`;=;DzH+֮;w[zLx(Jax2q]_U2j*aܹ3aǢ'=Od@4vj. {x{8H~inB \B9P<+Y7S<1ѿ2{py< ߔl&Qe)ON~Nqd'`ֽ;)^=zT@)ʕ+k{ |)~uԶ@Q (ȋy} .-Jq`zyLYџrvЛ,iAO?}&4-0&8Շ±m\r1vCPJ(/iLk$lݺƉ [ڇaZWc`m-[R]{{6F&Lqs"vGɑm|AwݶfI+rPZnpt9~?k m)x7P;+>^L\X_JaB8# | DL䫯($e{ϲeKG+QJu㼝Qi[Ԃ"3FE8:(9p,d2qH1LۇŢ-hPm \QWx14|>۶cej 4rc *s&~uk0 u8pN0 ߾}xR;~ݺK9$7w˗hѢz:%hhr`$at)$H nCw"xXTrщYݭR;tҔrP#sm1/lޯNRTw jɌ1?~ܪ{ʰ^{#˗/8΃!*.ˮhpZ*2 z=q¸5 1^7 -_ȲH.?i׎s?z1=x<+Vcz5JKiYl?iͿŧט[馹馛 \sŒN^l@VKft[]/lmd`bHGբő%BuWck \PgʿR͆Pgd/~իpAc \ lExgz-cesǷ&y}vEVXVhۊf&u` ;V]L~w?Vve6*2qqUMИWIn1b}V583\WGԘBzhd WzmڊƓ!0Xk}u`m][>?>g[oŝct[ԼD Q%`Rrmj>v7otԉ+˲P5X *7wqOl_wU߶#SS=7׻mJ 4{ J D3jdi}[kzzW4իJa͊+yLK8-Z\QڻqWwۦ\ ҬY?m=2Ɯqۂ Vq9*{`eQAJJλ2ML@)E=-(@Yavr NNf|n.*9_ƏGZ/̦MXf __7gJ9k;.Rmǩ[0"KyS438 фs7" ~c_4}Ws}PJ1u8m~]CXe>,aټy+Ri#ۍUGaqA2zda-ؿis G*B`zM@_!C8?/3+p,+$"3-0~)ض8OX=EplO1zepgd#ldbڵ }΁mm@OvYM1S? XӔ+j'@v3s wN]h&G;vLq~BL+~z)P>\n$o) s Y6*wc&'ӱcGKi0vovQ?wG+-[,]$M)9@gm˗/cѢӄ i?`ܹ~cO(.((ވڦ(]x Aߵ&O9{#%eY8e U䥎-CjLc.c-`f$1\nvwvTPv22xܱS]ӱ#ϣe޶ȎCַbTy 7g۶Ga-ʽ~X)S&2eJ5zo`pRΥSLrʕ U66<'VZE#r)O=~˲F+I"=x̉'L$y BaBW_y{Qf)uN۠>Off&ND❟Iya!mclɝ:U~ CA\i8d6G?QCu;$PԸ!鬬|jm-Z!R-QKɗ \uv-Guɯ.PLBV4 O;f{̞)--o6ѳ'mϵjN U/ެ,&wu啨jW0^6_\6ۍR}֗^F)8ѫc̱mt&+AUzl0ΐs ~vq40]T),_~KO}ٔ)_[jծF(s#'_}} 4~86MX^h!puJJ:mi92;֨+*|0ҭopٜ ?x }bgxbC9p`\`/.pȵ DzسvZMRv3E_2}*@S7oBɖ-y-O~80O6+V&~Y8Q-?'3@mÇׯBm޴^#/9@y'uک+iQysL?;:^Wntj'<{wf=O.Zp ÷>ZIIvib^q%E|&cezAbcdSOҾ_ƾt?n:2 ǧ8jR HIr,-LY ,| 8fl86:.G^ O+:3 iSmqɦaV[E(¶W\.XkV*1x?Mi(Э!R?PIRA 9L-HQi H-a{=9II~%~_}$cH'o'PXؠ:y7rMpank;n[cL̀Tu2-Y\}}58UV6 O?sk0t5w  ߿oƴiڥ$Vj]=J)RSS9y_UЂy@z}j??{#fj ӛr)߻jR elmYWrr&7R=ݡ~t/Q\ZFêa؅)zB]va… ~ \|{Ç /j +W Ork9Ô)^jUi~[%?q `D1wiSOضmXeYtҕY+^8xؔ- > 0##guթrr]q.2{R:*D^w2zL4k{q%lw4bwTH#^42ܑn]T~ ϪU+g$VM2y5sV֣֘MB*_,:*.ЧOcϞAIOʫL0* x9 V$uZ s2Ǻ ìkqN=T~}W |̅:Ƴs7εp%'3x1.'.*ǡO~BJNw}`Q1qI< @^>_}i7`̄E۫||kmAiiiYJϞ=e0v̐~Az|-9f  W^t_}wVZ)ýWmUZ:0])w{i۷1Ub8 =-+px:iS {8ѭr1zhVXQzjqY\gi'ah޳f :문f[\q}JJjY2ϘgaEb$%5~nCd~7wpYYۭ;(aLӨ)1tH}ǡՌRܩ 6F뿢RB/\rCjl6+F\1:ycƌaތmÏ8Y43 Xzg,옝sGWA@ŒKԩSp/w$.~Ҁ 8={Ɲ7id \٦T Axnӧ؍߱P\X 8voNt:qr==H_[,ƍcuv3^a̔dV2< q%%L2XճPPPthl<:G__~Z+8&M8yʔ2e)S&>LVr _OXlढ़;w O<*g]'%yU%%Г w$@l >c9県do P˲*׾VضM0d…̙3gǦM6:\e}W5Ԯ]t(@ (OokޭQ;'+#nӦ&# v7Qm{mRtz"izX[K0plg'=r:k&fJa),[oaGeZ?v3|0 B999,^|;fe9s0_\t'n\zuN8 UTmY+W^=d8D4@|Aۆ%:t0ܒ۽KU^D_GmaÆK/{}8sCs{ Xyk0 5g+58v(DAvuʮ#Ə=Ψ@G_1 һw3gAH7?=t(ayJͻgC-`nӧqUWl4 3%]|#lU'LkRȡ/Υx`M$m6]{`q(:-s;KA.}TSno8rŔRaÆu[n]7۶YW޹k;{\U)zpz:в^RdN3x\-[ży=zvYo |trl}0܌J&u`+=L?1 -{H]QNoR80KStܱlL֭"Vޏ>&GOR{䴊K1mr@)ʽ^}1q"[R}{c_b4zߚ5k;9"tӢ9yyyB!gԩ$@F9b۶Fq ZI]vI;dffz&9ôi8wLqD7t㛁:k:~<zMgyBq+^rO>!܆|v87+sOA{ =, @~>|M?O.pd#D)'S'vYRWoT2 5.uǽ%O0~{|8s@&77ze˖:, | ^+-v|xݢԣ{@c(޾n?WF~ecJJ(z;ӟZu뾸Xjժ^.e[L2#thN8W^4^B[>S`do ={$ۥpxo@`zNm3uTNhpuAOɩ{ IDATILuem Q9n*2@DzHՋ>g2M ;j| vSu+x Dz6#)ix| D?fժ5U[L|>U5RXjMąÇw0u2ړMYT :Hм:KsQ8Nc`@)ENN]O: #fdx;d4b_}M`_ͺK̚5J׿ixA.lL2y0 ѕ+Wܟ8~>_}Z:u67n;WQ +@3N|ӓLӅRJ@@tEc-\pz/y2{PZNﻏa;]M/眃//3f ;@mLӧi7o¿{n0;zkIӇ. JPGA&WOz|2(lvyyVi_}pY<I]ڹO?[ǖm)*Obẽyp,v}0hYY9V@>lp\hdԎ"IOOhXLDuSǨɤ$ RUM㒥yKEm۠iŹ9?3f;Xnw| x<TWW茩q`=ɓnG%I[w. 4c|ݷ;0w֭ <ѿhjᷤ`[4\oCܻߪv ݃4U vݷu5bbo I_a`]/܏P%dlCrc20u}-HĦ?b+f:[>Ú^"wd w6ܫ'=O> a*HCl~uXԁQ<#Zp;nGN#y3u HS| _wҍY{dYx{t5LP~}0&Jc!XVƸ[0MٳgU"00%?}5Xw^~u^]H{1&MxɓO/ceLIᥱc pXqLg&Ԕ.z"uy>S׷ Spef0K("@,HSI %׭4Mh6=X{睷9QR(r k_9: qIeerGx‘0i:uev֭'5 z ft&ne|CiZ/Z<Fedggsuլ_8oo_Bt=+s=uۼ(˳,µ5ەS-d ڵ;e$9b8ӦG4_뉅c/q$%ܻ7C~ixm4 ]4 t4L ӎi $$ת {B ~3: 7-cU41t2Ym71M Ӵ(--f| s G>,aD;h@݊m>oNXr?y9DpVBeeŨ3,WTɢg-,ob$I"PRfaE&ȑ! p$oݺѐ4X';!ݺQ ?sL Zt'pM̙S՜9s[\\ɓ>~$R!8pܹY]tQJ0ͿuhY_ED@$ 8p Hm 7t뮽.MQV?5MLKX5ήOہFLϽ bAfdM$j.;ls3Pn<ԔN}=VEC4^CYM**zJ{wVVMM#o_{6Shq vbJ}Wz:)t@P [%`Hmj3K1 m9쳈Wet׿s~ֲ(...{j`_qqqɓ.a{үkIsͻ ;w?4]7l~e-q5)R$vlX1vec`K]EtzADWVer-Zi̜9}D{7#վπ޻zP~qٌz$EIHgW\{-j/GyڮA}tݻ qNg0y҉'IQL/co ZjdFw/y _"4]W\¿]O&arކ(~}Pd{<3' *?!U+5O<ѯJZ?o;CBUU^~3EQڐeٵܓzuΖ.Z2 ,tRjYcINNNvbk' 2_~<-qӤzHYٖaFVfݒ!`Z[V2?oZCU?UaÆ D=bDy.iïw߅;m,4>lZmkB휏$4X|ve{ ?Τ$&MJܠlH6?$$rKM"l ?F7[X@RQN1|,]ǕIOÓG%aS[~3#}~H팸\<*% SZVƲe+ilXBNM]Ǜ͐?Ora!~\ӽ{Q\H$xw[FT ~~5yؗeY'vv V[{i VBoEQT iZ^xa,Dw9(g&?p?N'>/y7k>:c@y͝265ʿ^^egs0"? xssxt:Pee*+/b߰M|C+6r9]Br߾HTp2k {QtFm\ bC@vXrU6I0 K2W]m;ڢׂɢ{cnGӟHz\ؖАXִe#,uᆛjy'|"? ӫەf|5 y>!MKD ,"0%%uF<#ҿ(flTR;3<#=/7Ӊvp8D/a⻘#F"Ȋb+ e^ČfTlذ=t}#0vYGv820@m7,pM out}$Ig"̘-TǃocͫP"Lm׮%$ilR[ffSOoH.lz'Oƕ!;DjjX;Im Ġ+g1|8wiC@RU6<U'$z]6dPe%6 \s͟ k]wݽG < ?fȯ馛, n>Wl.\YdPױ׋BQd@u"0p]רe…M_M.B)CDۛݙp>#ү GfFiHi efo"HhFmm H,Rmc4 "r]w5!BLuM}Ov[LN.`g9aS8~N'Ҵagbܹԭ\١9 >,1u#2DA, "RWڧfX-I(ls6==IU:M Ox[wͤy:$UM^Z?q/o~E ,XOgF+/o߽,To쩧8u$VDح[Ky3?tԨŚ7_馛Ooω |gKEeb6뺎áGFF:ɾmUZ):IF%B054aÆo޴9HH"+^Ż~NS; Hˤ'=h1$NH ƍB!L \paiCCջ­f7瘣ѣ=JLଳ|_DZo@4YIN&@%l|=|IGT~Ag)"]7l`P5Kw8[F4J |9ىFvS~a"B(AXbw٨^o4DlHB၇5 0"|=3#R:9VT|L,_tݺu{ppĈiYnyN3PguV '㐿O>dgabbԗ [$% P+WP[_˚5?Ğ~򿕚TDkZy|q<ԣ$Be"I2UAD D7ta?o$*K1tW^~-Gx5GŘo•ˮ, 正ᇟ4̸17܀-|ٳZgIo0Eŕ dYQkV?k֢XI1 |aÝr풢`:~M/v9832py(b(6lb;lI"q$z_%]81(  sMt^v'-{/ʊ%zݍ_}^'OtV$t "ô, j`Gv3J((LCC#_dÏT].(T]pcxѣGwO>Z ۼy$˗ocUTTTEX //0bFdk׬3nH$4L݈<.wI.*b̙Gݬߋ|umsvuVx}Q|0ǣtoWΖwf'55v(.EKα(;Y}T)^X) 4tRgW9b(B,Cf@wXȒe2V$k*$1w>5 :f: ~G}3~&Cڶ+ۛe Cp ُ,$'' k>'h_|H|igsk3e*&>4##C~g1!$Ȓ0\.}/DNv [!)k֭[Yr% x L>5`%XtqM7mk*@[iA{#f: eab~Dj8OCuѸ315Mlt;ުKŒFbU;gׄW(832w޹8$[<3x-\ĪOUH8?& OCIÀci"jG_y=e)7h?\$`{f$7'ƌTURKsNUU%֯gM457kL^~~TIuFz:EGY'O }v )z18=wsڎ$_x3߳=:|6ӧ=dT=2v-+) _~ɜ33pi+*Tؼ+ IDATMXu}TΛt|f,Fr߾ q)c"HICX4d^Bm I"yc y o%3 M}P=|8Y,o[Us4N~ )))=yOQVV _0[H dI'xH$ȑ#ۧ/.[ ,A O? =`gq&.N [_hZ}fɒe`j¯Q-_Xѭ>O$M%~y 4/ ա+`5.p$JjZI^{Err)((K P׭[J*"Ճ_y%Sgj uic _xv0gń0);Oz\.fӸn=%Y6~<)={]tgJ ݦI樑4X١URb 1 ˖:x,ϒGGq:h\F$PZ%аl[}Gr%]ɉ8T-FMaM#н;X2S$k;P /k {!3UUmgK`Uʇ~,Sرc(YFdEAdEr˧^z el,c}h4!~ޒfL٫+fEQawLCx雷lߟAZFnX$Z=R[[vMnvyy a$'%o"+;;o(BZxj;@/Dv3u䴽#)P/]Ar8pf?T2 @v805CmKJ_GY ԯ^EiP= MevX׭O8wn.Kc o,غ#cPTis=ç_Ry*˘sQ$칭3/P\.~/fcZb|ȝtH( 裈Ҵ$ѿU2BM!7 o>SxrsIIIsC=DC}=|*iiEljl1->& iA/<}" 0 0M222)T{ϫCݿGBO!ı8g4Uw݁u\PZ<=.0_~f\F)Sdf XrZߑPO?ֳǐ*E'v cˆe`ݟǟi4,4,]F{z= )0P=n M#QJ6(OLnklb;iZqlmIU(}M>C] _r2K>@0M,c3 ICt]gp4`:ДP(LJr aPT>#ƌX(UQp8T r,Iـ-;HUj&ޤ$zɇ}nqyJGrJnD7!+ԭG*.K-$\SGXgj*N= 3gr8pd qD ˇv$U凗_y) >QZ1b8a7ހ{v$YFRNJ+:vBHDc‹/vBsUUPwGG!p aL? ު*JޕuߞE'2IN/ۉ}zqefeHITt]H>DŽ hF##s (( q{ʢ ?O>D Yy4553e$4u܃NwJNv6NSlІ-IOOô,!DH8B,kabF'-:S!)xIBK"==KcBJ7t.7n<琊(+Y4iǾ:uskRRklls\ށrҥzM?KЂA`9+DSaa:NG8ǎv0~ܱLz5z8g S*iטw,JKc''}P!WnՅLc%{ f,Fѩ'ﰪuKDO#œ͑/ceY$`Foі3ץk1zְ.: -w>B!77h 1MBZ4i(.,N'9,^DTǍ\'{GNClO<#)KmIzR6v -@Ƕu<;<ވiێ$N$Qݙ j!A05 bUW2W?.ղ*Zs3+fgKwߣIח>̈ē'B C͂9TVw?F4* .lzabEBh1):]Քb'2C-w'r =kagүob1H8B$&Fu}o[Re ,tC4MCD0I)Da$ɗLrR2> 4Z8#Fo`.dY/擗蚆i躆k1aR˲m$;$&,b^ lj +!?uu7|e[4`];=)2DySޣyӦcf=,PE%.#Zs0p$'QxT2G5l1X,BU;+SU4IݛѸbe%K,)ɤ (am)yAу?睝iM<WZ*eP~ഉMֽHJMNŴeUUygݻ7nl=r\h(ĴLFSsZ{54 "M4GAIIV&>jvw*E`yOͲems3gj6Ý)yxWJ2sf\JaC$"X3<&< [=L1!`Kn{z?59DASב$~KG'}:NXW^ek!sH,ZAkol麨lHF4~瞋;+^mWѝ OX.K$ MkdJEUU$5[qږơ:,a84fFH-a(PRR%Y蚆:(YY r/nZR `Xe"i`/~?f?~x-f~HM<@sN|i L˲l eE}QN&zM?/e0qNxܸMm+F8?ost] rEGMg3*Q~iRk~^];J$HgJ |#4ÆiY^/r"p˲0"XL\u4%IM'JĈE;>!\fhhn7a:Xh$J4#EѢQQ:F0̖)xI(4tt]@Ì_xrsoglYII,XgǟƈŐ;a:ygi9$.s#e ziZAccHXT(hHDlHp8D8!D0n CE*  ׆01 6!2H21ߵw_Pȵ50DX̲P4%  Ŧn{@&6o#́fj!B HXX eY=86f!NC8{: A]׭} ,@%GDb [ph4"8A,#bb1bZLLݮcxgI²,a⯄p:<~-2|%Ő$n7EͿf3MM"P[[C$?TPH$b?<Z,F  ;++n-ɦM1bУ z%p @`1-qFc]3N4m*ܲЃ!ޝry$w+g&2Ccf,r! "}V|qzlb#W_QG0y" ղi-^C/^{8M\S]m Ӂk"Qb-GD"a"hp$7"шH:Q[[/-C4tM' b!qukH{1tZ ? Ń`& E477.@ (́@+oGH$B8"(@jz齝R`$&PZZB0F/j&Mb}hqxh>{c$E=ZWripuHS=|޹}#"ٰLK(<zN\A)r]6LIa0ϐ>t(F8AIbuv9wh v,6JIɦe `8Dv(ѰXHTlі@H:U5UhF^5{b14M# H]$^eKlݭ5i!UUDDO ৱ`0H E?   k^ H@cRvĜp8-o9h<}]n&cnS>G Ǎ#wv•@ss’eѰv-k_}ucGO,8X( B&yĉ 0;;n025.YY0c1^v)|,{WN;q*+++C ™UED#&HnB!BpjbQAb1h4%`jcs,"U0m W`'755G= xx<֬YeEXHLàJ8@È-k޲Uꨫc[,Xg~DҎ&?;*?j',29/~GkkX^P+%O/ ֶ%FP/ izt;:x/v DQ|ikvCcLhR;7WW?ж!0Q=zvOϓ| dglm,ҭg"oeZiB^[1MMYN> p$X|9E GBH;'6z׻Ua#G w$'QPXoCrr2j]55,[UWhb*++eۍi|< Q^^N0` urmw׆ap v._" 0V4e7 qyIKMe-ȒDuM`9@]][6o&++ ˲F8|>IIIxp\?1"MMMP%Iwg[|E;~Ud/h FOt{IBq8X;>1K=/'9~Ǡ3 , __z~ KazB侖BUl5 !mAHܱ,(S&36ܲ'-3G grml;[n!TNpdɒzv kS]LJMM\6ٷEmnRoE͒| NYy9TUUƍE?/C㛿iXigu&B1p떭wޞ݀ f|\e$[7 a&MMMԚVVVRXX'h,8NN'm ״<,hp(DUU\r1$ n:^1 ]^` $$Yfܝwl+_ ڿ5D; IDATې$Oq &{/S̽;=@=hM 2ST|2oaIzl{L0pgem$GD#eLIEzC|{ǝ̽jV%ǣ_~|Ǭ\UVhX0ꄩVj6- ;y, ?' t:ųbmkÎ$tVY B~vY" RWWGA^476;=z Ipnnn?T؂+M7ZCMM,89lRHMM%Dvv'zB;NTUEWJJ UUUqhsSMMTTUqEu0ux5G.q8\iix2ۖ‘Spmۍ{emhdIQrs 3LIas3Oܷ/~?ʫ n݊::w K)<>àg ;t?8{E$EekË/q̞=O?}g'>.Pdɒ[h466;M7\OEeu"`$UW7 Z8_-]שn=`,,‘`'sB['t}{`rX D"k׮ӎ<_cS^UU>|8k׭#5%Ҳ2d9rrl$ h.VeT3<^xi d)) 9_n#,־ѦzqE;,$Fj/os\Z߾67$KqedHуEЃj% IQWT7֒q0T0$ 0d#(w~Bx{>; Y[yT}'{[wY '$F/ BMgnkp](l}"_}iDc23E$ dC1kQǏgժUۯ_wX<z聇 -F())! *-\UU)ݖ5]e!+RD0 3k?3D} @ ^.Z~C; OߏŲ,LL(+/GV!2ओ~CmI5T Ͻ~*}2sC!~ou?/U?OqFw3f#)O.Pee 'L`Wz ]v9^֘1:Dew`4^M 7Ҹ~=y%._Qn|I?.\~Gt.I8nz#\.+޲tqǢNߌa\xWKs(Ȝ{zL.;xgӝh%1]4\B5ۊVe>s*2gOLFfY2FV5ロZjtʮ"v'koetY 'z Dލ5x/?RWN߅?s6ź >d鍊LPl6$o}KX(e/Xi4 4 HFL =2yQ]QGݛ>幗Ν>s *ƀ~wԿ:^w]F.5j֤M7q]̙0qǘ:uʮ`T9Eh}o;m+9Z%w^{ 0$KZV^xO (M5=}aW(DIzmNNT?^)M#Gհa@s!8rrMHsikBBkޣD5kJ;}*} h$c_ {b_4W^l߾9ssf͚zY@˗'T/pȑ#YMz4uJ~~ w:V"""<ƿ8 ,, ZX,[r9~}[gff*J%Dn/\h'Njлo_>k6Y#Jb'dE"v-M7O>{" hߍ `GISF`>Z|41LNQlh ҺAآ%FN6- W7m#{596Վv&R>TŒ^lxh:OȩY8QuCX(cG^^-+7t}/pTUMIt: \lƞ鯐z9:Tك֯Z斿WDIl|~_b>nL&MO<{/|;6A( U߳W!CoOH$,]+zs]wW-l&!!łWNXL4 6U/+pw;AĐfCV 0:tݻw $ןh$,ZzjծE e |?-Ӧ$"w%-pCBmDXsQMpO2 ;N'aDԯGLf%{+BLQ_S_"$WͿk~uNDg~>L ۥK>C7o^_߿M*pEn\Z6m[ C#Ǥv{(T^L^^k֬Qv)nAS1,7ek獿!#Fȑ#Û4i(nQ' I~ (@sLb"b:ΖP-JYo۶ ]P! pj6{H߯z6VS'A@I5~!4CDԫ|51* ~wŞd0 lԿs&=pu|%@9'L=7q> &\<%lAk|v30_~T||<`4!2[n%''gj߾=[,̸$:w, m'LJN-ZA xGQo^@zz|闁'@Y>{@Qխ۵24ٓÇyw#AdS^Ӈ|ޢ$qx2~?CKx:%lqf.0n STqη>*d$%a =\mLF2}$}Y@*r ˗/G<3g%I޼7*Z,4vUGGG k(HDTTkNd2ѨQ#DQl'ȠN8qZ{5)##?O>5jHhҤtA( aZ J>l?N>8cb8o.}>.P (x?;'3hdFW bպ8h?gv.BAUhs[^l9W1EyyCBn#t~:S_ h#HOOgԨ-c?[[NA & ٠"PebccA !!!k[h 3ƅt/Z֮<̖gn֬kԥC*Z*D23Y2jЊGLUqxhǞMJb[Y}Xћz~fy׭+}n̂KME[j.(=_ün9_~`̛7rvl>̿k@i *8\޽ر#۷e9qB_|qUddd\:u }@!Pq?J*y 55`D S+~Ef@*J?6\~J-3#F5TN:9GSlyt+oL0SN1`@lٲÛ*i y @IM~ܬY3 YrK+/'\W?~ɒ%3wԩ3|NhVklrj6<0Nw'ر [N^Bg߁wZ,Ct,A2Ͻ ?|A8Žk{sl,`?0tٯ q>]O#N2X5A@\pw~ \rCԩÊ+/0ʃT<~' *GÜ<џjIN,TZU2d.,,l{>}yUWxPÇ_}՗111vGj{_/@EN<_^s*`7KK(61v>C֭ QCv89- iM':1g)*Ǝ =hzQ]2ɩlE>wV>B_cpB2H۶ O?C#~Eɓ'/Ww#44ܒKQ pvM^z/шd*psM&;INNfǎ/^YӾbC=dɒ"##u&cKsV+v I۶mS8phCy xԭOZVBv $aas+B'\_ Imkző_UEyyG^#DH=;0sÆ iӦMݸq5kM&,t:=<`ٲe $R6@h2'2RRHG-ЙLZ*AOݛQW/Ҷ-jsɤ̛n4DՓ&lc ר3f}>(:2o~ Hm.肂8v-KFJ֭}뭷5kVi/III6ϥ-F6M9$..@ }~쾹E05jd:u}5jHNNޢ*/ҥ9B?pE.SSSjժu;wv=!::cvg~^힮iiiu~|X:^8L~oD嫎!}!2>^\hZ|ar3뀥's? >w$G8x16.s8Tھ{ٹ,W!JΊ{eCu_~~)A Z$LY,i{ P@J"#"=w$'7lD2i͈rOV'@qcKQPB8xd@UL&/Ymst2/_>'O$ T0,77΅ Pnx?p?( FӴiә/х\J\@vv!==?x-иFn@7p+e|ٱcvUUk_Ӿ'z.?^z_  *lӼ97n / ttyUOu@>OTfҺIׯA$rN`wQeN7g^p űcxJ̧i%ķ@kצm޼YZȲ\$R\RJ{):t`Ç vxذa.ex}{_|^`_p-.o ==%KkH.mc@KNf;Yy}8.(ZZNG1]4]pW^iyD\r}(rf.Y$Ʉ!4h8/zt\ d"y,~Nn?ͬYo Y{ _kTj,駟8s指K9h;%ȑ#R =RⲋzkϜ9sVRR]w&W{ɲ칹 r,N:ő#Ge˖ `"6/Nyh":xse2QӹȖ3z@|߾޾kzzCj֤G7BcY}x~e CBK?^6ǎ%o(3MM%e\g!yZ{,jKvjCBBpl6{JK ܍-#z듞~d:~%O?4*H4\vW{}!vڞ wo)7pxnvBZZOfǎJRRR (]r"xM<(&UidpM?OC>@ p g}!K_&'v.} Pn-A8 gawߑ;%ܙ6 ^=ZT'IB2go޽{00ȲL.]?|mF)M/45i$W^bj.Pg0hx {eYaڵ;Ng 6d_RGxgVW^H_qyA", Gرc/jRR&:[ʇL` pВ@:źǟ`w{V-p-P*ܵs/Lku]{wiS0I?kkuF#O~uԬY9hĞ˂K5ki@?4N̜+lܞ=iێ]}G8|p23g,h+޽{ٳٿ?yyyڙRυ 4`РA-FN:z. IDAT5u٤TU5lܸq7|M!!!;R;NΝ;ǡCHIIQ!??:Z>ҝcƌ!)){۷;0V"TR#1b[q--PJ&q:2^ d CH(w (."'NܮfNԽy.ĉuY8hP) p.9fհU7]pAz6NyMSHl¸q*peùs9r$>3iJ bKJJk6հ0!$$@J;\Ӊ^ G`08{O)eqUOKK-_|ҥK?٣]:u">! \%ѣt:χIX,N8#GضmsN'y #F`|Mu! ~`7Ey@*rj ;T|BUtFfdq,w'׭+v)2ћ7:e.UEXzں禃(H'7n K? Mر|+U?YXϝ hxbb"mڴ!881cЮ] hO>ۓduJE>|M6Y&tL}! ;\D4~oѢExfs(9BCB#"2Ir^>#mzjj3 . `>uwGot0:1mΞ9˖m[ /I8p#Gb ̙3;S\b߈#竣F  >t-~Kc?H ,qiP_~m@O"W/-}MVpdJ>H6oj-W`6{vQ1d/8-ErcС8 s2ba˴X0ٓdYFV+_=wq4kgڴiSSiy! ذ1P.;i}xx p:b'**fZO MD=6&&Åf͚q GY tM&$Ij#+3G{.}6'':J UUﻩ_s`q]tz=zbfqv&D0gϞ%%%uʕxxy=pш( B82eh@eA*p -5wD'~}5<$yݺm:q<]_{4(!fb}>Zݺ8:? De>3n-QDqb̔ $˗iԀV$Ѷm[7o^lqUUU/b9ζl߿?kEz07_7!;;s$S_4oyA*?럿[:j*^vl(""cPzł5ߊ`訡lڴ3B裏u8>tzVpUɳ8=ʮ]ߕ_Uv8aC֭Gth&cБ$)蘈Fԍi@L#?`V^6m+vFCĠ7DQc=w#GektH|ޚGQ$ƾ=k0zzG1"ʆgCg6g'7m$F QÖ{ed+__]wbaɒ%eA91dr=5#) $2M3g}?iS:Ęp8ySW@3]zެI&*&*OQ^:$-"D+k޳g7GĽ+,<ӡ7D JcXV8YrZϥ?P`4/ M  o]c<sO"<,V %ł*aw ZTo9 $(Z?(uE+_L&I^!5kPCG"4~3;=>4, =/yzI/ E dpK (/5>T pm>Y3 ^ ү;lf1m 0L|~۷oTj.]0qbp5 JVػ75Ct%s%<:dP`0 N| 9degEff&dfdy֡ME>*`ҥ˽#Fh BL80mڴOd @.66m&6k֌0@k-ܯo_rsr[H)(ٌ`jbͷbZ2cƍaCHWƩSLt <]t8"+Þ={XhYYYP'@͐G?>bɝzkǘ6my5Etl*8t␝W7NcES:$ڿb5[z][{ZD/N'q7٤:tˉ9};u fӢ,#w8UJ5Ih\7l (:J#~ Zo ]PMǑU>]dyOqlؚ֖N矓u0׏tj˸D2?}e$yRO :-[кuksݛ(݋DEz=&M"w|w3gN Ν׻7O$&ҫfMA`oF5cd"N p`w=-ڵvVVՌܳEI:n(;edPM6)֭C^\ >)SmѢ.!!A",,0իMyyQq f6oޜPBJ(8@vtΜ9KjU 4GKٳX̔$&bj `Bitm޾Ç}N=;MS^Ј%@MQNTŇ3'6 nj&鳢6 9K7bʺAoKK{lcڴiVވwXV>|%W;~8~{iĿb!6{i]P'$|۶Y=mW_e˟` "8lV#`Z.8qاO^Ç7֬Y*UPJ!::Lxxx-[N9y{MUϸ, S NÁ(%:NSIIo p86 S<5 Zخر_%y9Rn]}LL 5kԄt:dY&,,͛Ѱ0jTݮ?awZ̵nWrWKM+/_իi:q}H X3O[Q8e=;cdOQj~{l'i/=?j;F]-2p"d:Ī&o`zŗ_~IBBBFƌC߾} `Br.R[Vh6{J( =ѫvf퓪UҸIc6mJ: 5Ć@U'lR +2L)DFFYDDč˖-^Oll޼y۵mFT4д!\@AU:.{ Peٳ8,?@/})"OE1::{nXBBYfTZUUHBt:tp]\"FxNdxAbIT'Q'ZCkA?DyW3dO=s +}z=yÆ"ЙLyϱ1-ݻw@'l|s@cW|7TL&? _F ^ufϞFtt%oڴпAܢǎev߾4 0 @4᠎̈uwoԇ[naBF33Yz 3ޟMl@݈(VRE*N 88:uо}{>gϞ5Q * tNJ&5 @F+&&F` [ 4^ S=@ PpG4ǀ'BZćmcke>V[ݫ' 7CE,gΐu0,0~]]L8m6TSLKpyynD胃5b^@^$Q}p0'7mfciBLo;4äh޼yʎ LRkxE Ԭ Ng}(G~[kj`0ЩS icԩwa7&5ic-ZP'<\3Xu(l3ZԻjdl1C^6o=KեP;5 "۷'??ؾ}{.]NQ DTusWTURSS+\nrpM99+:8 5]wu3ZhҶm[BBBl6tzW)` `8}(p3g>̊f={Qd0`('a*@ pb&O`ZwOɍ߳W@_|A """ѹs mѣ33F~FI֭}73tNpf/.\?k/f3V)"`9֭1P"I]kƭY,@/?vr߱/sZR %}}v??EDDиqcڷo:CBB;.'@$v9[s)J(y.|(<& 2FQL<:ujZvm~z^(LD) wni пB@oĖI|\PU{_tNq"xqD*` huc}њ!20}<%=?!J" o],hfŒ1cJ}G^NHN^H?}%((>}pM7a0KQQTаPMy`t|||넄]&M Hsw"vtzX0Pk] 7ʃ?hV'{pRGU,ZY!}ijyi,*D4,~e'Do6_R;wIRժU瞣UVrСbgOZZo&͚5; ::<o,^_.~CHIL }U-Ȍ( 0yy6væ bRth2=H\\

xAN+(sz*ȲLVfH. *u I~^~A5 K]aP62[a<Ҽyj#.. IDATʟ7{#^%* (E/6EMwSh܀;ƒ}5Ya_zydxaqqчXTY!Kи86UEo6?nͮ? <3gҨQ#, н{wHtt4v^III<̝;S%p1Gqu1h 6nHYwVn__[헇* 3vڷ2j vgd M>45n܍V} |/ZCzhܸq 4!"":2Ȋ"kȊ|>`+Bvv # ?BGB+L:XӦMڵkSG{.>,+E 9 ?Y Gc m$"  rQphd]2h'H :OvBng3ϲ[V-^}U֭[@y݋#44ri6mٳg1P9 Xl6l`Ĉt֭6^{wy`TݺѾ=ڊ<~/ F#yy};7M%4;~wi`,&dYM69r$|Ϟ=OCe+Rbp;.b9E@UռLI.pEfp3mڴ뉎./,/.~,;edYFhxAUEQ^8/ L/%svewkᵲATU%61kFFplZfY%qCBmwzCB8g?t3f 3gĝr, z3bzߧNb_ϳo߾ Ǐd2K/!XLiْO=]D ؁t2HfrQŎэC[$%nwq@I2ԯ_VZE!(3"N'S3<؛*p"jI JA%@`aÆڵl(\?fnCVd:}q@AԌ (΢<\PɦV]t hN?OgAm٢5׸@۩ݣ{XÇ=G嗟itm.</Iٟlz҃,6ٳ~[.giUUl6Ӯ];$IB3p@^y:w(%T^u{*P 2ڵk'P;8z$x];B$\5SrslO 6ZM'zuop0EUV4l0ъ $$$De-(NUsTUV=#f˹"b z3x.! 94k,nݺֿƿIzJ]"B?\AZD ĉ1c~)q>!a?l:tYd*{$Z_c"f#8&/NeUxH4zoFЋv>CG*NOpu/ mʂ~8/~3{|TZӑ4m۶qg~8^_ eϧutؑ ҲJ|3GǎT|$mg̙üMZW ]e'nG 7~g)領nݺ4i$_yf,w}7@QdWjޕ , WK`6lޢEQ.\Iy$_)w_eZ%$@AKHg6h޼9}!==u`̙|P]K tWml}rQˣ+W^(nGDBx-gӀ>[J.SK@ElYY&M0eVʦNe˖>%~֭3<ۙ7oiii" ȑ# ?ӧN?.7;tIt/,=vgla \>Rax <̘1؈Nqr]EiӦݻ7b_eN!!9uzO4sSS+X 'p,33S 6N+((^w{e<{}\\n\85X(R E]I@^:(P \<TU:ˍ6D 0 lL:ӸqؖOKΉ_^Wg6'w"3uTtB^1u%AQZlITTTYLDDwy'=z`ܹXV7/~!vZMիh+:0NE vy|ƪ z='xyFJNƩvSK#]T>꺟;w.9SqZ着#(2رcC;fk| d B;<2{jH=$@,4AQQT^׺uu]EDe]{YZP\XEл$63xNn&w&3}yf-3yyQ*k ?EndY{YxފW_ 0(hFJJ  lRR߲Đ<$uEAulnt__t$/pJ+k>@Ȯ3~;III^eYѣtޝy{Fq={p޻7~/~|a|8\j5c>(E,l* Yv?y@4&NȆ ;v,kC١C̻N9Il1O4E!Yþ>`ՔWТt?9W춨W]؜1ٛHKKc V…~ hhn5kùKXbE˗_RR MNN~$_/(W_%bpϘ z :UM&SR $($X8K4jQ8p "4L+fΜɓ 9,\ahz>6lPWU:z+YW^Ɋ^bqbaܲeϝ,{q<WDۥпkÁfѢElٲ<4 k֬['&X׮ߥDiZJv>ڼWfOV"hO^rʱx >a#O ƍF0S}g8:t ++-[t\lʊIIkfSt?7ڻ\.SpVT~T~! iӆmxjV T7]nxYu$W5!CqQj(IǏ̛7n!(o#6|/e&0|L![k'G{l,׭aGd%IseĈAKEEE|wϔU4dzSϪСݻwwZbvr w$:~=i|-?Fl}?±"ĉwW]U]0Vh}U7=<\veKW^S5$*(WU>>#=GuY1%&&z~o`es:HHH|mрp*xd>gJt=+f I% e#Q7ȣ vg/K!ǻgfϞͪUPYIHH{H[oѨQ# –-[m[V\}5KZ'zCn7c.%ytRUT0PLsS  ~.E3!M p[Vd0Wk6gflW$Sa~_2&>u=oH͌$aI$@; !ɬ,~Ȍ$Q^^Nll,:+V`ܸqQ5Vw8bRSOk ]5vpdEE^[pd]Żv)-%.-2i9`m=&펚r&'oY4I*#(ex#Fe_ Xh~m ׯgΝٓn)_8p\ L2۱#Ix1ۏf4dӑ#L\} 7Ӆcnh`[5iNfb.leVRaf^ظX׿I4~RG y DK#`ths wQy`,@o,N@MLCk SK7NCI{p8u"EY)**"++3g駟G93_z]J챱dKGّd g5MQUUBבN =}?YYYK4nY T5jȑ#ٸq#k֬uv;~~nݻy'>}:MbcykWG~@L U~9$ktD}ρp df6nK{SbR? aCBm ތ v{jm82fc`~}PQ}&M㢏xJp8@k0}cn2Bc޼] (^dIBqxO@|abb"wuI1\.҂:Fhgaь7!qXì{M.xeo/8Q.j},h.]0n8RSS TH^zҥK9x`P7b `L0'ߴCns8 ߽X򤈸III<ߟ҈I#{饗RXXҥK)**qp8uٳgpBZGII &MH YYՋ))ѯ߷* ol_Vط[?sv@_E#M|>7!@Z4l؀ǎU#Mg^`լ0_IxQYHTtD]B f #bL*߰r߼B t̯\m*7eOs)?KjՊ#FsÇٷoNBON.]ҥ 2bуs{EdPvΜY3s%J%˰9<1OF<"ϟOii)N2t:dʔ)<,_UUIr8xkWуNG3pPTVk~=GD~<-g."!djuDlqWK"rq۪dМ͖ElllD'8Rt=`7!..m>0⯭ ƾ^IME&1NG@mL@P+}$$$D=o_mkÆ l߾={Ҷm۠CuJKK꫙0aBD:+&L`si~@-WNBoFiRRcǎ%//ʨqTU%33 //Yf?(J )((`$eb"Ow:a}=J89q-㳝;a$BkD|a-"b}cn``C4Bq5@FF:II ɲǗ 663D hd2eOEi IDAT8Kj,zhx9.UTLB45og?"Rm-(JMR$I#H^ q޽ӧIرn͆(,\M6ѻwo7nleYflܸ^xݾ(aVŅ^&Y l=.#ֱp|Ӧ4 葦i$~袋Yn;vPPPQlnnFLӇ-ZMúÇyh"~i7G4?Up}k.B@=tڞd;uj.˒_ V`mL'>>>"@$JJJGz>ꊳ8qBQjOtLL 6Z*cuтr2(P H!躏 >V8 P1%"Å$I\2d%ᠤsҲeKHLL IDYYZ>cΜ9(|hr]p!o^O=%~Ig$ ngƱ"ڶaÆ t1i#]iР:uYZZ?0=_RL^;|RSE?ά΂xpB6rR7DH}": 0HVq!QFqݘ0KV_S~@u]`eMHHH(뀺5s믱EY]2kYs璝0=zԈ3˫JyYv[o/'+11_fݻi 5'Np)Bw g@"&# -ׇ6P5| QuW dYBnk C 0Ў"%!!!ѣGǩgSn \ӫUhZUDee%v=d&0dFV'MJ5t`szHɄHG6mڔQFEe)L/999SXXȪU()) i%IbƍܹnݺѶm[dYʍ{cȑL0e˖;4~ɓhҽjes`Hpm_e]Vk[4:qqqӧm۶1i$yݛ;waG?_\׬OLj;xqD}3{ ߲f>.]0]i֬۷ogݺu"dhz,^-[ЫW/6m44vILLdԩ\G$+ڻ׎A1)hA;g-t_ m"2={G(ܹsIOOW^."&&={/X_~oVҷ/Wi#V6OjZw7oҷ$;)*Dp l LY$ XEN@ǎ4nҘ#GsxQmeY2V@(6;Ʋ@[ZQI ^g~߾}YvP5uxB V7C4~!i Bc|l9,E+JwBv+bv9wa4Mt9êU(,, k߾}۷:йsghrJʫʬY`m=e]gdXvE4bt"D<713i>{>YoKY#`ƵHIIab \.WH~ صk`fb3f _=/"ׯ;z\.<^ 'O"}{3S5GmۧO}QYf$6uu+Veh޼9P;kpp{>cr8xsy"7&{޶X PUR &fH@qj{L)t9 Z_ս{wn Rq"ji 禱ZǼ.T- Ieu]cxO $ %؊IIIy*R 6d@&큻7b(U+l6$]G2U&==/-[~ݎeѢEl޼={^QQQAӦMyw矙8q"|Y͛~}Wqqg|a[L U&Ha"..g} . 6lHff&7nd4v;dddЫW/RRR,3֭[裏Xx1-x[7n! E[͛yqjD~;)E!"?ކ1D" gWI qqhIUM،e&{V1{^"kH<] ("ɪe8b1]hXIJJbu?k 3i^Uɲ2p#D.?-IǗ^śʶnGwmn8IU4fFVUlVq;vHVVk׮e۶mAgͣe˖ӟ.ٓ3gYV8tg-&Ç8R.mȘ1cTVVgM6\Xz5{qf͚E|{yv{֭En_ףKMZqė0DHX?!K31/Ka~~ crbccu ]>[#_5#II|`c?cҼtRp&;dgg70d: Y*%5%"%%" z@020*M] fD2ố#h=gggb :T+?`:5+_~~)s,{a<}~'y v;G }uHbcc?~<[5M_p9r+WrѐfcCǎMnݚwgfb,4b pQ"M{S"{}~Y@}GoF8Hl[VV ݘJO*:ρ)#84s/++o\W4G@!`?Pjjs5^ǰeUl$<ԔN3c`ЁƩxSlcf6{Y9H7ȚoN[nsND<0x`8+(-- :4oܸ]vKv^/111~K/N{8(0r+K$fdފIhqgD 61cƠ*!}Ҹqc.vڵk.,vYr%o6c$б#OuN8TV WO_A,~1 2aYnA_~@ 2ۗ<ors`q0G `( a^Ip,݁B:X %%:HU=HLLXf` Td6Z_Y!LSa`{z8M|%бcLj#q 8t |1~~ǎ;na՗|<:NĢ^%*>D[Ƶ`lڴ[v`4`xcΝԩS#>l9_^ԟ7&'E(Ƚ}2:8vd ԜXI&DzLvѲeK6mĦMv;ǎcʕ^ N'v]s2l8rk/ 

/U)]2V)ITEQj.䈅z躎,8@7ĥz3I&~jWU @mHLLZ׊pȑj mBAEh L)RvwҠAz7IН־cgV:qԷhle-p7LEV5'1GOi9+bEsijP#!lCXll6ɡSNA@?#F0i$.]Qnd{ym6TQKHNl⧟am֡Cz!rrrvK{=E<׳'l O}3vٕ+tAԥݣtc_[>WTݷӨQ0ɞh `e EU4l|0` P4F IR(w&HA 6$Il6\.^] *++9t:Heu &y]֭\uSKQT-[ꫯcj7bg!{ƢaT4kD?/Hٺ OJ&ǻwق~iGljĕՆ`>UUINNK.a޽\icܹ]Ҿ}{?!55)SrJ&Lp޽|{4Φ5#h6jihR$!H́ŋY5y G £gIw͍7//l6̘1>̟];Mda﾿e O._g_iFh s 2[|;R/trD W)+HHՄw+' 0kMPs]#O5j1P*Wjxu2o" 1N@0OSUU+5MvC, 3}IIx䑓N)xIU).A۠/I[1r#ּ8ǟyi/h>k.Ifff&-Z`ӦM[۰ndnJ^^Aر#ӦMc[TFPwb6_9$+O݉o&]*"l誊~eT#8n-{g?&]wŨQ7po3m4E!f]|~> 6(勶lQjA,_O KC FVm5Ry:#PMӈ$)Є8 RSS͏jj])**uf c1K9![t)`N\pݻw?)ꄁ Gs)ioT?./B4Y p7 TՓǑn=,y>[(o[ees~ʕ+ٵkW͛ӣG4hnJ kٳ#>W'n֭l&ڱ8q$%Һ5MkR*8|׾}a0f`Lt:y7O8'%-G BF8~8-+cռSqt" $ F9~5OFtza-ۘ@<_R˺ByY?@N[ $@Y)'tƲ" j^ӏ3lTB]T]IMMV xĉZ|U0^*++<Mofi8>N=I>gڵ$Ƴf$$ŋodm>]Nվ=#i^dY)xמ4XS@ߛb=wSx@Ըx0iv;<:u'v:tlv n'`ȑL81"Y@x\%x\%ZG ƤIٳgԌngΜ9|駜.Y|+w#opb,Y—J&;نBD~߾ ;}'Y 4PQQ!f5ĩl]%4;L)VPUUIMMAASӃnIII~aȹSZpMHIIﯨ&pn\T}To};+aе>p7Ӹq:{ѡzj\.| ?olej )h (T7o>bt~q*ޔƬ4K>|%BrqA\$ …^HLLLo\M61sLm&==7|Ӹq㈾ߩ@rr2oFJAeV^ĉu댿g;-l̈s!&~1?_MO?ݻ>#Bg_o0|WO~F"O12I3XIY8߭7( a8ya,Li#do}s_$J]@m'Wu%@II { ypm0ޗUYtnh#ol&pҸ>$͛7SZZ$I~ӧvZ ٣`8Fi,}ֽ͎nsFGIH`sWXH*61<( ͛7gĈt*a͆fɒ%̘1Ç UTTW_}wߍ~s,4Q IDATOF͒%KXhn;d:$HĎ;xQ!3I4lHK}y2ku)gsg`Bp !y-u8)!䞐}P)1(h '873p:}Y$|ow  `]Jx!&#`d}3{_̠AȲ̪UWeTUfΜ9?~(rI&#;J9~ݺ`sQH[FIOd&\躎ngС4l0dϨ^9pfbٲeAu W_}nݺt֍n~a8ߡ:k֬aΜ9TZ$@YYweee? ecĐ<:ٳ) 5l:׬r?툒ំ3'1t%YU:=B# !8V TTV ҥ,0,^CC}*ֱZל* ܮ.j!=ւkBj3fpMӂθB*ld 9_kË3TITh?iZ :[Vvz֭[SXXƍ-uAz~`ߡ9sкuk HBQH= *'^VJq6qd< XTiMݑTU%%%aÆol2nwH͛7{nu9cٺT$}obŊ,Zŋ;[ F֭ݻ7UVlݺիWll(//g4k֌={0cƌ2Hzᦻ^_/f̙,*oʻ74ԈYsDD+ޛ*=HŒťZ&r0ES9 k؏S,2g. HD0VIvݒo(TD ZSb~mxm?Vt{U> b*Z+qZn @FF~&tȃ:&ӣc)z}!''%Kpt88p/]ҹsgT4ɞ$w$i{ub/u2fx^7oε^KAAׯ8/6^%KqFhٲ`7|;\CζbZpu_N|f@DK 03EU@c )G^6$ U*oxoUmq'Fl{t@PAVF 8Ƭ?0> ...6jԨN_&7/3" Aii)6Z4If2N;t@vXv-G jm6kC.lȋZ'''3d))) ɶlyfiݺXWt&7$sw=~?3mv$UCs:t҅.]ʞ={j.--Yf瓚Rc dffҲej, o Y2@GZul6yyy|r:wȲo۹sgq8We?3d`7^{dR; S< :8/>/ub"=p7E|;!^"*'_P( 6ݜՍ6A,xma+ !0GNR oLh T@`U6hR>$F| U ߍZ;׆+t:ի{{(_`֥W!D8]B?XPy_W7D+EYfM1Z Xmuv).ZT,ׂ3& r[#b5[UUÞٰ'h 6Zͦ( H k"g4iu]Wz 6dРA޽M6lXlv(+I%v^yb'N U00f-[,3CΜ96mлwobbbUTM[Px:NΙQ7p4'!UW]Ν;YlV~mh6٩+4MYf\qlݺu(++㧟~"33 >7LϞQxqb'KWgDلIp(GA/':> m0P-MVۅS:*1X-c"s@nx=n^n@df *gL(y33^Q.ƨx=,0JP=twf5+qSi6)Hd/hڦM.25jDee%vįIoi#/clEY6+p{dojPUF߾}k ftt]t~MFAAAԑ8xEB1b?,$j46?Gv}K5dĄU&In-Zpӹsa Ot]s+$+++5k0ydv-Kb+;E!+ͩqv F>o!QWXLݍ?@@߳fTQBJ֖…cnUhL"!ʲ a;Q=qU?0 ( ,SVVJ-c.2dNCjFȑ.]"F$rss߿?6Ǝ>^oE8Uz[Ӛ,YtB* \z 2|'#` [/}$M Pۉ^MõX1u U΂$וٯ93̺.ݺucȑdffʘe_{N88iڴDQQs`ׯ')1.*ПX'꽧_>8@Kp bPD8!R XC )w^%`l5Ђ;j4VR@e jil)9iHK1a2"7UHBY5]Th@s(?RcKǫ3Tt xR;٭*fߞWrQ^Qɴqӹk۷s0l6TU~`לRoϭPޔ?KN n9^2nA:t(III!gf~`<4!5x`_PQQ_ ϞMtVC qU cB|p+DW f*O!AdS~ŋf6i\ uhr$*"` oǃ(WGrFc'Q@ to5a︎[,))5T:"$5a,t 4-@NO8 Va%X ;nu,Y-Wn.*ݢ,2Ц7qvv67|3YYY!@CII _v}:k9,{Ըnʦ18\:2O>fRRR1bwvV$Ilݺӧ}z_h@4222>|8=z@eE᫯BUU>|/;R֪ƣ ZuA$"tZ!:}`g#u4,h Bq1{= ȒZ[ ZևPQ9 `; =3x!s!`%DP4e7]X(ZqJЅZNP}gimiaOq ;2-ne@^o~ΒdK@aj~c~ާOt… 9p@Ⱦ۱ݻ]vѵkWtfCvZP qR~9HI>>)ۓu : ,ta*++iݺ5YYYYׇ0˖-c˖-瓞~ډCZZ?(n?TD-ۥӯW o(p:'CfDqlO@GѿhZ!u <(?:I0ב%CuUd sS=D Cq8} da%VF=A;V6 %%%ֱ0x)AGԵ?]%un#|βT94f$q1S>jAoUɢ5!͚\j9kRUx.2:Ă tZ^7$-[ЧOZlI5jl &_8s^}_dwqOwDB$ǞG:c¼7n7tЁ_{ul6.瓑A^^III6 ?~wq 34_}.f-Ь=< ܁HW2 !޳ꣅ4 !PyZ9_I6P2$3uMDmsH6[L|"7 8NCH }ZU]^!P)n#/.@Nyeeı4:S"5`jѢȔǴ2F?;ZjSuRE|ZlѤ>ja Wpt}Ԍbh!KhݦjAl:PŲɡcǎ,^ 6mi\.f͢]vՐm6 PD4\Y8NQU)鍄$A Q, Q^^Tdž^\W)*T.- I:z3$RHz !3ggzֳ;%rvJ۴U2j A03zhسg.cԩS9s^_Fa[$d?Z],5fͼ5 G߯C9h8/p _ ^?[2'?KP$c'3%V edQؐܘUgϞ7{w(RZZʦMشi[A}r;w.(px;MV@ԁVc~}C8R\EDW<Q a8-WP1&!͖UBL)@i6kGT 8Cu@Oiա]r#C"(EkmQk{ C[Jj,*Wd\+p!O`ޜ8Po{$z.}'ڠؘzyBl,"[r<4H"fP&Ȏ#Gؾ};.N8q}h& {?w!~%BNqz@'nV%ėc/T/aXE!CХKv ^p+WҩS'Z{Byye_Jab7 ،PrJND=Ok=|"wWCK=(}%wB88m \l[6`2 2DPdM@Uon q 9SwlWyսX+[DEEi`!IRX,Zmel"FAIBrTIH(*e+%\{\ ]i4D^a((h1w^G^en2㍔EoɅKzS>ЀZ.11 ?CWJvm۶#((HhDcٲn-!'SӓA=>O@E`CWZJ߉Y?R ɂgM.#VEU 9YPFUB hm]P߸ի)--%55^{ z-dWg5dܸq=*tp!VZEjj*(]hLqb|/S&-M:MiΜeNG_bO/$ ^Bӽ{wƍ^PZZʆ ؼy3FVYygz$s<]F`C5 Yd/4 l2NS'PdZPTt棤i܎FATTKct4@]_xZwNsW/ h4r0g uT hWO=wZSZR h)3qX,*;^݊t4dVU)d5y?+j{̶mۘ>}:ׯx}oGkUu9x 600d21#N{1C-Ғ՟N=U^aOLW2xNU1cOL` ѷ/g%w%2߬&> e䇍-y]yPJuؑGyvyTvZn݊`ByL+4&3bs#K^AW\JEb qk2Qt}m)<w!lPr-tMŅ\wFÉ'X|9ʉ~'l۶$Im/qTp/K;&0*ϋu$xb|>N!(`("(} -J9wPg̘Aaa!_~%$kyjCjh4MbU\UTAp0:;9fh4:I0 `4jh$@0/yŌoBA evh70;]^8)S?# PpzծUJ(Qpo^m!tv܉_MjuO>!11￟X>73 tI㍩F{9Kyia;6*"[ 6.IAݻ7[lŋtO ";;Ν;ӽ{w{ YԐ4OϒtEbX|ٺ;$_?D Y;8.R &s#66'Npa9k.N8Arr2QQQQ,YիG޶Ç[90Vli}!QD(+^O@9RE (K(* +3g2k֬* /I-xúRhj I vc88qw\}UrHS ;'C=`p `(7йKLy; 9xZ&u]m5ꐑIX-r]n]*C:ZOqWqhڄBBB2dxQelO>+7|N sxvccٲe:^xԊ*-׭f,Tw_B3h=z4rU;f8ʞ>ƐGqR"mK}cۏԯ`a%iʣ#0FVI2Ne^5Vvʸqʀ֯_͛)//Gղi&+_GT ِ2`-0k@GSBߏZ/JU(>[YF./D )܆GQVV/\e߶m?SEY8 R ]P$ץʵ 5Bw;އRUUIuA%Mb҃nM7q`{c4$1t lټվ@KƸf؟cǍ(ҿ6I E@yТE }QONVSt۷ogڴil!rb\HrD`r}.`@"@djd, wP]q<ӧ Z駟˳{4F#%Ais;) Hz`E4WV6#c5@># PZ0vX0Wjb ,Yܹs/.[P…췐  $1R0KÕR}+p5װpBΝ;dz>[3<@x5"P8 u.;CVcolݔVeԈN?%GHG<$$ W,ךe)%Ee.]:yLuWO%YVRY$l1-&3бcGfΜc=F-DQbl2y'fÊ%#DF#d]'1V<oO xm^kG1N;ݬ}_&4ݣr=VT3n8"##ZΝc͚5޽Yퟵh9# jmAj=f h4x q- ˲xgJ_mc@$r $իټyfP4MfS8Tu<$[S~@gOa_؏,\8SejZ6F#S* "e+.Y:lAAYT0[x#G\Ų:yKK[{ukuRETL4IVbTP=Mo>ӆxW۷|uΜ9ôiXhGZ')+>"((}ҽ{7t:_r>ׇnEFƛ=bm7L@@qÉ'Xb)))U/94|no`@v&+\#b>%&˗/租~FkF]Y8M38<o@,0CXmۖK.1uz ^. C^-h"@T]G% Oykγj;T SkHRAo_74Z-ꊫX*RT\ĴLUӑ[oIN\ӭR9QEVtp:r% UyJ[W+8}Hqf͚!m6{16mTEEEu]X5XKE>^]Jxma;iWQQQ?~y,4hZ޽UV^)ԁc3bI~;;keA az~3~DQ*ۢ7Wp %+wyBpR wglܸ3gp= >3gθkR!t586IH)^_]ו7ݺoس{oXm6nmk/^Ò%2d`sn5uǫ4qnFߺuZ'Nd2r_@U>̒%KhߡL\dVVfWrz ufWѲ,++tJ*fаP+.~d).Y JΞ=KIk^z gDGGAII/>|֭[47:Ziz(@-[X4nkh4l}$_m \7%I"22Ν;cXG$aA0LCLL ~~~5`Rҹ#w,yEP̥H?OLYBlvd~HJJBՒF"['y< >L|aRPN2<6`6ʱ;2d˗/_]Z#st&M8X`7m&5Mj`X0-f B۶PPWOEWW󽰰jx|/0vr.P_@BB^go~@MV˧|FffQ2HC-ƫo{oa2Z4|IXÏ8ucXEZqߤ{?ʄi332,5Yohm,oT!_L:Aj УG6lƍ1.7PVKii)o]veʔ).S;áͶp߳/_OAq.dLrb>_Kn:,fxrqӷzONNsڵϻ-haʕ$%%ѻwbP(J u_yK'o`_k("i56}sV~ѿ&NV%++ 9|0999x\l>+dvLFN9@`%^sL8_+23gRRV4+r+&9,lJ1 {E@O*t﫟j;8zuHn>yڟal޼_Ƅw!P5[Hs17|LjQÉme4=m;I Ws.. cZ$bbZ 77̳Y mq$$WXN/#jbr (R K$$AvS6N"55UVqw4 qq׳b v풛 21uTnf^n/߉"_С@ lQCrbL|m 7ΠTKH{gȑdggg 8y$iii\{tҥiGo '}fChДiG4Fr[gjul6"##f;v?h"JJJPG=Y3KbZ)6@>d@~ Z/Q\PB0uTyqc=5{)lL4IXU?'25OAY|u̚2W.VCPPp HLXz=\CDLۤâҏ^c /#W瞞$wNWe___~mxFE6mԇ( aJJh&hD 9jCE~;99 QQQdff)J %%KR @I爉ⓡ,]yp6}X&eߟҒOg"Ԋڠ 5lw<@HLL FѽWF^gq=>> jCc(g# dq}<1NfFO?;w""QXXHqqqA~]C-A!M.dW#!y-(ʪ|P+oSO=2P0 0S6/(rMe F@2&c2JUEGO \ClX ':@9D*:[,nN_}DQDӑw BPP0U|||x8xЭd3kj8س{/'OdРt:.Q)++c Ysљ`:vHHLj;7P2Τa6 A8KYieee\tnI_̙3\W?eÆP"^ +N@ð$kvbb`(*{@iI)Ai^mXZn=EEE0lqR>;dU*???4!2<s\@v9v)eeejՊVQJyqA2j!55,/ytpp0:t 44ԩqn*JJJHKKj5/ Xя,PZVL8h,۷#Fdcp(qףhHKKvFdb͜9s:F8ȟ|j$ϾVx:hIA7:m X= \.k#$HrW*G$!!6mPVV˗Jrb43a7ܵ=KivTc~={c{{c"uA4CCC9r$QQQȲNߟ(ҥ =z !!`+(\=vy>[qہL-*Cх@TfQ Lbp& vȿToPАP wU@\NN7mh,'..0jVVh/+M/޳gOlT~@jj f{y`ͧ3(6h^F g h4dPȗ`0] I~~~ <*?@'euSg\@ء'0s[O2E =R h䣏>hjbZy馛صkd޽ر\j>ٳg3t:8r}w/tp'Ccn`dLFb(++s** 2uvW vZzWU@c(uR92DL*٬6$teU7et!&Mŋz(NѱcGfϞݻYb.=IoXn=;wvۿ ֥dnGaI3 d^Sʉt?Vm@`H*f((aQlHmۖG"˲LQ1L_h_d |:~ )SӼr,-l6#1 #Bx)߾̚5tΝKQQ5Kj,^իW3yd߿ݥK(((`0sLzQ16{9O(īMk,9u؏#jj9W* rȲLII g` A V-7@t 1tZ-ܸ " 2FCjjSJFh4eILLez@dbTLvad^ˀk6Wֱq|sZbfƳeo(7%:PG۶m)++#??N8u Gh4VdvBҧ\.[s(ѭ-G߂|_# _!/Z.DƭJhh(;v@ӹ|`˖-[8vX?׏;3ZJ`ժU۞݆ ШHO >hkWأed e|}ϯPZZG@$+`ڷooUpFSWQ\\LFz:VFP`zb@ŵFu(~&[nϏA5P\BҹsgOAAYYYn<֯_Oii):tf8i|0ïG3Ksg; )*naˆKfRj='ٲ' h>}U$t:۷'66|ʖ"00VZaX%ΉO7@cRCeLk/k!,XZ-,y?>@>yα?|h۶-&L //ÇT%2>>>?SPP@_[2~xD+_QxxZ-D@QE_V6~(7%.ιyuI੩P/઩PTe"22$**ŀf3go60<"""'x^zxA@ӱe{9nꩌ+~[?6Zر#>̞RHhI?BlA87/)j-!CjfhP ?%KPTTI bU2)~f6O<`U s#Dp y z7pxGXx1_ϲf͚ZXҘ7o+Hi 4^Q/t٫Y*I}sw'SPe4+42AAAoޣxT@d#Ku ,&32r @zY eb֭\|QF5PpMк5^Nv@˖-3f :}t:l6?uv)S8p&i8^@b@@\\q X-6]P$ uz )L 3UNޙ@P@ll,Ç'!!m)*;w~ Jdd$hZ FI4SiO/<5;v,K,iqZW(((`ɒ%ٳǫ{I>|8vAAA?c%(P 8P:w)+ R6$jkagh4w^.^GW(<+=rJ*žȏ=;l!bJdfÍBV&K:YY`7n$,,̣`00x`&Nʍ78v=X |7ۯ/&c40)//b(FM V p \&/]GllS* 0337rܹFxǵB>J-:9xbzpxW*n23"K2JʄU=gJ p90]aO<ɲe˸[G߾}k8{,nǻ%EX9"Zhk]Q1/K nqjR1Gun(ȲL@@:t <a@ d=QAzY1({oѣ%bzΞ=˺u1bGfCf1aΟwڶxQԸ nĴ".>Eٰ훿Z$/W2F:Q5BnGO;s̙8O=+K6ZIf`ڵk.v$2EEE=,H*9?JPՐP %~# QPPEԩǜp5?@$iժn"ѿ>zTxx8XM\#J]anm:DX%y044$4}sr> 6E=nCk`t!؋Xk/c- #$$I| @ ס UPG?$ ]'O>v=+W`&0k&[?N?"w0&0֮R#vg}Ƅ (//wꢕe￿-.]Ĝ9s<5{hZ+&P3"&K*2#p&N'*v<z N w!",@@j:jjj]S 0DyplڴA^pcCеkWLnn.n-[(--m۶^pD8=L\\,Z)uJh`z#kKaDx DQF+'UyHwΰa߿?'N ''Ǟ }:u 6A\\5U4A+"6aJ_Ë3{᭗!%th|Q!$āфw !3:=z4j'N$))}ӧOg֭?-EԨQ*$U I%JT\ʍFZ--#Z2hPC3l~OԃpDPPm۶: U)BFV[UqC9* ٳ6 Y2YYY,\b kQXX\ؾ};z8C>:㉉d %5CǷ?qޗ)/a>Vw ZӡC! 6֭[sA-"VJV޽{ҩSʹ|'x“T# )oEl\lWA5Mh4Z"# uZ PTTDzzzs46As0hw™1$+; W 6fݱ`,JKܖRn"lhbfvw}Gxx8ݺum-Z`ذaDFFrI<fDEEypr?^Čw/hmt̾W!K4bTC= vu"B?)Nַ`4[x3)\yJRR%Hy\/Ah?7_@షJĚ5kٳ'fjյ\",,gy^z*,P6ő/Ȗ-[:3CsSkZjy$Ień<0N IIbgWB4H̀޾;(7_ڴioO?(X,aļyxWz56o˯!= E޸-EE>[/Uikbh45)SI OP\@ 1 *7Էpo'IpYɒ\PZP'ou4g=jyYY;v/:t୷bzNdb…̙3ÇK~"Z^( %WTc&@$=&3;:?_| 'z+BCNNg_{gUuܙȒ RD"-.hRjEDE6AA*TUD.(VeYT$`eq޹edg293}ӾT3nউТ{;ڈ?A) M *2Fx@ZwMFUn0SP ƪ ^c"DNiѢ]v Jk呖vEQh݆byjV?ͭ`)> &.' "}]x N;4ub7c)•W^b޽~OSUbl?L.]vmU2W*$w1l Qt=#B8XT*F!CHKK~E{giٳGwU+6}3Pּr<GokjWנYrߝh_m_Bv(CQq2+D{CSRR> IDAThߡ~>.@ii)6I'S*:TqKaaLٵQ(;K2͚c&'+oJwA֮?yjՊɓ'6mPRRAοo&M_&(7 y !+ h@h;epUϣ{ʿCYA{/O>^:D/qD<zc7n M7yV v~X"~O x1c+@՚cn+T5bPFp7tތ8ә4iRY1YfѶm[9vEQشifbӦM~wt7tMY9W<lǠ\Pxnq ݊iJ~nݺ`n6RUy9t={lC+/B~(֡=ʎ/PztG۸։t.!CI)@b' U1{uo߫ PeH|bIqU8T/`ɸGZc(K<ʅ,[SN9g}݈>z* .on:4Mtrx3g}{v&'_#J<8.iBRs$w_wX+2#!!#G0sLy|mPTmB1([><%;ák=@++yN4xٹsgfE/qFl&#@]-s~CFy^kBq0Edm[5`x3^vcܦ;jQ8N \`" ]'4vmۗ?0L݉y'KJdҥ,^89ya4}֯T]w]g^9E Gfҥݛmƽ˻KGٯh3ܿ_R7t<@7h #Wg֬YG'fʢwkw3?R1",b{"0n=P]\." iڵ/C?[nscѳgO(8NvܹsyVkdgLJ]oW.4:26<(^'XM/~&qS3y[fʔ)̞=mۚ {mCQ֮]ԩSٶm\geDoc@).F)(C;L V ì0m e(^AFiӦ7Y̌㟘dFa hxy>!&b@XZQ,n 0 #L$g&OAqFzɓ)- +jnݚ￟xN:)>fqFMƇ~跽jWhzAEl=vpvCiYZўIǟXn{i1|Ǝk? Aqq1O<7C95(ٴ)ڨ(?6w1ڜpD8h S A[}뷟ua׮]Z*P[CL>~?{_k^% =0(֝= K.hѢ6,K<222QlOQl,gl6v;vcǎGfyȄ4'w_OЬY3 4 :f͚? ~˶mHNN}t\o /Yh{VgtڕCRRRb?9TU%//7EIL_5-Ad3f?sCa.;]h#Gև6,..CSRIIIRiU3jyY9( -[u5 QuN/((СC$LǍtYh(5WL͌4nz> //ロ]:5.Kyꩧ^ۂ¼\~9\trכ.onԩSyw|8ʣ(E| (އ+FwCмYo-[5sXdd,aQ<gU! W,sUUg6ؘz^ ׍nVbUVn` Kk ƒr3tP9E UU3f -[n;wdΜ9+?&?YqIcm7N䚫٠\c9;`+\pvviJ/`lӦ SLaƌjʯl̘1[z NC\5SQJ{ U'21|X"D<:@ͧj]\ dknO@5Em`^U=xT&cx)y`%X>0ƍܹ3'N 7RRR1c&My~UQ6l`l޼92y%eQ;m42# 6ݻ7-b̘1A Xb .a.8,~uC7oii7 y<5Y]oXsj@:׍(;{M50d z] XQ ,+CiӦ,ZC ΛD x\gZdjm:{ 袋xWСCv[+Yr%Uiod|wر/#FT_LpDƌl3& %sZw'n>ZompF-{ "7;rvq}k.^|EPSNEEcƌu˖-[]c΁Swcjp{_qC&0;4MU$ x8=L4};v Fwtԉz;Ml6>CNʧ~ފs'5'9"-qیL^}W=cxaq;#''/O'55kUU}>itޝ:+H喀)"@;xavy@C(Њ:`/_\ 8˗3l0=T!i /̙37v"OsLBz[Ydn>..K:)m͓idgSLO5@С< 2LѪ`رuԕ~{Xy"GLh~|[k# sx4B f?; uIYs-F$P#>\XYYڵ+[6F9s(p8`<;??ݥLŶ}s_}gp漸Ng$rGg $$$׿ УG.:vħ./Pa]4Yw>^ø.q$7G .3vZpS<֩H"!YdРA\uU6s]6mmƜ9sܹ_fCUU{fΜkHƌ;[$Aa|5鋎3Lm̻ZLz']S:wNVԮ];x'MmP.`J#fzLy yY2Z7/Fa0|B" K[LŭeЂӪU+O^ESN9z &䷐hɓڴYڎ~ߔeӖ^Yµë^4=槃e D3̵gy@nG Fno4Vw>3ƍ^=^W:sYx4@NY$Q}… ILLW_ "Yx1#G 5k?{_|~"kRY O+❏iTKtrv.op_ʫ߇ cƌ Xd1ENSKph<^Uw3bH4^ c݁@!Β*P3׿4V'^.rkӧ:fcذariZQVѣtRIc[m]ua39tj2vTK N*?>$Hn:@ͮF_(=!HT`Y}ÿd.M~}81"VGj@,` g"Z,`$CA{n˨QŊ㎤$ƍٳѣGP;v0m4^uaxkC![/cʸ$F@nYݒm\~Q3:Wƍ U(t⿰DPl-^4ߘۜc7ǁ'dz(*p.) @.؉*o µkҬY3y*t҅ӧ3qDZjWgQs=XYB.z9oZ}rV+Jzu0w\5)G 9f34֐v]EOU_b,I0$24 'mTUo?ͻWiхʴihӦMߟyq7t:)--픖j*Oξ}w6eI]C݀hrMя#&sojoUsr0ۖ{Ĉ Sp?c8Ukx3ic" ,dgg3|p#ҹH*]v ,`СTTTPYYY!`8vcٲeŧn &j % i,dNJkZ"s-su􍀿b s]h(O@-nTEh~,@K -8 ^>hkz7L~~~D:)Zh_W~aKQQQmEt}v&Mkk7i5@c(u9f4\mI+xHC1@w8p4|0 W`MjfQ hjlt xh"'duիiժU|L<|dTUeÆ L0?In5:SO=}@iӘ`z[K͛ ճ܄o;(D@ճk[=6:0 6rfڴitЁ?2= zfܸqW(h۩`ʕ̘1~)ʽeԨQl#J7@^ɮPJאWMi.OYFCBh,24$@~P>@MaKߧ,Vî G&' P.+g\PU!Cxb?RZZZ>􃆲;w.˖- Y~=[nפ(V!QT#T+ =} 0~|* XqoG h@'|tbj_|A>}[V8W͚5kaŜqj(BBB;v;awy}!N cR_ |o 6 0B՗h^%'3~[{=Z[1Jsk9 X>$''c|NIII{eܹ$''SXXXkjEQl$''G'7ׯh:=#ԍv]Yguu_1כg%׿AC5@Xw"44n_#zr` L3e~4={fĉ(RcM޽; JJJJ93yOnN|D\jͪ2r#|Y: Ѐ}"PXW!NDBp.?r#G>|8>nstR*JJJ|TVV2vبg̘1<anhQyW V (y4H=  . 2%ƶbX P-@oTՐ|gӇoc511ѣGb g? رcTk.^uM=D1XvU7n#TZjM%'=Jjay4d_vGXoZYؑU5 Y P(ygܹ3-a'%%q=`ڴi/l](tE3ݦ/oL9m7/f#@CPK% 4t_OL xħY,WoK.go'XZZ<@޽yB҇nݺpB4NѸK!>MM6 nc5M,XPwvS+q(8=-54U{5XVeWk>K=v' GRB/ 6..}kP78@hv9jX9O3h!QXw VnMe9j~h^UIDATpHJ~cto@F(~Gyr-dffFs SrF;Bv̳TCP5+4͓0n= Ac4VM;pu\k@<, ï"b1^Eʭ BzP-vGgoTU4Ыؼy3g'>n!POT8Mj>}CdMsWP@3@00F+ `gՆ)5L}1x\!Y'ϡW\Jg\\={JQQy74MK UU=)Oe4,<1ˆ#_QQ|tWDϩ ''PB`Bݟ=|8_~y7ȰX. Q@UU4.@+`UY@Q\.^S4pS ^\\Liiix< S_c3=18K>QqF رcb Y%0sGU(L9)#@76YyR\\ 9"5NII EEEa iS͌恤T+`/tݼ q,Y&O7|QE)?,R~aZ}"JJJދ/!ˆP3 "M*25Ob( @,*J.`,-BYn] 7z\rJ}@НhLLs{ۮc}C ),,tH3K EP_ uNbtX`>`k(޽K.$uٲe ǏdT&ē:QhJE$)ƂϏN_oe瓟_l- 1jgmaa!yyy!Y%xyj"@ţwbp! W 8ʅ7os[oѸ,NƶmLM닿NP5?{핗Gaa!Y91jguvvvINN߂O0<5.F|S&A5}~2EG{\QQUׯ).x뭷8i.$TCO}LϨxLTFu?''R1j/d1Znw*Ngt>W@d!տ?~Y?`ݺu\(=@M6Ƌ|53 {xc7SCWUB@.QC13%YYYu {O k_s0[w8*xjd`0!k6aA4y6ҁk %j'P944O(ԲQ,=԰ EQرc%#$YSAAAS 4ÅeY]\5Qh4&-e| 8=z0c k#*b1h fϞLrLjvJg0 4ȊP406J!H4 6Z9)E!i/{P}pa*7U 0!"\?B^Jς 8p )))\ve:y=ʂ ԩ3g4TցpÁB~Nވփ9X}SMݳyD^C:m?NnnV\\)3=:8111y1!`^aȾA*cjp(s !Fѫ]}W|Wb֭\r  SO%%%f͚Dqq1:t>>[C' X> ae0=Q,E;*b ikJ MB9Ɨ ?Nzza@qvddd7d߾}ѣ/z2P}Ie3u4n6S"iiidffQ?P@TXXvNNNiZZ0mq%+Uok@_:HZqSWvC Dx# x%vӥ;[ 88ś`̙CAzjÈ]VPP|>Y|!@h\mnnnEzz:jU[i秊7_=*C^Oɜ 7swA~$Dɑ~9sFQ=JNNNEffvP 3ûrrr* #[=ǰXӭ^Xխ^G'N<h\^@u!~G}O}|H |CfEQ ;;{8 t :cvvv#G̝~m/P *Ӱ KV< ̋A 'cn@`1g^\\s^33 t:̍>7\ԍ`ڲ7WR9¯ZqС%NM1#Gl'X,++Zx5 j 5ΉͅQ^6@)G?u2bÙDH,XEZfME|( .LJJJJ> }B;GYtimڴI&lٲ%ﯰmWگq-EQӫWfTLHgȈͅF1m %zQa@_tAkXE~B/StmDENG34{_NQ Ua),,y-?;; rrssn wbԟ[^[ޱcd!Daaamk4f( PVM\&~߻Z'́JWDE!J=|֒΄Y0UT7餖7j\k,/( u| 1kхu::[ރ? C!4B/qZy\󗑏WTNͣ2JKK)++URJb&nzg3\#9nʹׯU6TG8í/#5!ṷ^<)X-<ߗGOb 4J@i{0#:2MQt/+/oht}RGubQ!BuAbΨQbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS&;UUIENDB`klog-0.9.8.1/hamlibclass.cpp0000644000175000017500000003654113532572307014611 0ustar develdevel#include "hamlibclass.h" #include #include #include #include HamLibClass::HamLibClass(QObject *parent) : QObject(parent) { //qDebug() << "HamLibClass::HamLibClass" << endl; timer = new QTimer(this); rigLaunched = false; pollInterval = 300; errorCount = 0; //m_serial = new QSerialPort(); connect(timer, SIGNAL(timeout()), this, SLOT(slotTimer()) ); //connect(m_serial, &QSerialPort::errorOccurred, this, &MainWindow::handleError); //connect(m_serial, &QSerialPort::readyRead, this, &MainWindow::readData); //timer->start(1000); clean(); //qDebug() << "HamLibClass::HamLibClass END" << endl; } HamLibClass::~HamLibClass() { if (rigLaunched) { rig_close(my_rig); rig_cleanup(my_rig); rigLaunched = false; } } void HamLibClass::setPool(const int _milsecs) { if (_milsecs>0) { pollInterval = _milsecs; } } void HamLibClass::slotTimer() { //freq_old = freq; if (!isRunning()) { return; } retcode = rig_get_freq(my_rig, RIG_VFO_CURR, &freq); if (retcode == RIG_OK) { errorCount = 0; //qDebug() << "HamLibClass::slotTimer: Freq: " << QString::number(freq) << endl; if (freq_old != freq) { emit freqChanged(freq/1000000); freq_old = freq; //qDebug() << "HamLibClass::slotTimer EMITING; " << QString::number(freq) << endl; } //qDebug() << "HamLibClass::slotTimer read: " << QString::number(freq) << endl; } else { //qDebug() << "HamLibClass::slotTimer Unable to read FREQ - Error: " << QString::number(retcode) << endl; //qDebug() << "HamLibClass::slotTimer Unable to read FREQ - Error: " << rigerror(retcode) << endl; stop(); } retcode = rig_get_mode(my_rig, RIG_VFO_CURR, &rmode, &width); if (retcode == RIG_OK) { errorCount = 0; //qDebug() << "HamLibClass::slotTimer: Mode: " << hamlibMode2Mode(rmode) << endl; if (mode_old != rmode) { mode_old = rmode; emit modeChanged(hamlibMode2Mode(rmode)); } } else { stop(); } //checkErrorCountAndStop(); } void HamLibClass::setMode(const QString _m) { //qDebug() << "HamLibClass::setMode: " << _m << endl; if (!isRunning()) { return; } retcode = rig_set_mode(my_rig, RIG_VFO_CURR, rig_parse_mode(_m.toLocal8Bit()), rig_passband_normal(my_rig, rig_parse_mode(_m.toLocal8Bit()))); if (retcode != RIG_OK) { errorCount++; //qDebug() << "HamLibClass::setMode: ERROR: Could not set mode: " << _m << endl; return; } errorCount = 0; //qDebug() << "HamLibClass::setMode - END true " << endl; return; } rmode_t HamLibClass::mode2HamlibMode(const QString _m) { /* if (_m == "USB") { return RIG_MODE_USB; } else if (_m == "LSB") { return RIG_MODE_LSB; } else if (_m == "CW") { return RIG_MODE_CW; } else if (_m == "FM") { return RIG_MODE_FM; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } */ return RIG_MODE_NONE; } QString HamLibClass::hamlibMode2Mode(rmode_t _rmode) { switch (_rmode) { case RIG_MODE_NONE: return QString(); case RIG_MODE_AM: return "AM"; case RIG_MODE_CW: return "CW"; case RIG_MODE_USB: return "USB"; case RIG_MODE_LSB: return "LSB"; case RIG_MODE_RTTY: return "RTTY"; case RIG_MODE_FM: return "FM"; case RIG_MODE_WFM: return "WFM"; case RIG_MODE_CWR: return "CW"; //TODO: Check with ADIF case RIG_MODE_RTTYR: return "RTTY"; // TODO Check case RIG_MODE_AMS://TODO: Check with ADIF return "AM"; case RIG_MODE_PKTLSB: return "LSB";//TODO: Check with ADIF case RIG_MODE_PKTUSB: return "USB";//TODO: Check with ADIF case RIG_MODE_PKTFM: return "FM";//TODO: Check with ADIF case RIG_MODE_ECSSUSB: return "USB";//TODO: Check with ADIF case RIG_MODE_ECSSLSB: return "LSB";//TODO: Check with ADIF case RIG_MODE_FAX: return "FAX"; case RIG_MODE_SAM: return "AM"; //TODO: Check with ADIF case RIG_MODE_SAL: return "LSB";//TODO: Check with ADIF case RIG_MODE_SAH: return "USB";//TODO: Check with ADIF case RIG_MODE_DSB: return "SSB";//TODO: Check with ADIF case RIG_MODE_FMN: return "FM";//TODO: Check with ADIF default: return QString(); } } void HamLibClass::stop() { //qDebug() << "HamLibClass::stop" << endl; timer->stop(); if (!isRunning()) { return; } int errorCode = rig_close(my_rig); //qDebug() << "HamLibClass::stop-1" << endl; if (errorCode == RIG_OK) { errorCount = 0; //qDebug() << "HamLibClass::stop: rig_close OK" << endl; errorCode = rig_cleanup(my_rig); if (errorCode == RIG_OK) { errorCount = 0; //qDebug() << "HamLibClass::stop: rig_cleanUp OK" << endl; rigLaunched = false; //qDebug() << "HamLibClass::stop - true" << endl; return; } else { errorCount++; //qDebug() << "HamLibClass::stop: rig_cleanup NOK: " << QString::number(errorCode) << endl; } } else { errorCount++; //qDebug() << "HamLibClass::stop: rig_close NOK: " << QString::number(errorCode) << endl; } //qDebug() << "HamLibClass::stop - false" << endl; return; } void HamLibClass::clean() { //qDebug() << "HamLibClass::Clean" << endl; myrig_model = 1; //Dummy equipment //qDebug() << "HamLibClass::Clean 0" << endl; //myport.parm.serial.rate = 57600; bauds = 9600; //qDebug() << "HamLibClass::Clean - 1" << endl; dataBits = 8; //qDebug() << "HamLibClass::Clean - 2" << endl; stopBits = 1; //qDebug() << "HamLibClass::Clean - 3" << endl; shandshake = RIG_HANDSHAKE_NONE; //qDebug() << "HamLibClass::Clean - 4" << endl; sparity = RIG_PARITY_NONE; //qDebug() << "HamLibClass::Clean - 5" << endl; //myport.type.rig = RIG_PORT_SERIAL; //qDebug() << "HamLibClass::Clean - 8" << endl; serialPort = QString(); sdtr = RIG_SIGNAL_UNSET; //qDebug() << "HamLibClass::Clean - 9" << endl; srts = RIG_SIGNAL_UNSET; //qDebug() << "HamLibClass::Clean - 10" << endl; rigLaunched = false; //qDebug() << "HamLibClass::clean - END" << endl; } void HamLibClass::init(bool _active) { //qDebug() << "HamLibClass::init: " << endl; //qDebug() << "HamLibClass::init: " << getNameFromModelId(myrig_model) << endl; //qDebug() << "HamLibClass::init: " << getNameFromModelId(myrig_model) << endl; if (!_active) { //qDebug() << "HamLibClass::init: Stopping..." << endl; stop(); //qDebug() << "HamLibClass::init: Stopped!" << endl; return; } if (myrig_model == -1) { //qDebug() << "HamLibClass::init: Rig Model not valid" << endl; return; } rig_set_debug(RIG_DEBUG_NONE); my_rig = rig_init(myrig_model); if (my_rig == NULL) { //qDebug() << "HamLibClass::init: Init failed, hamlib returned fail!" << endl; return; } else { //qDebug() << "HamLibClass::init: rig_init went OK!" << endl; } my_rig->state.rigport.type.rig = RIG_PORT_SERIAL; //serialPort = "/dev/cu.usbserial"; //qDebug() << "HamLibClass::init: serialport: " << serialPort << endl; //qDebug() << "HamLibClass::init: serialport2: " << serialPort.toLocal8Bit() << endl; strncpy (my_rig->state.rigport.pathname, serialPort.toLocal8Bit().constData(), FILPATHLEN); //qDebug() << "HamLibClass::init: rigport: " << my_rig->state.rigport.pathname << endl; my_rig->state.rigport.parm.serial.rate = bauds; //qDebug() << "HamLibClass::init: serial rate: " << QString::number(my_rig->state.rigport.parm.serial.rate) << endl; my_rig->state.rigport.parm.serial.data_bits = dataBits; //qDebug() << "HamLibClass::init: data bits: " << QString::number(my_rig->state.rigport.parm.serial.data_bits) << endl; my_rig->state.rigport.parm.serial.stop_bits = stopBits; //qDebug() << "HamLibClass::init: stop bits: " << QString::number(my_rig->state.rigport.parm.serial.stop_bits) << endl; my_rig->state.rigport.parm.serial.parity = sparity; //my_rig->state.rigport.parm.serial.dtr_state = RIG_SIGNAL_ON; //my_rig->state.rigport.parm.serial.rts_state = RIG_SIGNAL_ON; //qDebug() << "HamLibClass::init: handshake before" << endl; my_rig->state.rigport.parm.serial.handshake = shandshake; //qDebug() << "HamLibClass::init: handshake after" << endl; // Config done retcode = rig_open(my_rig); //qDebug() << "HamLibClass::init: retcode" << endl; if (retcode != RIG_OK) { //qDebug() << "HamLibClass::init: Can't open: " << rigerror(retcode) << endl; errorCount++; rig_cleanup(my_rig); return ; } //qDebug() << "HamLibClass::init: Rig open!" << endl; errorCount = 0; rigLaunched = true; timer->start(pollInterval); //qDebug() << "HamLibClass::init: END TRUE" << endl; return; } bool HamLibClass::isRunning() { return rigLaunched; } QStringList HamLibClass::getRigList () { //qDebug() << "HamLibClass::getRigList" << endl; // Rutine to fill the rig combo boxes // Do not display debug codes when load the rig's rig_set_debug (RIG_DEBUG_NONE); // and continue... strings.clear(); rig_load_all_backends (); //qDebug() << "HamLibClass::getRigList-10" << endl; rig_list_foreach (addRigToList, this); //qDebug() << "HamLibClass::getRigList-11" << endl; strings.sort (); //qDebug() << "HamLibClass::getRigList-12" << endl; return strings; } int HamLibClass::addRigToList (const struct rig_caps *caps, void *data) { //qDebug() << "HamLibClass::addRigToList" << caps->model_name << endl; QString name; //qDebug() << "HamLibClass::addRigToList-10" << endl; HamLibClass *r = (HamLibClass *) data; //qDebug() << "HamLibClass::addRigToList-11" << endl; name = caps->model_name; //qDebug() << "HamLibClass::addRigToList-12" << endl; r->rigName2RigId[name] = caps->rig_model; // We fill the equivalences between name & Id //qDebug() << "HamLibClass::addRigToList-13" << endl; r->rigId2RigName[caps->rig_model] = name; //qDebug() << "HamLibClass::addRigToList-14" << endl; r->strings << name; //qDebug() << "HamLibClass::addRigToList-END" << endl; return -1; // not 0 --> we want all rigs } int HamLibClass::getModelIdFromName (const QString _name) { //HamLibClass *r (HamLibClass *) data; int i = -1; i = rigName2RigId[_name]; return i; } QString HamLibClass::getNameFromModelId(const int _id) { //qDebug() << "HamLibClass::getNameFromModelId: " << QString::number(_id) << "/" << rigId2RigName.value(_id)<< endl; return rigId2RigName.value(_id); } void HamLibClass::setModelId(const int _id) { //qDebug() << "HamLibClass::setModelId: " << QString::number(_id) << endl; myrig_model = _id; } void HamLibClass::setPort(const QString _port) { //qDebug() << "HamLibClass::setPort: " << _port << endl; serialPort = _port; //strncpy (my_rig->state.rigport.pathname, serialPort.toLocal8Bit().constData(), FILPATHLEN); //qstrncpy(myport.pathname, serialPort.toLocal8Bit().constData(), serialPort.length()+1); } void HamLibClass::setSpeed(const QString _speed) { bauds = _speed.toInt(); } void HamLibClass::setData(const QString _data) { dataBits = _data.toInt(); } void HamLibClass::setStop(const QString _stop) { stopBits = _stop.toInt(); } void HamLibClass::setFlow(const QString _flow) { flowControl = _flow.toUpper(); if (flowControl == "HARDWARE") { shandshake = RIG_HANDSHAKE_HARDWARE; } else if (flowControl == "SOFTWARE") { shandshake = RIG_HANDSHAKE_XONXOFF; } else { shandshake = RIG_HANDSHAKE_NONE; } } void HamLibClass::setParity(const QString _parity) { parity = _parity.toUpper(); if (parity == "EVEN") { sparity= RIG_PARITY_EVEN; } else if (parity == "ODD") { sparity = RIG_PARITY_ODD; } else if (parity == "SPACE") { sparity = RIG_PARITY_SPACE; } else if (parity == "MARK") { sparity = RIG_PARITY_MARK; } else { sparity = RIG_PARITY_NONE; } } void HamLibClass::setFreq(const double _fr) { //qDebug() << "HamLibClass::setFreq: " << QString::number(_fr) << endl; if (!isRunning()) { return; } freq = _fr * 1000000; int retcode = rig_set_freq(my_rig, RIG_VFO_CURR, freq); if (retcode != RIG_OK) { //qDebug() << "HamLibClass::setFreq NOK: " << endl; stop(); errorCount++; return; } else { errorCount = 0; //qDebug() << "HamLibClass::setFreq OK: " << QString::number(freq) << endl; retcode = rig_get_freq(my_rig, RIG_VFO_CURR, &freq); if (retcode == RIG_OK) { errorCount = 0; //qDebug() << "HamLibClass::setFreq read: " << QString::number(freq) << endl; } else { stop(); errorCount++; //qDebug() << "HamLibClass::setFreq Unable to read FREQ" << endl; } return; } } void HamLibClass::setRTS(const QString _state) { if (shandshake == RIG_HANDSHAKE_HARDWARE) { // Note: An attempt to control the RTS signal in the HardwareControl mode will fail with error code // set to UnsupportedOperationError, because the signal is automatically controlled by the driver. return; } if (_state.toUpper() == "TRUE") { srts = RIG_SIGNAL_ON; } else { srts = RIG_SIGNAL_OFF; } } void HamLibClass::setDTR(const QString _state) { if (_state.toUpper() == "TRUE") { sdtr = RIG_SIGNAL_ON; } else { sdtr = RIG_SIGNAL_OFF; } } void HamLibClass::checkErrorCountAndStop() { if (errorCount > 10) { stop(); } } klog-0.9.8.1/dxcluster.cpp0000644000175000017500000007232013532572307014337 0ustar develdevel/*************************************************************************** dxcluster.cpp - description ------------------- begin : oct 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "dxcluster.h" DXClusterWidget::DXClusterWidget(DataProxy *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "DXClusterWidget::DXClusterWidget" << endl; dataProxy = dp; constrid = 1; awards = new Awards(dataProxy, Q_FUNC_INFO); initClass(); //qDebug() << "DXClusterWidget::DXClusterWidget - END" << endl; } DXClusterWidget::DXClusterWidget(DataProxy *dp, const QString &clusterToConnect, const int portToConnect, QWidget *parent) : QWidget(parent) { //qDebug() << "DXClusterWidget::DXClusterWidget2" << clusterToConnect << QString::number(portToConnect) << endl; constrid = 2; initClass(); server = clusterToConnect; port = portToConnect; dxSpotColor.setNamedColor("slategrey"); //defaultColor.setNamedColor("slategrey"); //neededColor.setNamedColor("slategrey"); //workedColor.setNamedColor("slategrey"); //confirmedColor.setNamedColor("slategrey"); //newOneColor.setNamedColor("slategrey"); dataProxy = dp; world = new World(dataProxy, Q_FUNC_INFO); awards = new Awards(dataProxy, Q_FUNC_INFO); tcpSocket = new QTcpSocket(this); dxClusterListWidget = new QListWidget(); inputCommand = new QLineEdit; sendButton = new QPushButton; clearButton = new QPushButton; inputCommand->setDisabled(true); inputCommand->setToolTip(tr("Click on Connect to connect to the DX-Cluster server")); dxClusterListWidget->setMouseTracking(true); sendButton->setText(tr("Connect")); clearButton->setText(tr("Clear")); QHBoxLayout *bottonLayout = new QHBoxLayout; bottonLayout->addWidget(inputCommand); bottonLayout->addWidget(sendButton); bottonLayout->addWidget(clearButton); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(dxClusterListWidget); layout->addLayout(bottonLayout); setLayout(layout); connect(sendButton , SIGNAL(clicked()), this, SLOT(slotClusterSendToServer()) ); connect(inputCommand, SIGNAL(textChanged(QString)), this, SLOT(slotClusterInputTextChanged()) ); //connect(searchResultsTreeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotDoubleClickSearch(QTreeWidgetItem *, int))); connect(dxClusterListWidget, SIGNAL(itemDoubleClicked ( QListWidgetItem *)), this, SLOT(slotClusterDXClusterWidgetItemDoubleClicked( QListWidgetItem * )) ); connect(dxClusterListWidget, SIGNAL(itemEntered ( QListWidgetItem *)), this, SLOT(slotClusterDXClusterWidgetItemEntered( QListWidgetItem * )) ); connect(dxClusterListWidget, SIGNAL(itemSelectionChanged()), this, SLOT(slotClusterDXClusterWidgetItemSelected() ) ); //void QListWidget::itemDoubleClicked ( QListWidgetItem * item ) [signal] // TO BE DELETED addData(); //TESTADDSPOT(); //qDebug() << "DXClusterWidget::DXClusterWidget2 - END" << endl; } void DXClusterWidget::initClass() { dxClusterConnected = false; dxClusterAlreadyConnected = false; showDxMarathon = false; showhf = true; showvhf = true; showwarc = true; showworked = true; showconfirmed = true; showann = true; showwwv = true; showwcy = true; myQrz = QString(); currentLog = 0; } void DXClusterWidget::setMyQRZ(const QString _qrz) { if (_qrz.length()>2) { myQrz = _qrz; } } void DXClusterWidget::addData() { //qDebug() << "DXClusterWidget::addData " << endl; /* QTreeWidgetItem *item = new QTreeWidgetItem(searchResultsTreeWidget); i = world->getQRZARRLId(_call); aux = world->getEntityName(i) + " - CQ: " + QString::number(world->getEntityCqz(i)); item->setToolTip(0, aux); item->setToolTip(1, aux); item->setToolTip(2, aux); item->setToolTip(3, aux); item->setToolTip(4, aux); item->setToolTip(5, aux); item->setToolTip(6, aux); */ dxClusterSpotItem * item = new dxClusterSpotItem(dxClusterListWidget, tr("Click on connect to connect to the DX-Cluster"), awards->getDefaultColor()); } DXClusterWidget::~DXClusterWidget() { //qDebug() << "DXClusterWidget::~DXClusterWidget" << endl; } void DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked( QListWidgetItem * item ) { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: " << item->text() << endl; QStringList ql; ql.clear(); if (item) { ql = readItem(item); //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: Length: " << QString::number(ql.length()) << endl; if (ql.length()==2) { ql << "double"; //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: EMMITED" << endl; emit dxspotclicked(ql); } else { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: NOT EMMITED-1" << endl; } } else { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: NOT EMMITED-2 (no item)" << endl; } } void DXClusterWidget::connectToDXCluster() { //qDebug() << "DXClusterWidget::connectToDXCluster" << endl; if (dxClusterConnected) { //qDebug() << "DXClusterWidget::connectToDXCluster: - Already connected!!" << endl; return; // If we are connected we don't want to start another connection } connect(tcpSocket, SIGNAL(connected()), SLOT(slotClusterSocketConnected()) ); connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(slotClusterDataArrived() )); connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slotClusterDisplayError(QAbstractSocket::SocketError))); connect(tcpSocket, SIGNAL(disconnected()), SLOT(slotClusterSocketConnectionClosed()) ); connect(inputCommand, SIGNAL(returnPressed()), this, SLOT(slotClusterSendToServer()) ); connect(clearButton, SIGNAL(clicked()), this, SLOT(slotClusterClearLineInput()) ); tcpSocket->connectToHost( server, port ); dxClusterListWidget->setSortingEnabled (false); dxClusterSpotItem * item = new dxClusterSpotItem(dxClusterListWidget, tr("Trying to connect to the server") + "\n", awards->getDefaultColor()); } void DXClusterWidget::slotClusterDisplayError(QAbstractSocket::SocketError socketError) { //qDebug() << "DXClusterWidget:displayError:" << endl; switch (socketError) { case QAbstractSocket::RemoteHostClosedError: break; case QAbstractSocket::HostNotFoundError: QMessageBox::warning(this, tr("KLog DXCluster"), tr("The host was not found. Please check:") + "\n\n" + tr ("- your network connection;\n" "- the host name and port settings.")); break; case QAbstractSocket::ConnectionRefusedError: QMessageBox::warning(this, tr("KLog DXCluster"), tr("The connection was refused by the peer. " "Make sure the DXCluster server is running, " "and check that the host name and port " "settings are correct.")); break; default: QMessageBox::warning(this, tr("KLog DXCluster"), tr("The following error occurred: %1.") .arg(tcpSocket->errorString())); } } bool DXClusterWidget::checkIfNeedsToBePrinted(const QString _DXEntity, int const _band, const int _mode) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: " << _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< endl; QStringList qs; qs.clear(); qs << _DXEntity << QString::number(_band) << QString::number(_mode) << QString::number(currentLog); //bool isConfirmed = false; bool status = awards->isThisSpotConfirmed (qs); //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: Status: " << _DXEntity << "/" << QString::number(status); if (!showconfirmed) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is confirmed? ("<< QString::number(status)<< ")" << endl; if (status) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: It is confirmed: DON'T' print: " << _DXEntity <<"/" << dataProxy->getNameFromBandId(_band) << endl; return false; } } if (!showhf) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is HF?" << endl; if (dataProxy->isHF(_band)) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: Not showing HF but... is it WARC?" << endl; if ( (showwarc) && dataProxy->isWARC(_band) ) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: Not showing HF but... is WARC, print!" << endl; return true; } //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is HF: DON'T print: "<< _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< endl; return false; } else { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is NOT HF" << endl; } } if (!showwarc) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is WARC?" << endl; if (dataProxy->isWARC(_band)) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is WARC, DON'T print: "<< _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< endl; return false; } else { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is NOT WARC" << endl; } } if (!showvhf) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is VHF?" << endl; if (dataProxy->isVHF(_band)) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is VHF, DON'T print: "<< _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< endl; return false; } else { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is NOT VHF " << endl; } } //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: returns TRUE and will be printed: " << _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< endl; return true; } void DXClusterWidget::setCurrentLog(const int _log) { if (dataProxy->doesThisLogExist(_log)) { currentLog = _log; } else { currentLog = -1; } } void DXClusterWidget::slotClusterDataArrived() { //qDebug() << "DXClusterWidget::slotClusterDataArrived" << endl; QStringList qs; QString dxClusterString; QString dxCall; QString dxFrequency; QString spotBand; spotBand = "-1"; //bool isADXSpot = false; int dxEntity = -1; while ( tcpSocket->canReadLine() ) { dxClusterString = tcpSocket->readLine(); dxClusterString = dxClusterString.trimmed(); QStringList tokens = dxClusterString.split(" ", QString::SkipEmptyParts); if (tokens.size()<2){ return; } // It is a "DX de SP0TTER FREC DXCALL" //0 = DX, 1 = de, 2 = spotter, 3 = Freq, 4 = dxcall, 5 = comment //qDebug() << "DXClusterWidget::slotClusterDataArrived: " << "DXCLUSTER->" << dxClusterString << "\nTOKENS: " << tokens << endl; if ((tokens[0] == "DX") && (tokens[1] == "de")) { //qDebug() << "******************** DXClusterWidget::slotClusterDataArrived: DX DE" << endl; //isADXSpot = true; QString spotter = tokens[2]; spotter.truncate(spotter.size() - 1); dxFrequency = tokens[3]; // Convert KHz to MHz... //dxFrequency = QString::number(abs (dxFrequency.toFloat())/1000); dxFrequency = QString::number( (dxFrequency.toFloat())/1000); dxCall = tokens[4]; dxEntity = world->getQRZARRLId(dxCall); // spotBand = QString::number(dataProxy->getBandIdFromFreq( dxFrequency.toDouble() ) ); qs.clear(); //spotBand = QString::number(world->getBandIdFromFreq( dxFrequency ) ); qs << QString::number(dxEntity) << spotBand << "-1" << QString::number(currentLog) ; //qDebug() << "DXClusterWidget::slotClusterDataArrived: Calling-2: " << QString::number(dxEntity) << endl; dxSpotColor = awards->getQRZDXStatusColor(qs); if (showDxMarathon) { if (awards->isDXMarathonNeed(dxEntity, world->getQRZCqz(dxCall), QDateTime::currentDateTime().date().year(), currentLog)) { dxClusterString = dxClusterString + " ### Needed for DXMarathon - " + QString::number(QDateTime::currentDateTime().date().year()) + " ###"; } } //qDebug() << "DX de ->" << "Spotter: " << spotter << "Freq: "<< dxFrequency << "DX: " << dxCall << endl; } else if ((tokens[0] == "To") && (tokens[1] == "ALL")) { //qDebug() << "DXClusterWidget::slotClusterDataArrived: TO ALL" << endl; dxSpotColor = awards->getDefaultColor(); } else if ( (dxClusterString.length()>=5) && (world->checkQRZValidFormat(tokens[1])) && (tokens[0]!="login:")) { // Freq / DXCall / Date // time //_qs << QRZ << Freq in MHz << lognumber; //qDebug() << "DXClusterWidget::slotClusterDataArrived: LENGTH >= 5" << endl; //qDebug() << "DXClusterWidget::slotClusterDataArrived: token0=" << tokens[0] << " / token1=" << tokens[1] << endl; //isADXSpot = true; dxCall = tokens[1]; dxFrequency = tokens[0]; dxFrequency = QString::number( (dxFrequency.toFloat())/1000); qs.clear(); spotBand = QString::number(dataProxy->getBandIdFromFreq( dxFrequency.toDouble() ) ); dxEntity = world->getQRZARRLId(dxCall); //qDebug() << "DXClusterWidget::slotClusterDataArrived: Calling-1: " << QString::number(dxEntity) << endl; qs << QString::number(dxEntity) << spotBand << "-1" << QString::number(currentLog) ; dxSpotColor = awards->getQRZDXStatusColor(qs); if (showDxMarathon) { if (awards->isDXMarathonNeed(dxEntity, world->getQRZCqz(dxCall), QDateTime::currentDateTime().date().year(), currentLog)) { dxClusterString = dxClusterString + " ### Needed for DXMarathon - " + QString::number(QDateTime::currentDateTime().date().year()) + " ###"; } } } else { //qDebug() << "DXClusterWidget::slotClusterDataArrived: DEFAULT" << endl; dxSpotColor = awards->getDefaultColor(); } // qs.clear(); //spotBand = QString::number(world->getBandIdFromFreq( dxFrequency ) ); //qs << dxCall << spotBand << "0"; //dxSpotColor = awards->getQRZDXStatusColor(qs); //qDebug() << "DXClusterWidget::slotClusterDataArrived: Call/dxSpotColor: " << dxCall <<"/"<< dxSpotColor.name() << endl; //dxClusterSpotItem * item = new dxClusterSpotItem(dxClusterListWidget, dxClusterString, dxSpotColor); //TODO: Change the "-1" by the mode if (!checkIfNeedsToBePrinted(QString::number(dxEntity), spotBand.toInt(), -1)) { //qDebug() << "DXClusterWidget::slotClusterDataArrived - Not to be printed!: " << dxCall << endl; return; } // QString flagSt; // QString aux; QListWidgetItem *item = new QListWidgetItem(); item->setForeground(QBrush(dxSpotColor)); item->setText(dxClusterString); /* if (dxEntity>0) { flagSt.clear(); aux = dataProxy->getISOName(dxEntity); if (aux.length()>1) { flagSt = ":/" + aux + ".png"; } else { flagSt.clear(); } flagSt = ":/flags/" + dataProxy->getISOName(dxEntity) + ".png"; QIcon flagIcon(flagSt); item->setIcon(flagIcon); } */ dxClusterListWidget->insertItem(0,item); //dxClusterListWidget->insertItem(0,item); //QListWidgetItem *item = new QListWidgetItem(); //item->setForeground(QBrush(awards->getQRZDXStatusColor(qs))); //item->setText(dxClusterString); //dxClusterListWidget->insertItem(0,item); } //qDebug() << "--------------------- DXClusterWidget::slotClusterDataArrived: " << dxClusterString << endl; //qDebug() << "DXClusterWidget::slotClusterDataArrived: " << dxClusterString << endl; } void DXClusterWidget::slotClusterSocketConnected() { //qDebug() << "DXClusterWidget::slotClusterSocketConnected" << endl; QListWidgetItem *item = new QListWidgetItem(); item->setForeground(QBrush(awards->getDefaultColor())); item->setText(tr("Connected to server")); dxClusterListWidget->insertItem(0,item); // dxClusterSpotItem * item = new dxClusterSpotItem(dxclusterListWidget, i18n("Connected to server"), awards->getDefaultColor()); dxClusterConnected = true; inputCommand->setFocus(Qt::OtherFocusReason); if (( dxClusterConnected ) && (!dxClusterAlreadyConnected) ){ bool ok; QString callsignText; if (myQrz.length()>2) { callsignText = QInputDialog::getText(this, tr("KLog message"), tr("Enter your callsign to connect to the cluster:"), QLineEdit::Normal, myQrz, &ok); } else { callsignText = QInputDialog::getText(this, tr("KLog message"), tr("Enter your callsign to connect to the cluster:"), QLineEdit::Normal, "", &ok); } //QString callsignText = QInputDialog::getText(this, tr("KLog message"), tr("Enter your callsign to connect to the cluster:"), QLineEdit::Normal, "", &ok); QString passwordText = QInputDialog::getText(this, tr("KLog message"), tr("Enter your password to connect to the cluster:\n(Just hit enter for no password)"), QLineEdit::Normal, "", &ok); QTextStream os(tcpSocket); if ( callsignText.length() > 2 && ok ) { os << callsignText << "\n"; //TODO: Check the DXCluster answer and enter the password if needed. sendButton->setText(tr("Disconnect")); clearButton->setText(tr("Clear")); dxClusterAlreadyConnected = true; } else { os << tr("Not logged on, you may need to enter your callsign again.") << "\n"; dxClusterAlreadyConnected = false; } inputCommand->setEnabled(true); inputCommand->setToolTip(tr("Enter here the commands to be sent to the DX-Cluster server.")); } } void DXClusterWidget::slotClusterSocketConnectionClosed() { //qDebug() << "DXClusterWidget::slotClusterSocketConnectionClosed" << endl; QListWidgetItem *item = new QListWidgetItem(); item->setForeground(QBrush(awards->getDefaultColor())); item->setText(tr("Connection closed by the server")); dxClusterListWidget->insertItem(0,item); dxClusterConnected = false; dxClusterAlreadyConnected = false; sendButton->setText(tr("Connect")); inputCommand->setDisabled(true); inputCommand->setToolTip(tr("Click on Connect to connect to the DX-Cluster server.")); //connect(inputCommand, SIGNAL(returnPressed()), this, SLOT(slotClusterSendToServer()) ); disconnect (inputCommand, SIGNAL(returnPressed()), this, SLOT(slotClusterSendToServer()) ); } void DXClusterWidget::slotClusterSendToServer() { //qDebug() << "DXClusterWidget::slotClusterSendToServer()" << endl; if (!dxClusterConnected) { connectToDXCluster(); return; // If we try to connect... } if ( inputCommand ->text().length() < 1 ) { //qDebug() << "DXClusterWidget::slotClusterSendToServer() - Vacio..." << endl; QTextStream os(tcpSocket); os << "bye\n"; return; } // write to the server QTextStream os(tcpSocket); os << inputCommand ->text() << "\n"; inputCommand ->clear(); } void DXClusterWidget::slotClusterClearLineInput() { //qDebug() << "DXClusterWidget::slotClusterClearLineInput" << endl; if ( ((inputCommand->text()).length()) <= 0 ) { if ( dxClusterConnected ) { QTextStream os(tcpSocket); os << "bye\n"; } else { } } else { inputCommand->clear(); } } void DXClusterWidget::slotClusterInputTextChanged() { //qDebug() << "DXClusterWidget::slotClusterInputTextChanged" << endl; if ( ((inputCommand->text()).length()) <= 0 ) { sendButton->setText(tr("Disconnect")); clearButton->setText(tr("Clear")); } else if (dxClusterConnected) { sendButton->setText(tr("Send")); clearButton->setText(tr("Clear")); } else {} } void DXClusterWidget::setColors (const QString _newOne, const QString _needed, const QString _worked, const QString _confirmed, const QString _default) { //qDebug() << "DXClusterWidget::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default << endl; // Just to pass the colors to the awards class awards->setColors(_newOne, _needed, _worked, _confirmed, _default); } void DXClusterWidget::setDXClusterSpotConfig(bool _showhf, bool _showvhf, bool _showwarc, bool _showworked, bool _showconfirmed, bool _showann, bool _showwwv, bool _showwcy ) { //qDebug() << "DXClusterWidget::setDXClusterSpotConfig " << endl; showhf = _showhf; showvhf = _showvhf; showwarc = _showwarc; showworked = _showworked; showconfirmed = _showconfirmed; showann = _showann; showwwv = _showwwv; showwcy = _showwcy; } void DXClusterWidget::slotClusterDXClusterWidgetItemSelected() { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemSelected " << endl; QListWidgetItem * item = dxClusterListWidget->currentItem(); QStringList ql; ql.clear(); ql = readItem(item); if (ql.length()==2) { ql << "selected"; emit dxspotclicked(ql); } else { } } void DXClusterWidget::slotClusterDXClusterWidgetItemEntered( QListWidgetItem * item ) { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemEntered" << endl; /* This code comes from slotClusterDXClusterWidgetItemDoubleClicked */ QString tip; tip.clear(); QStringList ql; ql.clear(); if (item) { ql = readItem(item); if (ql.length()==2) { tip = world->getQRZEntityName(ql.at(0)); item->setToolTip(tip); } else { } } else { } } bool DXClusterWidget::isConnected() { return dxClusterConnected; } QStringList DXClusterWidget::readItem(QListWidgetItem * item) { //qDebug() << "DXClusterWidget::readItem" << endl; QStringList fields; QString dxClusterString; //int currentEntity; QString dxCallsign, dxFreq; bool FirstFrecOK; if (item) { fields.clear(); dxClusterString = ((item->data(0)).toString()).simplified(); fields << dxClusterString.split(" "); (fields.at(0)).toFloat(&FirstFrecOK); // Just to see if the first string is a frecuency if ( (fields.at(0) == "DX" ) && (fields.at(1) == "de" ) ) { // DX de EA4TV: 21200.1 EA0JC The comment 1550 if ( world->getQRZARRLId(fields.at(4))> 0 ) { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: ARRLid: " << QString::number(world->getQRZARRLId(fields.at(4))) << endl; dxCallsign = (fields.at(4)).toUpper(); (fields.at(3)).toFloat(&FirstFrecOK); if (FirstFrecOK) { // The frecuency is valid dxFreq = fields.at(3); fields.clear(); //TODO: Change FREQ into bandId fields << dxCallsign << dxFreq; return fields; } else { // the frecuency is not a number! dxCallsign.clear(); dxFreq.clear(); fields.clear(); } } else { // The call is not from a valid country // TODO: if it is from a new entity/prefix it would not work. //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: Entity not valid" << endl; dxCallsign.clear(); dxFreq.clear(); fields.clear(); } } //else if (( isAFrecuency(fields.at(0) ) ) && ( isACall(fields.at(1)) ) ) else if ( (((fields.at(0)).toFloat()) > 0.0 )&& ( world->getQRZARRLId(fields.at(1))> 0 ) ) { // 14205.0 EA0JC 5-Mar-2012 1500Z dxCallsign = (fields.at(1)).toUpper(); dxFreq = fields.at(0); fields.clear(); fields << dxCallsign << dxFreq; return fields; } else { dxCallsign.clear(); dxFreq.clear(); fields.clear(); } } else { // No Item } return fields; } void DXClusterWidget::setDXClusterServer(const QString &clusterToConnect, const int portToConnect) { server = clusterToConnect; port = portToConnect; //qDebug() << "DXClusterWidget::setDXClusterServer: " << server << ":"<< QString::number(port) << endl; } void DXClusterWidget::setDXMarathon (const bool _enable) { showDxMarathon = _enable; } /* void DXClusterWidget::TESTADDSPOT() { //qDebug() << "DXClusterWidget::TESTADDSPOT " << endl; ; // Just a test spot QListWidgetItem *item = new QListWidgetItem(); item->setForeground(QBrush(dxSpotColor)); item->setText("DX de SP0TTER 14.000 DX1CALL"); dxClusterListWidget->insertItem(0,item); } */ /*************************************************************************** ** This is an auxiliary class intended to provide color to the DX-Cluster ** ** spots. ** ** It may be moved to a self .h & .cpp archives ** ****************************************************************************/ dxClusterSpotItem::dxClusterSpotItem( QListWidget *parent, const QString& spot, const QColor& color ) : QListWidgetItem( parent ){ //qDebug() << "dxClusterSpotItem::dxClusterSpotItem - Constructor" << endl; spotColor = color; setText(spot); // Experimenting with fonts for the cluster QFont f("Helvetica"); f.setFixedPitch(true); setFont(f); } dxClusterSpotItem::~dxClusterSpotItem() { //qDebug() << "dxClusterSpotItem::dxClusterSpotItem - Destructor" << endl; } klog-0.9.8.1/locator.cpp0000644000175000017500000002632713532572307013773 0ustar develdevel/*************************************************************************** locator.cpp - description ------------------- begin : vie feb 7 2003 copyright : (C) 2003 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "locator.h" #include Locator::Locator(){ ideg = 0; imin = 0; isec = 0; } Locator::~Locator(){ } bool Locator::isValidLocator(const QString& tlocator){ /* -------------- Subroutine ----------------------- Check valid locator (VALID: AA00AA -> RR99XX Input : char *locator = 4 or 6 characters word wide locator. returned value == -1 No error. (Valid locator). returned value == 0 Error. (Invalid locator). Note: also string "END" is considered a valid locator, but returned value is -2. ------------------------------------------------- */ //qDebug() << "Locator::isValidLocator: " << tlocator << endl; int lenght_of_locator; testLocator ="A"; testLocator = tlocator.toUpper(); lenght_of_locator = testLocator.length(); if (lenght_of_locator == 4){ testLocator = testLocator +"LM"; lenght_of_locator = 6; } if (lenght_of_locator != 6) { return false; }else{ theChar = testLocator.at(0); if (!theChar.isLetter()){ //First letter is not a valid letter return false; } if ((theChar<'A') && (theChar>'R') ){ //First letter is not a valid letter return false; } theChar = testLocator.at(1); if (!theChar.isLetter()){ //Second letter is not a valid letter return false; } if ((theChar<'A') && (theChar>'R') ){ //Second letter is not a valid letter return false; } theChar = testLocator.at(2); if (!theChar.isDigit()){ //Second letter is not a number return false; } theChar = testLocator.at(3); if (!theChar.isDigit()){ //Second letter is not a number return false; } theChar = testLocator.at(4); if (!theChar.isLetter()){ //First letter is not a valid letter return false; } if ((theChar<'A') && (theChar>'X') ){ //First letter is not a valid letter return false; } theChar = testLocator.at(5); if (!theChar.isLetter()){ //Second letter is not a valid letter return false; } if ((theChar<'A') && (theChar>'X') ){ //Second letter is not a valid letter return false; } } return true; } double Locator::getLat(const QString& tlocator){ //qDebug() << "Locator::getLat: " << tlocator; if (!isValidLocator(tlocator)) { return 0.0; } if (tlocator.length() == 2) { return (((tlocator.at(1)).toLatin1() - 65) * 10) - 90; } if (tlocator.length() == 4) { return (((tlocator.at(1)).toLatin1() - 65) * 10) + ((tlocator.at(3)).toLatin1() - 48) - 90; } else if (tlocator.length()== 6) { return (((tlocator.at(1)).toLatin1() - 65) * 10) + ((tlocator.at(3)).toLatin1() - 48) + (((tlocator.at(5)).toLatin1() - 65 + 0.5) / 24) - 90; } else { return 0.0; } } double Locator::getLon(const QString& tlocator) { //qDebug() << "Locator::getLon: " << tlocator; if (!isValidLocator(tlocator)) { return 0.0; } if (tlocator.length() == 2) { return (((tlocator.at(0)).toLatin1() - 65) * 20) - 180; } if (tlocator.length() == 4) { return (((tlocator.at(0)).toLatin1() - 65) * 20) + (((tlocator.at(2)).toLatin1() - 48) * 2) - 180; } else if (tlocator.length()== 6) { return (((tlocator.at(0)).toLatin1() - 65) * 20) + (((tlocator.at(2)).toLatin1() - 48) * 2) + (((tlocator.at(4)).toLatin1() - 65 + 0.5) / 12) - 180; } else { return 0.0; } } int Locator::getBeam(const double lon1, const double lat1, const double lon2, const double lat2){ double lon_a,lat_a,lon_b,lat_b, bearing; //qDebug() << "Locator::getBeam1: " << QString::number(lon1) << "/" << QString::number(lat1) << endl; //qDebug() << "Locator::getBeam2: " << QString::number(lon2) << "/" << QString::number(lat2) << endl; lon_a=lon1*PI/180; // Convert degrees to radians lat_a=lat1*PI/180; lon_b=lon2*PI/180; lat_b=lat2*PI/180; //earing_Distance( double lon_a, double lat_a, /* Lon/Lat of point A */ // double lon_b, double lat_b, /* Lon/Lat of point B */ // double *bearing, double *distance )/* From A to B */ //{ double gc_arc, cos_gc_arc, /* Great circle arc A to B */ cos_bearing, sin_bearing, /* cos/sin of bearing A to B */ lon_diff; /* Difference in longitude of B from A */ /* Longitude differnce of B from A */ lon_diff = lon_b - lon_a; /* Calculate great circle distance A to B */ cos_gc_arc = cos(lon_diff)*cos(lat_a)*cos(lat_b) + sin(lat_a)*sin(lat_b); gc_arc = acos( cos_gc_arc ); /* Distance in km */ // *distance = eradius * gc_arc; /* Calculate bearing A to B */ cos_bearing = sin(lat_b) - sin(lat_a) * cos_gc_arc; sin_bearing = sin(lon_diff) * cos(lat_a) * cos(lat_b); bearing = atan2(sin_bearing, cos_bearing); /* Correct negative (anticlockwise) bearings */ if( bearing < 0.0 ) { bearing = (2*PI) + bearing; } bearing = 360 - (180/PI*bearing); bearing = 360 - bearing; //qDebug() << "Locator::getBeam: " << QString::number(bearing) << endl; /* Convert to degrees */ return (int)bearing; } int Locator::getDistance(const double lon1, const double lat1, const double lon2, const double lat2, const bool _imperialSystem){ //http://en.wikipedia.org/wiki/Haversine_formula //qDebug() << "Locator::getDistanceKilometres: MyPos("<< QString::number(lon1) << ")" << endl; // << QString::number(lat1) << ") - DxPos(" << QString::number(lon2) << "/" << QString::number(lat2) << ")" << endl; double lo1,la1,lo2,la2; // TODO: Is it needed to check if the longitude and latitude are correct and/or between the magins? // if (!( (checkCoords(lon1, lat1) ) && (checkCoords(lon2, lat2)) )) // return 0; lo1=lon1* DEG_TO_RAD; // Convert degrees to radians la1=lat1* DEG_TO_RAD; lo2=lon2* DEG_TO_RAD; la2=lat2* DEG_TO_RAD; if (!_imperialSystem){ //qDebug() << "Locator::getDistance (Km): " << QString::number((int)(acos(cos(la1)*cos(lo1)*cos(la2)*cos(lo2)+cos(la1)*sin(lo1)*cos(la2)*sin(lo2)+sin(la1)*sin(la2)) * EARTH_RADIUS)) << endl; return (int)(acos(cos(la1)*cos(lo1)*cos(la2)*cos(lo2)+cos(la1)*sin(lo1)*cos(la2)*sin(lo2)+sin(la1)*sin(la2)) * EARTH_RADIUS); }else{ // In milles //qDebug() << "Locator::getDistance (Milles): " << QString::number(((int)(acos(cos(la1)*cos(lo1)*cos(la2)*cos(lo2)+cos(la1)*sin(lo1)*cos(la2)*sin(lo2)+sin(la1)*sin(la2)) * EARTH_RADIUS))* 0.62137) << endl; return ((int)(acos(cos(la1)*cos(lo1)*cos(la2)*cos(lo2)+cos(la1)*sin(lo1)*cos(la2)*sin(lo2)+sin(la1)*sin(la2)) * EARTH_RADIUS)) * 0.62137; } } bool Locator::checkCoords(const double lon1, const double lat1){ //qDebug() << "Locator::checkCoords" ; // Checks if a coordinates is correct. if ((lat1 > 90.0 || lat1 < -90.0) && (lon1 > 180.0 || lon1 < -180.0)){ return true; }else{ return false; } } QString Locator::getLocator(const double lon1, const double lat1) const{ /* -------------- Subroutine ----------------------- Calculate locator from longitude and latitude Input : lon = Longitude in decimal degrees (+ = West; - = East). lat = Latitude in decimal degrees (+ = North; - = South). Output: locator = 6 characters world wide locator. ------------------------------------------------- */ //qDebug() << "Locator::getLocator: (" << QString::number(lon1) << "/" << QString::number(lat1) << ")" << endl; QString locat = ""; //NO locator double lo, la; int alo,bla,clo,dla,elo,fla; lo=(-lon1+180)/20; la = (lat1+90)/10; alo=(int)floor(lo); bla=(int)floor(la); lo=(lo-(double)alo)*10; la=(la-(double)bla)*10; clo = (int)floor(lo); dla = (int)floor(la); elo = (int)floor((lo-(double)clo)*24); fla = (int)floor((la-(double)dla)*24); //TODO: Test if locators are calculated correctly. // generation function has been changed because of the QT4 migration locat = locat + QChar(alo+'A'); locat = locat + QChar(bla+'A'); locat = locat + QChar(clo+'0'); locat = locat + QChar(dla+'0'); locat = locat + QChar(elo+'A'); locat = locat + QChar(fla+'A'); // locat.at(0)=QChar(alo+'A'); // locat.at(1)=QChar(bla+'A'); // locat.at(2)=QChar(clo+'0'); // locat.at(3)=QChar(dla+'0'); // locat.at(4)=QChar(elo+'A'); // locat.at(5)=QChar(fla+'A'); return locat; } void Locator::degTodms(const double deg){ double temp; double ddeg; ddeg = 0; ddeg += 1.0/7200.0; /* Round-up to 0.5 sec */ ideg = (int)ddeg; temp = ( deg - (double)ideg ) * 60.0; imin = (int)temp; temp = ( temp - (double)imin ) * 60.0; isec = (int)(temp); } double Locator::dmsTodeg (int deg, int min, int sec){ return (double)deg + (double)min/60.0 + (double)sec/3600.0; } int Locator::getBeamBetweenLocators (const QString& tlocator1, const QString& tlocator2) { //qDebug() << "Locator::getBeamBetweenLocators: " << tlocator1 << "/" << tlocator2 << endl; if ( !(isValidLocator(tlocator1) && isValidLocator(tlocator2) ) ) { return -1; } else { double lon1 = getLon(tlocator1); double lon2 = getLon(tlocator2); double lat1 = getLat(tlocator1); double lat2 = getLat(tlocator2); return getBeam(lon1, lat1, lon2, lat2); } } int Locator::getDistanceBetweenLocators (const QString& tlocator1, const QString& tlocator2, const bool _imperialSystem) { if ( !(isValidLocator(tlocator1) && isValidLocator(tlocator2) ) ) { return -1; } else { double lon1 = getLon(tlocator1); double lon2 = getLon(tlocator2); double lat1 = getLat(tlocator1); double lat2 = getLat(tlocator2); return getDistance(lon1, lat1, lon2, lat2, _imperialSystem); //return getBeam(lon1, lat1, lon2, lat2); } } klog-0.9.8.1/world.cpp0000644000175000017500000013337613532572307013462 0ustar develdevel/*************************************************************************** world.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "world.h" /* QHash worldPrefixes; To insert a (key, value) pair into the hash, you can use operator[](): hash["EA"] = 130; hash["EA6"] = 131; hash["EA8"] = 132; */ World::World(DataProxy *dp, const QString _parentFunction) { //qDebug() << "World::World(0)" << _parentFunction << endl; constrid = 1; worldModel = new QSqlRelationalTableModel(this); numberOfEntities = 0; progressBarPosition = 0; klogDir = ""; kontestVersion = ""; locator = new Locator(); created = false; dataProxy = dp; //awards = new Awards(Q_FUNC_INFO); //qDebug() << "World::World(0) - END" << endl; } World::World(DataProxy *dp, const QString _klogDir, const QString _parentFunction) { //qDebug() << "World::World(1): Dir" << _klogDir << _parentFunction << endl; constrid = 2; klogDir = _klogDir; kontestVersion = ""; worldModel = new QSqlRelationalTableModel(this); numberOfEntities = 0; progressBarPosition = 0; created = false; //flagsDir=":/flags/"; locator = new Locator(); dataProxy = dp; //qDebug() << "World::World(1): - END" << endl; } World::World(DataProxy *dp, const QString _klogDir, const QString _kontestVer, const QString _parentFunction) { //qDebug() << "World::World(2): Dir" << _klogDir << _parentFunction << endl; constrid = 3; klogDir = _klogDir; kontestVersion = _kontestVer; worldModel = new QSqlRelationalTableModel(this); //qDebug() << "World::World(2): 1" << endl; numberOfEntities = 0; progressBarPosition = 0; created = false; //appDir = QString(); //flagsDir=":/flags/"; //qDebug() << "World::World(2): 2" << endl; locator = new Locator(); //qDebug() << "World::World(2): 3" << endl; dataProxy = dp; //qDebug() << "World::World(2): - END" << endl; } World::~World() { //qDebug() << "World::~World" << endl; } bool World::recreate(const QString _worldFile) { //qDebug() << "World::recreate: " << _worldFile << endl; QSqlQuery query; if (query.exec("DELETE FROM entity")) { //qDebug() << "World::recreate: EMPTY entity" << endl; if (query.exec("DELETE FROM prefixesofentity")) { //qDebug() << "World::recreate: EMPTY prefixesofentity" << endl; return create(_worldFile); } else {//TODO: Manage the query error //qDebug() << "World::recreate: FAILED TO EMPTY prefixesofentity" << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); return false; } } else {//TODO: Manage the query error //qDebug() << "World::recreate: FAILED TO EMPTY entity" << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); return false; } //qDebug() << "World::recreate: END..." << endl; return false; } bool World::create(const QString _worldFile) { //qDebug() << "World::create: " << _worldFile << endl; //klogDir = _worldFile; //qDebug() << "World::create: 2 " << klogDir << endl; if (readCTYCSV(_worldFile)) { created = true; //qDebug() << "World::create: TRUE" << endl; }else { created = false; //qDebug() << "World::create: FALSE" << endl; } if (created) { //dataProxy->updateISONames(); if (dataProxy->updateISONames()) { //qDebug() << "World::create: updateISONames TRUE" << endl; } else { //qDebug() << "World::create: updateISONames FALSE" << endl; } } //qDebug() << "World::create: END" << endl; return created; } void World::createWorldModel() { worldModel->setTable("entity"); worldModel->setRelation(Entity_Continent, QSqlRelation("continent", "id", "shortname")); worldModel->setSort(Entity_Name, Qt::AscendingOrder); worldModel->setHeaderData(Entity_Name, Qt::Horizontal, tr("Entity")); worldModel->setHeaderData(Entity_Continent, Qt::Horizontal, tr("Continent")); worldModel->select(); } QStringList World::processLine(const QString _line) { //qDebug() << "World::processLine: received: " << _line << endl; //QString queryString; QStringList aa; QString line; line = (_line).simplified(); if ((line).count('\'')) // Replaces ' by _ //The error comes from "Cote d'Ivoire" that breaks the SQL { line.replace(QChar('\''), QChar('_')); } //qDebug() << "World::processLine: Received: " << line << endl; //QSqlQuery query1; nullValue=-1; if ( (line.count(':') == 8 ) ) // First line of an Entity { //United States: 05: 08: NA: 43.00: 87.90: 5.0: K: //qDebug() << "World::processLine first: " << line << endl; numberOfEntities++; list.clear(); list << line.split(':'); entityName = list[0]; cqz = list[1].toInt(); ituz = list[2].toInt(); continentName = (list[3]).simplified(); continentId=-1; lat = list[4].toDouble(); lon = list[5].toDouble(); utc = ((list[6]).simplified()).toDouble(); prefix = list[7]; currentPrefix = prefix; continentId = dataProxy->getContinentIdFromContinentShortName(continentName); //queryString = "SELECT id FROM continent WHERE shortname=='" + continentName + "'"; //query1.exec(queryString); //query1.next(); //if (query1.isValid()) //{ // continentId = (query1.value(0)).toInt(); //} //qDebug() << "World::processLine Query - Read/continenId: " << continentName << "/" << QString::number(continentId) << endl; //queryString = QString("INSERT INTO entity (id, name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix) VALUES (NULL,'%1','%2','%3','%4','%5','%6','%7','%8','%9');\n").arg(entityName).arg(cqz).arg(ituz).arg(QString::number(continentId)).arg(lat).arg(lon).arg(utc).arg(numberOfEntities).arg(prefix); aa << entityName << QString::number(cqz) << QString::number(ituz) <getCQzFromEntity(currentEntity); _ituz = dataProxy->getITUzFromEntity(currentEntity); line = line.remove(';'); if (line.count(',') == 0) // Only one prefix in the final line { prefixAndZones = readZones(line, _cqz, _ituz); //aa.clear(); aa << prefixAndZones.at(0) << QString::number(currentEntity) << prefixAndZones.at(1) << prefixAndZones.at(2); //readZones returns a QStringList: prefix, CQz, ITUz //Returns QStringList: prefix << dxcc << cqz << ituz OR CurrentEntity as a number return aa; } else // More than just one prefix in the final line { //qDebug() << "World::processLineP Query (MORE one final)(line):" << line << endl; _list.clear(); _list << line.split(','); aa.clear(); //queryString.clear(); for (int i = 0; i < _list.size(); ++i) { // PROCESS THE LINE //qDebug() << "World::processLineP LastLine prefixes" << _list.at(i) << endl; //readZones returns a QStringList: prefix, CQz, ITUz prefixAndZones = readZones(_list.at(i), _cqz, _ituz); //aa.clear(); aa << prefixAndZones.at(0) << QString::number(currentEntity) << prefixAndZones.at(1) << prefixAndZones.at(2); //return aa; } //qDebug() << "World::processLineP: END" <getCQzFromEntity(currentEntity); _ituz = dataProxy->getITUzFromEntity(currentEntity); if (line.endsWith(',')) { line.chop(1); } if ((line.split(',')).size() == 1) // Only one prefix in the middle line { // Not usual, added this check for sanity reasons only //qDebug() << "World::processLine Query: (only one middle) " << endl; line = line.remove(','); prefixAndZones = readZones(line, _cqz, _ituz); aa.clear(); aa << prefixAndZones.at(0) << QString::number(currentEntity) << prefixAndZones.at(1) << prefixAndZones.at(2); return aa; } else { //qDebug() << "World::processLine Query: (MORE than one middle) " << endl; list.clear(); list << line.split(','); //queryString.clear(); aa.clear(); for (int i = 0; i < list.size(); ++i) { // PROCESS THE LINE prefixAndZones = readZones(list[i], _cqz, _ituz); aa << prefixAndZones.at(0) << QString::number(currentEntity) << prefixAndZones.at(1) << prefixAndZones.at(2); //ret = query.exec(queryString); } } } //aa.clear(); return aa; } QStringList World::readZones (const QString &pref, const int _cq, const int _itu) { //Returns a QStringList: prefix, CQz, ITUz //qDebug() << "World::readZones: (" << pref << "/" << QString::number(_cq) <<"/" << QString::number(_itu)<< ")" << endl; QStringList result; int cq = _cq; int itu = _itu; QString azone; QString aux = pref; if (aux.startsWith("=")){ aux = aux.remove(0,1); } if(aux.count('[')==1) // Check if has special CQz { //qDebug() << "World::readZones DETECTED [ !!!!" << endl; azone = (aux.midRef(aux.indexOf('[')+1)).toString(); //qDebug() << "World::readZones (ITU)-1: " << aux << " right of " << QString::number(aux.indexOf('[')) << " = " << azone << endl; itu = (azone.left(azone.indexOf(']'))).toInt(); //qDebug() << "World::readZones (ITU)-2: " << azone.left(azone.indexOf(']')) << endl; aux = aux.left(aux.indexOf('[')); //qDebug() << "World::readZones (ITU): " << pref << "/" << QString::number(itu) << "/" << aux << endl; } if(aux.count('(')==1) // Check if has special CQz { //qDebug() << "World::readZones DETECTED ( !!!!" << endl; azone = (aux.midRef(aux.indexOf('(')+1)).toString(); cq = (azone.left(azone.indexOf(')'))).toInt(); aux = aux.left(aux.indexOf('(')); //qDebug() << "World::readZones (CQ): " << pref << "/" << QString::number(cq) << "/" << aux << endl; } //qDebug() << "World::readZones (Pref/CQ/ITU): " << pref << "= " << aux <<"/" << QString::number(cq) << "/" << QString::number(itu) << endl; result << aux << QString::number(cq) << QString::number(itu); //qDebug() << "World::readZones (Pref/CQ/ITU): " << result << endl; return result; } int World::getPrefixId(const QString _qrz) { //qDebug() << "World::getPrefixId: -" << _qrz <<"-" << endl; //TODO: Instead of going from long to short, identify prefixes from the begining: // character(may be number) + number if (_qrz.length() < 1) { return -1; } int entityID = 0; QString aux = changeSlashAndFindPrefix((_qrz).toUpper()); while ((entityID <= 0) && (aux.length()>=1) ) { entityID = dataProxy->getDXCCFromPrefix(aux); //qDebug() << "World::getPrefixId: in the while" << aux << " = " << QString::number(entityID) << endl; if (entityID<=0) { aux.chop(1); } } //qDebug() << "World::getPrefixId: " << _qrz << QString::number(entityID) << endl; return entityID; } QString World::getQRZEntityName(const QString _qrz) { //qDebug() << "World::getQRZEntityName: " << _qrz << endl; if (_qrz.length() < 1 ) { return ""; } //QString queryString; //QSqlQuery query; int prefixIDNumber = getPrefixId(_qrz); return getEntityName(prefixIDNumber); /* queryString = "SELECT dxcc FROM prefixesofentity WHERE id=='" + QString::number(prefixIDNumber) +"'"; //qDebug() << "World::getQRZEntityName: queryString-1: " << queryString << endl; query.exec(queryString); query.next(); if (query.isValid()) { prefixIDNumber = (query.value(0)).toInt(); } else { prefixIDNumber = -1; } //qDebug() << "World::getQRZEntityName: " <<_qrz << " = " << (query.value(0)).toString() << endl; queryString = "SELECT name FROM entity WHERE dxcc=='" + QString::number(prefixIDNumber) +"'"; //qDebug() << "World::getQRZEntityName: queryString-2: " << queryString << endl; query.exec(queryString); query.next(); //qDebug() << "World::getQRZEntityName end: " << _qrz << " = " << (query.value(0)).toString() << endl; if (query.isValid()){ return (query.value(0)).toString(); }else{ return ""; } return ""; */ } QString World::getEntityName(const int _entityN) { int prefixIDNumber = _entityN; if (prefixIDNumber<=0) { return QString(); } return dataProxy->getEntityNameFromId(prefixIDNumber); /* QString queryString; QSqlQuery query; queryString = QString("SELECT name FROM entity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(prefixIDNumber); //queryString = "SELECT name FROM entity WHERE dxcc=='" + QString::number(prefixIDNumber) +"'"; //qDebug() << "World::getEntityName: queryString-2: " << queryString << endl; query.exec(queryString); query.next(); if (query.isValid()){ return (query.value(0)).toString(); }else{ return ""; } return ""; */ } int World::getQRZCqz(const QString _qrz) { //qDebug() << "World::getQRZCqz: " << _qrz << endl; if (_qrz.length() < 1 ) { return -1; } int i = -1; QString aux = _qrz; while ((i <= 0) && (aux.length()>=1) ) { i = dataProxy->getCQzFromPrefix(aux); if (i<=0) { aux.chop(1); } } return i; //int prefixIdNumber = getPrefixId(_qrz); //return getEntityCqz(prefixIdNumber); } int World::getQRZItuz(const QString _qrz) { //qDebug() << "World::getQRZItuz: " << _qrz << endl; if (_qrz.length() < 1 ) { return -1; } int i = -1; QString aux = _qrz; while ((i <= 0) && (aux.length()>=1) ) { i = dataProxy->getITUzFromPrefix(aux); if (i<=0) { aux.chop(1); } } return i; } int World::getEntityCqz(const int _enti) { if (_enti < 1 ) { return -1; } return dataProxy->getCQzFromEntity(_enti); /* QSqlQuery query; QString queryString; //queryString = QString("SELECT cqz FROM prefixesofentity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(prefixIDNumber); queryString = "SELECT cqz FROM prefixesofentity WHERE dxcc=='" + QString::number(_enti) +"'"; query.exec(queryString); query.next(); //qDebug() << "World::getEntityCqz: " << QString::number(_enti) << " = " << (query.value(0)).toInt() << endl; if (query.isValid()){ return (query.value(0)).toInt(); }else{ return -1; } return -1; */ } int World::getEntityItuz(const int _enti) { if (_enti < 1 ) { return -1; } return dataProxy->getITUzFromEntity(_enti); /* QSqlQuery query; QString queryString; queryString = "SELECT ituz FROM prefixesofentity WHERE dxcc=='" + QString::number(_enti) +"'"; query.exec(queryString); query.next(); //qDebug() << "World::getEntityItuz: " << QString::number(_enti) << " = " << (query.value(0)).toInt() << endl; if (query.isValid()){ return (query.value(0)).toInt(); }else{ return -1; } return -1; */ } int World::getQRZARRLId(const QString _qrz) { //qDebug() << "World::getQRZARRLId" << _qrz << endl; if (_qrz.length() < 1 ) { return -1; } int prefixIdNumber = getPrefixId(_qrz); return prefixIdNumber; } QString World::getQRZEntityMainPrefix(const QString _qrz) { if (_qrz.length() < 1 ) { return ""; } int i = getQRZARRLId(_qrz); return getEntityMainPrefix(i); //QString queryString; //QSqlQuery query; /* queryString = "SELECT mainprefix FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return ""; } else { query.next(); //qDebug() << "World::getQRZEntityMainPrefix(id/qrz): " << QString::number(i) << "/" <<_qrz << " = " << (query.value(0)).toString() << endl; if (query.isValid()){ return (query.value(0)).toString(); } else { return ""; } } return ""; */ } QString World::getEntityMainPrefix(const int _entityN) { if (_entityN <= 0 ) { return ""; } return dataProxy->getEntityMainPrefix(_entityN); /* QString queryString; QSqlQuery query; queryString = QString("SELECT mainprefix FROM entity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(_entityN); //queryString = "SELECT mainprefix FROM entity WHERE dxcc=='" + QString::number(_entityN) +"'"; if (!query.exec(queryString)) { return ""; } else { query.next(); if (query.isValid()){ return (query.value(0)).toString(); }else{ return ""; } } return ""; */ } bool World::isNewCQz(const int _cqz) { return dataProxy->isNewCQz(_cqz); /* QString queryString; QSqlQuery query; queryString = "SELECT id FROM log WHERE cqz=='" + QString::number(_cqz) +"'"; if (!query.exec(queryString)) { return false; } else { query.next(); if (query.isValid()){ return true; }else{ return false; } } return false; */ } bool World::isNewEntity(const int _entityN) { if (_entityN <= 0) { return false; } return dataProxy->isNewEntity(_entityN); /* QString queryString; QSqlQuery query; queryString = "SELECT id FROM log WHERE dxcc=='" + QString::number(_entityN) +"'"; if (!query.exec(queryString)) { return false; } else { query.next(); if (query.isValid()){ return true; }else{ return false; } } return false; */ } QString World::getQRZContinentShortName(const QString _qrz) { //qDebug() << "World::getQRZContinentShortName: " << _qrz << endl; //QString continentNumber = getQRZContinentNumber (_qrz); return getContinentShortName (getQRZARRLId(_qrz)); } QString World::getContinentShortName(const int _enti) { //qDebug() << "World::getQRZContinentShortName: " << QString::number(_enti) << endl; //QString continentNumber = QString::number(_enti); if ( _enti < 0 ) { return "--"; } QString a = dataProxy->getContinentShortNameFromEntity(_enti); if (a.length()!=2) { return "--"; } else { return a; } /* QString queryString; QSqlQuery query; queryString = QString("SELECT continent FROM entity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(_enti); //queryString = "SELECT continent FROM entity WHERE dxcc=='" + continentNumber +"'"; if (!query.exec(queryString)) { return "--"; } else { query.next(); if ( !(query.isValid()) ) { //qDebug() << "World::getQRZContinentShortName: NO VALID" << endl; return "--"; }else{ //qDebug() << "World::getQRZContinentShortName: VALID" << endl; return (query.value(0)).toString(); } } return "--"; */ } QString World::getQRZContinentNumber(const QString _qrz) { //qDebug() << "World::getQRZContinentNumber: " << _qrz << endl; int i = getQRZARRLId(_qrz); return QString::number(getContinentNumber(i)); /* QString a; QString queryString; QSqlQuery query; queryString = QString("SELECT continent FROM entity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(i); //queryString = "SELECT continent FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return "-1"; } else { query.next(); if ( !(query.isValid()) ) { //qDebug() << "World::getQRZContinentNumber(qrz/i/Cont): NO VALID" << endl; return "-1"; }else{ //qDebug() << "World::getQRZContinentNumber(qrz/i/Cont): VALID" << endl; a = (query.value(0)).toString(); } //qDebug() << "World::getQRZContinentNumber(qrz/i/Cont): " <<_qrz << "/" << QString::number(i) << "/" << a << endl; return a; } return "-1"; */ } int World::getContinentNumber(const int _enti) { //qDebug() << "World::getQRZContinentNumber: " << QString::number(_enti) << endl; if (_enti <= 0) { return -1; } return dataProxy->getContinentIdFromEntity(_enti); /* int a = -1; QString queryString; QSqlQuery query; int i = _enti; queryString = QString("SELECT continent FROM entity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(i); //queryString = "SELECT continent FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return -1; } else { query.next(); if ( !(query.isValid()) ) { return -1; }else{ a = (query.value(0)).toInt(); queryString = "SELECT id FROM continent where shortname=='" + query.value(0).toString() + "'"; if (query.exec(queryString)) { query.next(); if(query.isValid()) { return query.value(0).toInt(); } else { // Value not valid return -1; } } else { // Error in the query return -1; } } return a; } return -1; */ } double World::getQRZLongitude(const QString _qrz) { int i = getQRZARRLId(_qrz); return dataProxy->getLongitudeFromEntity(i); /* QString queryString; QSqlQuery query; queryString = "SELECT longitude FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return 0.0; } else { query.next(); if ( !(query.isValid()) ) { //qDebug() << "World::getQRZLongitude: NO VALID" << endl; return 0.0; }else{ //qDebug() << "World::getQRZLongitude: VALID" << endl; return (query.value(0)).toDouble(); } } return 0.0; */ } double World::getLongitude(const int _enti) { if (_enti <= 0) { return 0.0; } return dataProxy->getLongitudeFromEntity(_enti); /* QString queryString; QSqlQuery query; int i = _enti; queryString = "SELECT longitude FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return 0.0; } else { query.next(); if ( !(query.isValid()) ) { //qDebug() << "World::getQRZLongitude: NO VALID" << endl; return 0.0; }else{ //qDebug() << "World::getQRZLongitude: VALID" << endl; return (query.value(0)).toDouble(); } } return 0.0; */ } double World::getQRZLatitude(const QString _qrz) { int i = getQRZARRLId(_qrz); return dataProxy->getLatitudeFromEntity(i); /* QString queryString; QSqlQuery query; queryString = "SELECT latitude FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return 0.0; } else { query.next(); if ( !(query.isValid()) ) { //qDebug() << "World::getQRZLatitud: NO VALID" << endl; return 0.0; }else{ //qDebug() << "World::getQRZLatitud: VALID" << endl; return (query.value(0)).toDouble(); } } return 0.0; */ } double World::getLatitude(const int _enti) { if (_enti <= 0) { return 0.0; } return dataProxy->getLatitudeFromEntity(_enti); /* QString queryString; QSqlQuery query; int i = _enti; queryString = "SELECT latitude FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return 0.0; } else { query.next(); if ( !(query.isValid()) ) { //qDebug() << "World::getQRZLatitud: NO VALID" << endl; return 0.0; }else{ //qDebug() << "World::getQRZLatitud: VALID" << endl; return (query.value(0)).toDouble(); } } return 0.0; */ } QString World::getQRZLocator(const QString _qrz) { if (_qrz.length() < 1) { return ""; } return locator->getLocator(getQRZLongitude(_qrz), getQRZLatitude(_qrz)); } QString World::getLocator(const int _enti) { if (_enti <= 0) { return ""; } return locator->getLocator(getLongitude(_enti), getLatitude(_enti)); } /* int World::getBandIdFromFreq(const QString fr) { //qDebug() << "World::getBandIdFromFreq: " << fr << endl; //Freq should be in MHz QSqlQuery query; QString queryString = QString("SELECT id FROM band WHERE lower <= '%1' and upper >= '%2'").arg(fr).arg(fr); //qDebug() << "World::getBandIdFromFreq query: " << queryString << endl; if (!query.exec(queryString)) { return -1; } else { query.next(); int b=-1; if (query.isValid()) { b = (query.value(0)).toInt(); //qDebug() << "World::getBandIdFromFreq value: " << QString::number(b) << endl; //return (query.value(0)).toInt(); return b; } else { //qDebug() << "World::getBandIdFromFreq value not valid!!" << endl; return -1; } } return -1; } */ QString World::getQRZEntityPrefixes(const QString _qrz) { int i = getQRZARRLId(_qrz); return dataProxy->getEntityMainPrefix(i); /* QString result; result = ""; QString queryString; QSqlQuery query; queryString = "SELECT prefix FROM prefixesofentity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return ""; } else { while ( (query.next())) { if (query.isValid()) { result = result + ", " + (query.value(0)).toString(); } else { } } if (result.length() < 1) { return result; } else { result = result.remove(0,2); return result; } } return ""; */ } bool World::readCTYCSV(const QString _worldFile) { //qDebug() << "World::readCTYCSV(): " << _worldFile << endl; QString tq; tq.clear(); QString entityNumber; entityNumber = "-1"; QString fileName; qint64 beginingOfFile; int numberOfLines = 0; //int errorCode = -1; QFile file( _worldFile ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { //qDebug() << "World::readCTYCSV() File not found: END FALSE" << fileName << endl; return false; } else { //qDebug() << "World::readCTYCSV() File found: " << fileName << endl; } beginingOfFile = file.pos(); while (!file.atEnd()) { if ( (file.readLine()).contains(';') ) { numberOfEntities++; } numberOfLines++; } //qDebug() << "World::readCTYCSV() - numberOfEntities: " << QString::number(numberOfEntities) << endl; // The file is readed twice: 1: Main entity data; 2: prefixes. // Starts with main data: file.seek(beginingOfFile); progressBarPosition = 0; QProgressDialog progress(tr("Reading cty.csv..."), tr("Abort reading"), 0, numberOfLines, this); progress.setWindowModality(Qt::ApplicationModal); numberOfEntities = 0; // Reset this variable to reuse it and assign the "dxcc" to the entities (temp solution) QSqlQuery query; // Entity information QSqlQuery queryP; // Prefixes information query.prepare("INSERT INTO entity (id, name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); queryP.prepare("INSERT INTO prefixesofentity (id, prefix, dxcc, cqz, ituz) VALUES (?, ?, ?, ?, ?)"); QSqlDatabase::database().transaction(); QStringList stringList, stringListPrefixes, stringListProcessedPrefix; int entN; entN = -1; while (!file.atEnd()) { progress.setValue(progressBarPosition); progressBarPosition++; if (progress.wasCanceled()) break; stringList.clear(); stringListPrefixes.clear(); // // 9Y,Trinidad & Tobago,90,SA,9,11,10.38,61.28,4.0,9Y 9Z; // 5A,Libya,436,AF,34,38,27.20,-16.60,-2.0,5A; // MainPref / Name / dxcc / Cont / CQ / ITU / LAT / LON / -UTC / prefixes // 0 1 2 3 4 5 6 7 8 9 tq = file.readLine(); //qDebug() << "World::readCTYCSV(): Line: " << tq << endl; tq = tq.simplified(); //qDebug() << "World::readCTYCSV(): Line simplified: " << tq << endl; tq = tq.trimmed(); //qDebug() << "World::readCTYCSV(): Line trimmed: " << tq << endl; tq.remove(QChar(';'), Qt::CaseInsensitive); //qDebug() << "World::readCTYCSV(): Line without ;: " << tq << endl; stringList << tq.split(','); //qDebug() << "World::readCTYCSV(): Line stringList-0: " << stringList.at(0) << endl; if (( stringList.at(0)).contains(QChar('*'), Qt::CaseInsensitive)) { // This is a special Entity. Not really an ARRL Entity but interesting for the DXer. // From http://www.country-files.com/cty-dat-format // (A “*” preceding this prefix indicates that the country is on the DARC WAEDC list, and counts in CQ-sponsored contests, but not ARRL-sponsored contests). entN = -1; entN = (stringList.at(2)).toInt() + 1000; while ( (dataProxy->getEntityMainPrefix(entN)).size()>0 ) { //qDebug() << "World::readCTYCSV() entN: " << QString::number(entN) << endl; //qDebug() << "World::readCTYCSV() dataProxy->getEntityMainPrefix: " << QString::number(entN) << endl; entN = entN + 1000; } entityNumber = QString::number(entN); } else { entityNumber = stringList.at(2); } //qDebug() << "World::readCTYCSV(): Line stringList Length: " << QString::number(stringList.length()) << endl; if (stringList.size()>=8 ) { //(id, name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix) query.addBindValue(QVariant(QVariant::Int)); query.addBindValue(stringList.at(1)); // name query.addBindValue(stringList.at(4)); // CQ query.addBindValue(stringList.at(5)); // ITU query.addBindValue(stringList.at(3)); // Cont query.addBindValue(stringList.at(6)); // Lat query.addBindValue(stringList.at(7)); // Lon query.addBindValue(stringList.at(8)); // UTC //query.addBindValue(stringList.at(2)); // dxcc query.addBindValue(entityNumber); // dxcc query.addBindValue(stringList.at(0)); // Mainprefix //qDebug() << "World::readCTYCSV(): Entity name: " << stringList.at(1) << endl; //qDebug() << "World::readCTYCSV(): Entity cqz: " << stringList.at(4) << endl; //qDebug() << "World::readCTYCSV(): Entity ituz: " << stringList.at(5) << endl; //qDebug() << "World::readCTYCSV(): Entity cont: " << stringList.at(3) << endl; //qDebug() << "World::readCTYCSV(): Entity lat: " << stringList.at(6) << endl; //qDebug() << "World::readCTYCSV(): Entity lon: " << stringList.at(7) << endl; //qDebug() << "World::readCTYCSV(): Entity UTC: " << stringList.at(8) << endl; //qDebug() << "World::readCTYCSV(): Entity ARRL: " << stringList.at(2) << endl; //qDebug() << "World::readCTYCSV(): Entity Pref: " << stringList.at(0) << endl; if (query.exec()) { //qDebug() << "World::readCTYDAT(): Entity data added: " << stringList.at(1) << endl; } else if (query.lastError().number() == 19) { //qDebug() << "World::readCTYDAT(): Entity data added: error19: " << stringList.at(1) << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); } else { //qDebug() << "World::readCTYDAT(): Entity data added: error else: " << stringList.at(1) << endl; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().number(), query.lastQuery()); //errorCode = query.lastError().number(); //qDebug() << "World::readCTYCSV(): Entity data NOT added" << endl; //qDebug() << "World::readCTYCSV(): LastQuery: " << query.lastQuery() << endl; //qDebug() << "World::readCTYCSV(): LastError-data: " << query.lastError().databaseText() << endl; //qDebug() << "World::readCTYCSV(): LastError-driver: " << query.lastError().driverText() << endl; //qDebug() << "World::readCTYCSV(): LastError-n: " << QString::number(query.lastError().number() ) << endl; } //qDebug() << "World::readCTYCSV(): Entity ADDED or NOT" << endl; if (stringList.size()>8) { tq = stringList.at(9); stringListPrefixes << tq.split(' '); tq = stringListPrefixes.last(); QString prefAux = QString(); for (int i = 0; i < stringListPrefixes.size(); ++i) { prefAux = stringListPrefixes.at(i); //queryP.prepare("INSERT INTO prefixesofentity (id, prefix, dxcc, cqz, ituz) VALUES (?, ?, ?, ?, ?)"); // 0 1 2 3 4 // (id, prefix, dxcc, cqz, ituz) //qDebug() << "World::readCTYCSV(): Prefix: " << stringListPrefixes.at(i) << endl; queryP.addBindValue(QVariant(QVariant::Int)); //readZones (const QString &pref, const int _cq, const int _itu) //Returns a QStringList: prefix, CQz, ITUz stringListProcessedPrefix.clear(); stringListProcessedPrefix << readZones(prefAux, (stringList.at(4)).toInt(), (stringList.at(5)).toInt()); if (prefAux.at(0)=='=') { //TODO: Maybe there is a better way to identify exact calls instead of prefixes , identified with a = before he call. prefAux.remove(0,1); } //queryP.addBindValue(prefAux); queryP.addBindValue(stringListProcessedPrefix.at(0)); //queryP.addBindValue(stringList.at(2)); //queryP.addBindValue(stringList.at(4)); //queryP.addBindValue(stringList.at(5)); //queryP.addBindValue(stringList.at(2)); queryP.addBindValue(entityNumber); queryP.addBindValue(stringListProcessedPrefix.at(1)); queryP.addBindValue(stringListProcessedPrefix.at(2)); if (queryP.exec()) { //qDebug() << "World::readCTYCSV(): Prefix added: " << stringListPrefixes.at(i) << endl; } else if (queryP.lastError().number() == 19) {} else { //errorCode = queryP.lastError().number(); emit queryError(Q_FUNC_INFO, queryP.lastError().databaseText(), queryP.lastError().number(), queryP.lastQuery()); //qDebug() << "World::readCTYCSV(): Prefix data NOT added" << endl; //qDebug() << "World::readCTYCSV(): Prefix LastQuery: " << query.lastQuery() << endl; //qDebug() << "World::readCTYCSV(): Prefix LastError-data: " << query.lastError().databaseText() << endl; //qDebug() << "World::readCTYCSV(): Prefix LastError-driver: " << query.lastError().driverText() << endl; //qDebug() << "World::readCTYCSV(): Prefix LastError-n: " << QString::number(query.lastError().number() ) << endl; } } } } //qDebug() << "World::readCTYCSV() tq: " << tq << endl; progress.setLabelText("Reading cty.csv ... \nNow reading " + currentPrefix + " data"); //qDebug() << "World::readCTYCSV() - progressBarPosition: " << QString::number(progressBarPosition) << endl; } QSqlDatabase::database().commit(); progress.setValue(numberOfLines); if (created) { dataProxy->updateISONames(); } //qDebug() << "World::readCTYCSV() END TRUE " << endl; return true; } QString World::changeSlashAndFindPrefix(const QString _qrz) { //qDebug() << "World::changeSlashAndFindPrefix: -" << _qrz <<"-" << endl; int iaux1, iaux2; QString aux = _qrz.toUpper(); if ((aux).count('\\')) // Replaces \ by / to ease operation. { aux.replace(QChar('\\'), QChar('/')); } else { return aux; } if (aux.count('/')) // / found! Checking different options { if (aux.endsWith("/") ) { // We look for calls ending in slash "/" or "\" aux.remove(aux.length()-1,1); } iaux1 = aux.indexOf('/'); //qDebug() << "World::changeSlashAndFindPrefix: Slash found at: " << QString::number(iaux1) << endl; iaux2 = (aux.length())- iaux1; // iaux2 is the length of the second part if (iaux2 < 0){ iaux2 = -iaux2; } if ( iaux1 < iaux2 ) { //Like in F/EA4TV, we can simply take the first part as the prefix aux = aux.left(iaux1); } else { aux = aux.right(iaux2 -1); } } return aux; } bool World::checkQRZValidFormat(const QString _qrz) { //qDebug() << "World::checkQRZValidFormat: -" << _qrz <<"-" << endl; QString aux = changeSlashAndFindPrefix(_qrz.toUpper()); if (aux.length()<3) { return false; } // The format of a Call is defined here: // http://en.wikipedia.org/wiki/ITU_prefix_%28amateur_stations%29 //bool prefixEnded = false; //int callLength = _qrz.length(); int sepPos = 0; int barPos = aux.indexOf('/'); QString prefix = QString(); QString suffix = QString(); QString separator = QString(); // If barPos > 0 we have a complex call like F/EA4TV QCharRef c = aux[aux.length()-1]; if ( c.isDigit() && (barPos<=0) ) { return false; } prefix = prefix + aux.at(0); if ( ( aux.at(1) ).isDigit() ) { // W3 A6 if ((aux.at(2)).isDigit() ) { // A60 prefix = prefix + aux.at(1); separator = aux.at(2); sepPos = 2; } else { // W3A separator = aux.at(1); sepPos = 1; } } else { // EA 3D 2M if ((aux.at(2)).isDigit() ) { // EA0 prefix = prefix + aux.at(1); separator = aux.at(2); sepPos = 2; } else { // 3DA if (aux.length() < 4) { prefix = prefix + aux.at(2); return false; } if ((aux.at(3)).isDigit()) { // 3DA0 prefix = prefix + aux.at(1); prefix = prefix + aux.at(2); separator = aux.at(3); sepPos = 3; if (aux.length() < 5) { // 3DA0 prefix = prefix + aux.at(3); return false; } } else { return false; } } } for (int i = sepPos+1; i < aux.length(); i++) { suffix = suffix + aux.at(i); } //qDebug() << "World::checkQRZValidFormat: Prefix = " << prefix << endl; //qDebug() << "World::checkQRZValidFormat: Separator = " << separator << endl; //qDebug() << "World::checkQRZValidFormat: Suffix = " << suffix << endl; //qDebug() << "World::checkQRZValidFormat: Call = " << prefix+separator+suffix << endl; return true; } QStringList World::getEntitiesNames() { //qDebug() << "World::getEntitiesNames" << endl; return dataProxy->getEntitiesNames(); } int World::getHowManyEntities() { return dataProxy->getHowManyEntities(); } klog-0.9.8.1/startwizard.cpp0000644000175000017500000015352313532572307014705 0ustar develdevel#include "startwizard.h" //#include StartWizard::StartWizard(const QString _klogDir, const QString _softVersion, QWidget *parent) : QWizard(parent) { //qDebug() << "StartWizard::StartWizard: v=" << _softVersion << endl; //licAcepted = false; version = _softVersion; klogDir = _klogDir; inMemory = true; //fileOrMemoryPage = new FileOrMemoryPage(); ctyPage = new CTYPage(klogDir, version); setWizardStyle(QWizard::AeroStyle); setPage(Page_Intro, new IntroPage); setPage(Page_Lic, new LicPage); //setPage(Page_Mem, new FileOrMemoryPage); setPage(Page_CTY, ctyPage); setStartId(Page_Intro); QAbstractButton* finishButton = this->button(QWizard::FinishButton); QAbstractButton* cancelButton = this->button(QWizard::CancelButton); connect(finishButton, SIGNAL(clicked()), this, SLOT(slotButtonFinishedClicked())); disconnect( cancelButton, SIGNAL( clicked() ), this, SLOT( reject() ) ); connect(cancelButton, SIGNAL( clicked() ), this, SLOT( slotCancelWizard() ) ); //connect(fileOrMemoryPage, SIGNAL(exeInMemory(bool)), this, SLOT(slotRunInMemory(bool) ) ); //connect(ctyPage, SIGNAL(downloadTheFileSignal(bool)), this, SLOT(slotDownloadCTY(bool) ) ); QList layout; layout << QWizard::Stretch << QWizard::BackButton << QWizard::CancelButton << QWizard::NextButton << QWizard::FinishButton; setButtonLayout(layout); setWindowTitle(tr("KLog - The free hamradio logging program")); //qDebug() << "StartWizard::StartWizard: - END" << endl; } void StartWizard::setVersion(QString tversion) { version = tversion; } /*void StartWizard::slotUpdateDownloadProgress(qint64 received, qint64 total) { //qDebug() << "StartWizard::slotUpdateDownloadProgress: " << QString::number(received) << "/" << QString::number(total) << endl; ctyPage->updateProgress(received, total); } */ /* void StartWizard::slotDownloadFinished() { //qDebug() << "StartWizard::slotDownloadFinished" << endl; //close(); } */ void StartWizard::slotCancelWizard() { if( QMessageBox::question( this, tr("Quit Setup"), tr("Setup is not complete yet. Are you sure you want to quit setup?"), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) { // allow cancel reject(); } } void StartWizard::slotRunInMemory(bool checked) { if (checked) { inMemory = true; } else { inMemory = false; } } void StartWizard::slotButtonFinishedClicked() { //qDebug() << "StartWizard::slotButtonFinishedClicked " << endl; if (inMemory) { setResult(1); //qDebug() << "StartWizard::slotButtonFinishedClicked: done 1 " << endl; } else { //qDebug() << "StartWizard::slotButtonFinishedClicked: done 2 " << endl; setResult(2); } } /* bool StartWizard::doTheDownload() { //qDebug() << "StartWizard::doTheDownload" << endl; int downloading = 1; int i = 0; int ret; QMessageBox msgBox; QString str; msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); i = dl->download(); if (downloadValueResult == 0) { return true; } return false; } void StartWizard::slotValueReturnedFromDownload(int value) { //qDebug() << "StartWizard::slotValueReturnedFromDownload: " << QString::number(value) << endl; downloadValueResult = value; //close(); } */ IntroPage::IntroPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Welcome to KLog!")); topLabel = new QLabel(tr("Welcome to KLog! " "- brought to you under the terms of the GPL!")); topLabel->setWordWrap(true); welcomeBrowser = new QTextEdit; welcomeBrowser->setReadOnly(true); QString welcometxt = "" + tr("Welcome to KLog") + "" + "

" + tr("This looks like it's the first time you've run KLog on this computer.") + "

" + "

" + tr("KLog is a free hamradio logging program that can run on Linux macOS and Windows.") + tr("It is designed to provide general purpose, DX and contest logging.") + "

" + "

" + tr("It supports QSL management, import and export of ADIF ") + tr("and Cabrillo file formats and many other features...") + "

" + tr("Before you can start using KLog, you will be asked to:") + "

    " + "
  • " + tr("Acknowledge to the terms of the license.") + "
  • " + "
  • " + tr("Download the DX entities information.") + "
  • " + "
  • " + tr("Enter your callsign, CQ zone, etc. and main configuration.") + "
" + "

" + tr("Enjoy KLog and contact the development team if you have any suggestions!") + "

" + "

73 de EA4TV

"; welcomeBrowser->setHtml(welcometxt); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(welcomeBrowser); setLayout(layout); } int IntroPage::nextId() const { return StartWizard::Page_Lic; } LicPage::LicPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("KLog License information")); //setPixmap(QWizard::WatermarkPixmap, QPixmap(":/images/watermark.png")); topLabel = new QLabel(tr("Welcome to KLog!" "- brought to you under the terms of the GPL!")); topLabel->setWordWrap(true); licenseBrowser = new QTextEdit; licenseBrowser->setReadOnly(true); QString gplLic = "" "GNU General Public License v3.0 - GNU Project - Free Software Foundation (FSF)" "" "" "

GNU GENERAL PUBLIC LICENSE

" "

Version 3, 29 June 2007

" "

Copyright (c) 2007 Free Software Foundation, Inc.

" "

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

" "

Preamble

" "

The GNU General Public License is a free, copyleft license for software and other kinds of works.

" "

The licenses for most software and other practical works are designed " "to take away your freedom to share and change the works. By contrast, " "the GNU General Public License is intended to guarantee your freedom to " "share and change all versions of a program--to make sure it remains free " "software for all its users. We, the Free Software Foundation, use the " "GNU General Public License for most of our software; it applies also to " "any other work released this way by its authors. You can apply it to " "your programs, too.

" "

When we speak of free software, we are referring to freedom, not " "price. Our General Public Licenses are designed to make sure that you " "have the freedom to distribute copies of free software (and charge for " "them if you wish), that you receive source code or can get it if you " "want it, that you can change the software or use pieces of it in new " "free programs, and that you know you can do these things.

" "

To protect your rights, we need to prevent others from denying you " "these rights or asking you to surrender the rights. Therefore, you have " "certain responsibilities if you distribute copies of the software, or if " "you modify it: responsibilities to respect the freedom of others.

" "

For example, if you distribute copies of such a program, whether " "gratis or for a fee, you must pass on to the recipients the same " "freedoms that you received. You must make sure that they, too, receive " "or can get the source code. And you must show them these terms so they " "know their rights.

" "

Developers that use the GNU GPL protect your rights with two steps: " "(1) assert copyright on the software, and (2) offer you this License " "giving you legal permission to copy, distribute and/or modify it.

" "

For the developers' and authors' protection, the GPL clearly explains " "that there is no warranty for this free software. For both users' and " "authors' sake, the GPL requires that modified versions be marked as " "changed, so that their problems will not be attributed erroneously to " "authors of previous versions.

" "

Some devices are designed to deny users access to install or run " "modified versions of the software inside them, although the manufacturer " "can do so. This is fundamentally incompatible with the aim of " "protecting users' freedom to change the software. The systematic " "pattern of such abuse occurs in the area of products for individuals to " "use, which is precisely where it is most unacceptable. Therefore, we " "have designed this version of the GPL to prohibit the practice for those " "products. If such problems arise substantially in other domains, we " "stand ready to extend this provision to those domains in future versions " "of the GPL, as needed to protect the freedom of users.

" "

Finally, every program is threatened constantly by software patents." "States should not allow patents to restrict development and use of " "software on general-purpose computers, but in those that do, we wish to " "avoid the special danger that patents applied to a free program could " "make it effectively proprietary. To prevent this, the GPL assures that " "patents cannot be used to render the program non-free.

" "

The precise terms and conditions for copying, distribution and " "modification follow.

" "

TERMS AND CONDITIONS

" "

0. Definitions.

" "

This License refers to version 3 of the GNU General Public License.

" "

Copyright also means copyright-like laws that apply to other kinds of " "works, such as semiconductor masks.

" "

The Program refers to any copyrightable work licensed under this " "License. Each licensee is addressed as you. Licensees and " "recipients may be individuals or organizations.

" "

To modify a work means to copy from or adapt all or part of the work " "in a fashion requiring copyright permission, other than the making of an " "exact copy. The resulting work is called a modified version of the " "earlier work or a work based on the earlier work.

" "

A covered work means either the unmodified Program or a work based " "on the Program.

" "

To propagate a work means to do anything with it that, without " "permission, would make you directly or secondarily liable for " "infringement under applicable copyright law, except executing it on a " "computer or modifying a private copy. Propagation includes copying, " "distribution (with or without modification), making available to the " "public, and in some countries other activities as well.

" "

To convey a work means any kind of propagation that enables other " "parties to make or receive copies. Mere interaction with a user through " "a computer network, with no transfer of a copy, is not conveying.

" "

An interactive user interface displays Appropriate Legal Notices " "to the extent that it includes a convenient and prominently visible " "feature that (1) displays an appropriate copyright notice, and (2) " "tells the user that there is no warranty for the work (except to the " "extent that warranties are provided), that licensees may convey the " "work under this License, and how to view a copy of this License. If " "the interface presents a list of user commands or options, such as a " "menu, a prominent item in the list meets this criterion.

" "

1. Source Code.

" "

The source code for a work means the preferred form of the work " "for making modifications to it. Object code means any non-source " "form of a work.

" "

A Standard Interface means an interface that either is an official " "standard defined by a recognized standards body, or, in the case of " "interfaces specified for a particular programming language, one that " "is widely used among developers working in that language.

" "

The System Libraries of an executable work include anything, other " "than the work as a whole, that (a) is included in the normal form of " "packaging a Major Component, but which is not part of that Major " "Component, and (b) serves only to enable use of the work with that " "Major Component, or to implement a Standard Interface for which an " "implementation is available to the public in source code form. A " "Major Component, in this context, means a major essential component " "(kernel, window system, and so on) of the specific operating system " "(if any) on which the executable work runs, or a compiler used to " "produce the work, or an object code interpreter used to run it.

" "

The Corresponding Source for a work in object code form means all " "the source code needed to generate, install, and (for an executable " "work) run the object code and to modify the work, including scripts to " "control those activities. However, it does not include the work's " "System Libraries, or general-purpose tools or generally available free " "programs which are used unmodified in performing those activities but " "which are not part of the work. For example, Corresponding Source " "includes interface definition files associated with source files for " "the work, and the source code for shared libraries and dynamically " "linked subprograms that the work is specifically designed to require, " "such as by intimate data communication or control flow between those " "subprograms and other parts of the work.

" "

The Corresponding Source need not include anything that users " "can regenerate automatically from other parts of the Corresponding " "Source.

" "

The Corresponding Source for a work in source code form is that " "same work.

" "

2. Basic Permissions.

" "

All rights granted under this License are granted for the term of " "copyright on the Program, and are irrevocable provided the stated " "conditions are met. This License explicitly affirms your unlimited " "permission to run the unmodified Program. The output from running a " "covered work is covered by this License only if the output, given its " "content, constitutes a covered work. This License acknowledges your " "rights of fair use or other equivalent, as provided by copyright law.

" "

You may make, run and propagate covered works that you do not " "convey, without conditions so long as your license otherwise remains " "in force. You may convey covered works to others for the sole purpose " "of having them make modifications exclusively for you, or provide you " "with facilities for running those works, provided that you comply with " "the terms of this License in conveying all material for which you do " "not control copyright. Those thus making or running the covered works " "for you must do so exclusively on your behalf, under your direction " "and control, on terms that prohibit them from making any copies of " "your copyrighted material outside their relationship with you.

" "

Conveying under any other circumstances is permitted solely under " "the conditions stated below. Sublicensing is not allowed; section 10 " "makes it unnecessary.

" "

3. Protecting Users' Legal Rights From Anti-Circumvention Law.

" "

No covered work shall be deemed part of an effective technological " "measure under any applicable law fulfilling obligations under article " "11 of the WIPO copyright treaty adopted on 20 December 1996, or " "similar laws prohibiting or restricting circumvention of such " "measures.

" "

When you convey a covered work, you waive any legal power to forbid " "circumvention of technological measures to the extent such circumvention " "is effected by exercising rights under this License with respect to " "the covered work, and you disclaim any intention to limit operation or " "modification of the work as a means of enforcing, against the work's " "users, your or third parties' legal rights to forbid circumvention of " "technological measures.

" "

4. Conveying Verbatim Copies.

" "

You may convey verbatim copies of the Program's source code as you " "receive it, in any medium, provided that you conspicuously and " "appropriately publish on each copy an appropriate copyright notice; " "keep intact all notices stating that this License and any " "non-permissive terms added in accord with section 7 apply to the code; " "keep intact all notices of the absence of any warranty; and give all " "recipients a copy of this License along with the Program.

" "

You may charge any price or no price for each copy that you convey, " "and you may offer support or warranty protection for a fee.

" "

5. Conveying Modified Source Versions.

" "

You may convey a work based on the Program, or the modifications to " "produce it from the Program, in the form of source code under the " "terms of section 4, provided that you also meet all of these conditions:

" "
    " "
  • a) The work must carry prominent notices stating that you modified" "it, and giving a relevant date.
  • " "
  • b) The work must carry prominent notices stating that it is " "released under this License and any conditions added under section " "7. This requirement modifies the requirement in section 4 to " "keep intact all notices.
  • " "
  • c) You must license the entire work, as a whole, under this " "License to anyone who comes into possession of a copy. This " "License will therefore apply, along with any applicable section 7 " "additional terms, to the whole of the work, and all its parts, " "regardless of how they are packaged. This License gives no " "permission to license the work in any other way, but it does not " "invalidate such permission if you have separately received it.
  • " "
  • d) If the work has interactive user interfaces, each must display " "Appropriate Legal Notices; however, if the Program has interactive " "interfaces that do not display Appropriate Legal Notices, your " "work need not make them do so.
  • " "
" "

A compilation of a covered work with other separate and independent " "works, which are not by their nature extensions of the covered work, " "and which are not combined with it such as to form a larger program, " "in or on a volume of a storage or distribution medium, is called an " "aggregate if the compilation and its resulting copyright are not " "used to limit the access or legal rights of the compilation's users " "beyond what the individual works permit. Inclusion of a covered work " "in an aggregate does not cause this License to apply to the other " "parts of the aggregate.

" "

6. Conveying Non-Source Forms.

" "

You may convey a covered work in object code form under the terms " "of sections 4 and 5, provided that you also convey the " "machine-readable Corresponding Source under the terms of this License, " "in one of these ways:

" "
    " "
  • a) Convey the object code in, or embodied in, a physical product " "(including a physical distribution medium), accompanied by the " "Corresponding Source fixed on a durable physical medium " "customarily used for software interchange.
  • " "
  • b) Convey the object code in, or embodied in, a physical product " "(including a physical distribution medium), accompanied by a " "written offer, valid for at least three years and valid for as " "long as you offer spare parts or customer support for that product " "model, to give anyone who possesses the object code either (1) a " "copy of the Corresponding Source for all the software in the " "product that is covered by this License, on a durable physical " "medium customarily used for software interchange, for a price no " "more than your reasonable cost of physically performing this " "conveying of source, or (2) access to copy the " "Corresponding Source from a network server at no charge.
  • " "
  • c) Convey individual copies of the object code with a copy of the " "written offer to provide the Corresponding Source. This " "alternative is allowed only occasionally and noncommercially, and " "only if you received the object code with such an offer, in accord " "with subsection 6b.
  • " "
  • d) Convey the object code by offering access from a designated " "place (gratis or for a charge), and offer equivalent access to the " "Corresponding Source in the same way through the same place at no " "further charge. You need not require recipients to copy the " "Corresponding Source along with the object code. If the place to " "copy the object code is a network server, the Corresponding Source " "may be on a different server (operated by you or a third party) " "that supports equivalent copying facilities, provided you maintain " "clear directions next to the object code saying where to find the " "Corresponding Source. Regardless of what server hosts the " "Corresponding Source, you remain obligated to ensure that it is " "available for as long as needed to satisfy these requirements.
  • " "
  • e) Convey the object code using peer-to-peer transmission, provided " "you inform other peers where the object code and Corresponding " "Source of the work are being offered to the general public at no " "charge under subsection 6d.
  • " "
" "

A separable portion of the object code, whose source code is excluded " "from the Corresponding Source as a System Library, need not be " "included in conveying the object code work.

" "

A User Product is either (1) a consumer product, which means any " "tangible personal property which is normally used for personal, family, " "or household purposes, or (2) anything designed or sold for incorporation " "into a dwelling. In determining whether a product is a consumer product, " "doubtful cases shall be resolved in favor of coverage. For a particular " "product received by a particular user, normally used refers to a " "typical or common use of that class of product, regardless of the status " "of the particular user or of the way in which the particular user " "actually uses, or expects or is expected to use, the product. A product " "is a consumer product regardless of whether the product has substantial " "commercial, industrial or non-consumer uses, unless such uses represent " "the only significant mode of use of the product.

" "

Installation Information for a User Product means any methods, " "procedures, authorization keys, or other information required to install " "and execute modified versions of a covered work in that User Product from " "a modified version of its Corresponding Source. The information must " "suffice to ensure that the continued functioning of the modified object " "code is in no case prevented or interfered with solely because " "modification has been made.

" "

If you convey an object code work under this section in, or with, or " "specifically for use in, a User Product, and the conveying occurs as " "part of a transaction in which the right of possession and use of the " "User Product is transferred to the recipient in perpetuity or for a " "fixed term (regardless of how the transaction is characterized), the " "Corresponding Source conveyed under this section must be accompanied " "by the Installation Information. But this requirement does not apply " "if neither you nor any third party retains the ability to install " "modified object code on the User Product (for example, the work has " "been installed in ROM).

" "

The requirement to provide Installation Information does not include a " "requirement to continue to provide support service, warranty, or updates " "for a work that has been modified or installed by the recipient, or for " "the User Product in which it has been modified or installed. Access to a " "network may be denied when the modification itself materially and " "adversely affects the operation of the network or violates the rules and " "protocols for communication across the network.

" "

Corresponding Source conveyed, and Installation Information provided, " "in accord with this section must be in a format that is publicly " "documented (and with an implementation available to the public in " "source code form), and must require no special password or key for " "unpacking, reading or copying.

" "

7. Additional Terms.

" "

Additional permissions are terms that supplement the terms of this " "License by making exceptions from one or more of its conditions. " "Additional permissions that are applicable to the entire Program shall " "be treated as though they were included in this License, to the extent " "that they are valid under applicable law. If additional permissions " "apply only to part of the Program, that part may be used separately " "under those permissions, but the entire Program remains governed by " "this License without regard to the additional permissions.

" "

When you convey a copy of a covered work, you may at your option " "remove any additional permissions from that copy, or from any part of " "it. (Additional permissions may be written to require their own " "removal in certain cases when you modify the work.) You may place " "additional permissions on material, added by you to a covered work, " "for which you have or can give appropriate copyright permission.

" "

Notwithstanding any other provision of this License, for material you " "add to a covered work, you may (if authorized by the copyright holders of " "that material) supplement the terms of this License with terms:

" "
    " "
  • a) Disclaiming warranty or limiting liability differently from the " " terms of sections 15 and 16 of this License; or
  • " "
  • b) Requiring preservation of specified reasonable legal notices or " "author attributions in that material or in the Appropriate Legal " "Notices displayed by works containing it; or
  • " "
  • c) Prohibiting misrepresentation of the origin of that material, or " "requiring that modified versions of such material be marked in " "reasonable ways as different from the original version; or
  • " "
  • d) Limiting the use for publicity purposes of names of licensors or " "authors of the material; or
  • " "
  • e) Declining to grant rights under trademark law for use of some " "trade names, trademarks, or service marks; or
  • " "
  • f) Requiring indemnification of licensors and authors of that " "material by anyone who conveys the material (or modified versions of " "it) with contractual assumptions of liability to the recipient, for " "any liability that these contractual assumptions directly impose on " "those licensors and authors.
  • " "
" "

All other non-permissive additional terms are considered further " "restrictions within the meaning of section 10. If the Program as you " "received it, or any part of it, contains a notice stating that it is " "governed by this License along with a term that is a further " "restriction, you may remove that term. If a license document contains " "a further restriction but permits relicensing or conveying under this " "License, you may add to a covered work material governed by the terms " "of that license document, provided that the further restriction does " "not survive such relicensing or conveying.

" "

If you add terms to a covered work in accord with this section, you " "must place, in the relevant source files, a statement of the " "additional terms that apply to those files, or a notice indicating " "where to find the applicable terms.

" "

Additional terms, permissive or non-permissive, may be stated in the " "form of a separately written license, or stated as exceptions; " "the above requirements apply either way.

" "

8. Termination.

" "

You may not propagate or modify a covered work except as expressly " "provided under this License. Any attempt otherwise to propagate or " "modify it is void, and will automatically terminate your rights under " "this License (including any patent licenses granted under the third " "paragraph of section 11).

" "

However, if you cease all violation of this License, then your " "license from a particular copyright holder is reinstated (a) " "provisionally, unless and until the copyright holder explicitly and " "finally terminates your license, and (b) permanently, if the copyright " "holder fails to notify you of the violation by some reasonable means " "prior to 60 days after the cessation.

" "

Moreover, your license from a particular copyright holder is " "reinstated permanently if the copyright holder notifies you of the " "violation by some reasonable means, this is the first time you have " "received notice of violation of this License (for any work) from that " "copyright holder, and you cure the violation prior to 30 days after " "your receipt of the notice.

" "

Termination of your rights under this section does not terminate the " "licenses of parties who have received copies or rights from you under " "this License. If your rights have been terminated and not permanently " "reinstated, you do not qualify to receive new licenses for the same " "material under section 10.

" "

9. Acceptance Not Required for Having Copies.

" "

You are not required to accept this License in order to receive or " "run a copy of the Program. Ancillary propagation of a covered work " "occurring solely as a consequence of using peer-to-peer transmission " "to receive a copy likewise does not require acceptance. However, " "nothing other than this License grants you permission to propagate or " "modify any covered work. These actions infringe copyright if you do " "not accept this License. Therefore, by modifying or propagating a " "covered work, you indicate your acceptance of this License to do so.

" "

10. Automatic Licensing of Downstream Recipients.

" "

Each time you convey a covered work, the recipient automatically " "receives a license from the original licensors, to run, modify and " "propagate that work, subject to this License. You are not responsible " "for enforcing compliance by third parties with this License.

" "

An entity transaction is a transaction transferring control of an " "organization, or substantially all assets of one, or subdividing an " "organization, or merging organizations. If propagation of a covered " "work results from an entity transaction, each party to that " "transaction who receives a copy of the work also receives whatever " "licenses to the work the party's predecessor in interest had or could " "give under the previous paragraph, plus a right to possession of the " "Corresponding Source of the work from the predecessor in interest, if " "the predecessor has it or can get it with reasonable efforts.

" "

You may not impose any further restrictions on the exercise of the " "rights granted or affirmed under this License. For example, you may" "not impose a license fee, royalty, or other charge for exercise of " "rights granted under this License, and you may not initiate litigation " "(including a cross-claim or counterclaim in a lawsuit) alleging that " "any patent claim is infringed by making, using, selling, offering for " "sale, or importing the Program or any portion of it.

" "

11. Patents.

" "

A contributor is a copyright holder who authorizes use under this " "License of the Program or a work on which the Program is based. The " "work thus licensed is called the contributor's contributor version.

" "

A contributor's essential patent claims are all patent claims " "owned or controlled by the contributor, whether already acquired or " "hereafter acquired, that would be infringed by some manner, permitted " "by this License, of making, using, or selling its contributor version, " "but do not include claims that would be infringed only as a " "consequence of further modification of the contributor version. For " "purposes of this definition, control includes the right to grant " "patent sublicenses in a manner consistent with the requirements of " "this License.

" "

Each contributor grants you a non-exclusive, worldwide, royalty-free " "patent license under the contributor's essential patent claims, to " "make, use, sell, offer for sale, import and otherwise run, modify and " "propagate the contents of its contributor version.

" "

In the following three paragraphs, a patent license is any express " "agreement or commitment, however denominated, not to enforce a patent " "(such as an express permission to practice a patent or covenant not to " "sue for patent infringement). To grant such a patent license to a " "party means to make such an agreement or commitment not to enforce a " "patent against the party.

" "

If you convey a covered work, knowingly relying on a patent license, " "and the Corresponding Source of the work is not available for anyone " "to copy, free of charge and under the terms of this License, through a " "publicly available network server or other readily accessible means, " "then you must either (1) cause the Corresponding Source to be so " "available, or (2) arrange to deprive yourself of the benefit of the " "patent license for this particular work, or (3) arrange, in a manner " "consistent with the requirements of this License, to extend the patent " "license to downstream recipients. Knowingly relying means you have " "actual knowledge that, but for the patent license, your conveying the " "covered work in a country, or your recipient's use of the covered work " "in a country, would infringe one or more identifiable patents in that " "country that you have reason to believe are valid.

" "

If, pursuant to or in connection with a single transaction or " "arrangement, you convey, or propagate by procuring conveyance of, a " "covered work, and grant a patent license to some of the parties " "receiving the covered work authorizing them to use, propagate, modify " "or convey a specific copy of the covered work, then the patent license " "you grant is automatically extended to all recipients of the covered " "work and works based on it.

" "

A patent license is discriminatory if it does not include within " "the scope of its coverage, prohibits the exercise of, or is " "conditioned on the non-exercise of one or more of the rights that are " "specifically granted under this License. You may not convey a covered " "work if you are a party to an arrangement with a third party that is " "in the business of distributing software, under which you make payment " "to the third party based on the extent of your activity of conveying " "the work, and under which the third party grants, to any of the " "parties who would receive the covered work from you, a discriminatory " "patent license (a) in connection with copies of the covered work " "conveyed by you (or copies made from those copies), or (b) primarily " "for and in connection with specific products or compilations that " "contain the covered work, unless you entered into that arrangement, " "or that patent license was granted, prior to 28 March 2007.

" "

Nothing in this License shall be construed as excluding or limiting " "any implied license or other defenses to infringement that may " "otherwise be available to you under applicable patent law.

" "

12. No Surrender of Others' Freedom.

" "

If conditions are imposed on you (whether by court order, agreement or " "otherwise) that contradict the conditions of this License, they do not " "excuse you from the conditions of this License. If you cannot convey a " "covered work so as to satisfy simultaneously your obligations under this " "License and any other pertinent obligations, then as a consequence you may " "not convey it at all. For example, if you agree to terms that obligate you " "to collect a royalty for further conveying from those to whom you convey " "the Program, the only way you could satisfy both those terms and this " "License would be to refrain entirely from conveying the Program.

" "

13. Use with the GNU Affero General Public License.

" "

Notwithstanding any other provision of this License, you have " "permission to link or combine any covered work with a work licensed " "under version 3 of the GNU Affero General Public License into a single " "combined work, and to convey the resulting work. The terms of this " "License will continue to apply to the part which is the covered work, " "but the special requirements of the GNU Affero General Public License, " "section 13, concerning interaction through a network will apply to the " "combination as such.

" "

14. Revised Versions of this License.

" "

The Free Software Foundation may publish revised and/or new versions of " "the GNU General Public License from time to time. Such new versions will " "be similar in spirit to the present version, but may differ in detail to " "address new problems or concerns.

" "

Each version is given a distinguishing version number. If the " "Program specifies that a certain numbered version of the GNU General " "Public License or any later version applies to it, you have the " "option of following the terms and conditions either of that numbered " "version or of any later version published by the Free Software " "Foundation. If the Program does not specify a version number of the " "GNU General Public License, you may choose any version ever published " "by the Free Software Foundation.

" "

If the Program specifies that a proxy can decide which future " "versions of the GNU General Public License can be used, that proxy's " "public statement of acceptance of a version permanently authorizes you " "to choose that version for the Program.

" "

Later license versions may give you additional or different " "permissions. However, no additional obligations are imposed on any" "author or copyright holder as a result of your choosing to follow a " "later version.

" "

15. Disclaimer of Warranty.

" "

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY " "APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT " "HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM AS IS WITHOUT WARRANTY " "OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, " "THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR " "PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM " "IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF " "ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

" "

16. Limitation of Liability.

" "

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING " "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS " "THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY " "GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE " "USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF " "DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD " "PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), " "EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF " "SUCH DAMAGES.

" "

17. Interpretation of Sections 15 and 16.

" "

If the disclaimer of warranty and limitation of liability provided " "above cannot be given local legal effect according to their terms, " "reviewing courts shall apply local law that most closely approximates " "an absolute waiver of all civil liability in connection with the " "Program, unless a warranty or assumption of liability accompanies a " "copy of the Program in return for a fee.

" "

END OF TERMS AND CONDITIONS

" ""; licenseBrowser->setHtml(gplLic); aceptLicCheckBox = new QCheckBox(tr("Acknowledge")); aceptLicCheckBox->setToolTip(tr("Be aware that KLog is free software.")); registerField("licAgreement*", aceptLicCheckBox); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(licenseBrowser); layout->addWidget(aceptLicCheckBox); setLayout(layout); } int LicPage::nextId() const { return StartWizard::Page_CTY; //return StartWizard::Page_Mem; } void LicPage::setNextButtonActive(const bool _active) { } /* FileOrMemoryPage::FileOrMemoryPage(QWidget *parent) : QWizardPage(parent) { runInMemory = false; setTitle(tr("File or Memory")); //setPixmap(QWizard::WatermarkPixmap, QPixmap(":/images/watermark.png")); topLabel = new QLabel(tr("Please select whether you prefer to run the DB in memory or in a file:" "
    " "
  • Running KLog in memory will be much faster, specially when managing several thousands of QSOs.
  • " "
  • Running KLog in a file will be much secure and you will not be forced to save the file before exiting or opening the logfile when starting KLog.
  • " "
" "Please know that in this version this feature is still not fully-implemented so KLog will run in file.")); topLabel->setWordWrap(true); memoryRadioButton = new QRadioButton(tr("Run KLog DB in &memory")); fileRadioButton = new QRadioButton(tr("Run KLog DB in a &file")); //memoryRadioButton->setChecked(true); memoryRadioButton->setChecked(false); fileRadioButton->setChecked(true); memoryRadioButton->setToolTip(tr("Recommended for day-to-day logging")); fileRadioButton->setToolTip(tr("Recommended for contest logging")); connect( memoryRadioButton, SIGNAL(toggled(bool) ), this, SLOT(slotRunningModeSelectedMemory(bool))); connect( fileRadioButton, SIGNAL(toggled(bool) ), this, SLOT(slotRunningModeSelectedFile(bool))); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(topLabel); layout->addWidget(memoryRadioButton); layout->addWidget(fileRadioButton); setLayout(layout); } void FileOrMemoryPage::slotRunningModeSelectedFile(bool checked) { if (checked) { exeInMemory(false); } } void FileOrMemoryPage::slotRunningModeSelectedMemory(bool checked) { if (checked) { exeInMemory(true); } } int FileOrMemoryPage::nextId() const { return StartWizard::Page_CTY; } */ CTYPage::CTYPage(const QString _klogDir, const QString _version, QWidget *parent) : QWizardPage(parent) { //completed = false; dl = new DownLoadCTY(_klogDir, _version); QObject::connect(dl, SIGNAL(actionReturnDownload(int)), this, SLOT(slotDownloadFinished(int))); QObject::connect(dl, SIGNAL(actionShowProgres(qint64,qint64)), this, SLOT(slotUpdateDownloadProgress(qint64,qint64))); QObject::connect(dl, SIGNAL(actionError(int)), this, SLOT(slotDownloadError(int))); setTitle(tr("Country data download")); topLabel = new QLabel(tr("KLog needs country data...")); topLabel->setWordWrap(true); progressBar = new QProgressBar; progressBar->setEnabled(false); downloadButton = new QPushButton(tr("&Download")); ignoreDownloadButton = new QPushButton(tr("&Ignore")); // downloadButton.setText(tr("Download")); connect(downloadButton, SIGNAL(clicked()), this, SLOT(slotDownloadButtonClicked() ) ); connect(ignoreDownloadButton, SIGNAL(clicked()), this, SLOT(slotIgnoreDownloadButtonClicked() ) ); hiddenCheckBox = new QCheckBox(); registerField("downloadSelection*", hiddenCheckBox); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addWidget(progressBar); buttonLayout->addWidget(downloadButton); buttonLayout->addWidget(ignoreDownloadButton); ctyBrowser = new QTextEdit; ctyBrowser->setReadOnly(true); QString st = tr("Country data needed"); QString gplLic = ""; gplLic = gplLic+st+"

"; st = tr("KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC information."); gplLic = gplLic + st + "

"; st = tr("You need to download the cty.csv file if you want KLog to show you the countries, locator, ... of the QSOs you do."); gplLic = gplLic + st + "

"; st = tr("Click on Download to download now."); gplLic = gplLic+st+"

"; ctyBrowser->setHtml(gplLic); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(ctyBrowser); layout->addLayout(buttonLayout); setLayout(layout); } void CTYPage::slotUpdateDownloadProgress(qint64 received, qint64 total) { //qDebug() << "CTYPage::slotUpdateDownloadProgress: " << QString::number(received) << "/" << QString::number(total) << endl; progressBar->setMaximum(total); progressBar->setValue(received); } void CTYPage::slotDownloadButtonClicked() { //qDebug() << "CTYPage::slotDownloadButtonClicked" << endl; progressBar->setEnabled(true); dl->download(); //completed = true; } void CTYPage::slotIgnoreDownloadButtonClicked() { //qDebug() << "CTYPage::slotIgnoreDownloadButtonClicked" << endl; //ignoreDownloadButton->setChecked(true); hiddenCheckBox->setChecked(true); progressBar->setEnabled(false); //completed = true; } void CTYPage::slotDownloadFinished(const int ret) { //qDebug() << "CTYPage::slotDownloadFinished: " << QString::number(ret) << endl; if (ret == QNetworkReply::NoError) // No error { hiddenCheckBox->setChecked(true); progressBar->setEnabled(false); progressBar->setValue(progressBar->maximum()); //hiddenCheckBox->setChecked(true); //qDebug() << "CTYPage::slotDownloadFinished: (no error): " << QString::number(ret) << endl; } else if (ret == -1) // File could not be created! { //qDebug() << "CTYPage::slotDownloadFinished: (file could not be created): " << QString::number(ret) << endl; } else { //qDebug() << "CTYPage::slotDownloadFinished: (another result): " << QString::number(ret) << endl; } } void CTYPage::slotDownloadError(const int ret) { //qDebug() << "CTYPage::slotDownloadError: " << QString::number(ret) << endl; int errorCode = ret; int i; progressBar->setValue(0); progressBar->setEnabled(false); if(errorCode == QNetworkReply::NoError) { } else if(errorCode == QNetworkReply::HostNotFoundError) { i = QMessageBox::warning(this, tr("KLog"), tr("I can't find the host. Please check your network and try again\n" "Do you want to try again?"), QMessageBox::Retry | QMessageBox::Ignore); if (i == QMessageBox::Retry) { slotDownloadButtonClicked(); } else { slotDownloadFinished(-1); } } else { //TODO: Add a message showing the error that has occur. errorString()? } } klog-0.9.8.1/KLog.pro0000644000175000017500000001625713532572307013203 0ustar develdevelCONFIG += app_bundle CONFIG += static #CONFIG += release TEMPLATE = app VERSION = 0.9.8.1 DEFINES += APP_VERSION="$$VERSION" APP_NAME = KLog DEFINES += APP_NAME="$$APP_NAME" APP_UNIX_NAME = klog DEFINES += APP_UNIX_NAME="$$APP_UNIX_NAME" message(Building $${APP_NAME} $${VERSION}) message(Qt $$[QT_VERSION] in $$[QT_INSTALL_PREFIX]) #DEFINES *= QT_NO_DEBUG_OUTPUT DEFINES *= QT_USE_QSTRINGBUILDER DEFINES *= QT_STRICT_ITERATORS TARGET = $${APP_UNIX_NAME} QT += core \ gui \ sql \ network \ serialport \ widgets greaterThan(QT_MAJOR_VERSION, 4) { QT += printsupport QT += widgets \ charts } greaterThan(QT_MAJOR_VERSION, 4):greaterThan(QT_MINOR_VERSION, 4) { macx:QMAKE_LFLAGS += -Wl,-rpath,@executable_path/../Frameworks } HEADERS += setupdialog.h \ aboutdialog.h \ mainwindow.h \ setupdialog.h \ world.h \ logwindow.h \ filemanager.h \ contest.h \ database.h \ setuppagemisc.h \ locator.h \ dxcluster.h \ awards.h \ setuppageuserdata.h \ setuppagedxcluster.h \ setuppagecolors.h \ contest_cqwwdxssb.h \ setuppagelogs.h \ setuppageworldeditor.h \ setupentitydialog.h \ startwizard.h \ downloadcty.h \ dataproxy.h \ dataproxy_sqlite.h \ mainwindowsattab.h \ awarddxmarathon.h \ setuppagelogsnew.h \ setuppageclublog.h \ elogclublog.h \ softwareupdate.h \ softwareupdatedialog.h \ utilities.h \ dxccstatuswidget.h \ mainwindowmydatatab.h \ mainwindowinputcomment.h \ mainwindowinputothers.h \ mainwindowinputeqsl.h \ mainwindowinputqsl.h \ setuppagebandmode.h \ logmodel.h \ searchwidget.h \ infowidget.h \ showerrordialog.h \ udpserver.h \ setuppageudp.h \ statisticswidget.h \ charts/barchartstats.h \ updatesatsdata.h \ charts/statsgeneralchartwidget.h \ charts/statsqsosperyearbarchartwidget.h \ charts/statsentitiesperyearbarchartwidget.h \ charts/statscqzperyearbarchartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ charts/statsqsospermodebarchartwidget.h \ charts/statsqsosperdxccbarchartwidget.h \ charts/statsqsospercontinentbarchartwidget.h \ charts/statsqsosperhourbarchartwidget.h \ charts/statsqsospermonthbarchartwidget.h \ charts/statsworkedconfirmedpiechartwidget.h \ charts/statsworkedsentpiechartwidget.h \ charts/statssentconfirmedpiechartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ setuppagesats.h \ setuppagesatsnew.h \ setuppagehamlib.h \ hamlibclass.h message(Sources) SOURCES += main.cpp \ aboutdialog.cpp \ mainwindow.cpp \ setupdialog.cpp \ world.cpp \ logwindow.cpp \ filemanager.cpp \ contest.cpp \ contest_cqwwdxssb.cpp \ database.cpp \ dataproxy.cpp \ dataproxy_sqlite.cpp \ downloadcty.cpp \ dxcluster.cpp \ setuppagemisc.cpp \ locator.cpp \ awards.cpp \ setuppageuserdata.cpp \ setuppagedxcluster.cpp \ setuppagecolors.cpp \ setuppagelogs.cpp \ setuppageworldeditor.cpp \ setupentitydialog.cpp \ startwizard.cpp \ mainwindowsattab.cpp \ awarddxmarathon.cpp \ setuppagelogsnew.cpp \ setuppageclublog.cpp \ elogclublog.cpp \ softwareupdate.cpp \ softwareupdatedialog.cpp \ utilities.cpp \ dxccstatuswidget.cpp \ mainwindowmydatatab.cpp \ mainwindowinputcomment.cpp \ mainwindowinputothers.cpp \ mainwindowinputeqsl.cpp \ mainwindowinputqsl.cpp \ setuppagebandmode.cpp \ logmodel.cpp \ searchwidget.cpp \ infowidget.cpp \ showerrordialog.cpp \ udpserver.cpp \ setuppageudp.cpp \ statisticswidget.cpp \ charts/barchartstats.cpp \ updatesatsdata.cpp \ charts/statsgeneralchartwidget.cpp \ charts/statsqsosperyearbarchartwidget.cpp \ charts/statsentitiesperyearbarchartwidget.cpp \ charts/statscqzperyearbarchartwidget.cpp \ charts/statsqsospermodebarchartwidget.cpp \ charts/statsqsosperdxccbarchartwidget.cpp \ charts/statsqsospercontinentbarchartwidget.cpp \ charts/statsqsosperhourbarchartwidget.cpp \ charts/statsqsospermonthbarchartwidget.cpp \ charts/statsworkedconfirmedpiechartwidget.cpp \ charts/statsworkedsentpiechartwidget.cpp \ charts/statssentconfirmedpiechartwidget.cpp \ charts/statsqsosperbandbarchartwidget.cpp \ setuppagesats.cpp \ setuppagesatsnew.cpp \ setuppagehamlib.cpp \ hamlibclass.cpp message (Other files) OTHER_FILES += \ README-DEVEL \ TODO \ tips-for-devel.txt \ INSTALL.txt \ INSTALL-linux \ INSTALL-win.txt \ Changelog \ INSTALL-osx.txt \ NEWS \ klog.1 \ COPYING \ AUTHORS \ README message (More...) RESOURCES += klog.qrc DESTDIR = build/target/ OBJECTS_DIR = build/obj/ MOC_DIR = build/moc/ RCC_DIR = build/rcc/ # Tell Qt Linguist that we use UTF-8 strings in our sources CODECFORTR = UTF-8 CODECFORSRC = UTF-8 #include(translations/translations.pri) message (Translations) TRANSLATIONS = translations/klog_es.ts \ translations/klog_ca.ts \ translations/klog_da.ts \ translations/klog_de.ts \ translations/klog_fi.ts \ translations/klog_fr.ts \ translations/klog_hr.ts \ translations/klog_it.ts \ translations/klog_pl.ts \ translations/klog_ja.ts message(End of translations...) isEmpty(QMAKE_LRELEASE) { win32|os2:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease unix { !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt5 } } else { !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease } } } updateqm.input = TRANSLATIONS updateqm.output = $$DESTDIR/translations/${QMAKE_FILE_BASE}.qm updateqm.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm $$DESTDIR/translations/${QMAKE_FILE_BASE}.qm updateqm.CONFIG += no_link target_predeps QMAKE_EXTRA_COMPILERS += updateqm # deploy DISTFILES += Changelog COPYING unix:!mac { DEFINES += APP_LINUX CONFIG += c++11 # Translations should be copied in /usr/share/klog/translations # https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard # QT += dbus isEmpty(PREFIX):PREFIX = /usr BINDIR = $$PREFIX/bin DATADIR = $$PREFIX/share PKGDATADIR = $$DATADIR/klog INSTALLS += target target.path = $$BINDIR # DEFINES += DATADIR=\\\"$$DATADIR\\\" \ # PKGDATADIR=\\\"$$PKGDATADIR\\\" # translations.path = /usr/share/klog/translations translations.path = $$PKGDATADIR/translations # translations.files += build/target/translations/* translations.files += $$DESTDIR/translations/* #INSTALLS += translations datafiles.path = $$PKGDATADIR datafiles.files = $$DISTFILES INSTALLS += translations INSTALLS += datafiles LIBS += -lhamlib } macx: { ICON = klog.icns TARGET = KLog CONFIG += c++11 INCLUDEPATH +=../hamlib/include/ LIBS += -L"../hamlib/lib" -lhamlib } win32: { RC_ICONS = klog.ico TARGET = klog QMAKE_TARGET_COMPANY = EA4TV QMAKE_TARGET_DESCRIPTION = Hamradio logging LIBS += -L"C:/radio/hamlib-w32-3.3/lib/gcc" -lhamlib INCLUDEPATH += "C:/radio/hamlib-w32-3.3/include/" } else: { TARGET = klog } klog-0.9.8.1/AUTHORS0000644000175000017500000000101613532572307012660 0ustar develdevelJaime Robles, EA4TV - (2002-today) Akihiro Koda, JL3OXR - (2016-2017) Andrew Goldie, ZL2ACG - (2009-2010) Translators: Catalan - Josep Ma Ferrer, Catalan KDE Translation team (before Luis, EA3NM - 2016) Croatian - Kristijan - M0NKC Danish - Joe Hansen (debian-l10n-danish@list.debian.org) German - Burkhard Lück (lueck@hube-lueck.de) Finnish - Kristjan Lorents (debian-i18n@lists.debian.org) French - Christophe, F4HWL Italian - Simona - IU5HIU Japanese - Aki, JL3OXR Polish - Piotr, LA7RRA Spanish - Jaime, EA4TV klog-0.9.8.1/setuppagebandmode.cpp0000644000175000017500000001021313532572307016002 0ustar develdevel#include "setuppagebandmode.h" SetupPageBandMode::SetupPageBandMode(DataProxy *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageBandMode::SetupPageBandMode" << endl; dataProxy = dp; bandsListWidget = new QListWidget; modesListWidget = new QListWidget; QHBoxLayout *layout = new QHBoxLayout; QVBoxLayout *bLayout = new QVBoxLayout; QVBoxLayout *mLayout = new QVBoxLayout; QLabel *bandsLabel = new QLabel(bandsListWidget); bandsLabel->setText(tr("Bands")); bandsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *modesLabel = new QLabel(modesListWidget); modesLabel->setText(tr("Modes")); modesLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); addBands(dataProxy->getBands()); addModes(dataProxy->getModes()); bLayout->addWidget(bandsLabel); bLayout->addWidget(bandsListWidget); mLayout->addWidget(modesLabel); mLayout->addWidget(modesListWidget); layout->addLayout(bLayout); layout->addLayout(mLayout); //layout->addWidget(bandsListWidget); //layout->addWidget(modesListWidget); setLayout(layout); //qDebug() << "SetupPageBandMode::SetupPageBandMode - END" << endl; } SetupPageBandMode::~SetupPageBandMode() {} void SetupPageBandMode::addBands(QStringList _b) { bandsListWidget->addItems(_b); QListWidgetItem* item = 0; for(int i = 0; i < bandsListWidget->count(); ++i){ item = bandsListWidget->item(i); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(Qt::Unchecked); } } void SetupPageBandMode::addModes(QStringList _b) { modesListWidget->addItems(_b); QListWidgetItem* item = 0; for(int i = 0; i < modesListWidget->count(); ++i){ item = modesListWidget->item(i); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(Qt::Unchecked); } } QString SetupPageBandMode::getBands() { //qDebug() << "SetupPageBandMode::getBands" << endl; QString b; QListWidgetItem *it; if ( (bandsListWidget->count()) < 1) { return ""; } for (int i = 0; i < bandsListWidget->count(); i++) { it = bandsListWidget->item(i); if (it->checkState() == Qt::Checked) { b = b + it->text(); b = b + ", "; } } if (b.size()<2) { }else { b.chop(2); } return b; } QString SetupPageBandMode::getModes() { //qDebug() << "SetupPageBandMode::getModes" << endl; QString b; QListWidgetItem *it; if ( (modesListWidget->count()) < 1) { return ""; } for (int i = 0; i < modesListWidget->count(); i++) { it = modesListWidget->item(i); if (it->checkState() == Qt::Checked) { b = b + it->text(); b = b + ", "; } } if (b.size()<2) { }else { b.chop(2); } //qDebug() << "SetupPageBandMode::getModes: " << b << endl; return b; } void SetupPageBandMode::setActiveBands(QStringList q) { //qDebug() << "SetupPageBandMode::setActiveBands" << endl; if (q.isEmpty()) {return;} QString b; QListWidgetItem *it; if ( (bandsListWidget->count()) < 1) { return; } for (int i = 0; i < bandsListWidget->count(); i++) { it = bandsListWidget->item(i); it->setCheckState(Qt::Unchecked); for (int j=0;jtext() == q.at(j)) { it->setCheckState(Qt::Checked); } } } } void SetupPageBandMode::setActiveModes(QStringList q) { //qDebug() << "SetupPageBandMode::setActiveModes" << endl; if (q.isEmpty()) {return;} QString b; QListWidgetItem *it; if ( (modesListWidget->count()) < 1) { return; } for (int i = 0; i < modesListWidget->count(); i++) { it = modesListWidget->item(i); it->setCheckState(Qt::Unchecked); for (int j=0;jtext() == q.at(j)) { it->setCheckState(Qt::Checked); } } } } klog-0.9.8.1/klog.icns0000644000175000017500000243210613532572307013434 0ustar develdevelicns 4Fic12fPNG  IHDR@@iqsRGBIDATxZXUǶ] RlbAލ\5֘DcbI,kb&vk"]AEE7)Rm8x1˽}1gϞf5lwN$N%OndbRk׮&FFRSSMӒNEBb"RRŘ h4Ŀ|W^'&'o  >US##]GLjA:- L a``LdS  L朢' vrٝ;w̮;bbc! 0Q9^P*U]e0 x3}"֕VTC w j"oHԃ3g4Y͚?C_IxqHlmγL&6oAq,uqgs? CbKprU)ƍk9uOC\;G8_ԆOTI5U#+֗?KwJUv V/R;^$p*tdzBKػ [X] dtӗ6_Ad;}4_ ڹ|b}494 >L[rң`s7Bϡ =, ~(ֶmTd 9"}xt۸\n)ݙ7)IB܎lw ]5&[b LL22DVJ*̘g!(p)o޼`Qj4YkCEA&DՒES0^zs/iw:ιʧ [p47ϷHJ>hV+gݎ+/[̘ǏIQp 2?D|{z>ǽsкMPƾn IIM'/%bB7!T"FF006&;-Fxq_0)iZ5ɃQ(J|wF?{ş߆3nCZ5>5r˗/={vS7-L S\g??d**n¿ =u2˖ŝ[pu,YZI(ɒ1phX&pGei~PD.ݕL9rHDʕk4o+2&.?#d0}9"-KQQxϘ%-۵bf(Fl݊[=qP>pф9qE;OsnЫWwޒP TpU Dnۊ+˖8~NX+WTqj5~܀s̾$jOҍ!62.~ CFm@d$dN{fGXQv'r·zɾS򗃨5m /[Ņ 0d۶4#EÇaeM#&}7JN|''W:w-WR•DME/AڢA ^{$(en7j?ۻ@zZ cxq)-;O?銓65h K`u TvmQg d8m63pY3$:i{;)Su>}:U0Հuꚬ\ of۞={+ԪU+!e;[<9{ޕia%QjD nY:8ºBC_Fx~)1%VU4HHC-*/0!-Z;Am|e\TTUnܸq-[۽{O~yՀ5KJذazjAE{ɘ[ \vfQT\|qLth(NaZ/m%IL NSՕ+qcl 6oV͵kMfvfȐlwM]-^ؑ!/[GjTG8ʕ+^\o_~*… χ_fQ6Ȍ,eΚDt2So1O?ùʽ>T6!vS81OػoU3WqR*Me)#w~2{x)MDx5cc3y|Oisfgg'geeɡΝΔAO㑁v@=V9׮{!i|WϟٿBi/xߟ^[9?02ƍWA<(NΤhHޢj`,1.oȧfMP(CdtyZC1}:<==M(gB;Nz@e`Jt."^RPԉ}ipt^u^*Kȹ`Q] jnT4:w35ñp_}1v͛!eI*8:bpx8||@D7X? Y엱4 $&$&&'>gW4040HfIff2x$D}իWzud5e gFU.xtߵ MMk2Tc<6KV(j.$Z!u ˗/W(;qZKD &p ,X[XӁ} BIK2}As+ zyy E ` 5A"%55@?si.=]ѣ}{}-^ckHUK1o__@!t0 aJdZobڪK,mX<cFV&U u Mb,7R98SiҀϟx20..@SKEl`hh輀ċrcQ7EmLP$iAƗ۠v\<sΊŋd@q, 0Jy[źxc,ri q;~恘jlZzZ(۩ k=yD"1Aф|ʕLlV-4 "rhě_יQU|NӾvOVacf?|_D2=;^|jwV|˅W)4Lf _@6)wSk-;{:FQ%O5@W&Ox=?@I&'kvO-ƣʜEf-[r x̦'~SR?Ǐ1aԘ%a ceUqx Lt@~]^_%rхL@:uh'UQh@G.`Hܸz%0 P+z/>OmQ]Xчta LS%[Ay{5YˀcUT>/5#|D_%<|cƌR6S2={,jBXhxuC 3|ݻ(}X̚5Up?jǠb4Tg<vqz &1dxa۱c ː}wh op`BKe)Y[Fxo}h,#@4@|CQ)h.5_ -H YfޯO7 e.xu9󖣴s܎ \#w4hi2ysuֵqɒ%yZ=i.} IzR$ }&bY$HE3FpT7ɲc|R1gE<494gpÊЀCUV :3?ضNӡ%+dX*\[a"BSHZ%T'wh`S3͕R Լ(=d D]i-@+qk3n{N,7o  wjV\)4O A9 jlb.@i_YOբ߉TLAr N}-ͲaDQysB}j8N-Gx c j׬ݸ7?\`\% nݺcۚG fsL||'69ҫk4[kllmDYتxS0f%<{?Yxzx8xשu& @#ZTPNG  IHDR>asRGB>9IDATx]xTUӞ BAiJSI A@P)*"H % &}]n6 ;3g̜9wE Y@0, da Y@0, da Y@1?~^ H☜䕐ĸ蘘$GNjaW\9Wp &gΜ#?n VdؘILJyLL4Yy!ϡtرk%[د͛Ç'd{|-&W )))P!$DfAMqpVe/gjmܰa_7wn..H^&7nޔ ;wѣGqYB T!NNNL D`~Hqzһ7}먜nAT… rU-wS1_rc4ߎõGSS !KYSf[x`P忖kYfs|]߿/.^(܁} Ppᎅ:;;޺}[.U#^"A[Xݑ*[W2uWW-(sIy@y"Q {nYtvq+9!!%&.΁ `a`&x&EuxEDz_ױgԕ ΀ *.mIN /UxFgv@k±5HS$p3Б ~A 3^Gp?Hx$A\</<6xq4sɬyF'(&9GNVFj|G7 kH:IFJyIA=+H~/ghZ:pʡJ\/lS@!3z4} -R^w@5odurc8b2 'N9 )iԘ1cbd'u }x:*Zg$GcT662owx H|$|J(5`=U ̟/eڴ)^^^)Hy㌼7<ϸiC;/0WkC21bU@>H=ךX{ǐZAwnˠ۷T0q|V"##oF-AAAG&L.e}r"5qm4% 7Þ@M{Z̐-WGWWi>{ߠ$aINWGߑha&WRy=nC7xV#r(FT{}%'_>Ou\ۑ2wQ#n޴ [*Ǘ,I6xezQラ]}m,vx -; 6رu Qg&M5"+i?8&mz꬗l=G&S;wh$2(Orc˖-*":$wG :K".GL2a8{!S!g-.0QRz)9paZ0#'trȀ+d9$Ϣ}J{޽{ӿ ?~TQxPiN{}l {&MF)kOHd;7jO|MVhKuxY^^V<.^@!=G1zԫrR__tY>-.^qg.ZD|KB]SdTQ[\={JEt?xࠇ_-" MhҤqaڵk7μ[G CA|IQ'77w\WQ +b_r]j7p>ve[yAQl"%M6;Fe )K%IX\aba_o޼1gA}_oav}I:46RJ_;wVD|}v]> 3 K8uҘVXY?&62tE*NNÇt^ʛi`=cF*rA+r_%d=eJjOvJ/AZ Vu5k5((0J>f@,XOPam]bji!>4E &@_z:)Sm۶|(r鏘ޞH4:zbkdXżyZA*l2yrHZ5.bF] 2M^u|3Aa\rLRݻ[cߓ_4RUVMnN-Ln-jזIR\R 4kts?:f=p@8MPb P̤i?Q1k#3|T= `}P*~/$sEaa!f ?}Fc">5]GwL=;V۶Jc'*=Ӳq9 bTd=^USHMBɀ ]Wnõ9,4eE"_OF^J41#pQRnبQÁ ]X(PC{erΟ +['OǏɹ!r׉+[ã:>tvk'Dv+5/cc BhH)q z2% tąؾ?W u\V rLV;FR )ک9Zv$7n  kWab.eԞ0^j^#&' 11qr &8$@GHbקfLJI[n#ǎ#@ fnN˪0(u4h' #q*AS5u]JVzTP; P*)N3U64m. 6tϕK-],տRs|ׯ-`{q~ ޫS3Vc (ab2pz\\7GKXh<ĀMGGZP|o&eʖ )ٰiIhW_8j®}Tg»F&8i/#B9L(=:nvG] 02E"9pbmx_9R\Jʞ79Pݳ Jq,чoLy ;ID۶n_,>9gazyxyy&LZaϜ3l2Rˣ,?vEɆZȨQ)ʨЈV^*=LDFam삉F)b1g8"}[hevB;\;489 ]TDx(mvlbSߵ(B-WK s poV۔I?y0t;w`=.% ѨI#=5(sڬ0}#txd_ _v|K՗'ƍ<- JLn"ZaϞ>裛#FGV"05jWOׯot0+clOp%]ݭOHHnHLڦش! V+7@hW0Q~сv ƌ`T-4 ,VM)}ʞ&OX&؈(r^B^DȱJ.= 1%\ٽ{waI=2%̙3 :Hxϡ!.SLdݮqI0Z4؍ig bvj<# "w,cמ#L̞ {1aeQ&ϟ?_;_@8d8X]'qr{͚5 =:Vn> {܋Po8#N\9w ^Ƞ.8bTk)?+/Mŧj&|f/^\:`*.%]bcj`}^`F++6@$CN8Vj%1wJ#0/}޽Ӵ~ds$C_K+ٳgw}7O囹ʍ 3,B-[F9ӣ ͘*ֹdTVRb [s1Im9!u0Cm8A9MO2W4HnI˗L˱ԼT?'1PƎDa'7Fl&B$GP'lꆅ苿$C.v^S`hʥK}'UWJ͏v72zԨAv>+Q.^P)ӧO?o߾ 8R J(1|يi[HT낤m\eh3GeC@Ea "ОVd!RȘc%440'׬^uM2۷oZjve# |0B߾}kJ*U}K?;lWwFڧ\Ira-.1S^}_پ}^}Di%=Sիwp O͝wۃ]LiX5kjX}'NLMVϋ WS)`k+r5:HAS5L\e+GZsFRhJx/U# ſl冦Pɻ3spsYz5"xbSNU\=C$;9|RK}Yv>1|ʶK~K!-6n8=qwCe4*0k=vlyePAi^13f ;9;'I1cN+'8d3ɏH8<^BZ|mVυ+IJ3 3 QXlXc$@-iJރWq* gpVAZ*^ ^Q9&ŊZLZv[7|)Cbp S6Wnp+:9ԧ~ꧯ sg1}in5Zn+N;$&ܲOU<8k~⅐kGG?loWl@[qBcNS\ /#pG<Q^(Ⱦy_"E GThkZ=<&*WQǮ 8V_Ihz`gCq$D}>K9T\ `iLp9j׮)Շ;wgG\ssw+``~a%:u_xB$Q YLgj OF1O})<{mϏ3"͍7XwL,`a0>~$:^bFq!z@gx1PĹC@2pܘXͼYAAA+3|kz*3HhsWAz41kvwRXp=zi"iFZO| ˋ -O NaiPAc~ b(c… Z`,|IkOeJ n1~ 9(81Vwa3H56"MB<d>kiӦ1 ?q`B# pʕ(6 ŰIDM Ohj9#|kرcZ8} 0mT4)RG*"Ol9UF| 3л A]oѢ`/:m>Xϣ~&b n$7n>#.W=NwF7!.)AuPHJ*Ÿ`(b$ tr<_*2ܹdwyG9E.oؠF3`MD/UZ.]s=9ƐD6ݺbi9RbPr2 =H+h,\ʃnT}c(q4h7CSaAPFIv5fdtG@)4DU#^HCDuQ̯m"E];m7*y},AHaU""uc~_F}~ S/`{ eGHqfݳ ˬYjZi2mNt; qHw [iq ķF|KXVy1Wrc`uO\훐 hd0 MA2 ij5r$prFqy%%f~Gr)ktR8Z)=*j >`{Y1ƥ)5u%⹺F&] wKX$szx |)HC}ـH;#i@fK TETóȑO3v 2|=8у] ԇ֝[J dD<;G;$B(>[ܻk@]cr [r΀J d#ΝSħexGv&8=/^DR ]Ht8CKir>E5k(őF|zRA&;Gg)MJ^d&z%YI^H@tL±o*IV-/LtP x6]@eTpH`\C$; ;?yTP{V!ح[:RXWcxO^'WvlȧH1c l _N&26^1OCs U6Br}o'"i1qiM @04 x'h'IU>|s]*A"kg2Lv ̸D @ a;zl& ǨL7e9"g$u^n-%˯@)9m :(WrdFR_`.z=Rk2a8d8=uses|$뚏 Eڊ#NhC| 2iʕ r=R81kJ&N҄`kf҃2;Vc"ʖfghav=9(^4=0m‡%6!{ɮ#35=v_n; 9+i*1LG^C2tdYJJ?!>sMЖ*/Lć4'>nY2r5+=5Ϛ19isujae\ҦYDt~vaǴ-0H.2Bұm܏mk~I8nB Ĥ1Iqf)^~ǂh14Фt9"] 'W\YM-Hc8k%\,(\.:  *`9ħ&頰\ WN$  R"![|o#9tby|DOMNW<Y9 u&Ij@S5SGP#*Gȥ>=%Ha͓K?J }Qth'I /XCp_! G"6$=jt#/} fc}+6 ӝbŤwL /9EK a,J]|:?K A@߱Dh[|8[I-D5Z)M|:I9}ˢ/;-O{ I zUeq6K?hTn5m$W^}Er= mPQt@Ő?D _e$pFyDskJ |,yBf49CI6G F8Xwq훷e츑>ҽG7u"7ex|G_#V4\ى `'DE%9uFF%˜%2kaTZC"2֬Ƶ=d;ҺY) sWCf5A) O`lQp &]F Xb4d40>-x(uO( H"cP/`]-z:$^c5 <2 V_o/C?>۷퐼rʕ+=vU"Ab(,4ȅ[|V R&1Vл)*=ޒ?E)ӍA\gjϣ4!+(Fx7_$T\ao+d95qD_W9IK$Kb1#ӊ `=d0 p_ 5WW.,UK/MIXSt}Oˊ'~kMPG Ю 咽HԧN/-^ݛ6݁RxahQaD ((Z9GI'{Q*>^utV5N|G.6m+UɌw%rbti[PV§p+ ۷O!bq5@yi>O=k+EUxϸjq gNٳ~W;^o}9&Dh'P~[S1|s H8pư, /&=*NHj45ꈎ;%^̼!Nb)Q(FC!wRTdPt))>f𗼨m1!(t QP_V6Y9E+$:H9<-ðCjԻ8JmG[sDvSyYy*-,wpϜaY̎rD5+PJ%|s1"?)E.= ܹ]u&8 vpW ; C>0gS%A|_G(wF,_ ~DaC:0IP*eWbAEc`'c{L%B0\ĉ9it4<8#o+WЕ,ϫu 2% `3Z†{qbq /s>fA$3zp?  !:D$PQ ' p~a*pF5Uw7G) ºȢ%"s_|N#5q4jRRn)S>x|:lݗM.HUdU-[Zlrn\JRt" $eqؾKn-qȧRIEMK+&!ٜ,ǽ H,?r)8 oBAd|>=VE}KDD UUyҒp`"ќQM= | tQЫ7ݒ0:5r>4`CoP i2nr%b%䲛<Lٳg+A[6ʱwXRm1[uZR/irV߼ܣI$2]C&-T@t=6gڴH l\O9!L8Yee| Yc,G6񔊥Ceşؗ[ÕK~uq~ҦSe>P6-6УsFy}sX{+""@$e)pCĞE! Mylr1&˚It#cE70L uE]44i]UG6G+[z$p5A!]zN>}^n~ڕ[߂ ɲvK\Wsa<BYqaWƃHJ4d#Up5)`Gu{KהB}20CwP¹M7濍cHhSh{yV"vo bGv=QBnTRѾ >tRvҨti%39_Wnj25JMGZP?1Bo$Ǵ*MJ@sùSZ]uS{S ')vSNѭZI\HNJ$P۫M\h:{tj%-xٔ,__ݗ}y7|o4xڬzeőok^s-=8 . `4)o$$CO:-=79jIKz p ]Jʢ5╷0 #)o UD6w $2MOAo/6q$^1)HJ5f/U''-qA ;@0>5CIra_ƵG0Xt_;B.K&)+ltKIKW;{k[O}Fk0lJ jFFf5ЎO^幜]G5 =b( ?!n5wp;ȕߩ=.`VF]8@%GۗF}jp@4\#%# :h>qk8P;B7\C/D9` xi(x[^i|-_X&F J'ɤhϟב PTh>T po[OC(] !bH`J`G|5ڢ^ZGا>+zJ7$wUiߢ''B_<3M@\ Lo &'YӧaVHq#!vL@_B DBH&IG' @ /9ҢLDWO(;Z_y+ H* I'Gz_{")ӅonTp+O+4&j+4mdģP1]>Ǜ=|wWM^ƥ^>jdP(3f:ZqH5Zb9,|Má.^ eԺ5)`NP}Ȥ>=ۈz(ssmVE;н )8p@IT,\q t0>xyNnq ">W`S?eoP"r.ϝC8F1CmEO٦=IM+%"<2=}4V4gFi%9m #X~O2w~#?mc {Lϟ3P¤HOv7M@-Mlg*%#F񠠠!~+Ai|=wH;8 GHlT)#]H" SG)͡U2$ G܇ 1:@^8C+ ytF12 k&؁3"iTڌP눻H)?$|.@InyZk?c"AWnvyNHzFx.TJ)D\1Iv߭QP͛$xY@0, da Y@0, da Y@0, da Y@0, da Y@ >-ڈ IENDB`ic13MPNG  IHDR\rfsRGB@IDATx]`TETJ{EABT,JUwPP,#K^@zoxwK.ɥ7y۝3;;;;+7pc7pc7pc7pc7pc7pc7pc7pc7pc7pc7pc7pc7pc7pc7pc7pc7pc7pc7pc7pc7pc7H xkoȂeCȊi+F9lNw_Ep3ǴiJϗ/_2eʞ={ OOOqqqKS<bcb$66V%q^#""L!2R!ωȈoݺu pD8n|$'ذN:+WR={l5"##ΕK+QQBU"p0u%Ncr84C$wGD?]rmt,i7HcueJ,,G+&!Kpp㪉W_IƸޘn$'03 /oXJY/wkpB @ gݽ{6 *T۷%,4Tn$Xc<|ƠmOW,OEFwqJZg߯%{;~_Yܐp34@(ܨQAj_\<$ׯGIz%Aj"p7͛r \<8(H0{ z9lSI^u>>ŠN RH*85AyQT@R*U[l\umDҥe"A$8B.׮]kzO=NWX7xՄox67>a|aR>]s(QorKh,YFUrif  <; R\7p",FիU|ѐW𜧟:yRΝ?/gϪ9?@$E䆔`ާR;ŜO׮]֨^u=kUSSwcF"Gqn1H'>ZJK/9|rq%GDzWVaf2a fl߾*V@§rZo$,빉>h6)/S[Wmذʕ+W8 _-> @.]&zRuHxw! !jOſYF/({P h$&;3`sp[788@ uԙ7A§s#p#Yl.@4(ŽWIHѢ+J/^w4St7 yv?* pj\&nݠ1fIbWT|>n=6؛n- %Eb]v;w_Β%˚"BCaOe26 >eXƮiu l +>/mtn$: @#"z.jC$ww#)4=sÏP<hI#c7HwA(ijs c@F|tIN}Ws'QTz@B-jdr Qa!{fGt ́%!0q%,#*M&U/hdl@8a'E}=qB nC@8p j"FX]% ŕL!CpJ⽨ܣ.T.nkBeT@xsr UPQUF #\a"L 5?O=4̝zj-zBDěrQ7*iP+W8&~# pKJ0ZD7 "%uL0PCOJy>:P/;0K=pTwy%S¸&MHddrgDntB^DZ2ہ5U̡ї=s20AuzI8#;r=p!ܩD:^UmJڵ'vV DDݻD`ve,pGg"5)ӌ<,OQez# ^= `(˥@0 OU,m!}m.]iS%(8$]lRV-8sF^|EL< (oرc% *iJpw^h6mD÷Z&Pe+?d*(G\WFFCDk|5h mp% oŎ=B_]k)Ҹ'$TJX3;OҶtY6Ñ˄qAAHv`+s p:Za 5)KjE>6&EV%`wޔr$>OŋKy$k^IuYQђ->Yt:J<)jXd8^w۰wgc1W>T||}%b/Ejq2\eHm[&˗/]땅x'ٲe{\^{N8ք :M88m#WL uk/:`uFqyeM%?X G`hjդO-{/QwO\ =^D ,OH ByҨQ~u(?Fm}o^aMzZޒ _3tSfWXgؖd=X٩;oCU xd ֑N$$!;|9 Nc4s)ޢDi}Ut vM X/wߐc5kId=ZT;BCԹm6<&^a+AɊhHM 0::=@qfF> pI(3#d݇9S`&-ȜVϑJx_3c>)ܠA"~Re+ҕrIw\3WI-ZJoL|z8{6P@~aBVt:4U#Te Sxw'Ln~Mm ZUA| #;{V|xp B7RcH͙3ٌX{n&_ ٚ9{7o}ON/YܡC{7_2wn|2@2XXA HK YxR|3c'аR7n7^~z% O˗tEw9-//MvvJ*+|4RZNS]~/,W790222eʔŴ?T?L-Bvcќﶞ5Sj zÃd/\%'$G^~aHTLz|Սڵu,:gh%NޑRE)ٻ; x iي:o-%$ ,8cVI5jT/3gΡ?j%92i͛ܲe7n2\s |͗.]۩S'EG=1pY|EÇf D^]׺Gկ!9y?pt/pd&͐Do=FB٧$s.OlYٰpL[4[Oo@,EZ嵺Qpmv?n<6QVy717yLjbI+TXc%S pXݒڱCaa0\}0uü`a͛7f3A7/4utm\}κuOuOah/A6_xqjd%*eʔiǼ碧zX? "0Ucarlٳ%_N-DzmzU ROwI؎,G>đ/\!i o&~WJ4ӎ`іo?`J;\{%0?sN[IO>2޳3ߋ/KʹE..;n_l9, ?jժD?r9#jKPeϏ$'gqa04Yu(A'Ov)DqV)ھ"n`]6-05Xg2Ezʏ)%S|Ys$ N`@Õ:2}lPGσI5ES/ hذ:JA=PBZu g1H@6O8}-+HyrR)/J%*_a?#7ש-7vj`{*O>\isWfMx秐?w.DN7˥U%w. yO>%KN+[RC;˗_jBɔ#\ x|_SL}#\F8uǚ}1 \D_O^oj}@3/]DXX^'\ qF T2L}7>9qɏGڹsgIOk:T^ؽKb3Gb)O%3DZ.}%(֙QvzY۲w<3 }7ˡMa඾doid!G'5޿m.={<$`DtTZ1$ (bC/Tއx N_1sR#Qh㿁R0 (S&>5^2*Oi_ Po5)A٢SaHSѼ{~b_-|l[82w2Eը)wWfrGC9Vsp]2jyTöU5VDx|{nޡR坷9-]~\ 8>|r9+`N 7EZl5PcV$((lٲ=tG .-甁c2/><͋>*""\9O̰!OjS/W73A!0te+x5oѬʞ]\^YgkCL %Rcs̙18ں8r9i#XY2O GeN@e> 8dsF>@7 '%B~s胏FE1$<% Q,CSY ,W"(82dD"t!hQV$d3 /C*^{Ur',]۷[y Aϸ6=ί_/2HH{xy3 IO_#dɚ%s>E 1j%I oȑJVE}` ~΍aE(WkWqe%Gyk3W(OŊej"рApYkU6p:9/ "-կ3xy- .:kJrc9߸/p2|<"5ǎb/zN\?f\ۺ]3^~c.4>p* GSDo\Br9OQ [[`oܓ˻T:+kL2y c$U[nGz͑_O(RuH/OXN<y& v߾Tpi' ޫiEz|ǹk׬7UbK)4xk1cƼRwXr8ү@hbSb9JH &u/U_"09@ 5M>.%1X!Pw#?v*eF7 pdg né @nϨyC)Ss.aF'Q?PW@&ؙv9;/Vjmq8n Y"6C-V.\0GRʕ+_1bxRJIB$ pz"W\=$X& Uf詓AjxdW_tvXsgD{UP3g-U lzK>,q p hkΪTҳg/S(9r: ?fC6~o0CNpބ}uE %+Qz $l)N H(tFJQh3ú1~Dm|w x eC{d:zUV.#CbNMR `&ɂPe-o%p"rp `J1,6}ZmdɒSW/ ;Kڜr`4Lӓt@?61[U$X+9Np̘uRH,:'|"K. Nf5ғ "!?QQ뺒7:mTCY7< )ls 8#;ǎsV]l RCu7l u:wHaڛ* sHPR!*ѹ3m 9o?x60yr`̥|N 8 M ݝ_L=]M7N3loܞ=ʙ`4n.*qt44>`BEa B|+#$: ݮO?cI&|Eܺ#="e,[ ʕ+iZZ Ι#wrJ2w&)[z1!={woV#Y-}wWqH/<= KtYZx4iT)cǮz L7 jZц8jR.uV>CtZ|S)P$xA {*aAZ$)Q\[& t9C:𱘿K0* e&Dp#(ܢ6k$58`.gz^+%x$'t=5u09@e1ggY'%ґWh!8Z~/_.\(Z88J\+W::˗+NkG񦓎ߖ_RjN;Tƍʕ#K$Δ%Bi NI&  XTlڼ L!R2g'ֆaY#^EM(w͟=?idwOFPgŗ_H=7F`rJc|q Wr.mbxGÉI zvr@i`5./!J9ʔKKccQ ]KR$sPֵn'G>$1$O)p$*8 3f}/+VXYYBT {vKa0"w[B՚7o^:O.XFȥ2A\$9S怇eaRPIXl97@?i^ҋ*V($Yq/C=%#?GN^|\(S ~Z*\^0+yN(a?M4N}νcF }rY!И#0cs d`Nl pX,IUc?֚ `(`j@l%VێeD Iͥ? v)a2S ˅`.眍uZ6L#})ӝѐ.IJT$[Ol{팄97R/Z5pVXqVu(#p@ =Q+;k4^\.]*& \1*&J_K*\8v&N΃"#a@| )Dq*9rdg*f*\[T:gm? 2mI>XBI<=#ݹҍixzhb'dM$cĵ psL (`,WxUoV̷84€Wݦ R0<48l/w@,-Ť$Q! +!5>Pʼ6 mOȼ@o7{e, Sr%(^DDI:Zzn(!tE^`0#q̟h]"WL+H"wL8D )bg h4`8B{hԣty~l+;u=<{G*ߐ)z ~V9gƁT_<jnxNY YrbmU+:eiͶ@_׮#|D}<̅4edj=_d.܈o`h_]~W0!y^ D8NfUg6SGyXя682Eծ{t/H10HZl@&p! >0LY~~YcQbܦpEo*C@/_P\pY,\;w`xPTwJ:C-ThhNtŏ?Oo8jt<!yu:1*\,[&wNZzOh`u KŢX~m Mg \૚4˖;\Zt dIi HG\8-sr[NebZErovaw 1] ?B奄nݾ!)sz`'hHs]'=xh* .\_ ‡k Ν?CI] X$ѣ":FkLhV%3WEg֯k;t$Ֆ-Vp.e (YJʁ귴]iJk2:0 j|qx!kƊ"/C[4$'Z k:_"R۰<1%q^oӧ"c5;\"C ] hAwmL8_x^1C04 N _ F&b|K [r{kϟ'c璽{*q(H"գ^Q4_ʔ˗.JUaa٧_DZW.hl.{ab[ϚaW<4Ԑ=x gS @\+F B{ x,~,=[6<ȼ04*&pt!{TC,-o ̙khY(]-jp6m[yq*H@W*bZ y TS\`?R@]u6J+_;/-aڌgzz{Mը.cW S>8Z=X&v7+"oyǓ+  Ԯ-nmj;~Ͳ_֭%_K%>c^\jx%>JvPK|00~LtzJuH Ҧ`p>mO-]tŎB# 3qsn qGы;<Uy?Q,E`7mfgb(}p+Jg ʱ' ~]HŅu5%Db~9jՄ<77$J )jFQqȳditu颌|d@fguGY\re@F |t#寿2"Kps͘`'~董۶osinsC`1)E>dR?=,_r+ʞf'Oݾm9?̽M/_:c>D ).@Jaj:MV&@ෆCl?ȈH̱҄/uXo[VpVPk@u1-C4j+bM_I?r(4kZSH@:(,OUީ gK i ob5kf# v27S&M z?% q˼m~X~kO n+;IvRz2V%˷?rԍ7J'$B8ED4iDl޼1_ߗoc̀[OYolZP0p(94ȑ1k*M &g!kM vΩ\EkpiXx~gߪs*f ŭo ݻe&!|5KiӶ"zJ慥gH@~Y3꠫(JG+tmk o{pz=<ӂL`+. dڴ+ڂg"}\ AH`yڱ3p~_ޱƂ#@IN"k}R3l `)QqKs\LpicOI$3Er^TW7o6 nT`3? ݓu6B>?~&$ s1nܬ7&$_.vo g]LilP1~џ@qᇹw?(%@|C^Rg8YVZ^8SIBCE͛PJ*)Cz#?m*fvޝh%pkR3#ϩPjSt?(܃pϝ;?@-sުUHR.Iyyx|g#|.'Nk g i-}[2d|ɖ0="F2lB@Ց7;sf l۶-4k'Kqtghh޽{\ۧDO9#7n܈!2;j4eI#r8H:^VӋHPXσp?7+JDIl`[Tg '?q`qZ^<'R{Xޟր̖/Cn Evf_O<1Ƅ$_1b)9Q xNbIΞ: 6l *Ta5R1¹?(ẖ}(V=0{u_ەc,q-$sHOp{Vy!sScBԥ5j5L?R-6 EIs*t_k׮6m}J^̳'ChB7S`q6C^DBdLZ]kXoM9h?qUYwZJloAdKG%3Oԭs0iḫF/,ޘo%(]DZAeǦAiNOJ6ު>)Hx  8x-Z 3o޼ P U#9|Jfx |lRP#ھ}eO+ܘ'TC,^ivYׄ\L`$ qvX 3mH3vrFFn_lYR"м=WOi:(qޟd8g4PYMxKn?U:o w6[дyF'In݄[ 8Ao슕U#n~KNT6Pwr"|0nWNȒ9](y[2ˬP0`@iC[.Ș2nJkh,G7IrK/=VN-=9ż63ıS'N#??\?nΜ9亨$ؐ]<-=.^%$r'9! h5hKw ڐGP#6~'#ۋoԕ~ NO̓&mf\gk%H%p sp*r6^8 g4"H lƒ\FrΛGU  kthMGJ<30ҫtoŬƱ&r9s1% \.A91W^Q{):ig^-k62 OTjkrsB F\*U^͓0 *Bb,HqMj炸.lْvc^rDdlu\~sZ|kڴiξxa%rr%KT~3(p9gKoP֠AYAx> 7eٽ{;H$)(Z( N6ӣGuoѼқ,ކEN1L[rmpz`w]s4JcN'd:`]b{g `Ľ? K\5؟\'S+pȉvS~\i;>) -{8S!v( qC(s ` DKQlV;٣d&qVQr4+ϟܰxH~<׶u_qL"V,Y'_lߑ}^t9fW.2&qx;O(#ORRC&n\j$~~IyEݺuѽjԨ "йs縹?0Z tp6,Ȕ~@neprNIMġ?%WDIiS%Oʏ]B G>Y?k7o42}Lԏlx5qPer9x&-EuV͚5O$~B;S !(,_ Jе*X%OvD&k6m`A(J(3&=u1\oF OO=dUԺx1'N"| p&&~jNIάMMcn3X6y<1ep4CEI+r*UOՒ[J+cdPKj #= ?5Zzk7ߓ#N`f-ophO;y}6\>kC0DcH_Qx84|IK-nPZ%+=kB"=h=K]Z?cƛ %h([T9x~9s[VHbP(>Ol4ԍs{2vjM'$#3q@-B& \̙BEёOi>R"`,iKQFC\W~T:W{@Lw zli=kER7qD菑3oI1lKWxrx/jӋ1N5K ؕ)rf)` 8/U?_zuܜL9Ǐ ME}A٫*w0RKɈ8Ieǒ4SM1 gຒMs`-H}&ϓh;@3_2C?oY J guoA6Znu93 E'RAO?8-!ZsGIEd.ўpUt&wB@4q@mXm;ݏ9Gp٫p{i2Rmp($˧W^QZuJX`'N>Cj? 97|UY E"㖒HhHCCel;jxU2B( Ufk[RnKvٯ_?4ºW8$((#Jr1ogΈjg2#B!+f}q_? V3 Fv|t<%Y#r%slO(3ra10XAzOF0穫qɀJ-Z S3fŕ ƢI-*l4@fQ6j7wRz~~ Z*B)F3%n PE#pd{8}ߒFdc̗8e| a%7F]bi{,و]›QnBݟy%}# FQꇄd.S(ۇh3Ff_]g0g+mFlON6l8PHA#. 3e23X%d#N< yǸcs0@YشqMF-3d\z0[EɷX]YآVMXJ. %ȣ+3Xy zy:<%͛7aYney k2,A^ m w` B0B7Kj~V&շhLq5PJ]ӏ7@ :6[ꓬt9@境p5 Q A } Q!mH#Ԍ['c1Yl_7laal4Jo ˸Y nX4NO?A)8=jQ|3j7 zK')/M\ܼ3c 南>^i?p@^Kv$omQji72'cŠ `t dw2N.'C >Hl#1x),WΟ?o*vSw婧j^bd͒WԃI~įi|:̆y`*lco]֭nMHt <6s_)}@y\rW(mLg\76Y.)_ņ˖╖t䩧R:ʔ)1C }w>3R-TEcue_ # Qa0kb fzps S:?6lF9b`eS#ʹrIZ^Gԡ dˆ ]f`nr5: *bc:&QvU$r4xL/S:C:J5ʵSTp$גTʼn0p]7K8σF#?%:+&Gǎ. ?4@8.XU+#k\[xCAɹ=}Mq蹧Ln%Lթ| GLLuR5`,| *Y}('BLlH=u-߫,:p7.X؃@Ttp̹E;iԒ,) kp qST14w,J@ 1f gݶܗ@;v4̨t*?rIO<Ԁ5𝭿ey-~]G\Z̗xz9~Fg>^C.n.ep.vuٙN&S 9@B!n?dɒBg*Xvͩs:Ubp6*9XʌB0FR]41=1?`q‹XU8QSJ""@ w{$*< %5> ט8p)t.,sȎPBI ` l_by"@L-"F~օW+yn2%;-g(ɐ9lC [x c7?:&XTQʬ/lɷwtaE%5PmNy3=j-з3 ~B-!0d,S?!%`P:[BE|oD8?rou'x6)ݰ쫶} K9p^w c}C<B0uWg '\@Ao6)@ ?MolA'$Fw0*)$ "QX?Ԕ;*2 uWnYvV29#8jM:x&ʽVl.@&1:1AG(;&{@=\q[IL~W9y^1*/u4 Uyj25gA$@ z">5 P8(Ÿ#F8 EW}@NRA!mڴy ڹsn,f!ދߌ'χq4| ¼j%:~hr<sGs"6n{OEA6SHĘJ `#FP1ƹ=$DU(`q47:-u%O.]t̓OJ͛%~rm%~8EpdpB&g\uJd AJO^$ijav  r=ٿ@*9pk-B8,El-wgjbwTҪ4(%EITL`+2a[Vb.@jU5\Kln,ӍH "t`נuDu&ʳheN\?O]G+4?9) &WEТ'0PL6_?_kb-[z$h=]#3^n٥ߋ;qMyv죗!I=1>dzԋFs(Z aeq=b:B·Amt@CQoIP !"8wbToN\`l,RŹJsǟ3N:Jn]dʬ99?! hc)KHwswwl4qN0hz\M R)p'pI PmS VJK16ly{| w2c  Ý~(Acr'>vnΔ'rį@bh3 #TS [Ǚ_D3ƍV!oj1kX? 㕁M#D{"[+Ig$Н-;5viX>-Мa0 gJLkӼ'S p7#d6'Ψcж#f%4=SU n?Kªj6 x9GqCʏ'P^ ;0܉ wH7S]3bDIW`&s&|=`T V۶_{LRw.O B4*% +l4?($h7D A#G! LŒ(=A?o{S?gŒiH6L bg/e@>Sb%w`zjf[Jj5*)}Wi]O?F7oGe?>Hq> 74,TXͣ<; 6ސ^:}Zi$dn%@"p~=BB*fcG(C zBHc /t?׿&ا8!Mw L/<@chD`)al hFNϱX2p({2AP9Xc;?s}QVvqs{`[wRS,pg ,(mxTq~_Mx\Ő0"lAV;AӉ#>uxU_뜾d7FyVVq2h) FƱMb)aYv>R2AKvIx9Hpg֗R|6mDE,yX>O A.!xox:?"O $ O>rtxֿqpוx׮y0=aciKc:i6l%UFJ1>5j( [K!5@וb|?R_d#5 %#ʡ6#tCH5e/"4D4J̧L[K >of@эyLWBfBwʛi5n\ N?+Ĺ? z @BЍc^ c`đBU }dpxiX!آп}m9:l8qJ|m(w8{&IElWGp _#A;qG2G?6+QQmj{0-`^c?ց}i 1!uXRo;w i`l-0"FaM1P7_r4S~[*K_| Ŗ̔O(=Oǁ;k`;E~^8lik8dUMtYӂ(_AN8Ƛ=`m|1~Hr8b64−ղeˬVx9f̧Y1$hE LPxqc|wjoDk l J6< tR.^O?OcIL.bEsmv" b+f"@!I# Z"]Ț{@⛚tTL+f >d̫gI$f Y*"XLH1)S'YQn߹- `2:H`C= c8Ybo!)BNuu>֧HQ99px9sHFR;+߼I!t @~`~PP?@M;ba(92$ZLzd/^L*bY!)ҊzЫO?b;Gq2lGLP[tk}@S#~$U(l.0O>! c=C~`xUϾĩFf\7~k k}ey@"MBW1(z8 tvpS{L%l5I쐞^l N+|;KU;8&lmw9 zܺ#G*U6K_gHx|{Ai99Ƌrep\vR?@-9} +hCy8h>lU{0;X&WlE*`+ :dĀg=;u@J( q&Ӑ]:K V7{Ag/a{c|B8t $>iW}鯂˾lb&F|:  Jt^m}z)@ P @9 a71-hj/P@P F̀B r# 摶;{Or)S] 9JnCa sȝ/0P| ܴMo]!"+ܘ3?H`XWq99͊?†{fa%wHnÒK L Ȝ0]NnP䈓^7;|%*s#\$AgQ.I yB6Y6 Q8YMn6ڏ ~>zg#$ˎs<\aƍ; 'S6XG[iCNR S=qD Ǹ-cdhxЏ_gȳNݶ=. 9AB[+GMܤccJ8R񢛥!G0Џy[O֩NC0@4eLJh/ ˒8Xxokˆȁ!^ T0mV =j8*.Ly?OVK\=T2ZwĿ_#Qo~u}nm#!D"i:|xo Ǩ> `f";tV~g$xN8"CGE{Szc5gޟp]ph+O{<5<;l3#)w-)!*eYmjtWΨ5T)XBN=zZ @Kh!=H|9ekFSn@c!QjBt_zE17 |ӌ՝S|V c^U[80p*{yf ,~8*&p4{v8^ c~b/O>uo^MjZ=KJ0i~dhp$1?Hu:2vL{:%Ea-{9e%m OLЁHH q}쟂p dB=jg ȌrK06cױNuQB{ch(f xNn_>`貶wo>u|qg<ĀgW^' Ys0)xkOz{i#o:`tRt@AύbXzZy}BP' )u…T!6},xDxEy(R={c`K;nhAp}3Ika:`QώJF30Qq̈́ \Q'}z͡}wم}kmT5N|x k DI?ſ6ڼC=:dւkY/0203kKN {Nf7 Pwe18(^ ШM"Xk& >Ouߞ1hTK'shZǀ U3 <|iy1cQrE%AD~:ЗQ˂vU~cճf 7wÁ+q,WZ+G]&&xS)`.;XWh yΑKm}5qv +>/|Igw,<;3۷oa7^/\ЪAmǴ_Q\rBo*TW B :=TL1>GHT]wՋ0 !:`b9w=GspBB kS-hiSE+Bʹ^;%1/RxY) #xT~Io96movXZv6M]۵6f{MId2KK1tór/>ڌ⽷]~k̘iZ5 ڨgh:RF{}f0|^! }3FxMjRuew>ӋWEJC' 4PUI/Pʕ9Wd|sWZFjy]qh;ocDJ 1XEK9ĝN% 9 \ns3a34٪ywcLgV63Og3V۫4*qg駟TvZS>$fMAl__xT5s[~ xEv c@eǓ C/lx/0.Nsv}j#6n~!bNS=qZτbKf32y;cyӕWE,.A'g(Cfs 9@#uȆ>04̞*A9SoHwZh|e"C*5iڴ4/^F/eΩ 0n׭l/Ž[mMm-j/3ihk|Hqe.2 @e'd/bEu}8>̅VcT۵ŶcCKj+-ɑw@0{12ja^Y!Ƴ*כIoqoXI_M~엧`k9∮5 #9t6J(}\4MSz!8>t\ÜuNS5`j "Z9LϞcO&eP!]N}:gfu|  2XTr ]H6nXX '2>H nw9+UwGo Q0v|tk[|†vMc5Q*f'TXϞ=]lZSzueZǃﳦ/[.G /|ܤrd4]1gB`"7=Cv9YkXOڛo|C4̟ eq6ۼ@v”VK^pJI6QEӔ^FGCCV*BxpQeˁH}PؘLX;,9=vgsѾzcSU{{By`.=? IYy?*d1W}me3թ]ɪ.\b5nvF49r,͊8J t(^0\( ~[#*5;[X_e]]WS[i+m0Bxaxݴ+˾2T@Mʡ%c01pp4>QߡK[.8տl,x$vvБG-6%{ ?>yHYfEUs~ǛEb&@/!, LsPxUW웕6~j{{R =?~;o9@z3Ei7]W'rmfM|7¤·v[uD`_qUjDS؈Wm[!`x Ff^ʂeb@=_~r]㟯i ?R~hŸGQYX-4.Ӄ= sL]?7am4]η0/P~N㰕-T,׸}'%D)|#pP^ާH᜛fxk2 iֱC5;3}SYFlhzI|veh!`g+ZXmMmd-`fS};hT wVzj_#52i>}:_VˡrEU-2KEtNs;Li h|sϘIʊ+A`Omu© E6kM, aA+\zç<~J7O5ݕ_4e^GfMȍD$%s-FtLM@['4 mGs܄gCй8> M?h497Ty]}v}\).|eݏ8L=cM"gt#9 *ocyjk8۝wS}|Җ,[koM6r Vv0m&vjhknUk:e|}gsUZj^ڴ3 x((n!9HLef(*>7U`ܮ;x5甞= H6vå~:_PGgujۜmRbv- ;lv@v(xu_.EuÇ+hM x?m2Wc"b L0>^pa| }䨑R}&fo'#k/S퓏s<| 1SN;u;XC-4b:)avgzn|dvE#I=;ds(vX_϶λ|}r"B}pN5}zZ,iyeVc:AEoޠ~w`pI < hxY}&O65Ệ?2 V!Buqa\1k˅z-81W"IDATl[b95ؕ(tۿ0K,U,q<^HS.S.4Mc0>C#F}-h+,^.n׏l 7j>^y{յ OKv>4CH/ baj9OV[+QS TwPAHRxCX$sC:?f+&Zmw3b~ir:#EEX6Mh4f-y\F"X%ƱQf =zjuj8@FOK oN( \z+뛧TUpM[P09F4rQ&O$yu䓢n%0,\Ȧ)uy1' XئU{E6J{ukWkbOXQl6=>‹q,N=>"1ʹy*֡ >^yFȘ/2,X:e=Z3v 6./*XϊC@ <(;&g/>6CY.+hEqt55rc'a 'hH"?T^W'v4V{zp9]N^z>8Nk+- F@H^<sL4iSPy r $(>O%ܯ^5}jh9 m۾Rpm,,ZQV)VtڶmiQ|+}wj}nqD75}ۥxyek_<3nGAۦa#۬۾b+-X\cy=h7(LZ6ֈ5 0굤.[EȥhwNcש]ܸp&[_ w;Y_=R瞹)cVZ y[^}z—񇡫4,Kg5qVw7cΞiQ_B`UV._ޓ@ dl{ᇻ94zTvkޢ}kZm3--t8(@D2̅&=xRܴ.;[ޗz1밳+5 &w]V0#Ǣne\Nᖌ83_j5t C|":~({ztՓr/q=@G9d$HUU\sp(> _~[إv٭S:|]C#?/ܴ7&7dsÜS}ӯ-n4+bba ;=,V|_߮VXqs,G+Fp[fy1 N؞ҔyDgQM)+9SsN06ADj^zMi#i^S+uO{L׼Weo OR=Y?dV$ҭ[vżW.SϛՓxZ"*ze֩w8g}wU*T aR+yP-=L(Y3K}0=ȳ{L{.]n{zX/rzKZA*p-Aֶn^~] ģaC;E}1 xB 7pAЭURIafDn34Mxÿw%VyQ@>~2uJ+g)O8U7Kgm!^6 G8߳nx!:hO]ߩ! 5d $~ZSXPd}s)ӑkWy9 vZkf~~:^}[[B([c>}o_{imr ]c#o%oխ 1fni'?. b)'ȕX;:qaGɕXC80%.4)bqݠGw U {z&γeiG&ٞL .@G?ǴC$Cr.йGe.O%u4whZvǕMMVkm儩2"_K}S0xRۤE;_ͬ*W)Jʎ>k6 g {l؝wc3nvӍ8Ңís,8F7ie|X[?XO|9Q?5tRfR6绦0-={@lu`+g{zC9iCC0_^rr.Ly}tJ]f*%^[X3Rl-!=#5u.NַC8;H  2yE vM ;v^z MZ4d49 LMY\{ \bU$^jM7+K;Y\u+ {iXpks!F87R^_Œѭ)t!P$+ӳh^NM6ƣq:U)jil(T=z$׀ ,Zԫ1U =VJUV"ڰe%TsSw~l!x} \ 'jTϓ*M-&TPC aa 0b|pߐvܓi!nݧOtM{rj^!||OvaTS~ NӇ2*$Yadb/5mP.y?JF9c($.|pFW|jr\~p^.:T~* =سHxL 3?+-t͘ҮY҅:.!I^rrL+CĢMW߭n.ԩncM&&@YPLKu}z\pX4uxfۧZp-j#);eǸg,~1'_-ӎbz,2Z.d7 !F/™ywLI T0$УU/f=3a~,]ϟLiӹ@)@GRf){S{Fs?Q*l/yёrNE^%*M]B'ц_D ! 6`_&xK7UVN?GaWz\ 5+B$q(=Twag&fv.|izru}a}·Az? #F0~+? Β%; idՎHUw=ˆoh21X(`'SPБ9I%J0A&7)KFTXVZF#: *@D&Q׫dVuLC2z~ vXa$p >o ЭSMyL{fvPiֽ[MEh±ΰVi<V7P&Gp`_ #P>/u[\1; xso 9 JA a~nTNr QaF, ~9JXs?nRS0#3E^w͛\~!>fu70GW.EX] u3- ӤsRG *Lc߱@*YPQ?eߪKˋS q#0@G 3fՀe <{cS ZTnWc;E)8hX7s=N(p+”W[T SVه#Z[;?t\tt1ں=0ΆLi{RNI?L1Q9_d-LڨHI73{NX:.Bf? ?R'Z>|1ϙm]W϶:i܊w?|+, Uo0sJ}{%6S;,r4U#W'or$YdRYgKE|l!XC0gZ@w)\異 xqT9hd yNb"OM,]lkhb{fƐ >^H4]9Br> ;'Z8䰃\Wc3zVs5aTg'D{&U ԏVVC\^=Eݢ ʗ!r@E"礜gE?$!Qcmp3TN919L}߁ˍ߽}#jӖv ̳]队^Ӷ\7s޻w(^S|fnPReG Q~g [=ݦssUw%J)T$ѯ}^*^eԤ$D`AP7I_!6^_(HG ?@>Sְ~eי PkzN.b/Y=5HlBς&c7g ˊJƃc="YJ2-m8GfzzW+@y !Hhtsw:G䘑TfvԵ@D'2nDC-mkvc~\a)dm^GM-™__@@3S;U8:R]'tJ$:fXIB3]B+>R3q<qQOzmW*Kj;xD,آ?O<jSA/6PŅU#N!F`H@\<ν}/)GDUKA#upŪU*;we?(]guŏY_ ֕!y((\D[] ⷍ@x$LM^O<]7R"܎Fi*WۯlUv<?YΈނ0;B? E`oGMgJEތo <2@ F;찃zxe3wL8*'IS[@YF9s29\2*‹x:9db(1iڻ:iORrnމ8 R#QO^S!RW.%чf}/ؐm-EaQdy{%XֺZԌ6Ev"H4 _SVNGʟDZK<ɀZB Mߙ5?k6$SLqZgx{iqgx݆|,/"/<}o߾.b/'/_9G)D @2M'Fgwhs4Gx@D%CEXE/Ra!#N)+,n;+7p ] %\x)zT~!g561 s,B?pӟ M J8q<6|u66>;C 1==_L2<#aÆFLT \ x?H =k>G2,=[C4'C 4` , @u@q=Ƿ*=TS `G`R,oUd󀸡CewN=EӻHAm|,Bӹop/.$]'GPx5 N HZV.eCgUz+[߫TbP粁3Tyca~ɷL!J:.Ѩ3&z}ډ2AR):Td RUw1c^gZKMrgHHQX3?֮S3.Xa ZGCfJ)Rmmbc8+ڐt9^Exz>}gb!Q^Q;"mݗ]j]B, ^8J0|L2'7K?xvWjT_iE4JC>SXb!R T/]F<dUtXX(2T (Z .w߉'0uoK:A OCAJ=2ֽmѢ[ - yժWw2'p !r2gإjqѨဘϯ?Zvԁ]!o i"Xaz̼3f>$A1^iR:xS?4W?Q ޏ*~ż1?ٴi'̞s/S~zS _rx\cvrXY5??6 ݬQq)=T+^ ?0>4Pa$% SS:q~Ua(k'OW,OEFwqJZg߯%{;~_Yܐp34@(ܨQAj_\<$ׯGIz%Aj"p7͛r \<8(H0{ z9lSI^u>>ŠN RH*85AyQT@R*U[l\umDҥe"A$8B.׮]kzO=NWX7xՄox67>a|aR>]s(QorKh,YFUrif  <; R\7p",FիU|ѐW𜧟:yRΝ?/gϪ9?@$E䆔`ާR;ŜO׮]֨^u=kUSSwcF"Gqn1H'>ZJK/9|rq%GDzWVaf2a fl߾*V@§rZo$,빉>h6)/S[Wmذʕ+W8 _-> @.]&zRuHxw! !jOſYF/({P h$&;3`sp[788@ uԙ7A§s#p#Yl.@4(ŽWIHѢ+J/^w4St7 yv?* pj\&nݠ1fIbWT|>n=6؛n- %Eb]v;w_Β%˚"BCaOe26 >eXƮiu l +>/mtn$: @#"z.jC$ww#)4=sÏP<hI#c7HwA(ijs c@F|tIN}Ws'QTz@B-jdr Qa!{fGt ́%!0q%,#*M&U/hdl@8a'E}=qB nC@8p j"FX]% ŕL!CpJ⽨ܣ.T.nkBeT@xsr UPQUF #\a"L 5?O=4̝zj-zBDěrQ7*iP+W8&~# pKJ0ZD7 "%uL0PCOJy>:P/;0K=pTwy%S¸&MHddrgDntB^DZ2ہ5U̡ї=s20AuzI8#;r=p!ܩD:^UmJڵ'vV DDݻD`ve,pGg"5)ӌ<,OQez# ^= `(˥@0 OU,m!}m.]iS%(8$]lRV-8sF^|EL< (oرc% *iJpw^h6mD÷Z&Pe+?d*(G\WFFCDk|5h mp% oŎ=B_]k)Ҹ'$TJX3;OҶtY6Ñ˄qAAHv`+s p:Za 5)KjE>6&EV%`wޔr$>OŋKy$k^IuYQђ->Yt:J<)jXd8^w۰wgc1W>T||}%b/Ejq2\eHm[&˗/]땅x'ٲe{\^{N8ք :M88m#WL uk/:`uFqyeM%?X G`hjդO-{/QwO\ =^D ,OH ByҨQ~u(?Fm}o^aMzZޒ _3tSfWXgؖd=X٩;oCU xd ֑N$$!;|9 Nc4s)ޢDi}Ut vM X/wߐc5kId=ZT;BCԹm6<&^a+AɊhHM 0::=@qfF> pI(3#d݇9S`&-ȜVϑJx_3c>)ܠA"~Re+ҕrIw\3WI-ZJoL|z8{6P@~aBVt:4U#Te Sxw'Ln~Mm ZUA| #;{V|xp B7RcH͙3ٌX{n&_ ٚ9{7o}ON/YܡC{7_2wn|2@2XXA HK YxR|3c'аR7n7^~z% O˗tEw9-//MvvJ*+|4RZNS]~/,W790222eʔŴ?T?L-Bvcќﶞ5Sj zÃd/\%'$G^~aHTLz|Սڵu,:gh%NޑRE)ٻ; x iي:o-%$ ,8cVI5jT/3gΡ?j%92i͛ܲe7n2\s |͗.]۩S'EG=1pY|EÇf D^]׺Gկ!9y?pt/pd&͐Do=FB٧$s.OlYٰpL[4[Oo@,EZ嵺Qpmv?n<6QVy717yLjbI+TXc%S pXݒڱCaa0\}0uü`a͛7f3A7/4utm\}κuOuOah/A6_xqjd%*eʔiǼ碧zX? "0Ucarlٳ%_N-DzmzU ROwI؎,G>đ/\!i o&~WJ4ӎ`іo?`J;\{%0?sN[IO>2޳3ߋ/KʹE..;n_l9, ?jժD?r9#jKPeϏ$'gqa04Yu(A'Ov)DqV)ھ"n`]6-05Xg2Ezʏ)%S|Ys$ N`@Õ:2}lPGσI5ES/ hذ:JA=PBZu g1H@6O8}-+HyrR)/J%*_a?#7ש-7vj`{*O>\isWfMx秐?w.DN7˥U%w. yO>%KN+[RC;˗_jBɔ#\ x|_SL}#\F8uǚ}1 \D_O^oj}@3/]DXX^'\ qF T2L}7>9qɏGڹsgIOk:T^ؽKb3Gb)O%3DZ.}%(֙QvzY۲w<3 }7ˡMa඾doid!G'5޿m.={<$`DtTZ1$ (bC/Tއx N_1sR#Qh㿁R0 (S&>5^2*Oi_ Po5)A٢SaHSѼ{~b_-|l[82w2Eը)wWfrGC9Vsp]2jyTöU5VDx|{nޡR坷9-]~\ 8>|r9+`N 7EZl5PcV$((lٲ=tG .-甁c2/><͋>*""\9O̰!OjS/W73A!0te+x5oѬʞ]\^YgkCL %Rcs̙18ں8r9i#XY2O GeN@e> 8dsF>@7 '%B~s胏FE1$<% Q,CSY ,W"(82dD"t!hQV$d3 /C*^{Ur',]۷[y Aϸ6=ί_/2HH{xy3 IO_#dɚ%s>E 1j%I oȑJVE}` ~΍aE(WkWqe%Gyk3W(OŊej"рApYkU6p:9/ "-կ3xy- .:kJrc9߸/p2|<"5ǎb/zN\?f\ۺ]3^~c.4>p* GSDo\Br9OQ [[`oܓ˻T:+kL2y c$U[nGz͑_O(RuH/OXN<y& v߾Tpi' ޫiEz|ǹk׬7UbK)4xk1cƼRwXr8ү@hbSb9JH &u/U_"09@ 5M>.%1X!Pw#?v*eF7 pdg né @nϨyC)Ss.aF'Q?PW@&ؙv9;/Vjmq8n Y"6C-V.\0GRʕ+_1bxRJIB$ pz"W\=$X& Uf詓AjxdW_tvXsgD{UP3g-U lzK>,q p hkΪTҳg/S(9r: ?fC6~o0CNpބ}uE %+Qz $l)N H(tFJQh3ú1~Dm|w x eC{d:zUV.#CbNMR `&ɂPe-o%p"rp `J1,6}ZmdɒSW/ ;Kڜr`4Lӓt@?61[U$X+9Np̘uRH,:'|"K. Nf5ғ "!?QQ뺒7:mTCY7< )ls 8#;ǎsV]l RCu7l u:wHaڛ* sHPR!*ѹ3m 9o?x60yr`̥|N 8 M ݝ_L=]M7N3loܞ=ʙ`4n.*qt44>`BEa B|+#$: ݮO?cI&|Eܺ#="e,[ ʕ+iZZ Ι#wrJ2w&)[z1!={woV#Y-}wWqH/<= KtYZx4iT)cǮz L7 jZц8jR.uV>CtZ|S)P$xA {*aAZ$)Q\[& t9C:𱘿K0* e&Dp#(ܢ6k$58`.gz^+%x$'t=5u09@e1ggY'%ґWh!8Z~/_.\(Z88J\+W::˗+NkG񦓎ߖ_RjN;Tƍʕ#K$Δ%Bi NI&  XTlڼ L!R2g'ֆaY#^EM(w͟=?idwOFPgŗ_H=7F`rJc|q Wr.mbxGÉI zvr@i`5./!J9ʔKKccQ ]KR$sPֵn'G>$1$O)p$*8 3f}/+VXYYBT {vKa0"w[B՚7o^:O.XFȥ2A\$9S怇eaRPIXl97@?i^ҋ*V($Yq/C=%#?GN^|\(S ~Z*\^0+yN(a?M4N}νcF }rY!И#0cs d`Nl pX,IUc?֚ `(`j@l%VێeD Iͥ? v)a2S ˅`.眍uZ6L#})ӝѐ.IJT$[Ol{팄97R/Z5pVXqVu(#p@ =Q+;k4^\.]*& \1*&J_K*\8v&N΃"#a@| )Dq*9rdg*f*\[T:gm? 2mI>XBI<=#ݹҍixzhb'dM$cĵ psL (`,WxUoV̷84€Wݦ R0<48l/w@,-Ť$Q! +!5>Pʼ6 mOȼ@o7{e, Sr%(^DDI:Zzn(!tE^`0#q̟h]"WL+H"wL8D )bg h4`8B{hԣty~l+;u=<{G*ߐ)z ~V9gƁT_<jnxNY YrbmU+:eiͶ@_׮#|D}<̅4edj=_d.܈o`h_]~W0!y^ D8NfUg6SGyXя682Eծ{t/H10HZl@&p! >0LY~~YcQbܦpEo*C@/_P\pY,\;w`xPTwJ:C-ThhNtŏ?Oo8jt<!yu:1*\,[&wNZzOh`u KŢX~m Mg \૚4˖;\Zt dIi HG\8-sr[NebZErovaw 1] ?B奄nݾ!)sz`'hHs]'=xh* .\_ ‡k Ν?CI] X$ѣ":FkLhV%3WEg֯k;t$Ֆ-Vp.e (YJʁ귴]iJk2:0 j|qx!kƊ"/C[4$'Z k:_"R۰<1%q^oӧ"c5;\"C ] hAwmL8_x^1C04 N _ F&b|K [r{kϟ'c璽{*q(H"գ^Q4_ʔ˗.JUaa٧_DZW.hl.{ab[ϚaW<4Ԑ=x gS @\+F B{ x,~,=[6<ȼ04*&pt!{TC,-o ̙khY(]-jp6m[yq*H@W*bZ y TS\`?R@]u6J+_;/-aڌgzz{Mը.cW S>8Z=X&v7+"oyǓ+  Ԯ-nmj;~Ͳ_֭%_K%>c^\jx%>JvPK|00~LtzJuH Ҧ`p>mO-]tŎB# 3qsn qGы;<Uy?Q,E`7mfgb(}p+Jg ʱ' ~]HŅu5%Db~9jՄ<77$J )jFQqȳditu颌|d@fguGY\re@F |t#寿2"Kps͘`'~董۶osinsC`1)E>dR?=,_r+ʞf'Oݾm9?̽M/_:c>D ).@Jaj:MV&@ෆCl?ȈH̱҄/uXo[VpVPk@u1-C4j+bM_I?r(4kZSH@:(,OUީ gK i ob5kf# v27S&M z?% q˼m~X~kO n+;IvRz2V%˷?rԍ7J'$B8ED4iDl޼1_ߗoc̀[OYolZP0p(94ȑ1k*M &g!kM vΩ\EkpiXx~gߪs*f ŭo ݻe&!|5KiӶ"zJ慥gH@~Y3꠫(JG+tmk o{pz=<ӂL`+. dڴ+ڂg"}\ AH`yڱ3p~_ޱƂ#@IN"k}R3l `)QqKs\LpicOI$3Er^TW7o6 nT`3? ݓu6B>?~&$ s1nܬ7&$_.vo g]LilP1~џ@qᇹw?(%@|C^Rg8YVZ^8SIBCE͛PJ*)Cz#?m*fvޝh%pkR3#ϩPjSt?(܃pϝ;?@-sުUHR.Iyyx|g#|.'Nk g i-}[2d|ɖ0="F2lB@Ց7;sf l۶-4k'Kqtghh޽{\ۧDO9#7n܈!2;j4eI#r8H:^VӋHPXσp?7+JDIl`[Tg '?q`qZ^<'R{Xޟր̖/Cn Evf_O<1Ƅ$_1b)9Q xNbIΞ: 6l *Ta5R1¹?(ẖ}(V=0{u_ەc,q-$sHOp{Vy!sScBԥ5j5L?R-6 EIs*t_k׮6m}J^̳'ChB7S`q6C^DBdLZ]kXoM9h?qUYwZJloAdKG%3Oԭs0iḫF/,ޘo%(]DZAeǦAiNOJ6ު>)Hx  8x-Z 3o޼ P U#9|Jfx |lRP#ھ}eO+ܘ'TC,^ivYׄ\L`$ qvX 3mH3vrFFn_lYR"м=WOi:(qޟd8g4PYMxKn?U:o w6[дyF'In݄[ 8Ao슕U#n~KNT6Pwr"|0nWNȒ9](y[2ˬP0`@iC[.Ș2nJkh,G7IrK/=VN-=9ż63ıS'N#??\?nΜ9亨$ؐ]<-=.^%$r'9! h5hKw ڐGP#6~'#ۋoԕ~ NO̓&mf\gk%H%p sp*r6^8 g4"H lƒ\FrΛGU  kthMGJ<30ҫtoŬƱ&r9s1% \.A91W^Q{):ig^-k62 OTjkrsB F\*U^͓0 *Bb,HqMj炸.lْvc^rDdlu\~sZ|kڴiξxa%rr%KT~3(p9gKoP֠AYAx> 7eٽ{;H$)(Z( N6ӣGuoѼқ,ކEN1L[rmpz`w]s4JcN'd:`]b{g `Ľ? K\5؟\'S+pȉvS~\i;>) -{8S!v( qC(s ` DKQlV;٣d&qVQr4+ϟܰxH~<׶u_qL"V,Y'_lߑ}^t9fW.2&qx;O(#ORRC&n\j$~~IyEݺuѽjԨ "йs縹?0Z tp6,Ȕ~@neprNIMġ?%WDIiS%Oʏ]B G>Y?k7o42}Lԏlx5qPer9x&-EuV͚5O$~B;S !(,_ Jе*X%OvD&k6m`A(J(3&=u1\oF OO=dUԺx1'N"| p&&~jNIάMMcn3X6y<1ep4CEI+r*UOՒ[J+cdPKj #= ?5Zzk7ߓ#N`f-ophO;y}6\>kC0DcH_Qx84|IK-nPZ%+=kB"=h=K]Z?cƛ %h([T9x~9s[VHbP(>Ol4ԍs{2vjM'$#3q@-B& \̙BEёOi>R"`,iKQFC\W~T:W{@Lw zli=kER7qD菑3oI1lKWxrx/jӋ1N5K ؕ)rf)` 8/U?_zuܜL9Ǐ ME}A٫*w0RKɈ8Ieǒ4SM1 gຒMs`-H}&ϓh;@3_2C?oY J guoA6Znu93 E'RAO?8-!ZsGIEd.ўpUt&wB@4q@mXm;ݏ9Gp٫p{i2Rmp($˧W^QZuJX`'N>Cj? 97|UY E"㖒HhHCCel;jxU2B( Ufk[RnKvٯ_?4ºW8$((#Jr1ogΈjg2#B!+f}q_? V3 Fv|t<%Y#r%slO(3ra10XAzOF0穫qɀJ-Z S3fŕ ƢI-*l4@fQ6j7wRz~~ Z*B)F3%n PE#pd{8}ߒFdc̗8e| a%7F]bi{,و]›QnBݟy%}# FQꇄd.S(ۇh3Ff_]g0g+mFlON6l8PHA#. 3e23X%d#N< yǸcs0@YشqMF-3d\z0[EɷX]YآVMXJ. %ȣ+3Xy zy:<%͛7aYney k2,A^ m w` B0B7Kj~V&շhLq5PJ]ӏ7@ :6[ꓬt9@境p5 Q A } Q!mH#Ԍ['c1Yl_7laal4Jo ˸Y nX4NO?A)8=jQ|3j7 zK')/M\ܼ3c 南>^i?p@^Kv$omQji72'cŠ `t dw2N.'C >Hl#1x),WΟ?o*vSw婧j^bd͒WԃI~įi|:̆y`*lco]֭nMHt <6s_)}@y\rW(mLg\76Y.)_ņ˖╖t䩧R:ʔ)1C }w>3R-TEcue_ # Qa0kb fzps S:?6lF9b`eS#ʹrIZ^Gԡ dˆ ]f`nr5: *bc:&QvU$r4xL/S:C:J5ʵSTp$גTʼn0p]7K8σF#?%:+&Gǎ. ?4@8.XU+#k\[xCAɹ=}Mq蹧Ln%Lթ| GLLuR5`,| *Y}('BLlH=u-߫,:p7.X؃@Ttp̹E;iԒ,) kp qST14w,J@ 1f gݶܗ@;v4̨t*?rIO<Ԁ5𝭿ey-~]G\Z̗xz9~Fg>^C.n.ep.vuٙN&S 9@B!n?dɒBg*Xvͩs:Ubp6*9XʌB0FR]41=1?`q‹XU8QSJ""@ w{$*< %5> ט8p)t.,sȎPBI ` l_by"@L-"F~օW+yn2%;-g(ɐ9lC [x c7?:&XTQʬ/lɷwtaE%5PmNy3=j-з3 ~B-!0d,S?!%`P:[BE|oD8?rou'x6)ݰ쫶} K9p^w c}C<B0uWg '\@Ao6)@ ?MolA'$Fw0*)$ "QX?Ԕ;*2 uWnYvV29#8jM:x&ʽVl.@&1:1AG(;&{@=\q[IL~W9y^1*/u4 Uyj25gA$@ z">5 P8(Ÿ#F8 EW}@NRA!mڴy ڹsn,f!ދߌ'χq4| ¼j%:~hr<sGs"6n{OEA6SHĘJ `#FP1ƹ=$DU(`q47:-u%O.]t̓OJ͛%~rm%~8EpdpB&g\uJd AJO^$ijav  r=ٿ@*9pk-B8,El-wgjbwTҪ4(%EITL`+2a[Vb.@jU5\Kln,ӍH "t`נuDu&ʳheN\?O]G+4?9) &WEТ'0PL6_?_kb-[z$h=]#3^n٥ߋ;qMyv죗!I=1>dzԋFs(Z aeq=b:B·Amt@CQoIP !"8wbToN\`l,RŹJsǟ3N:Jn]dʬ99?! hc)KHwswwl4qN0hz\M R)p'pI PmS VJK16ly{| w2c  Ý~(Acr'>vnΔ'rį@bh3 #TS [Ǚ_D3ƍV!oj1kX? 㕁M#D{"[+Ig$Н-;5viX>-Мa0 gJLkӼ'S p7#d6'Ψcж#f%4=SU n?Kªj6 x9GqCʏ'P^ ;0܉ wH7S]3bDIW`&s&|=`T V۶_{LRw.O B4*% +l4?($h7D A#G! LŒ(=A?o{S?gŒiH6L bg/e@>Sb%w`zjf[Jj5*)}Wi]O?F7oGe?>Hq> 74,TXͣ<; 6ސ^:}Zi$dn%@"p~=BB*fcG(C zBHc /t?׿&ا8!Mw L/<@chD`)al hFNϱX2p({2AP9Xc;?s}QVvqs{`[wRS,pg ,(mxTq~_Mx\Ő0"lAV;AӉ#>uxU_뜾d7FyVVq2h) FƱMb)aYv>R2AKvIx9Hpg֗R|6mDE,yX>O A.!xox:?"O $ O>rtxֿqpוx׮y0=aciKc:i6l%UFJ1>5j( [K!5@וb|?R_d#5 %#ʡ6#tCH5e/"4D4J̧L[K >of@эyLWBfBwʛi5n\ N?+Ĺ? z @BЍc^ c`đBU }dpxiX!آп}m9:l8qJ|m(w8{&IElWGp _#A;qG2G?6+QQmj{0-`^c?ց}i 1!uXRo;w i`l-0"FaM1P7_r4S~[*K_| Ŗ̔O(=Oǁ;k`;E~^8lik8dUMtYӂ(_AN8Ƛ=`m|1~Hr8b64−ղeˬVx9f̧Y1$hE LPxqc|wjoDk l J6< tR.^O?OcIL.bEsmv" b+f"@!I# Z"]Ț{@⛚tTL+f >d̫gI$f Y*"XLH1)S'YQn߹- `2:H`C= c8Ybo!)BNuu>֧HQ99px9sHFR;+߼I!t @~`~PP?@M;ba(92$ZLzd/^L*bY!)ҊzЫO?b;Gq2lGLP[tk}@S#~$U(l.0O>! c=C~`xUϾĩFf\7~k k}ey@"MBW1(z8 tvpS{L%l5I쐞^l N+|;KU;8&lmw9 zܺ#G*U6K_gHx|{Ai99Ƌrep\vR?@-9} +hCy8h>lU{0;X&WlE*`+ :dĀg=;u@J( q&Ӑ]:K V7{Ag/a{c|B8t $>iW}鯂˾lb&F|:  Jt^m}z)@ P @9 a71-hj/P@P F̀B r# 摶;{Or)S] 9JnCa sȝ/0P| ܴMo]!"+ܘ3?H`XWq99͊?†{fa%wHnÒK L Ȝ0]NnP䈓^7;|%*s#\$AgQ.I yB6Y6 Q8YMn6ڏ ~>zg#$ˎs<\aƍ; 'S6XG[iCNR S=qD Ǹ-cdhxЏ_gȳNݶ=. 9AB[+GMܤccJ8R񢛥!G0Џy[O֩NC0@4eLJh/ ˒8Xxokˆȁ!^ T0mV =j8*.Ly?OVK\=T2ZwĿ_#Qo~u}nm#!D"i:|xo Ǩ> `f";tV~g$xN8"CGE{Szc5gޟp]ph+O{<5<;l3#)w-)!*eYmjtWΨ5T)XBN=zZ @Kh!=H|9ekFSn@c!QjBt_zE17 |ӌ՝S|V c^U[80p*{yf ,~8*&p4{v8^ c~b/O>uo^MjZ=KJ0i~dhp$1?Hu:2vL{:%Ea-{9e%m OLЁHH q}쟂p dB=jg ȌrK06cױNuQB{ch(f xNn_>`貶wo>u|qg<ĀgW^' Ys0)xkOz{i#o:`tRt@AύbXzZy}BP' )u…T!6},xDxEy(R={c`K;nhAp}3Ika:`QώJF30Qq̈́ \Q'}z͡}wم}kmT5N|x k DI?ſ6ڼC=:dւkY/0203kKN {Nf7 Pwe18(^ ШM"Xk& >Ouߞ1hTK'shZǀ U3 <|iy1cQrE%AD~:ЗQ˂vU~cճf 7wÁ+q,WZ+G]&&xS)`.;XWh yΑKm}5qv +>/|Igw,<;3۷oa7^/\ЪAmǴ_Q\rBo*TW B :=TL1>GHT]wՋ0 !:`b9w=GspBB kS-hiSE+Bʹ^;%1/RxY) #xT~Io96movXZv6M]۵6f{MId2KK1tór/>ڌ⽷]~k̘iZ5 ڨgh:RF{}f0|^! }3FxMjRuew>ӋWEJC' 4PUI/Pʕ9Wd|sWZFjy]qh;ocDJ 1XEK9ĝN% 9 \ns3a34٪ywcLgV63Og3V۫4*qg駟TvZS>$fMAl__xT5s[~ xEv c@eǓ C/lx/0.Nsv}j#6n~!bNS=qZτbKf32y;cyӕWE,.A'g(Cfs 9@#uȆ>04̞*A9SoHwZh|e"C*5iڴ4/^F/eΩ 0n׭l/Ž[mMm-j/3ihk|Hqe.2 @e'd/bEu}8>̅VcT۵ŶcCKj+-ɑw@0{12ja^Y!Ƴ*כIoqoXI_M~엧`k9∮5 #9t6J(}\4MSz!8>t\ÜuNS5`j "Z9LϞcO&eP!]N}:gfu|  2XTr ]H6nXX '2>H nw9+UwGo Q0v|tk[|†vMc5Q*f'TXϞ=]lZSzueZǃﳦ/[.G /|ܤrd4]1gB`"7=Cv9YkXOڛo|C4̟ eq6ۼ@v”VK^pJI6QEӔ^FGCCV*BxpQeˁH}PؘLX;,9=vgsѾzcSU{{By`.=? IYy?*d1W}me3թ]ɪ.\b5nvF49r,͊8J t(^0\( ~[#*5;[X_e]]WS[i+m0Bxaxݴ+˾2T@Mʡ%c01pp4>QߡK[.8տl,x$vvБG-6%{ ?>yHYfEUs~ǛEb&@/!, LsPxUW웕6~j{{R =?~;o9@z3Ei7]W'rmfM|7¤·v[uD`_qUjDS؈Wm[!`x Ff^ʂeb@=_~r]㟯i ?R~hŸGQYX-4.Ӄ= sL]?7am4]η0/P~N㰕-T,׸}'%D)|#pP^ާH᜛fxk2 iֱC5;3}SYFlhzI|veh!`g+ZXmMmd-`fS};hT wVzj_#52i>}:_VˡrEU-2KEtNs;Li h|sϘIʊ+A`Omu© E6kM, aA+\zç<~J7O5ݕ_4e^GfMȍD$%s-FtLM@['4 mGs܄gCй8> M?h497Ty]}v}\).|eݏ8L=cM"gt#9 *ocyjk8۝wS}|Җ,[koM6r Vv0m&vjhknUk:e|}gsUZj^ڴ3 x((n!9HLef(*>7U`ܮ;x5甞= H6vå~:_PGgujۜmRbv- ;lv@v(xu_.EuÇ+hM x?m2Wc"b L0>^pa| }䨑R}&fo'#k/S퓏s<| 1SN;u;XC-4b:)avgzn|dvE#I=;ds(vX_϶λ|}r"B}pN5}zZ,iyeVc:AEoޠ~w`pI < hxY}&O65Ệ?2 V!Buqa\1k˅z-81W"IDATl[b95ؕ(tۿ0K,U,q<^HS.S.4Mc0>C#F}-h+,^.n׏l 7j>^y{յ OKv>4CH/ baj9OV[+QS TwPAHRxCX$sC:?f+&Zmw3b~ir:#EEX6Mh4f-y\F"X%ƱQf =zjuj8@FOK oN( \z+뛧TUpM[P09F4rQ&O$yu䓢n%0,\Ȧ)uy1' XئU{E6J{ukWkbOXQl6=>‹q,N=>"1ʹy*֡ >^yFȘ/2,X:e=Z3v 6./*XϊC@ <(;&g/>6CY.+hEqt55rc'a 'hH"?T^W'v4V{zp9]N^z>8Nk+- F@H^<sL4iSPy r $(>O%ܯ^5}jh9 m۾Rpm,,ZQV)VtڶmiQ|+}wj}nqD75}ۥxyek_<3nGAۦa#۬۾b+-X\cy=h7(LZ6ֈ5 0굤.[EȥhwNcש]ܸp&[_ w;Y_=R瞹)cVZ y[^}z—񇡫4,Kg5qVw7cΞiQ_B`UV._ޓ@ dl{ᇻ94zTvkޢ}kZm3--t8(@D2̅&=xRܴ.;[ޗz1밳+5 &w]V0#Ǣne\Nᖌ83_j5t C|":~({ztՓr/q=@G9d$HUU\sp(> _~[إv٭S:|]C#?/ܴ7&7dsÜS}ӯ-n4+bba ;=,V|_߮VXqs,G+Fp[fy1 N؞ҔyDgQM)+9SsN06ADj^zMi#i^S+uO{L׼Weo OR=Y?dV$ҭ[vżW.SϛՓxZ"*ze֩w8g}wU*T aR+yP-=L(Y3K}0=ȳ{L{.]n{zX/rzKZA*p-Aֶn^~] ģaC;E}1 xB 7pAЭURIafDn34Mxÿw%VyQ@>~2uJ+g)O8U7Kgm!^6 G8߳nx!:hO]ߩ! 5d $~ZSXPd}s)ӑkWy9 vZkf~~:^}[[B([c>}o_{imr ]c#o%oխ 1fni'?. b)'ȕX;:qaGɕXC80%.4)bqݠGw U {z&γeiG&ٞL .@G?ǴC$Cr.йGe.O%u4whZvǕMMVkm儩2"_K}S0xRۤE;_ͬ*W)Jʎ>k6 g {l؝wc3nvӍ8Ңís,8F7ie|X[?XO|9Q?5tRfR6绦0-={@lu`+g{zC9iCC0_^rr.Ly}tJ]f*%^[X3Rl-!=#5u.NַC8;H  2yE vM ;v^z MZ4d49 LMY\{ \bU$^jM7+K;Y\u+ {iXpks!F87R^_Œѭ)t!P$+ӳh^NM6ƣq:U)jil(T=z$׀ ,Zԫ1U =VJUV"ڰe%TsSw~l!x} \ 'jTϓ*M-&TPC aa 0b|pߐvܓi!nݧOtM{rj^!||OvaTS~ NӇ2*$Yadb/5mP.y?JF9c($.|pFW|jr\~p^.:T~* =سHxL 3?+-t͘ҮY҅:.!I^rrL+CĢMW߭n.ԩncM&&@YPLKu}z\pX4uxfۧZp-j#);eǸg,~1'_-ӎbz,2Z.d7 !F/™ywLI T0$УU/f=3a~,]ϟLiӹ@)@GRf){S{Fs?Q*l/yёrNE^%*M]B'ц_D ! 6`_&xK7UVN?GaWz\ 5+B$q(=Twag&fv.|izru}a}·Az? #F0~+? Β%; idՎHUw=ˆoh21X(`'SPБ9I%J0A&7)KFTXVZF#: *@D&Q׫dVuLC2z~ vXa$p >o ЭSMyL{fvPiֽ[MEh±ΰVi<V7P&Gp`_ #P>/u[\1; xso 9 JA a~nTNr QaF, ~9JXs?nRS0#3E^w͛\~!>fu70GW.EX] u3- ӤsRG *Lc߱@*YPQ?eߪKˋS q#0@G 3fՀe <{cS ZTnWc;E)8hX7s=N(p+”W[T SVه#Z[;?t\tt1ں=0ΆLi{RNI?L1Q9_d-LڨHI73{NX:.Bf? ?R'Z>|1ϙm]W϶:i܊w?|+, Uo0sJ}{%6S;,r4U#W'or$YdRYgKE|l!XC0gZ@w)\異 xqT9hd yNb"OM,]lkhb{fƐ >^H4]9Br> ;'Z8䰃\Wc3zVs5aTg'D{&U ԏVVC\^=Eݢ ʗ!r@E"礜gE?$!Qcmp3TN919L}߁ˍ߽}#jӖv ̳]队^Ӷ\7s޻w(^S|fnPReG Q~g [=ݦssUw%J)T$ѯ}^*^eԤ$D`AP7I_!6^_(HG ?@>Sְ~eי PkzN.b/Y=5HlBς&c7g ˊJƃc="YJ2-m8GfzzW+@y !Hhtsw:G䘑TfvԵ@D'2nDC-mkvc~\a)dm^GM-™__@@3S;U8:R]'tJ$:fXIB3]B+>R3q<qQOzmW*Kj;xD,آ?O<jSA/6PŅU#N!F`H@\<ν}/)GDUKA#upŪU*;we?(]guŏY_ ֕!y((\D[] ⷍ@x$LM^O<]7R"܎Fi*WۯlUv<?YΈނ0;B? E`oGMgJEތo <2@ F;찃zxe3wL8*'IS[@YF9s29\2*‹x:9db(1iڻ:iORrnމ8 R#QO^S!RW.%чf}/ؐm-EaQdy{%XֺZԌ6Ev"H4 _SVNGʟDZK<ɀZB Mߙ5?k6$SLqZgx{iqgx݆|,/"/<}o߾.b/'/_9G)D @2M'Fgwhs4Gx@D%CEXE/Ra!#N)+,n;+7p ] %\x)zT~!g561 s,B?pӟ M J8q<6|u66>;C 1==_L2<#aÆFLT \ x?H =k>G2,=[C4'C 4` , @u@q=Ƿ*=TS `G`R,oUd󀸡CewN=EӻHAm|,Bӹop/.$]'GPx5 N HZV.eCgUz+[߫TbP粁3Tyca~ɷL!J:.Ѩ3&z}ډ2AR):Td RUw1c^gZKMrgHHQX3?֮S3.Xa ZGCfJ)Rmmbc8+ڐt9^Exz>}gb!Q^Q;"mݗ]j]B, ^8J0|L2'7K?xvWjT_iE4JC>SXb!R T/]F<dUtXX(2T (Z .w߉'0uoK:A OCAJ=2ֽmѢ[ - yժWw2'p !r2gإjqѨဘϯ?Zvԁ]!o i"Xaz̼3f>$A1^iR:xS?4W?Q ޏ*~ż1?ٴi'̞s/S~zS _rx\cvrXY5??6 ݬQq)=T+^ ?0>4Pa$% SS:q~Ua(k'S[8p!GgL#EhO]mN^5[[bW{$WjϻhvW +C @<م2"0Q*E+C?Ɔ l[ylox\fwt}ׇ~Kp(N몤J]цdAP[}X1<$WjϻiwX 桾+D @?ی3"0Y,*E+C?Ɔ jVtlox[fwt~ֆ~Kp%MꩤJ]ЅfAO[X1<$UiɤϻgvW +C @H简2"0}*ic14~PNG  IHDRxsRGB@IDATx]|M !!$wTzG@vE,T{.U*BzNl6awIv7r23w={J                                                                                          9:@`.!؆muT"p>мm*8,$n(nphDpphXXXrDDDP_¾¶OP9dPyYY*//'Tqq.))QEEE0~AAsH^}vԩ8 y炩, @=" @=-\@; IJJ!e偁B,)f RX۲ӿUiOM@SX~m[*ք@*my[tyyy*)C877טcYٛP?.| ,$.D@)Y .D^!5kfLLL,+G^糷 u!޸ž=t j{ER3O[,ܒ@!PbP2_Q,eP*PWrZ  $pr B".۴i3Ɩ ͛St | ab{.|ӸqL\!2 OP@A90feeb߿pVVHΌ(gHRD#2c4{„ҹsgRqls\Bd-ߺ[o9kuY@(~ŅeP|i1~;_2*߀k $V`\(f :tХK@H`Ҧ7@k&{xء ׅ.q&{|=]]^ՕVz ֬Z@bXMh)2p~x~> =4W@p1}߀g۷[n0Go={]0ӏU'x:~z>o[YՏ9~e~փ*m|PoT\S_sָ - 8PRW W0)ႯYW!A1" @c|RgW"9b|>};92_??CɓtbLpjӄol-* :+g9._[yغF/2WS.M˨m 2ǰʀpM`_4,t-ǧIݻZ :/33Sqc:iT!l,.j:gO^Ob9Hıo΄dc)P)6eO;ߔE4>`XE59Аv\;c}ՆlzVqsRcoT c[0^ ^(^82.FS ׯ_$Lp3yC !m.LI,Nb>RӠ6?lL_` "5X1>tLSFO@Hu u\tms2*qcTwek`<wk<P#5ǽ`ڏgO=j zoB_߷6C[EL瘖ubp30p 3, 8?\]Ǽm{X̖]1eXrk3/so? (.Dt=dȐvw mcd"=†&{2SSS4>|D*"!+ȂfK-eX\k>{\I^s` /.F>rȩ&LiڴR:l xGQS0q ڡCTc}ra'`p? i- 0$][>SJEL ? (񘤐.DyG;`rxﳷo@]6xz/ȑ#ѣ?rǼQ/ Js2QH\@{wïEo_!MSyu-R(߯8gAh*OF+{B! =)rgBI8{Yqݤ B={Աǵ"KOCʃ)Tj|j 66B bnjݺq`M_ۧ'rJ=9ž߾}OjB@!޴SH`T8@HhpDhG p~ԩ}W\qEpDDOѣ=-*nDAo-yMOGݻwݻvȏB_Hp(EPrq E3 =,$44rc".j{4S,{z_?tG1Ν3ĬA'\b"9vt3Qq^$:ɓ'+L3p= t[=}c,&᭿zG$UYi7~!$r!!?='N胗>iqݼOO?w㑌@<4@EKw u(uzfmvօ^h@8ւ_JBbwÑCGq*>  Q Z\8DxK'Qz0Б(sOEs)P >>,_.d&X  }z̘1 Ç}u>ݼR[s+㱷i{%eդPm8u'`!AR8%3"yɏ}¼^YoЗ)&~> ɪA(Gܙ S_lb#$QjzJIIqĈY'O+:_ߧRbX"%9 ,:HE *z/++VҐ7/ q.乵g Kp*,/>w)pHCH]uK;.$@HY-4r@>s9O}0@~S~ t1ȶ aT!v~$e @f۷oinvv`q~\2C"FL -sXF0WB@.D#իW\ttt@FZ 3?W?Wʒ}>5J~OW@H QIolÜvZuDh@ c \2O: rX|93" !.D ܹsx`@@PNVU|]sNfgw!w#`M@EIƎ `(ֈB`VXX}mڴ)=R\TT1[Oq6~X^̺z 7#i_k@6 BۼR! lό@"|Gaat/ kF 0 !Z;\(Q<__ߗŕbZ_($!|9 VJ 0f-/I` P^>₂0M H8׿~yN0#Mw,¡ `4$ c?47=-$u3uv'أv J T^ G?/Prبzyuzv  Ix. I$0,AG1 H>xUCw?*]tF\R(ȒN0{ʃ=,7,j+-^HnHN0|UH{ $8x\L6*N" @ =  ^ 6h7}OKEa /$q`/pg`F4܍A" `AH<Yzxuv" @I2 ^0m~"ށ=h^Ԩ?SQẰj)~/CJg@}^VEX!U9? q@F^؈Dh5zq8!n\-O-ɀD9&2'S )t8$N){6w*qߧ0 6B@/Z.~ -[3 EaM/p2{ObzEO?PFqK+$[VlD+f%XvZxN2]Z=`>/!/B@//z. ߋ`NVPW+QHr$n)I BQ2l%74ъcrH8wfZ!R1`afph58@%祖 0`΀pW0p#_q#wW}DW2@SPLA>qroxg/ӹ >l, #аMO y({sacǞ 9/\vAӌL1=) lTٳfl@ැ| "HgC`*PB4\T F>PS؃'s ^PQ&/Le=#n#=  _nƋ{r9_l%>{4gS?+0'#Pm*WV oQ;{Yk4!wX" hRO'>z ~XB%"0p2(bB(\XwHF؋%MlGg{DTi=+÷DAZ{: 4{xeۻ%ş\fBFAhhgOZH7}){B@msmyh03C0@Ϩ9xGQ׏!ijb f^tx 8!AD CfFK$gۂs^PAQ!Q>`Q/xl|mtc:Y0!'X`YYY|9ҸHBEV絤؇2<#/C_cnzz>fC'B"0g,??? r0s7| ~V3dΜ9Pyhpau#iozWDY]mVDGl)B^) ŋ-))|6aڬY#mcNBL%a8|,P||T/yWmNxqIm kk MYR sE.\#6ɉ[uPE`: r0W)f@֩Xfw$wB^ps62P+,igw0{?QKny5"ZESk@hd\d7*e,?jBj{EJ@u Bn !D~C ?~SgAav'x=P *z)x$,0IZ0#} {'VKĝQ&Uf͚CC~hx=oontr3jݬR[74$ s,٣ n ŸV91;#q&X8?ltt~pJ30ѻO*..K{lMF8η>(ψH~z t~ 94#`: eR(h=~ aEN+>1Crh¾F|7ߤ5i/`&a؀že&Ν;`!'Xf@(cξX7|0pQɑ$-!/B ]azjh䣥8 bpspc1kN?U=ztS-Z$q Ֆ-[J̙& ` } ,)y< #0 WPX~ @Zc<A9lGV - w=\ڴBs0X'k8.:#Grرc?+))y7Ux^-0@S}_N#+9Եb]xC=\^Q>Fz`E, v7:dL}T6%%EEFV~M0P}NJ[3]-}WVlX]ڊ4c7[rx8yv_& iDQJSX;fe\/ M.7+@Q?0ޯ>{Ak)W6iUp>T\ N Li:wd)_2e< N E`alG03^<> 59ߝgmj`DhhgVO!9 T0 Q vh>W/zդC{@%*X^EDWVRڶUPt2juO[ۖ8 NL҅ CJ+ qH(-}1N;&{ Kkn_h//  uQxtq{BO  4_ ^ n, /x#nҹu 0pz 0OT93J>jk&NA>T$ Vsv-T ػk)UG# .Ùy7DNr)OE'6VZn,D=E`)>}Tia!:e֮Zḽ`矖g6l0($$}veX9ȈVv?~<cB=VVVrlyTG ŽSahڣ1a !F;>| 7!}E`Fk,#|4u?/5(-M%Zu6S+we+`OY t5jHZqncttDJ0 []Cp-(*vW5 vNAmBȍ]٬ M|Av<|5 [MA11jV I%z萊_18@*C i6_-Vipr/B t -,ۂ*B( P?َV>~mgFv;7`q=Es#}!->} AkR(FuםBz?cbbL_ߩhjX {w5"hV5petSYJ@Gm nUFRHj=|UMxSw{macؐ<͑Fk`Iu.Y.N]oڽ:"`z@zڕ"dO!GE_kg3g~Rh=l?= - Oʂ཯R{_{ED%pA 1]M= m޼R~s٪UJtj<1Y 5{mEEekC0\4Bv#Rv30pvccv& Enl9& i x<og`6V6iPuKU竦|G\^O?Wy*7'Bf~# *7 S}OU:|huߪh r!ѣGWepSO=w}m,?lkc}@~=H3t*g@-c{qg=RncFW(ڲ62DW (C6zl8}t\_H7!|>?o>",p`j:|JC\bm@YIU $! tŏ]QLSz=B?W!L+܀iǣo9/ d{@F jtc@nGRFe;?{?-)/qj=v&qm_-z9rT>͂.E|͇aUYgUJڳgJŸS ׭[{L7?V?w8zZ_.Dee*6bcT@\wT cDkƾ3*4!A$,RdI@X򐾏ZM~\Qʙ$'!;.o Nŷ~xPn .eȣ  J.dB, HE_|SעiNG2puZқ"{P\'-72NCtpGԦ %*TOTn)dL q$ִv t\J@. Fz@@Lin6}i{34p(z9G3! W{}^~6_tj}ͪIsNoc tDT0So ofK? C!:BC:_vq,y!  2@ЕPO™'!@{2P) bCݓ߾g Ű bIg? {S=6K9We޻`;%q- SJ፟2fqˀ(I˗}qA^oe΄XqPaѡ"z+*C[Lђ%\{foEؼ.@% _Ln RBu(u G> t׿y _ f^ILuvM:uTZc&*ɘ&oa@Q1 G[_ ሻw^گ_ߕ?ap>?[tgA xk9iTn%MlGBD+cQWNo($K m>H~? .4\$J]yOurͅt;qMpk /TŰjOX \x9sO`灝mC 녔j~͉@ s^ܴߤ^Fsm ]8ݸ9uAҎ6؛S+v f} 7)H~"JtuɪݔKl v3^0*9 |5x!>hM ~[`xVD%곬rϺ*G ! XZr/Y@fGt-?uaO?Νդwܡ9qZ~U _7'4AM~7^{.44ݲX8\i 3Qa G釬82g0B`0h~^".Am 6he,D@(M17v_fc. 2fCM=QJ+vYKhg@}[&W], 0ѕ$ڼpÇ:dU"@+LK.Vox$Uja}nݦ z<XhhlCU :kYC&ڶk|80;Bu -ɝ+L[Fj;oa¿Ÿnp?rq˫h}< ̞]wjSO #Ns_#,xnBԭoQq(3S D>GESi*~L[μ0ߔe6|IapcZZy8ÿ p*-H%]V^n\;gL*L3T`Me'N-Yd4`HvFFYj\[3vjBȗNLaÇ$o1=b4t~+_@/=^> &nvkC^ Ss]׸C"9j{.[Eth|dˈ(*soSq*nw\i՗_*F6W鬷uVo߾Xl=wϜ9+:o L,Kw̚5+i:Yvz!>-lj؉7B]8OBu(uܱcCGV*fkT,εHCg75R @$(v.U!iO7VZ8@s.+.RaZ-,JO0<- ,Qp8tmS^ouC- ,--s:_ñl(f͚Mo&~߃Vh{Ck~Jo}8 YT{I~#i0npm3{N4UrK+@wGuPݽ!8lb웕+Wu:OKz^m) PQpEIj_WJ۾]{¼B*%F@ZC ǻ /$ Ј-fBE" 4z;vq($5@ 0W^}y!N=en*HWgք~,?c+W)lGDET룢vXW@D[sUĉ*k~~ڑm_gnP4 5js_Dg3O[% LeMT,q:㫺u[ {-Ĺ74u xFBn8y|l<<5AϞ>-T8CEfO-9&H*p7]Ƽ&RF{vݤg^T\F׆`ASwP''b|r h$.2>oQi=TdJeRGGa}p p}?8 lM0pA/ u Cd *zwUVUu2Ӥz䑇Z$Q|bq " M(ܑ#7Ȉuu?ZO*s͛8ZΑƴL nHzviN?0-'\.iφǩӴyJew%aHU,EjW9ϿP~NM-T+ Z?l/L8B&Muk1: cqbwK9MZމkU$I[U p=A}2mέ\LMp ETB~9 :Ѯm6#G $ؘ[n6+]{uꭷ߮h!w!z> %`xGO<歷T1csn_=3gB8}򙟑JC_}9FMQFDZyO$| 'UniRQ# ;ֵC)ctV]_uՉ?KoLE0oD1npBmҊ+J!e ,&Ç{!7*|>ڢl ~y"@o"B/[I XXJ.W+^ѬI4=V˭s@߿yQ lix{lhqg}ڪr:9rJvFxUS߁B3ZO}$ÃoME5U!]ැj|88w S /|7`ʔUxxD7 #}ꩧV\8{y\*~ Y >p5^xÎ'#hY&BGjm%9c'Sm3M\r*9p$u-^]rdk 55lz-ϏdhC=4q'g4D)^3tG1N`aہ__k? F=; ʭa.> \ھ}ᇕj?p̠2`s!*BE99ֲ}EgV}G}1#0M5J~,CeF8~D{W#& W3Ү}?BC@犫?C&yۼSD'ECE.-qiSA%`#`.qt5J<ޒӬo5UPhEoCv<$^'T=?#ƹ cZj*Xj)pRj_ ĩzO}j_!8=Sm $h  Խ{'19m+M%_&d5Xjj: Nƨc4.C}*S`bj  T Rj\j7O edvm ]J喽YgϗgZ Ÿ|0_.{aV{q2~|+kl>aSewj@)amUPz'jtӫBG|;5yWLaLfx.5oC~{}G!zm0eEi uڥJf{6[j Wi^>`ZcN=5 {>1~[+_[Z<{t_q gc!p/rC՜nys1/bF1bX#WXۓ!(_9r: ߔ1"@/+@bV?@Nij\G'zڏGKܲAbM.(ܷd~7={vREw)엀t$x~{)۫iН17?SاP$ x?wqj>\p2?}J{/ާJJM>Bgܩ~| fyolаEv蠺{5E}= Jrrk^_XJ")N\]m W `ڵ :ކũK;G 3|}߿SsV7r_}|޼Og|fX <]NU/B+/vO@Ra4h,}-I;ṽ4uYo$ xمwy'?iୖx>M? QkcվBͻާ(~泄i03SK=M֭ʃ|ia6ӧJ=JCXeJs5ž6U46mLc)=7' Y;j) :tz&pmEou; OFmM="àACh^X;Bm0<bh}3Gj`J%+ f5vm><!II7o.MK;F[^/d؇R}B&?GPЯ86޴L2<2[ QOdGUMJ?lvSݻO6GC٣•z\10b7oIU5gHԄoS #PzxCi3~J=COPtbT恎|-L>i1aPCֶ(aG3T3½,p}-\ L@(ù h7yƊ PpFx㍳1e Q1bΧ`k4lذP|lY=׾fh`=F`O>Vۖt4kR" ?׵ '7G `d\v)|?TdzVF[D).Q;Q)mL|WK6=*2EL;ǏS߭}ii 6={ s.|`}ͧp % w?@Xcco: yol'Wt bZMfN%:Q&K@n9OZeiw q8*c%7Z9i#&=z06kr!)H(sUQ6A[+k s*wr۟Z-5{QAˀCq@ţn5WuH0"˖U;8v:76 0hm (+X2{#.uߺBv 66θ{.u" LP5P 0.:% rq]x??t dPJq w$eQ)BS 5߈noMSyZ %~X1aHۿ޻ ©QnG~X֯Wa~ !Rk lZBhqʼn72(WX.tsaQ87PHDNš KjOT96'\Z wj@'ϨÔK4'̴7еk7'OfBJ_W[{p=~'- l3㝚?r-I[2!h%%pL'TQb#@'!ȿ?S4xQ֍#rWQAҹA(ZxGqj$"օHrjj_PӦ/F,=-/6Q ݂AhDE!*eİ@1V,B'`=}* Elѓt0Q2 T)0ܲdiS)/W`M;N=㠔DzgV^]LcXPGbĉ@ m@f|* 3,!'i>VPĦ8+,x N:iCt&Y |*d~E@ȿ*r=\{yc \ {[ȹ`FW}(`*8vSnT?,g-C-*%&O=IUI04ŎQv" eS+.UQ(PSm>ѼBSeEie^us90ȩ:}oϧ{i^JnF`oubuHƢETn)Йf|mUj1-X"{jkE Xh;DPsss[3nacҎ|~gI$Ž#} Q1l{\xѤ3g  ^\kaoc襤2hp*v)ݹ/c&l.j>t|֑C} j#K?Vs73 2NyNfybȡrFBIc+]s+lc-[7fcqq? :^ A7qJsQ~7GFEYpӘ&_7Qq[9cw݅8 xyBuܻÇWEg5fyZםЈz4(}}S0CАhp4bm*F*y|;ؐ,k0,b|*NJyd^7\6eK$kp/!*8(uch)KgrM86/v; ?p: rۻwںB0V~ܵk7ƻT4-}/_u.|9pxjCkn6bx+z^h@ ŞQ Zo:hnō* q\U`WZ(d7Hu*b>xy5B`&r~ cж|+:{f;7fؽΔzeڂ3km*<ҒRSb/33HS ,LECgQc:/>mڏ8wX7B Qdn&$$ЬGF;Oa޵KEl?gôEP[\! [`.<0Nlބ;{_!9mwFDW?#矕Ba-G:P&AT>؊`g eÇ  | 6ce0oj:TP0#;(p/D{ySʱ~ {Z JU"%v綿 q' 2Μs_|}X-/7Z_StOA:tPŋqppNz`7*݃m&LPcx]Es~3摻1l}3U?j67=5t 1_CU?H]\iI*V&W ]pBsn*)\ܽ{~wB 9ʑ;aV(vDFS)]>,O?9.O0 iiS84™3gAkWX^ pM%?cZ̈߼EiR5^qz{2zFh۵>}eywN+݇*;W 锎JXjYJ7)K C`<IpFa]7߬JtW]5UZ)p?;L93F@.Ɗ5/|xѱo+@BA`o6D[ZѶ6t0'&{_yM`Od/Uc}3el`J{Ÿ 1lg~xIҥK9/0-la(7ᬥosף[9ݮHz%BsC5aaᆂ|ݻvrfS&ͼjkc`z駁7nqk\bBK9 Xf1֯kT p~ɒ%H]NqΝդKUkBņެjLEkv">z5 Bom9\Mѣ5TcElѭZ_y*yZ*g{B|'`5W]}kK"e{?+*UɄm!-;v7ݢ~~mg#o]#?UZa%5P b}/ZũրD|%5T$B D .S٬<\Cm)׸ =̟??3W Hd*7Mϟu0|-<0=8MNFC5 r;y$0_r7$jiiJcD-X8/kf~pFJ%)=C~xqG30(OyjËU z1c8N9? K:V<)(Ώ>RoED8?^|Aa(i0 WC(=S3CX:JH8z:{b86uZ*ԬdZHY)ȴ( SPȝXa⻶W`JUmڴCdCزe:-Ѷ&cp DZ_~k3N-bm; /-m-6oap%BoN `8Q)aغsΉspXX}e[k,lGj[P8<,ȼbpT|0 KwoSi:>ctEHrj:TyHMҖ-A 4 mvFIo`1c*yd7L&*"M "pӧS_> :x#7K )gq$/{ca: ~rqb4tPcC\tdjLJWhѬo>j1r):Oq*z=ٽ :+qT[nRa/=̵/2pj756ͭw2g-~7!~Xz28s=lm&LAT@ m),?@[o{=bK %_@Clok`|:ɅrSchaÔ/R|>0ՇWMך?f brIiZG]-!S3p0x]uv{+Q`jس?s~skڎ6Ѵ.~ 3^uጳp1;_yUa,%*1 \uD9ֺ Zd<ӭ=|гwRòFv:qZV [v*wV ~Pw 1g?|z5*78= <333=!pEu̙Q Ӭ>Z{AlّEG8N m8d`onSEk -ÿN1ӕxWN7:;n QM0}T4kQz1k=^(~xxiTf CI:YLD.}41%Bo9e71K_/X;_eĿsa!`@Kb1ݻ.9jffNp!M|nAxi(@d~Gp m]Z?QS(p]AF(c6 N-XjJ?t0Mc*-wUNۯ翴57nԹ*BqH+)1tEeLR/Hn74iҡ>7>߃;"wMX8V(OL#6B'GPnI jƶ9rr:jEK~ub 0`xT'пš{|CؓdB,|Cmo{wx&˄m&mt^́SO5?a88OTt8 rOS ϭ>(᯿01][r qAZ/Bi@Tʎ~[$Pݟx t2"8F-+ZX_bJXؿSWb|)/gԩ\0)OmDjhmrjm@i۶j^}ǀ zSe O[~@~h9J35$e=vMfp*ǖ^ /SjZ:|>}ҰG\ݑ[̙,z%M! *kuĺ3s~X jր3q$&;Vcǩ6Xϝ؁l>)ɡ44Adc V/ה^M1BE ][Uʥ]P rL端}R]`G~IBp HpwN[uZR{RV(--RܵK"pw{<<OBP | }aЍ{t~9q9ԻTKcqu\q^qDsgf-!0!oϐ!w5kCXǮi6}vƌ!Eڕ\' _q] 1ہ<,SXm uȣ9b߷hB*0ԖF?NL4$&&RS{(SQ"{>-rTo~sL tK'O6?|>C4HEKs@ku$7ռdCEPgϭ+\O-X(GVfjҿ3dru]9@M¥Kr+WuYEx ҩ*2 'f B>9cKȬ <1GWc`Y>'Fy %<+e㹍?v[]w,I1~&M:~ Lȝj^\c r^=P>K@N0Ya$$^b5ǃ=GM߬fTNMN )q2?RӀ(|hKzN2XJ/} )0ŠӧO~|\ɰ H 8=M446N:}>\ΟWd=+)09ױ kAON&ׁtXЩC:쎕s@W~hW+wJ\'$x  h}9 0nOHm1K;e#6Yp(0x!~eKKz4~}Bb^zB%|J*Im5M\Ad9O8.6T򟲯ؼ I\޵kUCI/JE٬)+S?+{WTY`E!;!o7Z^= wW.Bڌ!@A|yK G1v矤BPCsdt v\|r.S$S =~ mB4x;|;~ ;Gv]I9ebZw}iFڷdd#W삃[zK\AʌnCF.sۮ 9tc/5OԾYB$|!:dD#%:8p,!eZ@ O&Th.vo"( P\H6L[d!iW3 }(Q>:q5(boVõ{2} ٣^BCd@/̀P[OUbPE{X+b\ǃ+C{\ڵo[tqȽR'y%@A#i{R0 \AK?yLb3.) Q|s!,|D? @eâ|*`A`TɴN@^ ֬^CJ>SWn?(=lFolַOVG/g&oŪ'r) YmA_XKfgDPAoy=oƛDAolEAPnoi2ƚZ!SĮʨUo#3 63d]-o}6WO85uU<_R,4ZfDK~g#UkkR2$(ϖ ];k* 9z_vQ1-W^%{_ZC=K]P1e6d +f ~hQ`kc\K10~/gԫWk8l*0K.^~(xtقF|Q*:ξ?~\DEiGF__|㷕Z2ՙA±Hۢ0j۵n Uu+8T0wP*V.oC)` [<2!F~_5ҵKW1u6]gq F @}ȕ[(wA{oayҥ3gRD{홝DTûxlٲc{H R@ Z|&WD\A /Ri3~DGGTe"(XB@RIhDA }_vŞ%)QBqHˀ>Mh懛 ܖ}Dmd5jHTU|g5# y;q_,afZul6 DŽ)+# $AO`â\\"W\ի(bVH1Ht" \M{$?KF UQЍsąatOo9T s h~ nZ"F|)2|5L@Qz0 UIzP7WN93vZ"xJA2V}q]vZA8'=zP_bDl_.\H0idbs eʔ˗K5D ]3Q86o.J8T (H}x#{xI-UN| :#FGIwÆ ſXBL\$55;N%HQ &6FT$5`0CϽ{ҥd~-uQ<Ԉ1P駥="QWO˱Zl4E!n/ QdM&wk3Ӗ-I T)_'Q\PP mR`-Sawe1^SIAYE. c9uo",|Λ$m7}| ʲ"b_]qmptQ/ =-.- lDӌ3SJ !A@me˗ e *ݻw)NhS--HT0 ԓ$̀kP1Bƈ}ܢBO$01B/\8uԢf?U)HLb’P⼠ $Ϲ`_fPPjK kJO,0bT Ֆ|r HhFi *QTbe R 80 +b5̋ucJ2m'H\# 1Ɛ)pZwhu,ǽrkՔ_){Gq"U" lCɁO?W"l ,?:(ZT0𝕆dKH88;D ϕ댓frTO+#o*^K_fm3_2' *^2^k3}]\1*{ vr-4H1 |f_<1,V4P¥ky'%W' svi\5hX bNRxk!Rf8_)H%a”)(@$ }lN[lݪ?%=UyL&X`J',L,Nr%cdW@!CFBTAm2܍Nȭ:7t|X1ZPw & g[PwHC5{Wg._|Qg 2Cp*~@ÒpKJ =EzFc!?TAիKՁ cj$:w@̰9Җ8$~eڵUsjѐ N{] uQ1}K 9 KQzrqS4ޥK╫V(#kJQ1c ydX Ӎ[C잪\& aVvY@CèۧĀ؀az~Ѽ%Q 摄!'Rj􌸌Aӷ薛n&vRv5@*btXSE 9Y=4a獞` ~8A R)H*?Q^瘊IL R4ږGS_PynYrY °I |VAƛ}\:_ FymթE/bMJ4B K7eHB/5s'HP ztdwpKܲorix߻xKNUM!g"h P{SڽaaP!d (X5. 7}`P@φ_[EM0&g5dnم;{ D*`,SZ{,'~kE?g#3<" ' uI'%'nI `;^T 0+&Z .y"x2%fk1n~`frW@IDATm& q{l]~<1_[i.X͞ېΆTp)c@0 E8$ 8$6zX]ɧ&'&BDbp7! >/'PRbH.N7,GV C~𱚣ف<OI kL$R= Od->4"D ]uW!p @ՂL~!@ ^XWp>[ݳ`fA{OY_sE Q H  | +c@]{}b6*.]pcA9$eH[( \``g~bw"SNrq#y,%ĬQ"c$aA0IVy"31a;r-'< ̽ͭJ|72}^ oT~%",`-V[([!=f6X'Chܿ+@UY'~Y>r\=D@-s9{fΞd>?C8d)H_!DPDN IB+MA[e;/, >4h O@adؒ&DT,$ʤ5"Pa'¸z.BPlBGc* ŽWj-$gOu~`a'fm:TeT]1c$r|} GRG^a%jodMdH׵Q3 XJ֏OcS!UsE}ǚoQ_?VMLgpcݠ ((69~HIIxFPл`ik b:#SFk"$ jOѾ9W89q5cA;Jxd}rT{s h̗Ή@_p`@DJ@U %׉nMj"""9DDQA(0Kp7DW:̙3v=YǿS5}>B4=~wRǸȷzyI(p7+@ۊ B@n9M¹䲉 Sw2r=9wYx 'jY@iM_2MH}+iDӕs8F (s}{'ϱ*NK"MĭCIą -GS6xjhh^Fc4b/*O-<"̂yN)oY*ҽs^RC=RK8m߂D,īعcgwTFE`4H`>`=k`7@BD- iݙT!}t I슴#vyЕ˿I69z…(DJ$_9(= y39|-&WR2i\ͳ>K*n@%*v ͜!19Aĥz  A[oWKwa SO2 T )AM,8F=yؤ=jcWzF m2`ByD@ ҥގ \<@ȨYleʡCbp&F4ry15s8Ѐ nq q;91)^$&6[YG袍F=6wZW[ʵm+QKK{twE[D"_Yx^i(Xy(Q)^&*B誔fyAL*?qGG,ueHhbA<|GuE6o"eJܲA5L[P5>ӡN*tp5rĖ;?túWwlI&%OhP0 /\L0D%J 0^jY3p>n"{ [_ߴyC(O<)Bm3 J ;&{eSľkITA>35dzeeJ  #n:)w귆4| 1镫$#'ZN +jw{/";)p RGSW$K#uY%8Yؠ0p2_G+8n 44hppmw^MɈ#9qXghEZlXU3\ zH 9v5$r[{s@3+2wz9v^dk֮%uQ׍!BoB&D<*[xRxj]( p'; y Ij8[H8= @?Iu['L9YԤA)rT=o }VZ(y}8J;Yf\.KZ_y-G&vap[\0^x#ɣfVB%cdFPk`X^+W1T5d>zCB8wSK6o pC0x2X{7)ذ0㺀yfe4.nZH* zyW6#=xxZ'm_بsp8$ַnݺ׃/^V ضG%qMṰ+n}U֭C`Jv1P$L?~\CJiU؊ż랻յ'FON^0!( (hV'O<Щc@Pt^~H Cl"mR{" O=2R XJĉRF,=Zzm< _Ƭ?]%+ufmƐa2޴,7 o3\kyS/_:ŋ ]>Dq>m +1D_U$1, v?< /o$痭p~Ūh y,;C3``ZrI#@ZӐ0KG/;O:]o#/WqqZtG:غE8bAfWf- x1$SE.e i{ Bࡃj-'#H0w U@fpIHz!0.A_zgPH 4x7i+BGB1jRL@C@D|,.9ѓKq,DUr|:%@I)j̚URq,J(U`33ՁF7r$HaHa.W,ŤtX'l[aOpu ķllybA-牰Y}/$(ԭtDzp$r䍖px\]9Oȅ #Fw^G{ $Wmݞo,1'(}/^hw rQ`纯3{Jo] * X@:@F0(*KD!!tL,_2T/C7p6Դ޽#w( 7Cl#'%`v^ 9 8A$ B]u6}ѱJB*-*:BMknd/(}PplxC.LxA$?[ C*mU_wo6k Vx[o}BmQ./(G bমM4HHqO$t&3ߜˀ~3 Y%;tPD}y1vMBΚZCW5kdÙwTwZys8qWmߑI-[(Zph!um;s0Ff%X'Cu7v2t\׹[fh0ő6~}qC̫ ҟ{ųyQaXtNApn߶#)D ~s4r%ڇxkK0 (Da11CȈbh2qRd)9]O&] 5R y.H,V:fm,M,N>]HSldll.균gp]碅R~b ho  d;8 q I8ep %=eV"u_cǎJܯñhePl|˨o# _R]"~s  >u󉒃p!}0 mfyXM;V0+ IWͱ$#;D VZ8XDxe>#ϵ]C8Ggо=Z:wI_ ""c]N &p)* Iy)yY؅LNW}ld;؂|PJeA=^8$.N{$VLj V:='m>@:"{qpA:Qo=o!" ]7D301FV\B1ў{"891a`欬Ŵ&M7Ow@nQ-K[n] daR ͑」91{K fNݩ^`^"0K7Nn%]~FUmC#DW5~ԗB C|'=u~׮HFDTӂ°d~qv#¶'cD Dc![P NZAF,s0A? O>ݻ$C$ckESI$d i'٧_މL(6M&8ؑbs f\!\4XWh`À yw~1EθG F?ȩ:|LWײ%RJhCPq_#WdAg !Fq+ysBulϳWC~7հJu'?࣫. 1XNܿ~3/\/Lt56b>Np @`%GsCqTzzz5kԇ~h8[rq"}DRJdlܰeb`x ɉr(F *_ՠ. 9 !s\g  K7ǽ3 sb7v.uyD<`"8Q0ojsRgͤL (̷1qQa pJjp ug֭ /Or(> ԁ3tkwHCdsҌ]u)5%BCa."n*`@@_i@ B?44T NG5ReL… }(Q=+ks#|ﳴn+c.#D!Bu IBC^~ (F& YBP`1D&q.L[h)+r >1aVKԲzk҈90tϊܦM{= omdRa#)tۛW\W^_3A04kW, ^h@7y 1x4nL?H~Tۄ& QȌU( wA?0nNFb0_IеD=`8:2"JkM٫ ؐ!CAtg, z(RDu )@T?ٷo Fg96`>$!'mUJl_s2glAC ,[E_|["B5mTlx6,GمE8>F`HOTwcC}$#|+ &>{ѣ_/bl@b 7Gkٗu;zv_|=(P#c! )uW ]ySKBHC'fNIín]5`0gOɑ6lbYzr33% iv{e'n SbG`ޔR.l o3ܬϮ=տgI>$YSV0`,YDtbogΞ=[P@)Vk (Pr BWO>OMpJW>?Pe1ܥ||4ݯKW_oXoDOzҮ]:/ȟHTre*&hT'@:r1/ T"BGAH6}{_ ^p:)wy@-&[rJ&xjbXȌrJN/ !+}Lzcqs[2zA(3ey f !qކn1OkRx,FjW_˪'!b~dt•uJi^I&ɡC| F r9}mg؛[ܧ uzzF }ؐK^%;X.]*toyZ@Z 8w\ƺu8#Q~ΆfE-/ Z( doI hfuA嗥,ƟltA4\?o!7) 8>kS飈dXpz9^_'O:|\u;yQu0CP+u9ykvjN`iH$ۥq ˎTٺRqw?#ؿo#~I~ Tf![fKHr-[&z2+|ݨAKZHFnr}舞8C7r_`x1dr4N?V_ 6<q'_.׷ߚ @oc8br…p)+̻ Գא"#D4Q)3 \M{xKK$=_It\ (bW㎅KVg(wڭ4m׆AXp QnF80/?4;z5 ~G`Nnu?'T#Ѭ܇:?,P I} [&82wdKǸ 3*HH> e%[/?#((9seb9}_-Eq"` 5kpE*;JKp̐6?8&tK [4 ipv K7N~znl [#. H 栁U8*:Һ5:.at_u?*!u=/Wh u<giYn.0}kdPU@ܙ*ṣ. o^N/Tp !s{ٻM''{`2eىZ1D?h stx ->l>uo&Epe`VW jV:s9bń5'! =5KD3C@$F׷jA(:4ldXkuЈ( 'f;$Ankżөޒku!*75źwN373oY؞ǸYBCC#P8ρg,8JY͂ > :3r慗o-uB:h"AhxGT3Ja8y,@&+0>&i) U@!Z]ٿ_V<2V~p ĸ^gB3 4{/)'*q`yy׮nذ2GGv(4\6Ĝhw#}APիWǠ"OU'. iP&H#^s7C i\&.Xr4-Bkѽ2@o={)MWFcB#9p=y؋FG!8f9suUD;yzn 6mJ-q'%>q8,Gm۶%!p + v po %`A_onӍĄe0qʴ64jEiT Z/5Z Ey CNMH@arЧ;4@7EB A)6P c=230nC{"G#z8O CCh߀qTn~rn&[Mo8NfZO>]sK/u>H:.0(pJP.?2hkt"@#C ;BO?[Y  Nk{W,4ܿ8zu?uX w y TdtJ~]b= C@C#s>V7kŹg,`.!{}`yF1r5q>^4Hj <X.8lz5=sƲ*w{z*X E e΋C?,"ϝ^Rba~ЛjG  Qu}sߚǂ` &9zܱ'BW *59ش]8D=NNu sΝ;^#'+Dr- ntY6:POKw͓~Ll}K"t|{۷OV^ ;eq r R rXVET]ou߲#cDp.\OZd| QI(d,!Y3Yt=B v-`6yxdmyX./Lue,9`1xP{JDW8=}kIP*a|ϴ׷`R P j^#[_~g< })=%3r3 >2}2+B'Dd|Kt\CܣsÓmԩÄBM`(x} .!ߨ0>wt_k֪igL ]bNmq ub@7Ax`e{xͩOY&+}NBa$(Q8Վ͚)QQT;:PbA>#{I>}W_bR3&'8j"_r6o5o°ӵړNtz*ބõ 7%IrRA/?3/OetkQ?.<c^Pd q-ou"@A% G!A8 ν<7|"u /dɒU.],d!:&.V:y_Ah? [HT,]vA٥Wwt7Li6w*뎺fqؿ/(Ua`КcRd/r5DܸBV$(ţF˙5k>6 hVο$ t\wtq+s؆-q@?a,.YOi6Iƈ!=~f\c 0S'6;5{*%ay pK<0seuK#" cUR :NpGVՆ+c7(|ɝHܵkWRk ZmDLnqBfogPWq!!%AIcȀ[>LCꙞ %8! 89w8E?s'*vh/1XV.~YA+0R%¶D>PvMbc="rJUn(1 t!=`&;J О"lb_qظ45F r iW_XUls /?{#^ $6bbc!"23}v5ne66Fd߃JWDAS _HV}3&'J ;!7n쀇ڄ̩WnE7TO|D܊%é%ŁLKITQ$ILҬٞF~ZaݺuIΰw<|}e;F~e˖LJs]4O/ϒhc}͏;_)%QX_~Vdh@Th]׈q&K;vD0ZR0" yjCHe>Y];iܳ* uһ j C8o+WOǥ ;TfJtXUm!a_Sk` ߳G"JmFVoF A[Ӳ/5)Jz})wk =$۱v[!>ۖl գC5xdd 2+$$? dN(e7oz՚~v3#]$ "'a׸aC%Oq88X7k.3gϼM6ϓ3JGyBjUOt))E?D+(ZEV ܎T1(qX@.UqJ0QH289#|g>B$K-~Jj@̉΅JgnWm)B J\qhzXb2p_Pi,%fN]f9nߩi^.\XtOX<6woۦ8[k'^qȋ *|3DFrLsw O.*ޞvM*y7,Pc܋0X6ǛsӞ={dL<كA9.K*٬[5xhۦr Hij%b5Got;B(Qꟺ6/̓C@!86dTCCg^.ICpOix0+Vr8@1PA/$߃2(_DPs'AvfV̨/(_#PjĉE-|ݺ< CB$6QᯃkV'Q ~JDcƂpՑ? HжTjX${~z[r`2z080"OFni+4qg<\SOB: {o'e}:g;44衃jP'bAPO|E mH=q}ٺu+r醲%a, A>D:eq]=ywoitML2J䣐?]?]@ 'Ʃ2Ndlߦ;{b(4Cq Ba /tspD0қ~"O!\M7yqjPrf 0g"|0D<7_puV 3R$$NRn6]y%}@ ' Ǜ-;aM VcN,j$J7Ϳ x K]G 2&@֭^="7 ˰ 92 >FEohm<>Tya#0V dek5s]5D`|>EłT>? )jپc;1#";\|v<䓃jԨ P +RNB`T+A2uCn1s9BYZJ݇JCI˩+KXQ:b:+(aD.}+8Ru`vL<7siC+wSͮÑPߠ'"H>뎜h^ 3e($'A/67xlD8 zBvO"@^0_t G-Z0 CTO6?yO,$tBb<\իUWF!| s\JCh V,dWSBP }P kDkx/`̀V='!~q,TY"c:]kDaƲ[6< Idߴ*b3ȟI}]aP $a.?õ耵oԷC%$ЕA !YXs*%xn2z9;=א?^N(i˗ ky^hWs O{0aB|^4aLR E5@&{>L csg5}=g2>3%!o/'ǣ܂a;e1D>8'PiP\L:- 0;][PwYtQ 4l{ZWw/Q㏥(> GOɕvj-w_t&@hA@d }`H4TaЖk; &b\IKYyDE$4Fr!P&gM#}nvɌQ'`Kx/m ߘA<)bӘ;cDkl~乹}U'JXiȟ EӉ'd%JB4eX.enk OFĢx/Vޣ>ODj"(:Ϥ~q"?Y15?Q(.[ !6D-&<-eJkb+P7{#]f Cȩ+_9CÆҿRXHݓG7֮iyaYawUptOV̎CʽDvD;0cS~f{{n)1pvbD Gl 5IC2~@IDATYEXH妃zY:|B5(]P6 :Ş\k_`}kje^BfEi9%$[-`N ˮ@n|—D'x'xdhHVG4ɮl!쿀!O7۷=i"DHQ(i|iR;I};ѷwN$(OM!ʫwHeo I9YhD'Kn]%o5} uP-ƢDqz*9~5rRYKuHvA'P?[^s̉8q19qQ1jW)9]5$/ 0}H,!51;?ք¾޵K^ i#P^E(NJF _ºoǴnf먲E"xO)Yw` Tz" |D@7~Cb|ܝ7azBvmn9t ..(8 W.{AYC W#&MMI$v)@속Z#[xt| "Ğ?a)qػ|w*RjjcV4 @B&"1s$C)@qݸ-AfQ! >MDY: cxV^Z@"5ĩY՛SL:! K$I Dz aEqE}:#}}u'cY@mKb@{6ȅ=2gk~,_{0;T}Ⱎi[rq3? RnmO 2'a} S -nyJ݃/aȜN -tYz#@y@ B ~poC x_vr 㷽~յz橃ѰFPfp@Kiԫ ns_/\ot `t5A@`\Q?wI5W&?\uMX+@ᤆҝ^<.4M0EJfmd?V8pŨ3脀eT&@~wfPm:KD5k䱞NgsiDi a^ߩªzI0FC{1lݠ?!_{ݰOVGu}X ra?()c]#]-97 2ӂdۇ+#M"{o05Dzr5dH~r⳰-H1iSp0[vocǎ ̢8E:}_?' }43t^[8~g HH.0 *+ Pn&@RHvEi(D:Dz߃(aHwk6 eq[ґc ޓBeau8==[ Fi* )$OQo>h`A]֜A_.4 2[_p[f34:@*PSã3[wo1v6wqS;GRPw~1E>OM2ڑSzd$4D#e^64;dE~zQFxJfG"7x\ʵ*"((H!sF$"ĉ۴D~2￯I0| F_@ki$y% ܣᙏ" C=/ [.zqaL9MR~Xoc \ K#Fh'fBx>| ^S!z,0#W\w~G{UfJ41*+#q!4XdXc*> tr3p<,# q;R.>C#_Q GJoz}2i|D\3Wuk90|ӽ,Ν;=Bj)CVR!򏅇Z߀?֏?*'7Q xMzD$k|Ok޸5_s(-πJ8FF iEN =m8wt2a$X2W@p Ґً/EFY7 q&1},zQHqro T>'߬$`HZ/p)i1e 9;9|2p_*uSnUJ7ٹ%)@Zi(c$0k>wY;Emܵ&׉23P鬩ˇțdQ.]R&5tdbZ; ;`傼$g}K 0~%: ēe ??,L&CĿǔ"6:~eh/Zq@[A5[Xnβ'O,Dtd|B,*Y"{@lW4˔A4'r1W5J23>% H*OҬIPvڊ'ׁ#[}_c&E$ۓeo|a 9AX^ ˡ2nC:554)5kӫUW}RJ˹9tcHL{rNRm[N~th/#Ƥtiam]u17O)´iyXQ$}YDQE y**',9a`D0cV3Q3˙"*H~vٙݻvL骮ͅb?EAwǎΆH~1¯om$I)=zw"zt+I'(S'!I@H{k @p~ȇ?{\!m t޴FSP#U4{%86p 1 Ռٿlr3 T;G6 t@!q~1@% ^ߚ+Yu+J0 -kH QjJLZbZv/E]ʢBڣlcoN۔a=Q(梭{n?i~ W-)‘#GKP1_4>m4@'D X G/B/)oX_!H{VQjƚi, 8*ni;2 ,LDF kУe FuƋ$ -k-T2^j4N\*Q\=10@fQ@Tuj}NpeyX6tXS%"&Ѷ)Rّ! GC[5b JR#FL5Ҹp xY7ڰlW+N\6E;҉h<=AyZa+c?9<"-Wa9) ѥ kOB؃>4 x} ;Xnfk-- Ik)mj>qP%b ]Q?mpvN=BG ˟~B-vJ}CM&uGayKd.#y(oVv]52T"RG=HW|MKҹ83o#ӥf|Mdy݅дILcbPS<#$'w%ZMxV%uʀ֟1#R=uH@f~WGξ<΄KY pq<R#\,(sj[%T)&UY[}Wh5!YNϵu᭷ϿY_jK|j{{}Znx<, &YvI Ǎo~y*}$uѧس 칯o./o1K|e's0Ln [ Yro&f)"gO 9qSĨ|$F|OIP:j9N6j~pNVd0Erq6G$2aDž.6aAzT!3 K{k|]`(5=V*#*d4 5uEAdISlPH[6.lvrH &4HKp99@x!3hڥts=Q]}pHG4Ny:;:L{6I vz)5I}m`xJ#L_}57zntF{.h hTra*_*3J~x߫滤F<4 5U9ڵkK 8߳:_^:gڥ ´>_֩j⦒=+| { KVSVooFI>K}Is_$ggT?iBYj "F@P&M~.ϪLEN|>C 4)Ua5 aޘ|Ҥ}.OAlC8I%ʇxH uud%yxeK,̃+;PISu~'1I>|hC™$e&fi=l3Lį`LAȣW;GL}uݭw춛stD;fQӴ\lݿo] r< %CD0(7Z;"V8i#bK_qxe@8$I9Ufi/kƄ(ѷ=wΖk|o/WZT:tiqç~j\r=%c:|+kLa?^kuP싌.&5sHܡ|h /M wTn)?g=茀_{x.z%1ݤqL+O` ˧uL> aА}@gb"iXfž ^zL#JbنH?g4 0Pb38,@qsr-1vMf2qSd#!NfUT`PE_CaЈE)EE{`?2 2[Q"@On>'%?&|1 O W W lr]&O_3e"<k%{Rsl{j:d>}XS1?ɚ}0[D!}5PYk:nt&Zasi\JL\ 6}~?+eh&~鯶̾]kh1`xYR)쐺jJ=!x'ۘr0E/wtLښ$kYv5uo .Oi|$o]e{2}i:= ,O,x@&?c*|p ^|6jԨǕgQւaj_0x6WCJ|~a/nAjLRL@/aO?}S$.`2Cp?LWAҁ͛0&  68|~W"&w:1(0$9F+8EB(ώtY㠿J|p|[=YYiX_ck~؋AAmH1?d-tf˚d“&l'Qb.2I߼B]uUC`T YzW!jMm) {:\w?/^޵f*/-p7_8ņjr}Y0#C:m?WZ q{á' cE!贺3NE'`eIC֢WG"@?>T]W3q{8Yğ~ J~e`x9}ϛ'rr=`\42D?_HqP4/l?sX)~¶(s'dv'XQqh%KOG_ (K9;%f|~IfM0f >Z?Rz%~j!yC?3k]uǎ tɂsuE!--aR:g!R$vPCKTcPBF@N)R|8ՙ|F&Md3N{n1̀dF%<1[n=^yh[1]qgP/@{ԭ}0,#a0= W,Q +!SƗ]w./&J8c ]l#xM)BT"} LjP'|$~X^]Sy&!u۶mmvm6y3>(W:ú$t8dUֈ q*6Cc8BGCdwэ7.Q(I#5qqמ;uKF!R i<+ @^W~YgUL}ꐏƐ&. ǶF+xg_NW6llAʣ&>AgYr=awe C~5>69p`jI9 =#y&wba6;z-CA˿XAuK3[ [ثi1 VP%?X3Я["EV}~t FR?}pXm"N(I :ل @ ||ō!B6aK>Q&9\;2^-|0 ~ߑW.GFU0ҭ Ǣ@MOb-{k (IGâċ‡2^:ϤWr\U_:}F$Y1:K VC a.b SGi+N4Q+0so7xP֊0/֨Ųҕho+ﰃui`D0MR55g17S#}aOUFr0uTWO?}(E%4?XGCX_F*d>i b߸m +ܐ85Rَ}k躏i$ ABƂ$]q^^2%u.Aɇk\x͆Y>@~kk=_D%a[HBhӖŌd-3{n`f??>ÇQF  ϼ馛8աi `@޳3t-V NX «~[]3_I8SHI^aYvmڴeƠ8c9yڙtE10!(@H 7d D0T,0Z}@k?o$o<>#x$!®Q1 sq?r_+ pxJOX= 0Cps=y4$9nZƾ:K^ikr@UH$SO;/!/{gJ[-~s֬p.|ڷZG_N?@suڢHYtZK[Yy6ȑ UzJ_"aV?T7 (>Ĝ#Q~<`ZQ[XGŞϡ̌mK j ʞԿRRFsf 027ڐp Au4: cR`4z"$}5e6P[b7̤خW#^̵۠*6Qc=]C A/L{J'}OVOo9jl<1 ҭ@C]A;L tCtB`17RYYq`x 4@;v̬) |yݫ%'M1.jBf̐k*ó/ܓg! (21oZUmour*9d\]&Y>׌~ϵlj0_"bRcdn+p*: u:KB yӒί.K%%]=Ñ;#cԼ%` f|61R=OM͠1Kdy=6T 33φt;W8)/ekEޖ_~f(=/kbYQa^}Ր'=+G3Hԯ/n%jV..cWO(}eR w0yɅ‘ٲx:B~,*f!izk׮fK}}|^BCK<.y|]Sf` -N1k /sx,]YMf|T7.F^=/sh\Oyϓg- ADXېdb\c \y;J;[v܆=zqn!f}$ WwݥeAiuo_JG~uoc֏G%1teL>HKym96lXC0OupX~X@]0H505X"/p!o 0JO/d XuN!}&F=^Q?Op=ܯ\DѬ " R0RVKAXFE*8ٜPl0L>=Clmn/N^\A+dqNz%YS򅙒Bt֘xP5-P5=e_`8XpȷO[}7.]v5ﱶό0@ oO?G'6\_ouň6Xv?p275F̗ o2R#&<@x| 0:$~p*vE]rf6CL Fz*l#~@,TĬgl?ì@j[L81;٥=|{ ~ĥFui~ }塣W :}T3eϬ&UC; />'GVVy -[%pN;`uciGmx.1o\!>}ueFJk9U}c|`{!X04.@c-5DT&0]7 ?^w=M9y .M4PRXHcY& X,^mqp\Fďŷ %E?֑K '[ #f] m(VS͹CU^}{[f|י `ߋ |_Yr1կ_?se \)a@OP Wȷ.-ppnj(j<q?_5c DdßkH5.} k}'ᜢ_"܌3ۿ;[vÅ 0O!8#î)Mɚer>GcyDR16 kڌvcP_Rx=a0@0,(] kX7~v=q vPOJ}lQCֆVD!uf\@:POoQ-e.32^츙Z7>Vgx:?>ygFrQDJGHVT{@@4Ξ3 5=.荅&i|q%ΤiOȎ0?0+,aqeMb`-lP<$yљ6}[[Wm/ dMyw &]6FY?ލ0 ðUax<^}0+|)ِm;Lwavv:Y;7z538#ld}:WО߷2.{s/dA?iSkmϼRRK LreQxIr@tq{0-Tr&(NB+;ۇ6[x{aviGM2cyd̄EL|L1#ݍMxNC|pz?qܭ$@qnUTg>r4b< Шa+< b'PQ{]>OƵP<3$ѼȥQ @=yZ+?-NϿFWVnc췽$ͶjXK`?)Oo֓Q.`>) >Tf|MX3&}Ia1n>`eXIzƓu f/cK>1pPP7+'sv`ߜ~A)Lv1/H`H&!S!/ b~F9R}DR bBf5 XlWR(!!Ye>,W evmH[}"!< ? O|>{0w~QDŽu},g\a|,"+<^DTg`JĀ4("ą:ԓ}eT ʇy(qȆ{HCKfJA4n>䝕@ҁOYJBv'qg@ipU]9wTDZW`󚶰Oim}@Oequ2Fgou]mFd:W_Gb{ɦ:|~cN.ñiKWE ov޹Gj@eTjba~  ;y6ܐ -:;GOpR߯RLkC ju#_ȇڌk)|ퟣICSW!88zOUSر!+<2jÄ ,)-YF<eS/d#]]! ~xh/9uop7zCl4OK~8-"~D tIf N\p)L1D_Os$nIlzA AN-hg2F6"vޭ@|m폝ww6[ŗǣ=vyto} ?T? lf;)qQϪ(-r^޿dI.['};C04Ē{۱#/C{֡&bT_K #:O\Zˀ[\_'4' X`Xz]@ǥ\ytZ<|o+O_$f3}`ezpJe?Gf&߄z%W SB };a LlOЊ]&4+0u4,障41=ioE㛰@S ggEiԌR`5>!zI1'{= 2Gax<&wK8!)9 ՒqٌJ:_4sIPB), GF G]ϑ=xą7/"&RTG&%a\+{GݵYVMdCN;gVhe6/>bͿasIm\׭mZUm7ڴ:]v !!,iB3xw%^І/3S0cE;HQd@p\:0w m> ˉÎN|I;xK]K*%3}b+)%W%D&O*4Tl=Fb͌2 $LAPI˽ւwVVnDcPf|,_zQh{yKB3HxBP[ic085-c*)3R%Frq0e&ภ7߻KZœ(pagΜ53t:uJ JDq xV'8Ӫ8#"d6km϶E['ڸOk2 6u##x^fRc.ut^ȑOডDžp/P MZelˌF:w Bd_^E|\Oqyx;ҠkYkk`IM0pKI ^p϶-҈\b<=^JMlbZǞdֽZ}16岒"̷ Z| mϳqo4LiבG RuUh= `eK~8呴:B'l馛'~e^&ּCk*&},>$F>6MUKz6HR4wO䎚o.pmr3FU'8ԕVul/Dacnj <2-:[.rn&|Hz%DNᒚԮ73;\|Lqu3eh/Np G-Z8 «˧jHl^Ju_ T =<fµ?Y{x#t"s];񊦣,,1=\KPh!~HD@R*c5ߪ(lu7ml hQccv:CQI4kSwZ eb3le?ܶepҠw:HZ|eI;t5+#-r{ "⯌_6>Cg2} EKYL_Fcy?g4M{>|H|{+ @ԦTQXNbDF [@s*mmϏ?&_ }wx&׼.^7NȵP@&N`ou8Ì=ۙ Z[!,/B0ĉ-:2UF 0vtr00Ndc`9{ؘ]YQmdܧ9\ KX vLfo` +n4N4ܣckD̺^?X UTD鋶(&О؄Gۗk% kHP{|3kMﰒ]}e2n0Oh㑇Ȏ?$70f/2Zbw{#G=/)1C>= `Ҁ`G=,mCC <ʔ  ?V_9. ȑ$ Tnķ޲&"W-RU&Ӆ7 [ҏpPVY8zIW}1o|%$Ož+Yaa< '6ch@c-I q7eb ?~29vDMeu&u*jrߝ`G4 :nayw0\Oy{f;.[\̤]ڀ⟿O1A4(Q᝹G RF`$-lu5ۊYYԠ{mڪkHܿ$RZ9Py#?yJyоlg} ;iI!pتQjbY .Cjľzl!뭷^aх]x(|'pBxק;˶`U5H[V=g^;1[>R4׿RBK|Ș` UۅυBIbC%`5Pa"2K!mVbq4Л"(t_{$N=]t<|!O`|'^bDpOF? :̬||QFSv"GGjcp?%M`n3Lb,%wvi3"ň#R%Ľ{&Mꏶg?Au.$F`n_$[$M*[m҆ dO;ݶ:T~}֭q~{~I@?Iӧ=v 7W%:HgϞ[3LރwpKi~G\wmǍ4RNϩ:x7%=YW?Xu. QN2si EM! `!3ENj&q¬"!ћ )CeΚY`ݿd,eXhb >6sùIxD<¸vt?O ( r)&pd)/Ҥmt;fwС!f\|p~\w/~\qAL|< \ʚ,ҧ- x҅бECAq;߫2}ɟY/m'qS@T%B; LY96yu QC茁׺ke=gk dsmc~ijaH- /= &F{Kvv>{IIoa+BP , |9NN9j;2?̓wmT)>p &7@V/W75ؿSxlyy^B(NԖBN$ +E+)L%^%Kq8|'̷تˋ5.~sMqog!'J!y:10S i)h(_ۯy54|pi3 @ԑXwݒe :~@ߡI)7XcVM\y$0fG et2Q] 7g= m`yHgܩeEo!A?`} ՠʤg'43 0<7;00B_MPC<Qf%S L5 vءбcGv߷0hD\'^|&&iIz . \&vݵkz9Eǻn-붶l(v~R[.34I 8pWjH)`Z2ASeP' zQ!軄g R;W"c ^r>0o8>n$'-QkoPړ'@&V:1B `gho U#Ҡ{l XJYs)oZ W \ⷄ.PK< jGIh{Ѷ\Yg 3G=? `siS=b2Pl)nGڼeZZ_Ni}L-(nHqWm"BLxhK;+[04lDFRރ믇4¶!Q{:} ",2K>ď3S.ރ`[c x_2 5p;NN{޳#v 'YʛvwB h |2?!l'=쓖{p!L 2$u-m`HV!3 KoSxQe/X;H^i?ɓ>׸k۪h b(c o?@2ɗ(KE~]: ďvL>!CGQYj 5\KB¬rM7 򈌩oh~nlSA ҇161V;t4ƒ?i@)Y1me\_~g?<~:Fo`m_zút}%M mm}^]v'q=3g}6̤n~H3st4Yz@7ÐVnY3ʖ'WYBشֿab|ؠ;^yE _wT$٢u{p!3nRr&mKN^y_%Ry'/<3]F%t\;uR%%O _ ^(@nfZ\^H'`\8(ʆ*>L6|tE3 @$⡽Erk DpqF *f-,ZU/ţ{ږ: FʐDiBs3%RufͶ\mWN4w:W\a!*WN:z"ˌ/)ڄu=3zQ>|kq :݌aAjZ4/yuBB;ai%ErOAB[V+YLOCtL  <ʼn{1WIpia!Q'.N,NJ0eyay+7ZYh .T20pa<7& kPy< 7tV^ Ux̳d_9<kiߜ(;Z|̝z5=j6ZG#NAAH H73>cto dQ^ZШmtwzۘd &:k`ZLDxJvgc&L0;FZ9IR".OJ$Gy~~iLӆg VeZ6wȞyePnW.*O  ' im' 2#/4U& ~X~lZlЕLSڻ/i{WKnY9ҳ3$K0 (N( " Gck6znQ6Sr{cSl!wA~R`cFZz8Y4rI {챇-%>^.= =%q3/i3 v Ɵg,/<_hea!2yfwyfl$".,,q`$F"aڐe^介~~!zM8~uv$}._S0$ki+VWW0.D?RQ0paEefІ~M&'i!a1!)ϟgpI  ̰إ|#?.Ư=@:+%e2[/@৲P]0]eqў ¢yzusaQ~5v _7rj@_~t;U~TI&^Z&6M1^hs&r-Q;:[2 eP\'uj 6u5ۮoTFRn[gOj]mp΅`^/Hؒ?~i@[=HF}tUOڽ{p"颮]x&p-y=C7 6L)w2~X9!3ɒtrESBw>Mv WiO/!%e&]I/Z@OG_kw}L>qtQFnqRQ 0DWr#}EZ6vxQɡixWj Z62>4H;Iώv0.]~ !l_K_S3gvK5^|}kݲ=}*6(m 0 {Ykf^yai)%-<`\e⯿N{՝6C?>޻? z:{Ї46I6Ess쓫[nk fʎ CHEiC/*)>e/bpG/eI}e_|1|[Pt3}ؾۆlo.ze8T$|]N!Lyb?̎X2^x0;p.[Q++J(ƫT>hKg>v$)'ipO遻'~_1@ @~)]X,-~Cp  繼tIy -/yGIp2EoJ 1G( tw) ׳.nmkuoն?ˌvjmD/٪+Ͳg$aӿ£>f̪c'{⣩vm "*eh{bއ0\2W^,"5LDE,,ht՝5Yv.7f+=SN<&l%V'r aMw{m%g WxwBI I7@W =kiu޷o`=r-[\}3{Ž ʠr«wPcBF1! u 8Ůlc *{@.W80Cgr@@G߉w$ q2e|g8'^ ;cAS)He*e7BPQ|خVY^t5q a@a9 XZ4^(ϟnld{#mj\X2N;tx{V!SifZ^-~[hğ3.w0-<32Δ|_zi>e$Zue><;^ky?R[(!_$~1^E_JFXOd}H˷lczkdyLVNi}0%,`6$`"Fa\X/ aB+ g g?Bn.I.Y[e q_D9I%>&⟄/]yhIݯPe!ujҬܶ7tpg{e쏉 lu&66mfױm9L?ayy0@اO};puy<'&c qfG*}{i 57Ʀ+79CYLL&0 N[, 2DWH]Χ?Q̹v)gd?ˊݺBB{as˨! ğ_ !݅/mO9-aU^D° Pc0&=օ~}nHMXp $]r M@ʋ_   P.uzLк.?fi;K$ac100|8" |6}`s{mGYlycv`Y֪\divڀUß. {8!H˟f:<>z4k|a ;fts|NkֹWR߾=Xӭ_H0s6tWjױ:sg+`|@Sh.H>" D EVC `-il9ߖi( Е7gښϛ;᷶&s ?5gi&Y[iu,W w.Q0PN9;ix%RU\AO {E 3f%weG@ZAaRn̞cStݛ?ض‡.hoC[cm3 ̟8hyV~Y׼}y9&!bXޠa[%5@|<`)?^xի[۞ԚЪjiZV|ֲFM[]W_m^OW:4N2+AxVYB+ >>pPPE ̙m 43HsBfG߲uמ&#_#=L&Ҝ JPx`\.M31Iȓh^ .D*2 O9p +iJ !|p ETu* G*2f0ɺnHmmud[{[lm!q늘I*tx9yHХY$35 g F﹋mr o[R f-fiku成#®&U_>S{,VFHD>ol?9:s7[ue i5|F֊*wϖDvPdD0iw =!+#D&z/$ (pFA1D&P  rKDst$pޅ~KfAצ xXeK^{\OuXQ 2#l|M%{Y,7_9z־Qm{55~{5~t>:AeX44%@2-z?C:i]᰻w[[>9Q]uJ۸aV^zqC?^z),`"v^Fޟm9[0HZ0eݵt&@fxV2@=#xu`T){g_uX >} i_.{vv6Co3ghR[[dr_fӾ~>?!]un=#Q+bbpwXoܤG;og2!AV/S bJ./.PV%>hQcR2!ɏd}<+K_%/)On1q\Ŀ&H 2M yFR\}Y5Zjf if!v!742 x'zL:F5"AG2bU~FL}0jp4_lC-|f64lNCܡF6uL痳Y=l&ֳ?*ȷ\aO4t<'u8(>Qh4nvLwh3:H$jmxJ{[_״w!\w$l&" Izޅ=ht"0 3Yg)p?T>7#r!blO:N$y#Z2fy쬃;G )o)|:B=)·i?< '*FnHL^,E3ڵoo [Wu ^a)e%bn3}[ugS1qk;pχ|=:>w`;S`x+h쉢#Y4d]w*Q'|>U c@9;~|aqe9xxu:,L^鐺מ_H<"^K9< 4{!8N`~mx0i%=uv@ ve`-Dz̲O0l%y Ʋl恱KkA7U {mt]m F\s}rx̯]̶>U<[񙗬o^=mqۗۦǟn:Qe<(AXzr-r#F1BG$iiq6IsAafKVu8DE e4>n'X![,# {%(1&CT a#R Z* yt1^2Va3؜XNqAO[4OL=iq窜=nS&OI4| e;r> ՁؠbfblڌMdL2h:ihtg띊0c{ 2a, ȇ VD׏hKg]Ym[юR |vyW[{@?qMhS1Yˏ? LeD @MkGlPvd $ s=xRy噧Wڧ#ǚ~Dߓ#k1|轆 /$og?+[} MDiՅ*IѠrHxtߕ%v)3+R!9xAl ёg&N*3@ Џ;Kuf.e 㹏=NfB!=K.V^E= s!9F=.N >:g,M 943gʹ5$oVoՁhOy0ۢ!Pa/X,:b~h杁k:߻~( 2#D .! (vi2e[3Zq{ lW$ oo]t}A$7ׯw+Mg[&V8[ mZhNo}jg ?>?.2A#Æ^{ХKi@aYA?%>%KC.!UԬ_RoJ|SsNXs3Ԯq pQ{o{ =4lys] [ÇJG}>,OK [t f.`џi4d v||{\qq߉mE[G;5.8_  t;kVyKߨ(Ҁ*iM chmo{D̉^=>@cpxE/I7)ڊ7ifٙ:u8s裏-os؟h^I'laΞb96²_~oho;n< x咲?73c_F$KʾM"*%IeI*ْB %[R)%QB%c0޼[fޛ7~=s92"WhOZ 7;Qp@ !m%U?I!X `_37ˤJj'b/ ]7H(wo`Lظdɒj/O1>|Xp?`OJ7vnY2!Ô3j+usBF_mQ^ N@ׯb³)܁&U(`ƀ!oPc|X0qM0 X@oL9kG&@3v|WiCn+*Pf~ O7?uP>SeO+V{jY':(kԨ tKN(x ]qq2+BwXbXHI nT~>eÆ(Ҍ wwGY ³WUTV,+2}(HBCH`bx []}RT@RպukiӦa!~Y>alN䔙WK%Ⱦ>St|edV%.Q1;ߕ=_JhIfp< v)PBjl;Dom,T=cbeySޮut~'-Z6Eߩrfh]6>j8Z<;K{ a&Uj<{Šk!wΒD.mQA#c3D^G@;$mH@IDATW[ 75+JǞP.h*8SÞxVW?2t3~x@7VW喅S8DLe+Պqw8&ʘeO1Jv_;N]V@d4G]=~/蛟m(ooNE$X} fR}J/?ɁsWzWq=04i0HԸ@!3p8ݗ̴W]īof*n Ep,rM2Ex (D>Q&z=G*h z5wAgIkӂ62vzg\(Ak'Xݧ]@~)S֠m9!*텤bŊht?Vhh7A ?{$c]NrZc%,A$r+|z?x,.`d5ͣ' /B,Mg.KקȞeҊFJ} N:7V{ |O4~DO 7߬w>oT/oVu^H1抖7uN〡"ťQ;·~%''ݢN]v- JJ+T F'UX"[|l?Xw-]BWLO񐒍J*)%5ZݓYlYFm]p KpRS9Y{AYnGEEH !YDFA#ſCuYtxui9r2zVD-@/OSߙ5m2cjzBtOm:lCv.LY\ֿ-Y^(Hl'+ G0N f-n>~58hkƅڶu˽he)$!QKD=*\'KcN@,0Ӓ#eؒ2R)) ;RԐ0>/NDP7d[427K4KZ?`СJ?%ڵK蝎7(%/SIlL~iڤ:܇o|]|i{m)-{Nww4L .7~Lj|ؕ)9rL"`CjaõuPn3k IܟTA;F"[D? ?æE>d@! TN.cJO߿ t.Vm>/N-3t#s[( =_8_6E- p ^՞yeWRWFº{n9UlʵufN̈~H#u.v8,` eC4+ʒt+{ Jﮅe_eʹgc%gճ팿(߯9/}Z5pܻwou̬/BFUhfEe31R f] |,ԯ.N1&k9|_=o{HX2 Б'>q# =Z<)n4BbAI/I_+cNɂܒ[:ќ7;`W☙gcyIW z%+Bm"q㳓`;%;ƍSN#/1ˊPt<]V4tպeXN/(4mZbLؠɚ6Ƭ`\ny~Kr#s|"4Y7#њ8K98dys>G}XXH7HbeOԤ4iD|7ݿ֐G??s|7^v<;143_ aЌ \GMʪpmPe˖\q/J/U1/&I-<ͯ`3l秎x0y[6n~'EIQ}O>DNGRKyd[7H.yor^T)kq+xYv#-&Vnu(GJ8j,=?}|dD@L3T؎ Y#ˡ[[ᶷHk$ᆺ!H=zá))rV9sUWB0h@u2Ș 0d5+ڠ{yX}|8c"]IۀUj@q?Y22/?4mP ^C^ed PKkqZڤe [;#uYO1i9i1s? El1^(6^ڌJ`}J_ͬ8Pni ' jRBTrԨYC(B5oUm۶3F.x 5M\L=^PZٞ!NFfOs9=蘈uSk& )R~!lIOك[ g{t[,QYLJ&]&/&k}G7Qv=EGC .ɟRFѽ$J|bP,:tPi߅c"+Gy@f.QWc{k5 wUb~_Gn COM`xŜ9so$(?2#qxުd1Y=/4wdL1Ȏ[J:-t'ws5=$ 3[A4\깂TRYl݂:çw;Wn9iS78{ܷoL0yQ<O1Ý;*{K:ws#Sr}JÚlRBtfG3?qqqWu:Gք1Z;9tZ*¶b(GG|tU+ÇHƲ.\|޵{'D@!XQi ލ]>}\0>6pSf>+Tpbǻ.]Xm#Aˊgsg9x4U)q[1'd{dpxG" n'=:'?P*1w\%{,2tYs<哓2ӲbvYf<>~yxY{aYw,W$:\V_9Ɨ(qKqG @gaeF fwpv U| N npiĸXiou%['NT!r`p5EBZjpnf[X+OnR(,z 5ed(ٱm@`EEJwb17a2nB3L<~LLLo6l୫$§i@ՉzڷXa`^(x f}¢,&-Z*3W?Y1Nˌ ,[1W52Ir&wDzuqw{MGw:P穾@6켴J]- TضuxM?w#po˷,qNwO' V'`lk '+wf|2uTo]qP6Ϋu]U*s6U=3I81F3 cޓa%[}SlMƝ/+8~ ɘJoD8?^=~y䪲uPL]]X."W?LS!zA3jݕo?dx>dlלC|As]ޑF|3DzA,ucOVyS;mZS/:\JF|SI!ˊ{2gEO}x~=搀V^8%O[gn]v $r`lC!T\Y)s)@}p6 ?l #GuRXbQהoNN`sEYE9SP;-RT_~OgS҄Hn"J(vZt6-#tIqޚO>c<'ؠrb|!Ouݯ@qx 0>-tyģC)jx{ ULn%q*=|xi.I.SJAJ 3% Rwpu9un 8MUG(F89f4o\LƁ24R'߇Y 8~ C=ύ9>߱};ޚ"OUھje{0Y=ZʍMC䟬t{:͓5ifRҬY3Et .0[\l Elsqڨ P>Jr1Ri-]YϾH2 2UKdC_e5x_̈D`e A10֋Ӏ%2O7L8q<)!8f5,K9Exaԭ[nkY@utljjrS2 -ȭ8thHb8w*@Q ='aC|-)Geg~R:oT)r;VVDN%9y_8~=I>&\*`Qgp XͤbѸ[OI-'?Z܉'kdnKbc{dDmX#cY RxjM W oHJGJ %7oVԍ>|<>9^(bJ/ȌP삾焢,l^ui#xcSO1sjOOo8EY<&V̹|]VOo{zTp N25{~!qNhV#cOtT׺9*]!,W-0#fΈp" ?LHI:k<l L~Ry7;Ӽdp^9RpC} 1%P 'q\qzjQ9(360Fj׮-7V\Ou' j1>\  4P7پ&RV qʅ|f2@$g%oBb^!W;]v|D.ƶ@l/$=szwPNO9'M8Pw7TcrR=X \$t滠)3gAP"@dhʽp€|M`|UBL>0vfR5Xu;]tEHctC׵9pқ kA5Q3z],T@,jzom޵;l{C9t̕'83 U%wRm9C|L:\wKcREˠw_)RV֭]N5'zJf:oKVPjnШB>k_OG VEdמSѢҢI^aɷcIgPC8tQ:Iߓ/%PDGEGlVh(WkL'ʖSR2Ձu\d lό7%@oC7,3_a<=2+Wviѱ'mwf'cIUAh#E8 ]ن~AQ;3Pd.5OK[/Jx/\Z5{'8"Wu`f~$-DRzuĆ&h4doŕ4Wx g#qs%yFO(0JmeҺ!XXT惗r)] q A%@9? @} fĉ`l 8oJdn3f=dxs5\P/!dX'ĀD$`F^k$3ڬto D0 lSW_ (@aԡ[<(]킌})VURUKr ,!ձ}n,܎C Q xq"]2:$VC,]yV~":lDʡcm~+"`2hU#G~ILGTl~QeuLF.펄qkK` m! O[ <{<*v0M}D.ۼY8v&C1O裏%ƱZp>SO=NOnLǏ&/$#9/9- hzh*hRWOV}%㿢zrubֵoyVurRzX~T]V8+n5BK3ǬcHGt5;&26#!q2@+ x饗~mI8H&8{͆H=( ^_;7DĐ#R^iA9`ׯ=#Smb3nٲE7co_߇|MY5]X 2ffy)\"< ^o/9vҸĕ0hW ՠ8R?૯R @Bc()1l֋k~'GzԬ*1xjuEi'Vdgկ?锘,s$|C1t=*rj OI²{{\4/tP#B3y3.ei]SdGieYXϢx뗚|mz+w^P`,_}N.9#o%d쓲ry ()ώ<g@8Ï;2&85כ`.cnV\xB!VФῠ|\6LH*R8:*΋$Hk2{8vf޶8Smn)ЪÆX>#0Q!ܽCl'εb3A`S;Il,Ćjz@u&s+wy_^V3$ܔ̐)uO_.ÃȌx"X7/91=L<-aU(+$`5)Q%n?÷K`4@l~)W_(@7l)~mb~ؖR\;a~Mq.t0{l܈cb{ aJtL\ EP) 4;,HR׉xN:7kAkf*XEլHδRBv`fku|Xs:_ߛHSre)2t8X"|[U ] '^QI&ؐ?:Z6yGH*Kvp/sp$d(7]+_CҜkڦGM$\aJRZ[V6-(,*pR➃廏+I7K\\ǟ7Dr_+9vEM>t9h_+u+K_b/g}Q^#Hp? eXo0ͱqUͱыWu٠ 4:"ȃX?a+G?MkXDKӄ{|]6f4}[h:ܦkqaGu:lq DX#F2iCPˉWj$+`nAkLyh@lxJ)f 8<㬁<.LFOIT]W3?O+Ǘ~E`gСCVفJ \ܐV*_.-Μ+ J6({V@_|Q&L]iPLj5b{c' a_/zu?ܾ^lq`ݛ:)yWl5dTx)%.c&S֬Y3^;@i|j 4~hY4bcĉ>͖_=O 7#&c5[Yv7 孩{g[ @fY#:1Sid+dVH8ؽ|q t\fDiRV`ܟ#Լ> (w@z=/}adMAGvRrVxf)nGV'@7s^3Z<ᑧ̍3F˙G.?6EDD`O^'m)$DܻJˠ*ir\yFMxƀ/q:7hoOI C s[ư,}$_/yxPl0( n{bk k3GVq͚5wU v>s׮]ݓCvO} 2>`8(S0OYMҘk\P"~XUS +J_je鼶bulGutۭ@Vj$kxx=@`'XOLʢ 3^pJ&V󧎿e WyJڤDiqc4 ,MQ?ĕ1MxvCmsڪS[u`J #@Z /SU%(R(R1^G;WW'ޙAʧ~S@tQ܄EBGs:j8p;Vs\fRgE64blaL(oh lQl{}D.2b=Ym B`85#@'B3fPWqwHCOd'jD `r[m~t/?#x`ijGidlz ` UpP5viTR%{GsP1>FoHVr%^)B`g^h{cU |֛!4BC tCM@ ]|Y5W8&!" \Xx ˝_>Bv&dp?xI}th-e&=/}e0eBI@9RIv}`屽;2 PJ./"}roo֒C#JITjpNA5<R$HR+[짋mju{CG\xGZDl1_+IEr@# ɥސ*=zH:#(<ф?/駦wӊ28$Hӫ|滯uF]݆8dQ3l3iwI`F&jpJE)-Nvt{ u̥cҀnݺӖ-#|(T Bf)!-OEIB`ǂ-#/괇>7jk?@3C 2:'"1yNaqAutO;`ٰN^uX8|@-{ P2%Mudx(5ગVr&bE݋߆bf9-`^xgk8GS$&ۊE f @N ,XA~fZj,?H4pNV@VZa?TLepu_=q{+C҄W^B2$h8)V6_?JU ?~F^֟1q 'Q}Sy+`B]Koz˫b[ q_I)V$R&}(>rP6|]0(ҧ~@V?VVt6FF04kL9Jx٣jWUȥ&|i\8IlHcQX?`5 h~64\((Qcׯqʎ>>>^e`E-˗Kݕ(^bߊ:{Fl]3І-ÏmN)U>xe ޑ+Oh꟒!(ZthaE?jll}f5X|83rcB8,T\PLCme->`.ԕDo|Pdb 6{y5ܓ*4= <ɒN} Ԯ bk ynj,i¼v:Slo \RmQobm~"￘>>sBn5i땽!=ULIqd*pOVe||/0K :vjM2r`9yd w!שj dHh Z+C"s3ﳅ_ C}+ ͮ|<=ijyNJ3 z!OWX h !Y4WUz F[{Lg; x\ƕodVPP60N@@zj-Ȧ)VCrQF)L6.Z ~[z@իqxC\<+;Z`jҥĶ]]Y~c( 1^_xlFS1eu#^.Є 'aMcz_RcT~i:tAlLCva|k`eQo?x XјjS!,8X:TD`G9GaT,^pP]Q!>fԩ~ cy6*I$#Y?lt[{z2|V&>;P? ?rdKLAN@7<bqr2R8DZ >:%g^{=OR`MPR,+/Mn&A 9Ax(_y{BW`5{J4 1|>Sl؎P:/ êg ]P?]]Nj&4!cϊ$m"Gteg&Z &..륅@U|s~45>O"?#(ZV27qtuMl 4Q 0Xx , \<~)^I|9KQp%6g { ˒Țe8,#|KBuqvh7i$iٲON<zA4F6mKQJQ@Uls2%"xB t*t;2(WՕ⟹os]2I駟Vq8ey i /EnFyKx "ܹH (}b!SKx (ؘ&nޓ*#\f.6kڬcM8;1`̎Xfv}":_-I#ȉ:,+46ai @?xVB\c߶m[hk.T9wY'^t|Y=|@;:$_.; 6ߜ'/ˤ%,DQΝOfȉ.M:.+i^ؒݱ"JIy6,b] ?DEe3>IDAT+R)f|:С =r=^$JBC5L3a4ACK"{AYpضlĉ@#|3z@$"/z/geдTXcW1'ު{H}5bݎX'§SX~T_lQ?˒B#xM451s%ah&E|%<@b7Ћ 'Qpw+% H)'ɉ‰;3Nʭ92s}WIy9!Q* je2رmyNY7DB`^ R>t^{5̍qѺ.#~&BxQb?Mu_0 ;Qp3UC쐐ؚ4` u{2<_ w夓f~ihFPU* .똞ъgFklj*3*@!,e UN!a KFoBS=jms¡dɒjb kh4Z6~[A*W4+)Jx75̧,)1SߥK5L4+mJWf)b?p]^e<ˍ<1<۳L+]gG<W״x7M=EHtclg@8m-oD|#Fzw e? 5ChMBF^sTkHEC4PQNj'4jצ4(FI;4Mf{t,z\D5(Ay 6{O4s< K#"8Q1QI4m*+>vB߁M+/..NRןg\1lD\*eH?cŸ 9O,iZuӮ.C4$HTrl,^qN~X,ݺO ʃ>7P9~7-W_HqlcM*{Ko|>.b`X\譫>3u YAҽ`J 9(+c :iZ߻BP@pଯHeBK`P`"*AWDgEK[Db,y-xsO[pe=O1yod uȗ[zLQF:u.rO IA4fnGv,2s5˗>}x\kWx^#Ip < ~rģ[HHL'C%@$+&_Y^2y'C>*?\8o4 .YD9+Ńݒ_Z6ɯNHlp^-%߂y;Bxo$V`/R&; kH_@)25P^i2"۷@_O쵛b ,K^~>z ^9|RsBWD9 Q}~gGUgΉWZ5dbn{5-B&fFțI#Z=FZ M 4L~jyӘ};?1`O>UՕR9 |$w@d$mՍqaܸ Z5w;)>7DM*ϟ@qeKx!^%"0m+ Āc=&O+WN[ J5@/Դ~c௖m;S׏ЫK!%aIO(*eJF XIW̧Ƴ>+`tnglWf:ȿ7ँ5`dyGY~3*%n @D(zB *"+\ U~0JKRYҦQT㇢Vp/'^}9 M}Qcͮe˖C?6|:Yjχx{hqhۥcòhY<|OqQ:gG䆻X S眒G|3<߁:E"b~~S+WVu=|u# ,UJ~h߀Sn8$^M{\E mծPf?93V0Fk=CF<%2GݩK'P*Lq:eh7ӏ.EhV-pi'.H{ h4EH;٥( y\ ?,-+ 8",_.'PsY 4ɛ>}4_ <Oo_/NK{)lHeeݢr.Ά;$ǏP{6r|Wga ⤗VJ 4Z:=q6I9f-"}#ѸFFB@uLiHxgLsxsB _N:={8ew Lݝ X RfvqJx,(yf1Dӡ8"nf@PfQбcG4lPMVKF:ta#Z6kgNg)w`=3 tV,+[Wv7"܆`=yI*uAN=iyhgRQ3.z+SgGg\G|a2Q(-+a=[#,,KSqTkAFrkF1{(,;,ɝ?ԁJLs <<Ǟ2ibL(~ vu C_Z i:PS6!ZDtyRvRaf3͝Ko%dgeRRt.)sR/q[ډd|y^E$?x~-mfլrDoS_/>q.XXF^]sJ KpK \PgDJflk*HHJI|H; k0{p[*]6Hq e^u7 )+DfЎ&$FaD8)F@@2^F egUt"]{6i倴_Á#>k qu.i=v #N#ҩA9y*~*RoT8t+;b2@H!5 h*H}0u& xʔnrfzpx jGm{83p˯go - "9JKHCA.N * tٶj1lfYC;PI TlЈo ,?=moݺUZԩb?Hym ^.}4EIj4:"| |j'#/,TG?`ӦMO?6B1X+̙XJ^WߟU'mV|<5J/mLWtĕ>. 8 Wėeؒ ³&]xC}Q_MEѾ ]ɗ41U (zh%'uL?4&|T gcf uvg"xA¥!Tf9&S52N+0*s9lB@o==A7T 1Z&4tZpd{%`! hHw{oɯb`4PA{m+H_̟?_1-sLSHBp |YޛuJm_x* 溡^n?^Ƞop !Yuip3uf:L373|B2ڶW4# Q٘]ba+J4m7g͚Ej6}}dx9եX.YZu9hv)5?! +#v(ŋ,d(_~t|{W ܾWܾȬ%ӝ諝`w}Ya9k(?,RATצcpCkSU@p硙)vJV`-OWdF_Q1՘u#2rzQG/A O ~@(x'~Ei/|~sVZ7JrOOc&)n֋ƒ~+ˁ$|ətVNu? IBno@&ӦMSʅ;vHמN 6~WA&+S^+.KgqJtN*޺hGN_@Xh6cT@=^MOx.㍶3 l#LrԨ0=X@VhP!"Yhe r"!sd^X~21V`Gzs"#~̙#UT^ bчe{/K^s\1_ZY2wcM6,tl^K1֭QF_ʊ+԰ o?g z#<$ݟ%7.zHG+io ,?1A,5L?롲Nf);BOFۤK!  aJH߄q=I癃7O5YT̉ށ8BհZB Qٽ1k!ɿ~ze{O3* ʔJO9' vNo'չì0!_*+.mptV9 T >\={rGJ @<_@e,v#$P!e9MP>Xؠ*tԝZ幗> tq B70| Qоtx*c X슰zDjxV ON]~pv8h{* =۳0T(a>س  tǿ9 T[= pB}.˕+t^z%UV\dZmY]޽8wUL+@ӄ(cDE?y頗'hq' sZfUgY ʙb5ڜ4멂T(HV߁F/3"ã;I6S)%DKVRWY*Eպ&$ Em)JXԻ6/N%.'>#3ǔ7_< 9h@iq; hiV) ЃX|2xW 7mV/å#-4t165-Fk" rIw@ؙ+_E>(TPv<3Z*'1|!|}F}X#ȤU!+z 駷K$p W̮]!4E iO뭷*t1J:$ʽA1\&A:HV u 5po޼:hoWJ[IpQ׽ &HRRH0]bz3\nRq%U~ YN9j7&uc׈Ѓ5F[>"t&dYԦC!l2eggqA$]ב()vV7>׋G؏o)eҤIo>i֬qN@r%ufę\>ӏ# msI1z=ҠvZ:k֬)M4#Gݻ8_L%C 6#T|c+0 8::U(!a ˎt

!/Hy~]Ԥ2z>[ é 짡DO>Μ9cZ3,Ukɓ^90' ezhJ/1i~! e(?v7i]0&]Y|l:Tgϙ e&6 ܪd@LuY¸7#-a@{@<?TT)^xRaX ?t8}_9*-L‰%[ @bpRZåp]pzPժU~DO@\ԯ_ߜkJ^|E_Ej_*ҨO3JPjG{Džtffp#1̜BFġx)35mf4SQ F``\y{hp6o-@rR?V"~^~_z '0w>eSd<I6m*ƍ:Nt pVAn|ufBWP 1Ԙ-V|o\i( wo_WCJP74n52|2B;"jR=AŎ1Rԃzao`5VGQjԨ!{VNveKEt߰qm2sON wA⌵fYTeYĿM@21)ttnOK7n(LUUUY.~9!o#xx)S!Spc䆺y+xd7g !&u,hdwOSNk|P7{(W+ DA)ZM bc4E;W)@- qo1{zmOKCPzXxZi_ [|"p?&[Ay ?e0ǐ8,"J0Ug1uƺ-}堿D^W./N4,(_&JV)+_M|,I;(ofΈDLt1(,VHծ.%662BiMi*bMLQ&ZM]*mmV5( Ayg{ܹw{~_o?q-ى5 r/.īoqO_^V'ѣG;l??vmt: l`ܔB@(B};3:#yKLCw,R+j@YY3Ry^9yg#aE`5n/ AR8nҤINo!'w_7O#O u n ]0uɓ_ pp6䪐ݷL39ۙ-v>hM͢h}MWnV*qpreܣrbQҏJw<6x|Wc\ِ[[[ݩMfsӤMO)Gu9O qQ!~Rqdl]qXK< 7PhG%25M2bVd_ KWI ̃| h is **nWO\XE&܍`ؕ͟扸~u] 4v~}07(7m;/ɷ򗿳ǭ[]}`/Vq;$ƼF~74L=Uhs EHLooc[Ɖl' v'W+b9FOZ2_ | r>$*LZ]ەsYrYn.؎G W3X q1_C+w׻SN9=! l{g p8G2 i-0Mpr.2)SJ""/I}@SSMkŌ`GِcgQ#Sz;]t.AQ\-W8`3;3>Lgx<7e {+LeA2Ljk7!!<ʕ+%\;<$oiuzlƴ.~6&ogn0 }YG +Jh~60XM_3hgMbMNs/RbY4e^^-YZ1Q| PT.ڝ`+6[|^:]ۙZ\hœ}r$ƍsӧO/@vcG5tww\E//tṈ/U9{IHhF6gYm'YI`(N[neZȞҟg3F oMNrZ˲kttr{+d=ˬW @ڍ@?ݻw xtT ^Q#mVwBxL,O8|}_w^? }: ܕW^i@ c8͙]ޜ`zj -H`'f@{: @?ߩTOąXr xzRMx/p Ϛ _z 9V}n84Q&^1qQ9q)9?< X]^A`nV y֭[m38^V{a9nL1_@^R\ #{O1 Ƌ ?aΝ"ə%WFyt NzLAM2fs1ڝ-\>_]>Fx5ͽ{~瞛E&}饗lc B-W^;k ,h+Q`# ݤM cU,U[<]LFB Y۾};􋊖LѰ^a2ゾ+p*0#rE\VWMHkĎ?]}^{͝}I-MQqzL`esH?ZIo*ŶEfB?=#egԤS?O?tPÔ yITN)sx^jO1)׷ p|qِs9scǎANȢ'p&LHr#O!]I"*NI|T\fԌeihR,Nh:-hؘ=Ro@/3w~8ZtW vqHO)•6jW'QO2KJ=$)πp|4ymٲ%~/Pi`7ydo6yf`ļ(0 Di l^0<.Tz<&UT۹Xͩ|2W,ܨG.~}8*R]n沣/`Ϡ6܋NS{v /[5¾TVX|9vmK/ummm.?s ]VfɗPa%!&$|"]PgZF{MyfoU>߱&X=VF{Q^`JpW1Pj ;? r%ebtRcƌq3gtz8Ngn$I\I"+N sHGǁoEz?E+Asl$8WgߖaWꚢIfZN;i%=.m{x"0Sh69~Lq)hm Qn*꯯Y(̾P `jPTSLHk?d.wG2+.>2gGx)?<Y 1VfbsVEDD'li툕?,/ew׺lM:W~urMCq׮]kKS>*`7]:v(lj+~dզ pѓ!W@FCN\Y ){se^]sUyߌcE,9ǾV$pO!;[O–S績D54z'@c??Ha)i 6$hKE`9I!Gp8$`* (9H]]9#GwWOs.4f|vUodſvrƔU j]#Ryxҽ\dZ%o|%@I n>TsA#"oP(NL}?Țqi7qv)ӴMӁ_ŢߎY\pz-$RwN< 'Cpa^z3kF~׮#LG =T~Q?[_N=b|m W#{ڽgl}smdG/@[yG[ :2m? d^.>R|d70hop%3n|aԖQCe51ݶÖTU^" 3!+DVHH +C9h44zAF`3cZSp\_G1+E֮Y7 =Wx#Xjo#{E=" #6C~y ew.g}]㪔#FަM[Z|¿{N)W,`؛֔4k6 ۏbYUw`aj/" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " A`̩v IENDB`ic09~PNG  IHDRxsRGB@IDATx]|M !!$wTzG@vE,T{.U*BzNl6awIv7r23w={J                                                                                          9:@`.!؆muT"p>мm*8,$n(nphDpphXXXrDDDP_¾¶OP9dPyYY*//'Tqq.))QEEE0~AAsH^}vԩ8 y炩, @=" @=-\@; IJJ!e偁B,)f RX۲ӿUiOM@SX~m[*ք@*my[tyyy*)C877טcYٛP?.| ,$.D@)Y .D^!5kfLLL,+G^糷 u!޸ž=t j{ER3O[,ܒ@!PbP2_Q,eP*PWrZ  $pr B".۴i3Ɩ ͛St | ab{.|ӸqL\!2 OP@A90feeb߿pVVHΌ(gHRD#2c4{„ҹsgRqls\Bd-ߺ[o9kuY@(~ŅeP|i1~;_2*߀k $V`\(f :tХK@H`Ҧ7@k&{xء ׅ.q&{|=]]^ՕVz ֬Z@bXMh)2p~x~> =4W@p1}߀g۷[n0Go={]0ӏU'x:~z>o[YՏ9~e~փ*m|PoT\S_sָ - 8PRW W0)ႯYW!A1" @c|RgW"9b|>};92_??CɓtbLpjӄol-* :+g9._[yغF/2WS.M˨m 2ǰʀpM`_4,t-ǧIݻZ :/33Sqc:iT!l,.j:gO^Ob9Hıo΄dc)P)6eO;ߔE4>`XE59Аv\;c}ՆlzVqsRcoT c[0^ ^(^82.FS ׯ_$Lp3yC !m.LI,Nb>RӠ6?lL_` "5X1>tLSFO@Hu u\tms2*qcTwek`<wk<P#5ǽ`ڏgO=j zoB_߷6C[EL瘖ubp30p 3, 8?\]Ǽm{X̖]1eXrk3/so? (.Dt=dȐvw mcd"=†&{2SSS4>|D*"!+ȂfK-eX\k>{\I^s` /.F>rȩ&LiڴR:l xGQS0q ڡCTc}ra'`p? i- 0$][>SJEL ? (񘤐.DyG;`rxﳷo@]6xz/ȑ#ѣ?rǼQ/ Js2QH\@{wïEo_!MSyu-R(߯8gAh*OF+{B! =)rgBI8{Yqݤ B={Աǵ"KOCʃ)Tj|j 66B bnjݺq`M_ۧ'rJ=9ž߾}OjB@!޴SH`T8@HhpDhG p~ԩ}W\qEpDDOѣ=-*nDAo-yMOGݻwݻvȏB_Hp(EPrq E3 =,$44rc".j{4S,{z_?tG1Ν3ĬA'\b"9vt3Qq^$:ɓ'+L3p= t[=}c,&᭿zG$UYi7~!$r!!?='N胗>iqݼOO?w㑌@<4@EKw u(uzfmvօ^h@8ւ_JBbwÑCGq*>  Q Z\8DxK'Qz0Б(sOEs)P >>,_.d&X  }z̘1 Ç}u>ݼR[s+㱷i{%eդPm8u'`!AR8%3"yɏ}¼^YoЗ)&~> ɪA(Gܙ S_lb#$QjzJIIqĈY'O+:_ߧRbX"%9 ,:HE *z/++VҐ7/ q.乵g Kp*,/>w)pHCH]uK;.$@HY-4r@>s9O}0@~S~ t1ȶ aT!v~$e @f۷oinvv`q~\2C"FL -sXF0WB@.D#իW\ttt@FZ 3?W?Wʒ}>5J~OW@H QIolÜvZuDh@ c \2O: rX|93" !.D ܹsx`@@PNVU|]sNfgw!w#`M@EIƎ `(ֈB`VXX}mڴ)=R\TT1[Oq6~X^̺z 7#i_k@6 BۼR! lό@"|Gaat/ kF 0 !Z;\(Q<__ߗŕbZ_($!|9 VJ 0f-/I` P^>₂0M H8׿~yN0#Mw,¡ `4$ c?47=-$u3uv'أv J T^ G?/Prبzyuzv  Ix. I$0,AG1 H>xUCw?*]tF\R(ȒN0{ʃ=,7,j+-^HnHN0|UH{ $8x\L6*N" @ =  ^ 6h7}OKEa /$q`/pg`F4܍A" `AH<Yzxuv" @I2 ^0m~"ށ=h^Ԩ?SQẰj)~/CJg@}^VEX!U9? q@F^؈Dh5zq8!n\-O-ɀD9&2'S )t8$N){6w*qߧ0 6B@/Z.~ -[3 EaM/p2{ObzEO?PFqK+$[VlD+f%XvZxN2]Z=`>/!/B@//z. ߋ`NVPW+QHr$n)I BQ2l%74ъcrH8wfZ!R1`afph58@%祖 0`΀pW0p#_q#wW}DW2@SPLA>qroxg/ӹ >l, #аMO y({sacǞ 9/\vAӌL1=) lTٳfl@ැ| "HgC`*PB4\T F>PS؃'s ^PQ&/Le=#n#=  _nƋ{r9_l%>{4gS?+0'#Pm*WV oQ;{Yk4!wX" hRO'>z ~XB%"0p2(bB(\XwHF؋%MlGg{DTi=+÷DAZ{: 4{xeۻ%ş\fBFAhhgOZH7}){B@msmyh03C0@Ϩ9xGQ׏!ijb f^tx 8!AD CfFK$gۂs^PAQ!Q>`Q/xl|mtc:Y0!'X`YYY|9ҸHBEV絤؇2<#/C_cnzz>fC'B"0g,??? r0s7| ~V3dΜ9Pyhpau#iozWDY]mVDGl)B^) ŋ-))|6aڬY#mcNBL%a8|,P||T/yWmNxqIm kk MYR sE.\#6ɉ[uPE`: r0W)f@֩Xfw$wB^ps62P+,igw0{?QKny5"ZESk@hd\d7*e,?jBj{EJ@u Bn !D~C ?~SgAav'x=P *z)x$,0IZ0#} {'VKĝQ&Uf͚CC~hx=oontr3jݬR[74$ s,٣ n ŸV91;#q&X8?ltt~pJ30ѻO*..K{lMF8η>(ψH~z t~ 94#`: eR(h=~ aEN+>1Crh¾F|7ߤ5i/`&a؀že&Ν;`!'Xf@(cξX7|0pQɑ$-!/B ]azjh䣥8 bpspc1kN?U=ztS-Z$q Ֆ-[J̙& ` } ,)y< #0 WPX~ @Zc<A9lGV - w=\ڴBs0X'k8.:#Grرc?+))y7Ux^-0@S}_N#+9Եb]xC=\^Q>Fz`E, v7:dL}T6%%EEFV~M0P}NJ[3]-}WVlX]ڊ4c7[rx8yv_& iDQJSX;fe\/ M.7+@Q?0ޯ>{Ak)W6iUp>T\ N Li:wd)_2e< N E`alG03^<> 59ߝgmj`DhhgVO!9 T0 Q vh>W/zդC{@%*X^EDWVRڶUPt2juO[ۖ8 NL҅ CJ+ qH(-}1N;&{ Kkn_h//  uQxtq{BO  4_ ^ n, /x#nҹu 0pz 0OT93J>jk&NA>T$ Vsv-T ػk)UG# .Ùy7DNr)OE'6VZn,D=E`)>}Tia!:e֮Zḽ`矖g6l0($$}veX9ȈVv?~<cB=VVVrlyTG ŽSahڣ1a !F;>| 7!}E`Fk,#|4u?/5(-M%Zu6S+we+`OY t5jHZqncttDJ0 []Cp-(*vW5 vNAmBȍ]٬ M|Av<|5 [MA11jV I%z萊_18@*C i6_-Vipr/B t -,ۂ*B( P?َV>~mgFv;7`q=Es#}!->} AkR(FuםBz?cbbL_ߩhjX {w5"hV5petSYJ@Gm nUFRHj=|UMxSw{macؐ<͑Fk`Iu.Y.N]oڽ:"`z@zڕ"dO!GE_kg3g~Rh=l?= - Oʂ཯R{_{ED%pA 1]M= m޼R~s٪UJtj<1Y 5{mEEekC0\4Bv#Rv30pvccv& Enl9& i x<og`6V6iPuKU竦|G\^O?Wy*7'Bf~# *7 S}OU:|huߪh r!ѣGWepSO=w}m,?lkc}@~=H3t*g@-c{qg=RncFW(ڲ62DW (C6zl8}t\_H7!|>?o>",p`j:|JC\bm@YIU $! tŏ]QLSz=B?W!L+܀iǣo9/ d{@F jtc@nGRFe;?{?-)/qj=v&qm_-z9rT>͂.E|͇aUYgUJڳgJŸS ׭[{L7?V?w8zZ_.Dee*6bcT@\wT cDkƾ3*4!A$,RdI@X򐾏ZM~\Qʙ$'!;.o Nŷ~xPn .eȣ  J.dB, HE_|SעiNG2puZқ"{P\'-72NCtpGԦ %*TOTn)dL q$ִv t\J@. Fz@@Lin6}i{34p(z9G3! W{}^~6_tj}ͪIsNoc tDT0So ofK? C!:BC:_vq,y!  2@ЕPO™'!@{2P) bCݓ߾g Ű bIg? {S=6K9We޻`;%q- SJ፟2fqˀ(I˗}qA^oe΄XqPaѡ"z+*C[Lђ%\{foEؼ.@% _Ln RBu(u G> t׿y _ f^ILuvM:uTZc&*ɘ&oa@Q1 G[_ ሻw^گ_ߕ?ap>?[tgA xk9iTn%MlGBD+cQWNo($K m>H~? .4\$J]yOurͅt;qMpk /TŰjOX \x9sO`灝mC 녔j~͉@ s^ܴߤ^Fsm ]8ݸ9uAҎ6؛S+v f} 7)H~"JtuɪݔKl v3^0*9 |5x!>hM ~[`xVD%곬rϺ*G ! XZr/Y@fGt-?uaO?Νդwܡ9qZ~U _7'4AM~7^{.44ݲX8\i 3Qa G釬82g0B`0h~^".Am 6he,D@(M17v_fc. 2fCM=QJ+vYKhg@}[&W], 0ѕ$ڼpÇ:dU"@+LK.Vox$Uja}nݦ z<XhhlCU :kYC&ڶk|80;Bu -ɝ+L[Fj;oa¿Ÿnp?rq˫h}< ̞]wjSO #Ns_#,xnBԭoQq(3S D>GESi*~L[μ0ߔe6|IapcZZy8ÿ p*-H%]V^n\;gL*L3T`Me'N-Yd4`HvFFYj\[3vjBȗNLaÇ$o1=b4t~+_@/=^> &nvkC^ Ss]׸C"9j{.[Eth|dˈ(*soSq*nw\i՗_*F6W鬷uVo߾Xl=wϜ9+:o L,Kw̚5+i:Yvz!>-lj؉7B]8OBu(uܱcCGV*fkT,εHCg75R @$(v.U!iO7VZ8@s.+.RaZ-,JO0<- ,Qp8tmS^ouC- ,--s:_ñl(f͚Mo&~߃Vh{Ck~Jo}8 YT{I~#i0npm3{N4UrK+@wGuPݽ!8lb웕+Wu:OKz^m) PQpEIj_WJ۾]{¼B*%F@ZC ǻ /$ Ј-fBE" 4z;vq($5@ 0W^}y!N=en*HWgք~,?c+W)lGDET룢vXW@D[sUĉ*k~~ڑm_gnP4 5js_Dg3O[% LeMT,q:㫺u[ {-Ĺ74u xFBn8y|l<<5AϞ>-T8CEfO-9&H*p7]Ƽ&RF{vݤg^T\F׆`ASwP''b|r h$.2>oQi=TdJeRGGa}p p}?8 lM0pA/ u Cd *zwUVUu2Ӥz䑇Z$Q|bq " M(ܑ#7Ȉuu?ZO*s͛8ZΑƴL nHzviN?0-'\.iφǩӴyJew%aHU,EjW9ϿP~NM-T+ Z?l/L8B&Muk1: cqbwK9MZމkU$I[U p=A}2mέ\LMp ETB~9 :Ѯm6#G $ؘ[n6+]{uꭷ߮h!w!z> %`xGO<歷T1csn_=3gB8}򙟑JC_}9FMQFDZyO$| 'UniRQ# ;ֵC)ctV]_uՉ?KoLE0oD1npBmҊ+J!e ,&Ç{!7*|>ڢl ~y"@o"B/[I XXJ.W+^ѬI4=V˭s@߿yQ lix{lhqg}ڪr:9rJvFxUS߁B3ZO}$ÃoME5U!]ැj|88w S /|7`ʔUxxD7 #}ꩧV\8{y\*~ Y >p5^xÎ'#hY&BGjm%9c'Sm3M\r*9p$u-^]rdk 55lz-ϏdhC=4q'g4D)^3tG1N`aہ__k? F=; ʭa.> \ھ}ᇕj?p̠2`s!*BE99ֲ}EgV}G}1#0M5J~,CeF8~D{W#& W3Ү}?BC@犫?C&yۼSD'ECE.-qiSA%`#`.qt5J<ޒӬo5UPhEoCv<$^'T=?#ƹ cZj*Xj)pRj_ ĩzO}j_!8=Sm $h  Խ{'19m+M%_&d5Xjj: Nƨc4.C}*S`bj  T Rj\j7O edvm ]J喽YgϗgZ Ÿ|0_.{aV{q2~|+kl>aSewj@)amUPz'jtӫBG|;5yWLaLfx.5oC~{}G!zm0eEi uڥJf{6[j Wi^>`ZcN=5 {>1~[+_[Z<{t_q gc!p/rC՜nys1/bF1bX#WXۓ!(_9r: ߔ1"@/+@bV?@Nij\G'zڏGKܲAbM.(ܷd~7={vREw)엀t$x~{)۫iН17?SاP$ x?wqj>\p2?}J{/ާJJM>Bgܩ~| fyolаEv蠺{5E}= Jrrk^_XJ")N\]m W `ڵ :ކũK;G 3|}߿SsV7r_}|޼Og|fX <]NU/B+/vO@Ra4h,}-I;ṽ4uYo$ xمwy'?iୖx>M? QkcվBͻާ(~泄i03SK=M֭ʃ|ia6ӧJ=JCXeJs5ž6U46mLc)=7' Y;j) :tz&pmEou; OFmM="àACh^X;Bm0<bh}3Gj`J%+ f5vm><!II7o.MK;F[^/d؇R}B&?GPЯ86޴L2<2[ QOdGUMJ?lvSݻO6GC٣•z\10b7oIU5gHԄoS #PzxCi3~J=COPtbT恎|-L>i1aPCֶ(aG3T3½,p}-\ L@(ù h7yƊ PpFx㍳1e Q1bΧ`k4lذP|lY=׾fh`=F`O>Vۖt4kR" ?׵ '7G `d\v)|?TdzVF[D).Q;Q)mL|WK6=*2EL;ǏS߭}ii 6={ s.|`}ͧp % w?@Xcco: yol'Wt bZMfN%:Q&K@n9OZeiw q8*c%7Z9i#&=z06kr!)H(sUQ6A[+k s*wr۟Z-5{QAˀCq@ţn5WuH0"˖U;8v:76 0hm (+X2{#.uߺBv 66θ{.u" LP5P 0.:% rq]x??t dPJq w$eQ)BS 5߈noMSyZ %~X1aHۿ޻ ©QnG~X֯Wa~ !Rk lZBhqʼn72(WX.tsaQ87PHDNš KjOT96'\Z wj@'ϨÔK4'̴7еk7'OfBJ_W[{p=~'- l3㝚?r-I[2!h%%pL'TQb#@'!ȿ?S4xQ֍#rWQAҹA(ZxGqj$"օHrjj_PӦ/F,=-/6Q ݂AhDE!*eİ@1V,B'`=}* Elѓt0Q2 T)0ܲdiS)/W`M;N=㠔DzgV^]LcXPGbĉ@ m@f|* 3,!'i>VPĦ8+,x N:iCt&Y |*d~E@ȿ*r=\{yc \ {[ȹ`FW}(`*8vSnT?,g-C-*%&O=IUI04ŎQv" eS+.UQ(PSm>ѼBSeEie^us90ȩ:}oϧ{i^JnF`oubuHƢETn)Йf|mUj1-X"{jkE Xh;DPsss[3nacҎ|~gI$Ž#} Q1l{\xѤ3g  ^\kaoc襤2hp*v)ݹ/c&l.j>t|֑C} j#K?Vs73 2NyNfybȡrFBIc+]s+lc-[7fcqq? :^ A7qJsQ~7GFEYpӘ&_7Qq[9cw݅8 xyBuܻÇWEg5fyZםЈz4(}}S0CАhp4bm*F*y|;ؐ,k0,b|*NJyd^7\6eK$kp/!*8(uch)KgrM86/v; ?p: rۻwںB0V~ܵk7ƻT4-}/_u.|9pxjCkn6bx+z^h@ ŞQ Zo:hnō* q\U`WZ(d7Hu*b>xy5B`&r~ cж|+:{f;7fؽΔzeڂ3km*<ҒRSb/33HS ,LECgQc:/>mڏ8wX7B Qdn&$$ЬGF;Oa޵KEl?gôEP[\! [`.<0Nlބ;{_!9mwFDW?#矕Ba-G:P&AT>؊`g eÇ  | 6ce0oj:TP0#;(p/D{ySʱ~ {Z JU"%v綿 q' 2Μs_|}X-/7Z_StOA:tPŋqppNz`7*݃m&LPcx]Es~3摻1l}3U?j67=5t 1_CU?H]\iI*V&W ]pBsn*)\ܽ{~wB 9ʑ;aV(vDFS)]>,O?9.O0 iiS84™3gAkWX^ pM%?cZ̈߼EiR5^qz{2zFh۵>}eywN+݇*;W 锎JXjYJ7)K C`<IpFa]7߬JtW]5UZ)p?;L93F@.Ɗ5/|xѱo+@BA`o6D[ZѶ6t0'&{_yM`Od/Uc}3el`J{Ÿ 1lg~xIҥK9/0-la(7ᬥosף[9ݮHz%BsC5aaᆂ|ݻvrfS&ͼjkc`z駁7nqk\bBK9 Xf1֯kT p~ɒ%H]NqΝդKUkBņެjLEkv">z5 Bom9\Mѣ5TcElѭZ_y*yZ*g{B|'`5W]}kK"e{?+*UɄm!-;v7ݢ~~mg#o]#?UZa%5P b}/ZũրD|%5T$B D .S٬<\Cm)׸ =̟??3W Hd*7Mϟu0|-<0=8MNFC5 r;y$0_r7$jiiJcD-X8/kf~pFJ%)=C~xqG30(OyjËU z1c8N9? K:V<)(Ώ>RoED8?^|Aa(i0 WC(=S3CX:JH8z:{b86uZ*ԬdZHY)ȴ( SPȝXa⻶W`JUmڴCdCزe:-Ѷ&cp DZ_~k3N-bm; /-m-6oap%BoN `8Q)aغsΉspXX}e[k,lGj[P8<,ȼbpT|0 KwoSi:>ctEHrj:TyHMҖ-A 4 mvFIo`1c*yd7L&*"M "pӧS_> :x#7K )gq$/{ca: ~rqb4tPcC\tdjLJWhѬo>j1r):Oq*z=ٽ :+qT[nRa/=̵/2pj756ͭw2g-~7!~Xz28s=lm&LAT@ m),?@[o{=bK %_@Clok`|:ɅrSchaÔ/R|>0ՇWMך?f brIiZG]-!S3p0x]uv{+Q`jس?s~skڎ6Ѵ.~ 3^uጳp1;_yUa,%*1 \uD9ֺ Zd<ӭ=|гwRòFv:qZV [v*wV ~Pw 1g?|z5*78= <333=!pEu̙Q Ӭ>Z{AlّEG8N m8d`onSEk -ÿN1ӕxWN7:;n QM0}T4kQz1k=^(~xxiTf CI:YLD.}41%Bo9e71K_/X;_eĿsa!`@Kb1ݻ.9jffNp!M|nAxi(@d~Gp m]Z?QS(p]AF(c6 N-XjJ?t0Mc*-wUNۯ翴57nԹ*BqH+)1tEeLR/Hn74iҡ>7>߃;"wMX8V(OL#6B'GPnI jƶ9rr:jEK~ub 0`xT'пš{|CؓdB,|Cmo{wx&˄m&mt^́SO5?a88OTt8 rOS ϭ>(᯿01][r qAZ/Bi@Tʎ~[$Pݟx t2"8F-+ZX_bJXؿSWb|)/gԩ\0)OmDjhmrjm@i۶j^}ǀ zSe O[~@~h9J35$e=vMfp*ǖ^ /SjZ:|>}ҰG\ݑ[̙,z%M! *kuĺ3s~X jր3q$&;Vcǩ6Xϝ؁l>)ɡ44Adc V/ה^M1BE ][Uʥ]P rL端}R]`G~IBp HpwN[uZR{RV(--RܵK"pw{<<OBP | }aЍ{t~9q9ԻTKcqu\q^qDsgf-!0!oϐ!w5kCXǮi6}vƌ!Eڕ\' _q] 1ہ<,SXm uȣ9b߷hB*0ԖF?NL4$&&RS{(SQ"{>-rTo~sL tK'O6?|>C4HEKs@ku$7ռdCEPgϭ+\O-X(GVfjҿ3dru]9@M¥Kr+WuYEx ҩ*2 'f B>9cKȬ <1GWc`Y>'Fy %<+e㹍?v[]w,I1~&M:~ Lȝj^\c r^=P>K@N0Ya$$^b5ǃ=GM߬fTNMN )q2?RӀ(|hKzN2XJ/} )0ŠӧO~|\ɰ H 8=M446N:}>\ΟWd=+)09ױ kAON&ׁtXЩC:쎕s@W~hW+wJ\'$x  h}9 0nOHm1K;e#6Yp(0x!~eKKz4~}Bb^zB%|J*Im5M\Ad9O8.6T򟲯ؼ I\޵kUCI/JE٬)+S?+{WTY`E!;!o7Z^= wW.Bڌ!@A|yK G1v矤BPCsdt v\|r.S$S =~ mB4x;|;~ ;Gv]I9ebZw}iFڷdd#W삃[zK\AʌnCF.sۮ 9tc/5OԾYB$|!:dD#%:8p,!eZ@ O&Th.vo"( P\H6L[d!iW3 }(Q>:q5(boVõ{2} ٣^BCd@/̀P[OUbPE{X+b\ǃ+C{\ڵo[tqȽR'y%@A#i{R0 \AK?yLb3.) Q|s!,|D? @eâ|*`A`TɴN@^ ֬^CJ>SWn?(=lFolַOVG/g&oŪ'r) YmA_XKfgDPAoy=oƛDAolEAPnoi2ƚZ!SĮʨUo#3 63d]-o}6WO85uU<_R,4ZfDK~g#UkkR2$(ϖ ];k* 9z_vQ1-W^%{_ZC=K]P1e6d +f ~hQ`kc\K10~/gԫWk8l*0K.^~(xtقF|Q*:ξ?~\DEiGF__|㷕Z2ՙA±Hۢ0j۵n Uu+8T0wP*V.oC)` [<2!F~_5ҵKW1u6]gq F @}ȕ[(wA{oayҥ3gRD{홝DTûxlٲc{H R@ Z|&WD\A /Ri3~DGGTe"(XB@RIhDA }_vŞ%)QBqHˀ>Mh懛 ܖ}Dmd5jHTU|g5# y;q_,afZul6 DŽ)+# $AO`â\\"W\ի(bVH1Ht" \M{$?KF UQЍsąatOo9T s h~ nZ"F|)2|5L@Qz0 UIzP7WN93vZ"xJA2V}q]vZA8'=zP_bDl_.\H0idbs eʔ˗K5D ]3Q86o.J8T (H}x#{xI-UN| :#FGIwÆ ſXBL\$55;N%HQ &6FT$5`0CϽ{ҥd~-uQ<Ԉ1P駥="QWO˱Zl4E!n/ QdM&wk3Ӗ-I T)_'Q\PP mR`-Sawe1^SIAYE. c9uo",|Λ$m7}| ʲ"b_]qmptQ/ =-.- lDӌ3SJ !A@me˗ e *ݻw)NhS--HT0 ԓ$̀kP1Bƈ}ܢBO$01B/\8uԢf?U)HLb’P⼠ $Ϲ`_fPPjK kJO,0bT Ֆ|r HhFi *QTbe R 80 +b5̋ucJ2m'H\# 1Ɛ)pZwhu,ǽrkՔ_){Gq"U" lCɁO?W"l ,?:(ZT0𝕆dKH88;D ϕ댓frTO+#o*^K_fm3_2' *^2^k3}]\1*{ vr-4H1 |f_<1,V4P¥ky'%W' svi\5hX bNRxk!Rf8_)H%a”)(@$ }lN[lݪ?%=UyL&X`J',L,Nr%cdW@!CFBTAm2܍Nȭ:7t|X1ZPw & g[PwHC5{Wg._|Qg 2Cp*~@ÒpKJ =EzFc!?TAիKՁ cj$:w@̰9Җ8$~eڵUsjѐ N{] uQ1}K 9 KQzrqS4ޥK╫V(#kJQ1c ydX Ӎ[C잪\& aVvY@CèۧĀ؀az~Ѽ%Q 摄!'Rj􌸌Aӷ薛n&vRv5@*btXSE 9Y=4a獞` ~8A R)H*?Q^瘊IL R4ږGS_PynYrY °I |VAƛ}\:_ FymթE/bMJ4B K7eHB/5s'HP ztdwpKܲorix߻xKNUM!g"h P{SڽaaP!d (X5. 7}`P@φ_[EM0&g5dnم;{ D*`,SZ{,'~kE?g#3<" ' uI'%'nI `;^T 0+&Z .y"x2%fk1n~`frW@IDATm& q{l]~<1_[i.X͞ېΆTp)c@0 E8$ 8$6zX]ɧ&'&BDbp7! >/'PRbH.N7,GV C~𱚣ف<OI kL$R= Od->4"D ]uW!p @ՂL~!@ ^XWp>[ݳ`fA{OY_sE Q H  | +c@]{}b6*.]pcA9$eH[( \``g~bw"SNrq#y,%ĬQ"c$aA0IVy"31a;r-'< ̽ͭJ|72}^ oT~%",`-V[([!=f6X'Chܿ+@UY'~Y>r\=D@-s9{fΞd>?C8d)H_!DPDN IB+MA[e;/, >4h O@adؒ&DT,$ʤ5"Pa'¸z.BPlBGc* ŽWj-$gOu~`a'fm:TeT]1c$r|} GRG^a%jodMdH׵Q3 XJ֏OcS!UsE}ǚoQ_?VMLgpcݠ ((69~HIIxFPл`ik b:#SFk"$ jOѾ9W89q5cA;Jxd}rT{s h̗Ή@_p`@DJ@U %׉nMj"""9DDQA(0Kp7DW:̙3v=YǿS5}>B4=~wRǸȷzyI(p7+@ۊ B@n9M¹䲉 Sw2r=9wYx 'jY@iM_2MH}+iDӕs8F (s}{'ϱ*NK"MĭCIą -GS6xjhh^Fc4b/*O-<"̂yN)oY*ҽs^RC=RK8m߂D,īعcgwTFE`4H`>`=k`7@BD- iݙT!}t I슴#vyЕ˿I69z…(DJ$_9(= y39|-&WR2i\ͳ>K*n@%*v ͜!19Aĥz  A[oWKwa SO2 T )AM,8F=yؤ=jcWzF m2`ByD@ ҥގ \<@ȨYleʡCbp&F4ry15s8Ѐ nq q;91)^$&6[YG袍F=6wZW[ʵm+QKK{twE[D"_Yx^i(Xy(Q)^&*B誔fyAL*?qGG,ueHhbA<|GuE6o"eJܲA5L[P5>ӡN*tp5rĖ;?túWwlI&%OhP0 /\L0D%J 0^jY3p>n"{ [_ߴyC(O<)Bm3 J ;&{eSľkITA>35dzeeJ  #n:)w귆4| 1镫$#'ZN +jw{/";)p RGSW$K#uY%8Yؠ0p2_G+8n 44hppmw^MɈ#9qXghEZlXU3\ zH 9v5$r[{s@3+2wz9v^dk֮%uQ׍!BoB&D<*[xRxj]( p'; y Ij8[H8= @?Iu['L9YԤA)rT=o }VZ(y}8J;Yf\.KZ_y-G&vap[\0^x#ɣfVB%cdFPk`X^+W1T5d>zCB8wSK6o pC0x2X{7)ذ0㺀yfe4.nZH* zyW6#=xxZ'm_بsp8$ַnݺ׃/^V ضG%qMṰ+n}U֭C`Jv1P$L?~\CJiU؊ż랻յ'FON^0!( (hV'O<Щc@Pt^~H Cl"mR{" O=2R XJĉRF,=Zzm< _Ƭ?]%+ufmƐa2޴,7 o3\kyS/_:ŋ ]>Dq>m +1D_U$1, v?< /o$痭p~Ūh y,;C3``ZrI#@ZӐ0KG/;O:]o#/WqqZtG:غE8bAfWf- x1$SE.e i{ Bࡃj-'#H0w U@fpIHz!0.A_zgPH 4x7i+BGB1jRL@C@D|,.9ѓKq,DUr|:%@I)j̚URq,J(U`33ՁF7r$HaHa.W,ŤtX'l[aOpu ķllybA-牰Y}/$(ԭtDzp$r䍖px\]9Oȅ #Fw^G{ $Wmݞo,1'(}/^hw rQ`纯3{Jo] * X@:@F0(*KD!!tL,_2T/C7p6Դ޽#w( 7Cl#'%`v^ 9 8A$ B]u6}ѱJB*-*:BMknd/(}PplxC.LxA$?[ C*mU_wo6k Vx[o}BmQ./(G bমM4HHqO$t&3ߜˀ~3 Y%;tPD}y1vMBΚZCW5kdÙwTwZys8qWmߑI-[(Zph!um;s0Ff%X'Cu7v2t\׹[fh0ő6~}qC̫ ҟ{ųyQaXtNApn߶#)D ~s4r%ڇxkK0 (Da11CȈbh2qRd)9]O&] 5R y.H,V:fm,M,N>]HSldll.균gp]碅R~b ho  d;8 q I8ep %=eV"u_cǎJܯñhePl|˨o# _R]"~s  >u󉒃p!}0 mfyXM;V0+ IWͱ$#;D VZ8XDxe>#ϵ]C8Ggо=Z:wI_ ""c]N &p)* Iy)yY؅LNW}ld;؂|PJeA=^8$.N{$VLj V:='m>@:"{qpA:Qo=o!" ]7D301FV\B1ў{"891a`欬Ŵ&M7Ow@nQ-K[n] daR ͑」91{K fNݩ^`^"0K7Nn%]~FUmC#DW5~ԗB C|'=u~׮HFDTӂ°d~qv#¶'cD Dc![P NZAF,s0A? O>ݻ$C$ckESI$d i'٧_މL(6M&8ؑbs f\!\4XWh`À yw~1EθG F?ȩ:|LWײ%RJhCPq_#WdAg !Fq+ysBulϳWC~7հJu'?࣫. 1XNܿ~3/\/Lt56b>Np @`%GsCqTzzz5kԇ~h8[rq"}DRJdlܰeb`x ɉr(F *_ՠ. 9 !s\g  K7ǽ3 sb7v.uyD<`"8Q0ojsRgͤL (̷1qQa pJjp ug֭ /Or(> ԁ3tkwHCdsҌ]u)5%BCa."n*`@@_i@ B?44T NG5ReL… }(Q=+ks#|ﳴn+c.#D!Bu IBC^~ (F& YBP`1D&q.L[h)+r >1aVKԲzk҈90tϊܦM{= omdRa#)tۛW\W^_3A04kW, ^h@7y 1x4nL?H~Tۄ& QȌU( wA?0nNFb0_IеD=`8:2"JkM٫ ؐ!CAtg, z(RDu )@T?ٷo Fg96`>$!'mUJl_s2glAC ,[E_|["B5mTlx6,GمE8>F`HOTwcC}$#|+ &>{ѣ_/bl@b 7Gkٗu;zv_|=(P#c! )uW ]ySKBHC'fNIín]5`0gOɑ6lbYzr33% iv{e'n SbG`ޔR.l o3ܬϮ=տgI>$YSV0`,YDtbogΞ=[P@)Vk (Pr BWO>OMpJW>?Pe1ܥ||4ݯKW_oXoDOzҮ]:/ȟHTre*&hT'@:r1/ T"BGAH6}{_ ^p:)wy@-&[rJ&xjbXȌrJN/ !+}Lzcqs[2zA(3ey f !qކn1OkRx,FjW_˪'!b~dt•uJi^I&ɡC| F r9}mg؛[ܧ uzzF }ؐK^%;X.]*toyZ@Z 8w\ƺu8#Q~ΆfE-/ Z( doI hfuA嗥,ƟltA4\?o!7) 8>kS飈dXpz9^_'O:|\u;yQu0CP+u9ykvjN`iH$ۥq ˎTٺRqw?#ؿo#~I~ Tf![fKHr-[&z2+|ݨAKZHFnr}舞8C7r_`x1dr4N?V_ 6<q'_.׷ߚ @oc8br…p)+̻ Գא"#D4Q)3 \M{xKK$=_It\ (bW㎅KVg(wڭ4m׆AXp QnF80/?4;z5 ~G`Nnu?'T#Ѭ܇:?,P I} [&82wdKǸ 3*HH> e%[/?#((9seb9}_-Eq"` 5kpE*;JKp̐6?8&tK [4 ipv K7N~znl [#. H 栁U8*:Һ5:.at_u?*!u=/Wh u<giYn.0}kdPU@ܙ*ṣ. o^N/Tp !s{ٻM''{`2eىZ1D?h stx ->l>uo&Epe`VW jV:s9bń5'! =5KD3C@$F׷jA(:4ldXkuЈ( 'f;$Ankżөޒku!*75źwN373oY؞ǸYBCC#P8ρg,8JY͂ > :3r慗o-uB:h"AhxGT3Ja8y,@&+0>&i) U@!Z]ٿ_V<2V~p ĸ^gB3 4{/)'*q`yy׮nذ2GGv(4\6Ĝhw#}APիWǠ"OU'. iP&H#^s7C i\&.Xr4-Bkѽ2@o={)MWFcB#9p=y؋FG!8f9suUD;yzn 6mJ-q'%>q8,Gm۶%!p + v po %`A_onӍĄe0qʴ64jEiT Z/5Z Ey CNMH@arЧ;4@7EB A)6P c=230nC{"G#z8O CCh߀qTn~rn&[Mo8NfZO>]sK/u>H:.0(pJP.?2hkt"@#C ;BO?[Y  Nk{W,4ܿ8zu?uX w y TdtJ~]b= C@C#s>V7kŹg,`.!{}`yF1r5q>^4Hj <X.8lz5=sƲ*w{z*X E e΋C?,"ϝ^Rba~ЛjG  Qu}sߚǂ` &9zܱ'BW *59ش]8D=NNu sΝ;^#'+Dr- ntY6:POKw͓~Ll}K"t|{۷OV^ ;eq r R rXVET]ou߲#cDp.\OZd| QI(d,!Y3Yt=B v-`6yxdmyX./Lue,9`1xP{JDW8=}kIP*a|ϴ׷`R P j^#[_~g< })=%3r3 >2}2+B'Dd|Kt\CܣsÓmԩÄBM`(x} .!ߨ0>wt_k֪igL ]bNmq ub@7Ax`e{xͩOY&+}NBa$(Q8Վ͚)QQT;:PbA>#{I>}W_bR3&'8j"_r6o5o°ӵړNtz*ބõ 7%IrRA/?3/OetkQ?.<c^Pd q-ou"@A% G!A8 ν<7|"u /dɒU.],d!:&.V:y_Ah? [HT,]vA٥Wwt7Li6w*뎺fqؿ/(Ua`КcRd/r5DܸBV$(ţF˙5k>6 hVο$ t\wtq+s؆-q@?a,.YOi6Iƈ!=~f\c 0S'6;5{*%ay pK<0seuK#" cUR :NpGVՆ+c7(|ɝHܵkWRk ZmDLnqBfogPWq!!%AIcȀ[>LCꙞ %8! 89w8E?s'*vh/1XV.~YA+0R%¶D>PvMbc="rJUn(1 t!=`&;J О"lb_qظ45F r iW_XUls /?{#^ $6bbc!"23}v5ne66Fd߃JWDAS _HV}3&'J ;!7n쀇ڄ̩WnE7TO|D܊%é%ŁLKITQ$ILҬٞF~ZaݺuIΰw<|}e;F~e˖LJs]4O/ϒhc}͏;_)%QX_~Vdh@Th]׈q&K;vD0ZR0" yjCHe>Y];iܳ* uһ j C8o+WOǥ ;TfJtXUm!a_Sk` ߳G"JmFVoF A[Ӳ/5)Jz})wk =$۱v[!>ۖl գC5xdd 2+$$? dN(e7oz՚~v3#]$ "'a׸aC%Oq88X7k.3gϼM6ϓ3JGyBjUOt))E?D+(ZEV ܎T1(qX@.UqJ0QH289#|g>B$K-~Jj@̉΅JgnWm)B J\qhzXb2p_Pi,%fN]f9nߩi^.\XtOX<6woۦ8[k'^qȋ *|3DFrLsw O.*ޞvM*y7,Pc܋0X6ǛsӞ={dL<كA9.K*٬[5xhۦr Hij%b5Got;B(Qꟺ6/̓C@!86dTCCg^.ICpOix0+Vr8@1PA/$߃2(_DPs'AvfV̨/(_#PjĉE-|ݺ< CB$6QᯃkV'Q ~JDcƂpՑ? HжTjX${~z[r`2z080"OFni+4qg<\SOB: {o'e}:g;44衃jP'bAPO|E mH=q}ٺu+r醲%a, A>D:eq]=ywoitML2J䣐?]?]@ 'Ʃ2Ndlߦ;{b(4Cq Ba /tspD0қ~"O!\M7yqjPrf 0g"|0D<7_puV 3R$$NRn6]y%}@ ' Ǜ-;aM VcN,j$J7Ϳ x K]G 2&@֭^="7 ˰ 92 >FEohm<>Tya#0V dek5s]5D`|>EłT>? )jپc;1#";\|v<䓃jԨ P +RNB`T+A2uCn1s9BYZJ݇JCI˩+KXQ:b:+(aD.}+8Ru`vL<7siC+wSͮÑPߠ'"H>뎜h^ 3e($'A/67xlD8 zBvO"@^0_t G-Z0 CTO6?yO,$tBb<\իUWF!| s\JCh V,dWSBP }P kDkx/`̀V='!~q,TY"c:]kDaƲ[6< Idߴ*b3ȟI}]aP $a.?õ耵oԷC%$ЕA !YXs*%xn2z9;=א?^N(i˗ ky^hWs O{0aB|^4aLR E5@&{>L csg5}=g2>3%!o/'ǣ܂a;e1D>8'PiP\L:- 0;][PwYtQ 4l{ZWw/Q㏥(> GOɕvj-w_t&@hA@d }`H4TaЖk; &b\IKYyDE$4Fr!P&gM#}nvɌQ'`Kx/m ߘA<)bӘ;cDkl~乹}U'JXiȟ EӉ'd%JB4eX.enk OFĢx/Vޣ>ODj"(:Ϥ~q"?Y15?Q(.[ !6D-&<-eJkb+P7{#]f Cȩ+_9CÆҿRXHݓG7֮iyaYawUptOV̎CʽDvD;0cS~f{{n)1pvbD Gl 5IC2~@IDATYEXH妃zY:|B5(]P6 :Ş\k_`}kje^BfEi9%$[-`N ˮ@n|—D'x'xdhHVG4ɮl!쿀!O7۷=i"DHQ(i|iR;I};ѷwN$(OM!ʫwHeo I9YhD'Kn]%o5} uP-ƢDqz*9~5rRYKuHvA'P?[^s̉8q19qQ1jW)9]5$/ 0}H,!51;?ք¾޵K^ i#P^E(NJF _ºoǴnf먲E"xO)Yw` Tz" |D@7~Cb|ܝ7azBvmn9t ..(8 W.{AYC W#&MMI$v)@속Z#[xt| "Ğ?a)qػ|w*RjjcV4 @B&"1s$C)@qݸ-AfQ! >MDY: cxV^Z@"5ĩY՛SL:! K$I Dz aEqE}:#}}u'cY@mKb@{6ȅ=2gk~,_{0;T}Ⱎi[rq3? RnmO 2'a} S -nyJ݃/aȜN -tYz#@y@ B ~poC x_vr 㷽~յz橃ѰFPfp@Kiԫ ns_/\ot `t5A@`\Q?wI5W&?\uMX+@ᤆҝ^<.4M0EJfmd?V8pŨ3脀eT&@~wfPm:KD5k䱞NgsiDi a^ߩªzI0FC{1lݠ?!_{ݰOVGu}X ra?()c]#]-97 2ӂdۇ+#M"{o05Dzr5dH~r⳰-H1iSp0[vocǎ ̢8E:}_?' }43t^[8~g HH.0 *+ Pn&@RHvEi(D:Dz߃(aHwk6 eq[ґc ޓBeau8==[ Fi* )$OQo>h`A]֜A_.4 2[_p[f34:@*PSã3[wo1v6wqS;GRPw~1E>OM2ڑSzd$4D#e^64;dE~zQFxJfG"7x\ʵ*"((H!sF$"ĉ۴D~2￯I0| F_@ki$y% ܣᙏ" C=/ [.zqaL9MR~Xoc \ K#Fh'fBx>| ^S!z,0#W\w~G{UfJ41*+#q!4XdXc*> tr3p<,# q;R.>C#_Q GJoz}2i|D\3Wuk90|ӽ,Ν;=Bj)CVR!򏅇Z߀?֏?*'7Q xMzD$k|Ok޸5_s(-πJ8FF iEN =m8wt2a$X2W@p Ґً/EFY7 q&1},zQHqro T>'߬$`HZ/p)i1e 9;9|2p_*uSnUJ7ٹ%)@Zi(c$0k>wY;Emܵ&׉23P鬩ˇțdQ.]R&5tdbZ; ;`傼$g}K 0~%: ēe ??,L&CĿǔ"6:~eh/Zq@[A5[Xnβ'O,Dtd|B,*Y"{@lW4˔A4'r1W5J23>% H*OҬIPvڊ'ׁ#[}_c&E$ۓeo|a 9AX^ ˡ2nC:554)5kӫUW}RJ˹9tcHL{rNRm[N~th/#Ƥtiam]u17O)´iyXQ$}YDQE y**',9a`D0cV3Q3˙"*H~vٙݻvL骮ͅb?EAwǎΆH~1¯om$I)=zw"zt+I'(S'!I@H{k @p~ȇ?{\!m t޴FSP#U4{%86p 1 Ռٿlr3 T;G6 t@!q~1@% ^ߚ+Yu+J0 -kH QjJLZbZv/E]ʢBڣlcoN۔a=Q(梭{n?i~ W-)‘#GKP1_4>m4@'D X G/B/)oX_!H{VQjƚi, 8*ni;2 ,LDF kУe FuƋ$ -k-T2^j4N\*Q\=10@fQ@Tuj}NpeyX6tXS%"&Ѷ)Rّ! GC[5b JR#FL5Ҹp xY7ڰlW+N\6E;҉h<=AyZa+c?9<"-Wa9) ѥ kOB؃>4 x} ;Xnfk-- Ik)mj>qP%b ]Q?mpvN=BG ˟~B-vJ}CM&uGayKd.#y(oVv]52T"RG=HW|MKҹ83o#ӥf|Mdy݅дILcbPS<#$'w%ZMxV%uʀ֟1#R=uH@f~WGξ<΄KY pq<R#\,(sj[%T)&UY[}Wh5!YNϵu᭷ϿY_jK|j{{}Znx<, &YvI Ǎo~y*}$uѧس 칯o./o1K|e's0Ln [ Yro&f)"gO 9qSĨ|$F|OIP:j9N6j~pNVd0Erq6G$2aDž.6aAzT!3 K{k|]`(5=V*#*d4 5uEAdISlPH[6.lvrH &4HKp99@x!3hڥts=Q]}pHG4Ny:;:L{6I vz)5I}m`xJ#L_}57zntF{.h hTra*_*3J~x߫滤F<4 5U9ڵkK 8߳:_^:gڥ ´>_֩j⦒=+| { KVSVooFI>K}Is_$ggT?iBYj "F@P&M~.ϪLEN|>C 4)Ua5 aޘ|Ҥ}.OAlC8I%ʇxH uud%yxeK,̃+;PISu~'1I>|hC™$e&fi=l3Lį`LAȣW;GL}uݭw춛stD;fQӴ\lݿo] r< %CD0(7Z;"V8i#bK_qxe@8$I9Ufi/kƄ(ѷ=wΖk|o/WZT:tiqç~j\r=%c:|+kLa?^kuP싌.&5sHܡ|h /M wTn)?g=茀_{x.z%1ݤqL+O` ˧uL> aА}@gb"iXfž ^zL#JbنH?g4 0Pb38,@qsr-1vMf2qSd#!NfUT`PE_CaЈE)EE{`?2 2[Q"@On>'%?&|1 O W W lr]&O_3e"<k%{Rsl{j:d>}XS1?ɚ}0[D!}5PYk:nt&Zasi\JL\ 6}~?+eh&~鯶̾]kh1`xYR)쐺jJ=!x'ۘr0E/wtLښ$kYv5uo .Oi|$o]e{2}i:= ,O,x@&?c*|p ^|6jԨǕgQւaj_0x6WCJ|~a/nAjLRL@/aO?}S$.`2Cp?LWAҁ͛0&  68|~W"&w:1(0$9F+8EB(ώtY㠿J|p|[=YYiX_ck~؋AAmH1?d-tf˚d“&l'Qb.2I߼B]uUC`T YzW!jMm) {:\w?/^޵f*/-p7_8ņjr}Y0#C:m?WZ q{á' cE!贺3NE'`eIC֢WG"@?>T]W3q{8Yğ~ J~e`x9}ϛ'rr=`\42D?_HqP4/l?sX)~¶(s'dv'XQqh%KOG_ (K9;%f|~IfM0f >Z?Rz%~j!yC?3k]uǎ tɂsuE!--aR:g!R$vPCKTcPBF@N)R|8ՙ|F&Md3N{n1̀dF%<1[n=^yh[1]qgP/@{ԭ}0,#a0= W,Q +!SƗ]w./&J8c ]l#xM)BT"} LjP'|$~X^]Sy&!u۶mmvm6y3>(W:ú$t8dUֈ q*6Cc8BGCdwэ7.Q(I#5qqמ;uKF!R i<+ @^W~YgUL}ꐏƐ&. ǶF+xg_NW6llAʣ&>AgYr=awe C~5>69p`jI9 =#y&wba6;z-CA˿XAuK3[ [ثi1 VP%?X3Я["EV}~t FR?}pXm"N(I :ل @ ||ō!B6aK>Q&9\;2^-|0 ~ߑW.GFU0ҭ Ǣ@MOb-{k (IGâċ‡2^:ϤWr\U_:}F$Y1:K VC a.b SGi+N4Q+0so7xP֊0/֨Ųҕho+ﰃui`D0MR55g17S#}aOUFr0uTWO?}(E%4?XGCX_F*d>i b߸m +ܐ85Rَ}k躏i$ ABƂ$]q^^2%u.Aɇk\x͆Y>@~kk=_D%a[HBhӖŌd-3{n`f??>ÇQF  ϼ馛8աi `@޳3t-V NX «~[]3_I8SHI^aYvmڴeƠ8c9yڙtE10!(@H 7d D0T,0Z}@k?o$o<>#x$!®Q1 sq?r_+ pxJOX= 0Cps=y4$9nZƾ:K^ikr@UH$SO;/!/{gJ[-~s֬p.|ڷZG_N?@suڢHYtZK[Yy6ȑ UzJ_"aV?T7 (>Ĝ#Q~<`ZQ[XGŞϡ̌mK j ʞԿRRFsf 027ڐp Au4: cR`4z"$}5e6P[b7̤خW#^̵۠*6Qc=]C A/L{J'}OVOo9jl<1 ҭ@C]A;L tCtB`17RYYq`x 4@;v̬) |yݫ%'M1.jBf̐k*ó/ܓg! (21oZUmour*9d\]&Y>׌~ϵlj0_"bRcdn+p*: u:KB yӒί.K%%]=Ñ;#cԼ%` f|61R=OM͠1Kdy=6T 33φt;W8)/ekEޖ_~f(=/kbYQa^}Ր'=+G3Hԯ/n%jV..cWO(}eR w0yɅ‘ٲx:B~,*f!izk׮fK}}|^BCK<.y|]Sf` -N1k /sx,]YMf|T7.F^=/sh\Oyϓg- ADXېdb\c \y;J;[v܆=zqn!f}$ WwݥeAiuo_JG~uoc֏G%1teL>HKym96lXC0OupX~X@]0H505X"/p!o 0JO/d XuN!}&F=^Q?Op=ܯ\DѬ " R0RVKAXFE*8ٜPl0L>=Clmn/N^\A+dqNz%YS򅙒Bt֘xP5-P5=e_`8XpȷO[}7.]v5ﱶό0@ oO?G'6\_ouň6Xv?p275F̗ o2R#&<@x| 0:$~p*vE]rf6CL Fz*l#~@,TĬgl?ì@j[L81;٥=|{ ~ĥFui~ }塣W :}T3eϬ&UC; />'GVVy -[%pN;`uciGmx.1o\!>}ueFJk9U}c|`{!X04.@c-5DT&0]7 ?^w=M9y .M4PRXHcY& X,^mqp\Fďŷ %E?֑K '[ #f] m(VS͹CU^}{[f|י `ߋ |_Yr1կ_?se \)a@OP Wȷ.-ppnj(j<q?_5c DdßkH5.} k}'ᜢ_"܌3ۿ;[vÅ 0O!8#î)Mɚer>GcyDR16 kڌvcP_Rx=a0@0,(] kX7~v=q vPOJ}lQCֆVD!uf\@:POoQ-e.32^츙Z7>Vgx:?>ygFrQDJGHVT{@@4Ξ3 5=.荅&i|q%ΤiOȎ0?0+,aqeMb`-lP<$yљ6}[[Wm/ dMyw &]6FY?ލ0 ðUax<^}0+|)ِm;Lwavv:Y;7z538#ld}:WО߷2.{s/dA?iSkmϼRRK LreQxIr@tq{0-Tr&(NB+;ۇ6[x{aviGM2cyd̄EL|L1#ݍMxNC|pz?qܭ$@qnUTg>r4b< Шa+< b'PQ{]>OƵP<3$ѼȥQ @=yZ+?-NϿFWVnc췽$ͶjXK`?)Oo֓Q.`>) >Tf|MX3&}Ia1n>`eXIzƓu f/cK>1pPP7+'sv`ߜ~A)Lv1/H`H&!S!/ b~F9R}DR bBf5 XlWR(!!Ye>,W evmH[}"!< ? O|>{0w~QDŽu},g\a|,"+<^DTg`JĀ4("ą:ԓ}eT ʇy(qȆ{HCKfJA4n>䝕@ҁOYJBv'qg@ipU]9wTDZW`󚶰Oim}@Oequ2Fgou]mFd:W_Gb{ɦ:|~cN.ñiKWE ov޹Gj@eTjba~  ;y6ܐ -:;GOpR߯RLkC ju#_ȇڌk)|ퟣICSW!88zOUSر!+<2jÄ ,)-YF<eS/d#]]! ~xh/9uop7zCl4OK~8-"~D tIf N\p)L1D_Os$nIlzA AN-hg2F6"vޭ@|m폝ww6[ŗǣ=vyto} ?T? lf;)qQϪ(-r^޿dI.['};C04Ē{۱#/C{֡&bT_K #:O\Zˀ[\_'4' X`Xz]@ǥ\ytZ<|o+O_$f3}`ezpJe?Gf&߄z%W SB };a LlOЊ]&4+0u4,障41=ioE㛰@S ggEiԌR`5>!zI1'{= 2Gax<&wK8!)9 ՒqٌJ:_4sIPB), GF G]ϑ=xą7/"&RTG&%a\+{GݵYVMdCN;gVhe6/>bͿasIm\׭mZUm7ڴ:]v !!,iB3xw%^І/3S0cE;HQd@p\:0w m> ˉÎN|I;xK]K*%3}b+)%W%D&O*4Tl=Fb͌2 $LAPI˽ւwVVnDcPf|,_zQh{yKB3HxBP[ic085-c*)3R%Frq0e&ภ7߻KZœ(pagΜ53t:uJ JDq xV'8Ӫ8#"d6km϶E['ڸOk2 6u##x^fRc.ut^ȑOডDžp/P MZelˌF:w Bd_^E|\Oqyx;ҠkYkk`IM0pKI ^p϶-҈\b<=^JMlbZǞdֽZ}16岒"̷ Z| mϳqo4LiבG RuUh= `eK~8呴:B'l馛'~e^&ּCk*&},>$F>6MUKz6HR4wO䎚o.pmr3FU'8ԕVul/Dacnj <2-:[.rn&|Hz%DNᒚԮ73;\|Lqu3eh/Np G-Z8 «˧jHl^Ju_ T =<fµ?Y{x#t"s];񊦣,,1=\KPh!~HD@R*c5ߪ(lu7ml hQccv:CQI4kSwZ eb3le?ܶepҠw:HZ|eI;t5+#-r{ "⯌_6>Cg2} EKYL_Fcy?g4M{>|H|{+ @ԦTQXNbDF [@s*mmϏ?&_ }wx&׼.^7NȵP@&N`ou8Ì=ۙ Z[!,/B0ĉ-:2UF 0vtr00Ndc`9{ؘ]YQmdܧ9\ KX vLfo` +n4N4ܣckD̺^?X UTD鋶(&О؄Gۗk% kHP{|3kMﰒ]}e2n0Oh㑇Ȏ?$70f/2Zbw{#G=/)1C>= `Ҁ`G=,mCC <ʔ  ?V_9. ȑ$ Tnķ޲&"W-RU&Ӆ7 [ҏpPVY8zIW}1o|%$Ož+Yaa< '6ch@c-I q7eb ?~29vDMeu&u*jrߝ`G4 :nayw0\Oy{f;.[\̤]ڀ⟿O1A4(Q᝹G RF`$-lu5ۊYYԠ{mڪkHܿ$RZ9Py#?yJyоlg} ;iI!pتQjbY .Cjľzl!뭷^aх]x(|'pBxק;˶`U5H[V=g^;1[>R4׿RBK|Ș` UۅυBIbC%`5Pa"2K!mVbq4Л"(t_{$N=]t<|!O`|'^bDpOF? :̬||QFSv"GGjcp?%M`n3Lb,%wvi3"ň#R%Ľ{&Mꏶg?Au.$F`n_$[$M*[m҆ dO;ݶ:T~}֭q~{~I@?Iӧ=v 7W%:HgϞ[3LރwpKi~G\wmǍ4RNϩ:x7%=YW?Xu. QN2si EM! `!3ENj&q¬"!ћ )CeΚY`ݿd,eXhb >6sùIxD<¸vt?O ( r)&pd)/Ҥmt;fwС!f\|p~\w/~\qAL|< \ʚ,ҧ- x҅бECAq;߫2}ɟY/m'qS@T%B; LY96yu QC茁׺ke=gk dsmc~ijaH- /= &F{Kvv>{IIoa+BP , |9NN9j;2?̓wmT)>p &7@V/W75ؿSxlyy^B(NԖBN$ +E+)L%^%Kq8|'̷تˋ5.~sMqog!'J!y:10S i)h(_ۯy54|pi3 @ԑXwݒe :~@ߡI)7XcVM\y$0fG et2Q] 7g= m`yHgܩeEo!A?`} ՠʤg'43 0<7;00B_MPC<Qf%S L5 vءбcGv߷0hD\'^|&&iIz . \&vݵkz9Eǻn-붶l(v~R[.34I 8pWjH)`Z2ASeP' zQ!軄g R;W"c ^r>0o8>n$'-QkoPړ'@&V:1B `gho U#Ҡ{l XJYs)oZ W \ⷄ.PK< jGIh{Ѷ\Yg 3G=? `siS=b2Pl)nGڼeZZ_Ni}L-(nHqWm"BLxhK;+[04lDFRރ믇4¶!Q{:} ",2K>ď3S.ރ`[c x_2 5p;NN{޳#v 'YʛvwB h |2?!l'=쓖{p!L 2$u-m`HV!3 KoSxQe/X;H^i?ɓ>׸k۪h b(c o?@2ɗ(KE~]: ďvL>!CGQYj 5\KB¬rM7 򈌩oh~nlSA ҇161V;t4ƒ?i@)Y1me\_~g?<~:Fo`m_zút}%M mm}^]v'q=3g}6̤n~H3st4Yz@7ÐVnY3ʖ'WYBشֿab|ؠ;^yE _wT$٢u{p!3nRr&mKN^y_%Ry'/<3]F%t\;uR%%O _ ^(@nfZ\^H'`\8(ʆ*>L6|tE3 @$⡽Erk DpqF *f-,ZU/ţ{ږ: FʐDiBs3%RufͶ\mWN4w:W\a!*WN:z"ˌ/)ڄu=3zQ>|kq :݌aAjZ4/yuBB;ai%ErOAB[V+YLOCtL  <ʼn{1WIpia!Q'.N,NJ0eyay+7ZYh .T20pa<7& kPy< 7tV^ Ux̳d_9<kiߜ(;Z|̝z5=j6ZG#NAAH H73>cto dQ^ZШmtwzۘd &:k`ZLDxJvgc&L0;FZ9IR".OJ$Gy~~iLӆg VeZ6wȞyePnW.*O  ' im' 2#/4U& ~X~lZlЕLSڻ/i{WKnY9ҳ3$K0 (N( " Gck6znQ6Sr{cSl!wA~R`cFZz8Y4rI {챇-%>^.= =%q3/i3 v Ɵg,/<_hea!2yfwyfl$".,,q`$F"aڐe^介~~!zM8~uv$}._S0$ki+VWW0.D?RQ0paEefІ~M&'i!a1!)ϟgpI  ̰إ|#?.Ư=@:+%e2[/@৲P]0]eqў ¢yzusaQ~5v _7rj@_~t;U~TI&^Z&6M1^hs&r-Q;:[2 eP\'uj 6u5ۮoTFRn[gOj]mp΅`^/Hؒ?~i@[=HF}tUOڽ{p"颮]x&p-y=C7 6L)w2~X9!3ɒtrESBw>Mv WiO/!%e&]I/Z@OG_kw}L>qtQFnqRQ 0DWr#}EZ6vxQɡixWj Z62>4H;Iώv0.]~ !l_K_S3gvK5^|}kݲ=}*6(m 0 {Ykf^yai)%-<`\e⯿N{՝6C?>޻? z:{Ї46I6Ess쓫[nk fʎ CHEiC/*)>e/bpG/eI}e_|1|[Pt3}ؾۆlo.ze8T$|]N!Lyb?̎X2^x0;p.[Q++J(ƫT>hKg>v$)'ipO遻'~_1@ @~)]X,-~Cp  繼tIy -/yGIp2EoJ 1G( tw) ׳.nmkuoն?ˌvjmD/٪+Ͳg$aӿ£>f̪c'{⣩vm "*eh{bއ0\2W^,"5LDE,,ht՝5Yv.7f+=SN<&l%V'r aMw{m%g WxwBI I7@W =kiu޷o`=r-[\}3{Ž ʠr«wPcBF1! u 8Ůlc *{@.W80Cgr@@G߉w$ q2e|g8'^ ;cAS)He*e7BPQ|خVY^t5q a@a9 XZ4^(ϟnld{#mj\X2N;tx{V!SifZ^-~[hğ3.w0-<32Δ|_zi>e$Zue><;^ky?R[(!_$~1^E_JFXOd}H˷lczkdyLVNi}0%,`6$`"Fa\X/ aB+ g g?Bn.I.Y[e q_D9I%>&⟄/]yhIݯPe!ujҬܶ7tpg{e쏉 lu&66mfױm9L?ayy0@اO};puy<'&c qfG*}{i 57Ʀ+79CYLL&0 N[, 2DWH]Χ?Q̹v)gd?ˊݺBB{as˨! ğ_ !݅/mO9-aU^D° Pc0&=օ~}nHMXp $]r M@ʋ_   P.uzLк.?fi;K$ac100|8" |6}`s{mGYlycv`Y֪\divڀUß. {8!H˟f:<>z4k|a ;fts|NkֹWR߾=Xӭ_H0s6tWjױ:sg+`|@Sh.H>" D EVC `-il9ߖi( Е7gښϛ;᷶&s ?5gi&Y[iu,W w.Q0PN9;ix%RU\AO {E 3f%weG@ZAaRn̞cStݛ?ض‡.hoC[cm3 ̟8hyV~Y׼}y9&!bXޠa[%5@|<`)?^xի[۞ԚЪjiZV|ֲFM[]W_m^OW:4N2+AxVYB+ >>pPPE ̙m 43HsBfG߲uמ&#_#=L&Ҝ JPx`\.M31Iȓh^ .D*2 O9p +iJ !|p ETu* G*2f0ɺnHmmud[{[lm!q늘I*tx9yHХY$35 g F﹋mr o[R f-fiku成#®&U_>S{,VFHD>ol?9:s7[ue i5|F֊*wϖDvPdD0iw =!+#D&z/$ (pFA1D&P  rKDst$pޅ~KfAצ xXeK^{\OuXQ 2#l|M%{Y,7_9z־Qm{55~{5~t>:AeX44%@2-z?C:i]᰻w[[>9Q]uJ۸aV^zqC?^z),`"v^Fޟm9[0HZ0eݵt&@fxV2@=#xu`T){g_uX >} i_.{vv6Co3ghR[[dr_fӾ~>?!]un=#Q+bbpwXoܤG;og2!AV/S bJ./.PV%>hQcR2!ɏd}<+K_%/)On1q\Ŀ&H 2M yFR\}Y5Zjf if!v!742 x'zL:F5"AG2bU~FL}0jp4_lC-|f64lNCܡF6uL痳Y=l&ֳ?*ȷ\aO4t<'u8(>Qh4nvLwh3:H$jmxJ{[_״w!\w$l&" Izޅ=ht"0 3Yg)p?T>7#r!blO:N$y#Z2fy쬃;G )o)|:B=)·i?< '*FnHL^,E3ڵoo [Wu ^a)e%bn3}[ugS1qk;pχ|=:>w`;S`x+h쉢#Y4d]w*Q'|>U c@9;~|aqe9xxu:,L^鐺מ_H<"^K9< 4{!8N`~mx0i%=uv@ ve`-Dz̲O0l%y Ʋl恱KkA7U {mt]m F\s}rx̯]̶>U<[񙗬o^=mqۗۦǟn:Qe<(AXzr-r#F1BG$iiq6IsAafKVu8DE e4>n'X![,# {%(1&CT a#R Z* yt1^2Va3؜XNqAO[4OL=iq窜=nS&OI4| e;r> ՁؠbfblڌMdL2h:ihtg띊0c{ 2a, ȇ VD׏hKg]Ym[юR |vyW[{@?qMhS1Yˏ? LeD @MkGlPvd $ s=xRy噧Wڧ#ǚ~Dߓ#k1|轆 /$og?+[} MDiՅ*IѠrHxtߕ%v)3+R!9xAl ёg&N*3@ Џ;Kuf.e 㹏=NfB!=K.V^E= s!9F=.N >:g,M 943gʹ5$oVoՁhOy0ۢ!Pa/X,:b~h杁k:߻~( 2#D .! (vi2e[3Zq{ lW$ oo]t}A$7ׯw+Mg[&V8[ mZhNo}jg ?>?.2A#Æ^{ХKi@aYA?%>%KC.!UԬ_RoJ|SsNXs3Ԯq pQ{o{ =4lys] [ÇJG}>,OK [t f.`џi4d v||{\qq߉mE[G;5.8_  t;kVyKߨ(Ҁ*iM chmo{D̉^=>@cpxE/I7)ڊ7ifٙ:u8s裏-os؟h^I'laΞb96²_~oho;n< x咲?73c_F$KʾM"*%IeI*ْB %[R)%QB%c0޼[fޛ7~=s92"WhOZ 7;Qp@ !m%U?I!X `_37ˤJj'b/ ]7H(wo`Lظdɒj/O1>|Xp?`OJ7vnY2!Ô3j+usBF_mQ^ N@ׯb³)܁&U(`ƀ!oPc|X0qM0 X@oL9kG&@3v|WiCn+*Pf~ O7?uP>SeO+V{jY':(kԨ tKN(x ]qq2+BwXbXHI nT~>eÆ(Ҍ wwGY ³WUTV,+2}(HBCH`bx []}RT@RպukiӦa!~Y>alN䔙WK%Ⱦ>St|edV%.Q1;ߕ=_JhIfp< v)PBjl;Dom,T=cbeySޮut~'-Z6Eߩrfh]6>j8Z<;K{ a&Uj<{Šk!wΒD.mQA#c3D^G@;$mH@IDATW[ 75+JǞP.h*8SÞxVW?2t3~x@7VW喅S8DLe+Պqw8&ʘeO1Jv_;N]V@d4G]=~/蛟m(ooNE$X} fR}J/?ɁsWzWq=04i0HԸ@!3p8ݗ̴W]īof*n Ep,rM2Ex (D>Q&z=G*h z5wAgIkӂ62vzg\(Ak'Xݧ]@~)S֠m9!*텤bŊht?Vhh7A ?{$c]NrZc%,A$r+|z?x,.`d5ͣ' /B,Mg.KקȞeҊFJ} N:7V{ |O4~DO 7߬w>oT/oVu^H1抖7uN〡"ťQ;·~%''ݢN]v- JJ+T F'UX"[|l?Xw-]BWLO񐒍J*)%5ZݓYlYFm]p KpRS9Y{AYnGEEH !YDFA#ſCuYtxui9r2zVD-@/OSߙ5m2cjzBtOm:lCv.LY\ֿ-Y^(Hl'+ G0N f-n>~58hkƅڶu˽he)$!QKD=*\'KcN@,0Ӓ#eؒ2R)) ;RԐ0>/NDP7d[427K4KZ?`СJ?%ڵK蝎7(%/SIlL~iڤ:܇o|]|i{m)-{Nww4L .7~Lj|ؕ)9rL"`CjaõuPn3k IܟTA;F"[D? ?æE>d@! TN.cJO߿ t.Vm>/N-3t#s[( =_8_6E- p ^՞yeWRWFº{n9UlʵufN̈~H#u.v8,` eC4+ʒt+{ Jﮅe_eʹgc%gճ팿(߯9/}Z5pܻwou̬/BFUhfEe31R f] |,ԯ.N1&k9|_=o{HX2 Б'>q# =Z<)n4BbAI/I_+cNɂܒ[:ќ7;`W☙gcyIW z%+Bm"q㳓`;%;ƍSN#/1ˊPt<]V4tպeXN/(4mZbLؠɚ6Ƭ`\ny~Kr#s|"4Y7#њ8K98dys>G}XXH7HbeOԤ4iD|7ݿ֐G??s|7^v<;143_ aЌ \GMʪpmPe˖\q/J/U1/&I-<ͯ`3l秎x0y[6n~'EIQ}O>DNGRKyd[7H.yor^T)kq+xYv#-&Vnu(GJ8j,=?}|dD@L3T؎ Y#ˡ[[ᶷHk$ᆺ!H=zá))rV9sUWB0h@u2Ș 0d5+ڠ{yX}|8c"]IۀUj@q?Y22/?4mP ^C^ed PKkqZڤe [;#uYO1i9i1s? El1^(6^ڌJ`}J_ͬ8Pni ' jRBTrԨYC(B5oUm۶3F.x 5M\L=^PZٞ!NFfOs9=蘈uSk& )R~!lIOك[ g{t[,QYLJ&]&/&k}G7Qv=EGC .ɟRFѽ$J|bP,:tPi߅c"+Gy@f.QWc{k5 wUb~_Gn COM`xŜ9so$(?2#qxުd1Y=/4wdL1Ȏ[J:-t'ws5=$ 3[A4\깂TRYl݂:çw;Wn9iS78{ܷoL0yQ<O1Ý;*{K:ws#Sr}JÚlRBtfG3?qqqWu:Gք1Z;9tZ*¶b(GG|tU+ÇHƲ.\|޵{'D@!XQi ލ]>}\0>6pSf>+Tpbǻ.]Xm#Aˊgsg9x4U)q[1'd{dpxG" n'=:'?P*1w\%{,2tYs<哓2ӲbvYf<>~yxY{aYw,W$:\V_9Ɨ(qKqG @gaeF fwpv U| N npiĸXiou%['NT!r`p5EBZjpnf[X+OnR(,z 5ed(ٱm@`EEJwb17a2nB3L<~LLLo6l୫$§i@ՉzڷXa`^(x f}¢,&-Z*3W?Y1Nˌ ,[1W52Ir&wDzuqw{MGw:P穾@6켴J]- TضuxM?w#po˷,qNwO' V'`lk '+wf|2uTo]qP6Ϋu]U*s6U=3I81F3 cޓa%[}SlMƝ/+8~ ɘJoD8?^=~y䪲uPL]]X."W?LS!zA3jݕo?dx>dlלC|As]ޑF|3DzA,ucOVyS;mZS/:\JF|SI!ˊ{2gEO}x~=搀V^8%O[gn]v $r`lC!T\Y)s)@}p6 ?l #GuRXbQהoNN`sEYE9SP;-RT_~OgS҄Hn"J(vZt6-#tIqޚO>c<'ؠrb|!Ouݯ@qx 0>-tyģC)jx{ ULn%q*=|xi.I.SJAJ 3% Rwpu9un 8MUG(F89f4o\LƁ24R'߇Y 8~ C=ύ9>߱};ޚ"OUھje{0Y=ZʍMC䟬t{:͓5ifRҬY3Et .0[\l Elsqڨ P>Jr1Ri-]YϾH2 2UKdC_e5x_̈D`e A10֋Ӏ%2O7L8q<)!8f5,K9Exaԭ[nkY@utljjrS2 -ȭ8thHb8w*@Q ='aC|-)Geg~R:oT)r;VVDN%9y_8~=I>&\*`Qgp XͤbѸ[OI-'?Z܉'kdnKbc{dDmX#cY RxjM W oHJGJ %7oVԍ>|<>9^(bJ/ȌP삾焢,l^ui#xcSO1sjOOo8EY<&V̹|]VOo{zTp N25{~!qNhV#cOtT׺9*]!,W-0#fΈp" ?LHI:k<l L~Ry7;Ӽdp^9RpC} 1%P 'q\qzjQ9(360Fj׮-7V\Ou' j1>\  4P7پ&RV qʅ|f2@$g%oBb^!W;]v|D.ƶ@l/$=szwPNO9'M8Pw7TcrR=X \$t滠)3gAP"@dhʽp€|M`|UBL>0vfR5Xu;]tEHctC׵9pқ kA5Q3z],T@,jzom޵;l{C9t̕'83 U%wRm9C|L:\wKcREˠw_)RV֭]N5'zJf:oKVPjnШB>k_OG VEdמSѢҢI^aɷcIgPC8tQ:Iߓ/%PDGEGlVh(WkL'ʖSR2Ձu\d lό7%@oC7,3_a<=2+Wviѱ'mwf'cIUAh#E8 ]ن~AQ;3Pd.5OK[/Jx/\Z5{'8"Wu`f~$-DRzuĆ&h4doŕ4Wx g#qs%yFO(0JmeҺ!XXT惗r)] q A%@9? @} fĉ`l 8oJdn3f=dxs5\P/!dX'ĀD$`F^k$3ڬto D0 lSW_ (@aԡ[<(]킌})VURUKr ,!ձ}n,܎C Q xq"]2:$VC,]yV~":lDʡcm~+"`2hU#G~ILGTl~QeuLF.펄qkK` m! O[ <{<*v0M}D.ۼY8v&C1O裏%ƱZp>SO=NOnLǏ&/$#9/9- hzh*hRWOV}%㿢zrubֵoyVurRzX~T]V8+n5BK3ǬcHGt5;&26#!q2@+ x饗~mI8H&8{͆H=( ^_;7DĐ#R^iA9`ׯ=#Smb3nٲE7co_߇|MY5]X 2ffy)\"< ^o/9vҸĕ0hW ՠ8R?૯R @Bc()1l֋k~'GzԬ*1xjuEi'Vdgկ?锘,s$|C1t=*rj OI²{{\4/tP#B3y3.ei]SdGieYXϢx뗚|mz+w^P`,_}N.9#o%d쓲ry ()ώ<g@8Ï;2&85כ`.cnV\xB!VФῠ|\6LH*R8:*΋$Hk2{8vf޶8Smn)ЪÆX>#0Q!ܽCl'εb3A`S;Il,Ćjz@u&s+wy_^V3$ܔ̐)uO_.ÃȌx"X7/91=L<-aU(+$`5)Q%n?÷K`4@l~)W_(@7l)~mb~ؖR\;a~Mq.t0{l܈cb{ aJtL\ EP) 4;,HR׉xN:7kAkf*XEլHδRBv`fku|Xs:_ߛHSre)2t8X"|[U ] '^QI&ؐ?:Z6yGH*Kvp/sp$d(7]+_CҜkڦGM$\aJRZ[V6-(,*pR➃廏+I7K\\ǟ7Dr_+9vEM>t9h_+u+K_b/g}Q^#Hp? eXo0ͱqUͱыWu٠ 4:"ȃX?a+G?MkXDKӄ{|]6f4}[h:ܦkqaGu:lq DX#F2iCPˉWj$+`nAkLyh@lxJ)f 8<㬁<.LFOIT]W3?O+Ǘ~E`gСCVفJ \ܐV*_.-Μ+ J6({V@_|Q&L]iPLj5b{c' a_/zu?ܾ^lq`ݛ:)yWl5dTx)%.c&S֬Y3^;@i|j 4~hY4bcĉ>͖_=O 7#&c5[Yv7 孩{g[ @fY#:1Sid+dVH8ؽ|q t\fDiRV`ܟ#Լ> (w@z=/}adMAGvRrVxf)nGV'@7s^3Z<ᑧ̍3F˙G.?6EDD`O^'m)$DܻJˠ*ir\yFMxƀ/q:7hoOI C s[ư,}$_/yxPl0( n{bk k3GVq͚5wU v>s׮]ݓCvO} 2>`8(S0OYMҘk\P"~XUS +J_je鼶bulGutۭ@Vj$kxx=@`'XOLʢ 3^pJ&V󧎿e WyJڤDiqc4 ,MQ?ĕ1MxvCmsڪS[u`J #@Z /SU%(R(R1^G;WW'ޙAʧ~S@tQ܄EBGs:j8p;Vs\fRgE64blaL(oh lQl{}D.2b=Ym B`85#@'B3fPWqwHCOd'jD `r[m~t/?#x`ijGidlz ` UpP5viTR%{GsP1>FoHVr%^)B`g^h{cU |֛!4BC tCM@ ]|Y5W8&!" \Xx ˝_>Bv&dp?xI}th-e&=/}e0eBI@9RIv}`屽;2 PJ./"}roo֒C#JITjpNA5<R$HR+[짋mju{CG\xGZDl1_+IEr@# ɥސ*=zH:#(<ф?/駦wӊ28$Hӫ|滯uF]݆8dQ3l3iwI`F&jpJE)-Nvt{ u̥cҀnݺӖ-#|(T Bf)!-OEIB`ǂ-#/괇>7jk?@3C 2:'"1yNaqAutO;`ٰN^uX8|@-{ P2%Mudx(5ગVr&bE݋߆bf9-`^xgk8GS$&ۊE f @N ,XA~fZj,?H4pNV@VZa?TLepu_=q{+C҄W^B2$h8)V6_?JU ?~F^֟1q 'Q}Sy+`B]Koz˫b[ q_I)V$R&}(>rP6|]0(ҧ~@V?VVt6FF04kL9Jx٣jWUȥ&|i\8IlHcQX?`5 h~64\((Qcׯqʎ>>>^e`E-˗Kݕ(^bߊ:{Fl]3І-ÏmN)U>xe ޑ+Oh꟒!(ZthaE?jll}f5X|83rcB8,T\PLCme->`.ԕDo|Pdb 6{y5ܓ*4= <ɒN} Ԯ bk ynj,i¼v:Slo \RmQobm~"￘>>sBn5i땽!=ULIqd*pOVe||/0K :vjM2r`9yd w!שj dHh Z+C"s3ﳅ_ C}+ ͮ|<=ijyNJ3 z!OWX h !Y4WUz F[{Lg; x\ƕodVPP60N@@zj-Ȧ)VCrQF)L6.Z ~[z@իqxC\<+;Z`jҥĶ]]Y~c( 1^_xlFS1eu#^.Є 'aMcz_RcT~i:tAlLCva|k`eQo?x XјjS!,8X:TD`G9GaT,^pP]Q!>fԩ~ cy6*I$#Y?lt[{z2|V&>;P? ?rdKLAN@7<bqr2R8DZ >:%g^{=OR`MPR,+/Mn&A 9Ax(_y{BW`5{J4 1|>Sl؎P:/ êg ]P?]]Nj&4!cϊ$m"Gteg&Z &..륅@U|s~45>O"?#(ZV27qtuMl 4Q 0Xx , \<~)^I|9KQp%6g { ˒Țe8,#|KBuqvh7i$iٲON<zA4F6mKQJQ@Uls2%"xB t*t;2(WՕ⟹os]2I駟Vq8ey i /EnFyKx "ܹH (}b!SKx (ؘ&nޓ*#\f.6kڬcM8;1`̎Xfv}":_-I#ȉ:,+46ai @?xVB\c߶m[hk.T9wY'^t|Y=|@;:$_.; 6ߜ'/ˤ%,DQΝOfȉ.M:.+i^ؒݱ"JIy6,b] ?DEe3>IDAT+R)f|:С =r=^$JBC5L3a4ACK"{AYpضlĉ@#|3z@$"/z/geдTXcW1'ު{H}5bݎX'§SX~T_lQ?˒B#xM451s%ah&E|%<@b7Ћ 'Qpw+% H)'ɉ‰;3Nʭ92s}WIy9!Q* je2رmyNY7DB`^ R>t^{5̍qѺ.#~&BxQb?Mu_0 ;Qp3UC쐐ؚ4` u{2<_ w夓f~ihFPU* .똞ъgFklj*3*@!,e UN!a KFoBS=jms¡dɒjb kh4Z6~[A*W4+)Jx75̧,)1SߥK5L4+mJWf)b?p]^e<ˍ<1<۳L+]gG<W״x7M=EHtclg@8m-oD|#Fzw e? 5ChMBF^sTkHEC4PQNj'4jצ4(FI;4Mf{t,z\D5(Ay 6{O4s< K#"8Q1QI4m*+>vB߁M+/..NRןg\1lD\*eH?cŸ 9O,iZuӮ.C4$HTrl,^qN~X,ݺO ʃ>7P9~7-W_HqlcM*{Ko|>.b`X\譫>3u YAҽ`J 9(+c :iZ߻BP@pଯHeBK`P`"*AWDgEK[Db,y-xsO[pe=O1yod uȗ[zLQF:u.rO IA4fnGv,2s5˗>}x\kWx^#Ip < ~rģ[HHL'C%@$+&_Y^2y'C>*?\8o4 .YD9+Ńݒ_Z6ɯNHlp^-%߂y;Bxo$V`/R&; kH_@)25P^i2"۷@_O쵛b ,K^~>z ^9|RsBWD9 Q}~gGUgΉWZ5dbn{5-B&fFțI#Z=FZ M 4L~jyӘ};?1`O>UՕR9 |$w@d$mՍqaܸ Z5w;)>7DM*ϟ@qeKx!^%"0m+ Āc=&O+WN[ J5@/Դ~c௖m;S׏ЫK!%aIO(*eJF XIW̧Ƴ>+`tnglWf:ȿ7ँ5`dyGY~3*%n @D(zB *"+\ U~0JKRYҦQT㇢Vp/'^}9 M}Qcͮe˖C?6|:Yjχx{hqhۥcòhY<|OqQ:gG䆻X S眒G|3<߁:E"b~~S+WVu=|u# ,UJ~h߀Sn8$^M{\E mծPf?93V0Fk=CF<%2GݩK'P*Lq:eh7ӏ.EhV-pi'.H{ h4EH;٥( y\ ?,-+ 8",_.'PsY 4ɛ>}4_ <Oo_/NK{)lHeeݢr.Ά;$ǏP{6r|Wga ⤗VJ 4Z:=q6I9f-"}#ѸFFB@uLiHxgLsxsB _N:={8ew Lݝ X RfvqJx,(yf1Dӡ8"nf@PfQбcG4lPMVKF:ta#Z6kgNg)w`=3 tV,+[Wv7"܆`=yI*uAN=iyhgRQ3.z+SgGg\G|a2Q(-+a=[#,,KSqTkAFrkF1{(,;,ɝ?ԁJLs <<Ǟ2ibL(~ vu C_Z i:PS6!ZDtyRvRaf3͝Ko%dgeRRt.)sR/q[ډd|y^E$?x~-mfլrDoS_/>q.XXF^]sJ KpK \PgDJflk*HHJI|H; k0{p[*]6Hq e^u7 )+DfЎ&$FaD8)F@@2^F egUt"]{6i倴_Á#>k qu.i=v #N#ҩA9y*~*RoT8t+;b2@H!5 h*H}0u& xʔnrfzpx jGm{83p˯go - "9JKHCA.N * tٶj1lfYC;PI TlЈo ,?=moݺUZԩb?Hym ^.}4EIj4:"| |j'#/,TG?`ӦMO?6B1X+̙XJ^WߟU'mV|<5J/mLWtĕ>. 8 Wėeؒ ³&]xC}Q_MEѾ ]ɗ41U (zh%'uL?4&|T gcf uvg"xA¥!Tf9&S52N+0*s9lB@o==A7T 1Z&4tZpd{%`! hHw{oɯb`4PA{m+H_̟?_1-sLSHBp |YޛuJm_x* 溡^n?^Ƞop !Yuip3uf:L373|B2ڶW4# Q٘]ba+J4m7g͚Ej6}}dx9եX.YZu9hv)5?! +#v(ŋ,d(_~t|{W ܾWܾȬ%ӝ諝`w}Ya9k(?,RATצcpCkSU@p硙)vJV`-OWdF_Q1՘u#2rzQG/A O ~@(x'~Ei/|~sVZ7JrOOc&)n֋ƒ~+ˁ$|ətVNu? IBno@&ӦMSʅ;vHמN 6~WA&+S^+.KgqJtN*޺hGN_@Xh6cT@=^MOx.㍶3 l#LrԨ0=X@VhP!"Yhe r"!sd^X~21V`Gzs"#~̙#UT^ bчe{/K^s\1_ZY2wcM6,tl^K1֭QF_ʊ+԰ o?g z#<$ݟ%7.zHG+io ,?1A,5L?롲Nf);BOFۤK!  aJH߄q=I癃7O5YT̉ށ8BհZB Qٽ1k!ɿ~ze{O3* ʔJO9' vNo'չì0!_*+.mptV9 T >\={rGJ @<_@e,v#$P!e9MP>Xؠ*tԝZ幗> tq B70| Qоtx*c X슰zDjxV ON]~pv8h{* =۳0T(a>س  tǿ9 T[= pB}.˕+t^z%UV\dZmY]޽8wUL+@ӄ(cDE?y頗'hq' sZfUgY ʙb5ڜ4멂T(HV߁F/3"ã;I6S)%DKVRWY*Eպ&$ Em)JXԻ6/N%.'>#3ǔ7_< 9h@iq; hiV) ЃX|2xW 7mV/å#-4t165-Fk" rIw@ؙ+_E>(TPv<3Z*'1|!|}F}X#ȤU!+z 駷K$p W̮]!4E iO뭷*t1J:$ʽA1\&A:HV u 5po޼:hoWJ[IpQ׽ &HRRH0]bz3\nRq%U~ YN9j7&uc׈Ѓ5F[>"t&dYԦC!l2eggqA$]ב()vV7>׋G؏o)eҤIo>i֬qN@r%ufę\>ӏ# msI1z=ҠvZ:k֬)M4#Gݻ8_L%C 6#T|c+0 8::U(!a ˎt

!/Hy~]Ԥ2z>[ é 짡DO>Μ9cZ3,Ukɓ^90' ezhJ/1i~! e(?v7i]0&]Y|l:Tgϙ e&6 ܪd@LuY¸7#-a@{@<?TT)^xRaX ?t8}_9*-L‰%[ @bpRZåp]pzPժU~DO@\ԯ_ߜkJ^|E_Ej_*ҨO3JPjG{Džtffp#1̜BFġx)35mf4SQ F``\y{hp6o-@rR?V"~^~_z '0w>eSd<I6m*ƍ:Nt pVAn|ufBWP 1Ԙ-V|o\i( wo_WCJP74n52|2B;"jR=AŎ1Rԃzao`5VGQjԨ!{VNveKEt߰qm2sON wA⌵fYTeYĿM@21)ttnOK7n(LUUUY.~9!o#xx)S!Spc䆺y+xd7g !&u,hdwOSNk|P7{(W+ DA)ZM bc4E;W)@- qo1{zmOKCPzXxZi_ [|"p?&[Ay ?e0ǐ8,"J0Ug1uƺ-}堿D^W./N4,(_&JV)+_M|,I;(ofΈDLt1(,VHծ.%662BiMi*bMLQ&ZM]*mmV5( Ayg{ܹw{~_o?q-ى5 r/.īoqO_^V'ѣG;l??vmt: l`ܔB@(B};3:#yKLCw,R+j@YY3Ry^9yg#aE`5n/ AR8nҤINo!'w_7O#O u n ]0uɓ_ pp6䪐ݷL39ۙ-v>hM͢h}MWnV*qpreܣrbQҏJw<6x|Wc\ِ[[[ݩMfsӤMO)Gu9O qQ!~Rqdl]qXK< 7PhG%25M2bVd_ KWI ̃| h is **nWO\XE&܍`ؕ͟扸~u] 4v~}07(7m;/ɷ򗿳ǭ[]}`/Vq;$ƼF~74L=Uhs EHLooc[Ɖl' v'W+b9FOZ2_ | r>$*LZ]ەsYrYn.؎G W3X q1_C+w׻SN9=! l{g p8G2 i-0Mpr.2)SJ""/I}@SSMkŌ`GِcgQ#Sz;]t.AQ\-W8`3;3>Lgx<7e {+LeA2Ljk7!!<ʕ+%\;<$oiuzlƴ.~6&ogn0 }YG +Jh~60XM_3hgMbMNs/RbY4e^^-YZ1Q| PT.ڝ`+6[|^:]ۙZ\hœ}r$ƍsӧO/@vcG5tww\E//tṈ/U9{IHhF6gYm'YI`(N[neZȞҟg3F oMNrZ˲kttr{+d=ˬW @ڍ@?ݻw xtT ^Q#mVwBxL,O8|}_w^? }: ܕW^i@ c8͙]ޜ`zj -H`'f@{: @?ߩTOąXr xzRMx/p Ϛ _z 9V}n84Q&^1qQ9q)9?< X]^A`nV y֭[m38^V{a9nL1_@^R\ #{O1 Ƌ ?aΝ"ə%WFyt NzLAM2fs1ڝ-\>_]>Fx5ͽ{~瞛E&}饗lc B-W^;k ,h+Q`# ݤM cU,U[<]LFB Y۾};􋊖LѰ^a2ゾ+p*0#rE\VWMHkĎ?]}^{͝}I-MQqzL`esH?ZIo*ŶEfB?=#egԤS?O?tPÔ yITN)sx^jO1)׷ p|qِs9scǎANȢ'p&LHr#O!]I"*NI|T\fԌeihR,Nh:-hؘ=Ro@/3w~8ZtW vqHO)•6jW'QO2KJ=$)πp|4ymٲ%~/Pi`7ydo6yf`ļ(0 Di l^0<.Tz<&UT۹Xͩ|2W,ܨG.~}8*R]n沣/`Ϡ6܋NS{v /[5¾TVX|9vmK/ummm.?s ]VfɗPa%!&$|"]PgZF{MyfoU>߱&X=VF{Q^`JpW1Pj ;? r%ebtRcƌq3gtz8Ngn$I\I"+N sHGǁoEz?E+Asl$8WgߖaWꚢIfZN;i%=.m{x"0Sh69~Lq)hm Qn*꯯Y(̾P `jPTSLHk?d.wG2+.>2gGx)?<Y 1VfbsVEDD'li툕?,/ew׺lM:W~urMCq׮]kKS>*`7]:v(lj+~dզ pѓ!W@FCN\Y ){se^]sUyߌcE,9ǾV$pO!;[O–S績D54z'@c??Ha)i 6$hKE`9I!Gp8$`* (9H]]9#GwWOs.4f|vUodſvrƔU j]#Ryxҽ\dZ%o|%@I n>TsA#"oP(NL}?Țqi7qv)ӴMӁ_ŢߎY\pz-$RwN< 'Cpa^z3kF~׮#LG =T~Q?[_N=b|m W#{ڽgl}smdG/@[yG[ :2m? d^.>R|d70hop%3n|aԖQCe51ݶÖTU^" 3!+DVHH +C9h44zAF`3cZSp\_G1+E֮Y7 =Wx#Xjo#{E=" #6C~y ew.g}]㪔#FަM[Z|¿{N)W,`؛֔4k6 ۏbYUw`aj/" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " A`̩v IENDB`ic05`ARGBqʂ$ q'#m߀ MaAGUMW-PɭYP@wxaJ!_C ۉ~tn`xhuZeZWX,RRnTςVtvVрN__WNb ́Db\FN ES((TfI ]G9'4+4@l;f[_UY _dRBeRi(Gs?^a-AM!T_^T-Zmf&c%9ChN S;*^b`;AZKaS,1R:^e=&[-2c`Y.y>h,`_ci5eTa_b/KZ``JPXdD\1d__a2;0*Zd_a_d-#$cϛP?f__e.)6 baEXȀѹG:Q`_b9!Ab/4ɀ=ag,`_cH?Tkl~z4׫X)I,u`L(ro2h։ՖBXy%'N,ŔŋˎGW- NOx+Cքŭ9yL_La+PmŪ-`LEN+w~j(NE>C,W&B=9:)2!7970,Od$*71+fI\E8& 0*6nEl~[ BᲇJ<sR2׋OSmfTT0xI޵AXٹbm|>Q^۲h{>ibxFXױ]XeD\loj_a#cϛR h[zGڥ^XdƀѷHNJZfcƀ?a_YߣTfgl~z6{UmR'aL(ro3h֓|ۃYy%'N-ŞčjHW- OOy,C֌ɭ:zLaLb,PzȘ.aLEN,xy(OE>C.W'C=9:*3#6970.Rl$*71+fI\E8& 0*5mDl}Y BಇJ<sS2֋OSmfSS0wIܵ@Xظbl|>R^ڲhy=hawEXְ\XdB\lnj^`#cϝN gZzG٤]XdʀѹENJZfcɀ<a_XޢTfgl~z4ȀUlQ+_L(so0h֓~Wy%&N+ƍmSIFW, LOw*Cֺ୉7yL^La)Pǚ,_LEM*'NE>C+W%B=99)4΄!6970+f#+7.+ic10RPNG  IHDR+sRGB@IDATxWyZie5Kd2l[U\ ncPZHH $00`Jh˶.yFGWwݝ{hswf"  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @dY @ Tx iT'͒f11_&iXua)Xf:r 4퓼`n]{n~$O] @c%0Xg@JGi47';v-;v륺LMM544d2uuuruuu>#۴.:@o1Ӻmop%@___t'yO@A)9P&JK;-RA<SO BvWJsi$?niӦevԎ=#/> }=Mz:1ǽжi%0iJ+' @$q;;;ZV@[5[<*9P`= m0@@ PA@ PΖ'-Bf9ͫjiiJU3gΘ1#ܜۙfZaNInbtUqfG}:6o1ɴº0Uk#|@y] D*đM:oy[.D(LU^c \p ^>|p{{wWH;%~)Jv  P# bH:WrM"ɵnߴ`ǎ}ɏ{;w+`;ݮLfrvrˑxJ#жBۂ]!. G(8Xi_rРA2|^ "@[[ۀԯA@оJܽw}@H5Q^վkU;OoF._V'}ATxl_ZG|pp=>p  e p?H~.j@0@HM5HJIn¿@뛗.]Zs 'TYsΞ=;+?96^}+SɷssΧNuirimMy|@4akjzO_ʣZ8 88СC>-IIF0@ 09! *ϵgI_,Gpŋ-[VkԄ?wmk{4|ϻ~\{s~]ڒZ7mK B cدzN0S:Zu#eZ h] ' ~0Jߗ(A @`t{A@ 4({O.֪5ot'\pB'H}ΖloϸF_yI-9 ӱncq͹ԬuUqi/DoiuX/.j 9(iZdWOiQ @ (kH LHuIzjgЏ_#:no66n[Hw}v亨x(Y ,:jquIjx^?x#p5ͱ0ƺy<=+xp@_W]5HI'0@(S‘m@)'Ycy_|qyWkk12y|٩ʱцiiΟ\ixv;{p>7Z[gPx$ 80^˭H<(eIN|ojWhZhx7Х߮ia[h@ {iA@ PFBH1*ҕ9ӧOo֮Z*nۑШ/GFTF'yLr>?nᶅtgmc=ގXcB#k/v4B` 9u ,y[Z7ӉJs? tMupp tP @ =@)&?-1{f;sNGwNí?^1& <69 -ZDٱZ[[><>LB@  6I9o*Bp#M{;?KC  $@`2sn@II˥s,X|%ke˖~9q~;^N:Amw4ǎ{p=U7MrC ʃ@h)@r>,'.]r99?YۆHWc[GJ 0L,o@\ Nڠs6mprt9\u;0PLgsrhMc'сAM:;vC 9AhI 1/Z7y9F>xǎ&ݡҷ3o'?8~t C+p Z礽ahu={D߃a(&H[ 7;m.C8I tk%%{H|zB3 3 ʁ?&Y͛7ǃ͜9sTNwaQipN޽{8z EA Hl~օ}'6wЃ[$^  Pb$@ \ӦM.kP3ŋgCǣvcA B@.~l/]HC8 @`;B(k+IԬ擟?f֬Y(ß9t`[}C yp(6u`ŽݻGv$S@Zx0J7K?0@(EHRL+Ռs9I;S5ؑϓuuvf5]C#ǵ9mξ۷oݻvŵ ?\E bJwHnAq p8@J LS,]4_E]T;ߟt]R9cM۵۶mw7AKX $A #0v bMK.mv3uֹoΎ=7W::ܶ}G<\l0ڱcG]NktE LUjG |SA1UQn@!@`<8@\yKT_ŸokkVuܷ?Y>Z˾#zQ c" M‹ISc~< &@0BH;S]zrΝ׻3ڱ~.P|~TM?r Q{H2t%@`^z )͛7 OxByWS__//8So_7xG[]/"BByv;4: 4Gz!@%@(4_^f͚j܎#~8;oߎ? W) P %Z ZQ lc )K(*oWu45U3}?~.[pôкlnݻwӬ߄1@` '{OIr Li@ >QwHvK '@/!RJL=ukT:u^ǿ^/8^_hкu@!*޽Gc1@(L@- hzX-mc@Y PVBe@`Aiʕ+k=߂ b5sr4J;`~۶m  1pYGzd>1@eG@]22 @uy5]z'tRr@iГ* PJ$!)C#_s~k׮Ψ}vvmI>9my7w~i L ybIs$1>@ @* He!S@ Igyf>WOnmGwN}rrpώ]7D $ȍС`@~vtI 0*F fHϿvƍ'pBVM3,{]ryy7߹sg]8_&@n|q+F'aRG@. RHJy^Z5]tQU~93Sm;q@)"oz'wJESiL]\>f~֭e:ڪ_ݛsGtCwaz PZeԃ]12KԽ mvs-ZT{͜93ۛݷwoMG{{|L:N.joӠ~. )\{Ep %w 8X, I!@`RsR@ ޮ]]WWx֮\Ɵ;o_]qr={۷G @7IA4& ='RH\jҚ5kj_:;:j4jO{rr}}( P-SQ^-FwJWK XWBA C@tf5={Uߞkl$塶ߟK|<@K@|Ńj2hn p5@ &4RK51UUU5]vŊju[[I~y6;f LMzt+p(Kֳ@d - C)'0Kt%Kj8Ztuvؿ&YSt]rr>l 5/ @`P`@AJ5Pb@`2 loVPSS~/~hQ6wν4Ӟݻ=ɾĜ@: (0'_*&W@ P)Wr@!D;tҥKkN>ZW&iO:Nt^ f8f_Ar%'KޗX,  PT$[6444z W껺ξ<"osS7?x 5 Pk^=eZ~;o=KqDI`N8ᄪ+WMVvjR`Bt\A@ 16[_Ki?ʋ^hkpZ5niiR}U[kkk[CŎc bPkSe P C-YqٮKc 32RJAӧW-YZQcWg`_|G?5n!L!@F@A8  4@ְ)  0Z eW͝;׵U7\AڢcZ *@oS 9aH XRAz1.H@ *ɏKOY_]__jPmҹO;}y  0YS0iUMe*L! ;@)%JBM3f~v5y.rp?#@i$~%74|. (BC 04@%e59sfֵ}}ݪX^g?#B3@8 @v\#SXP E@ T)Snd7jzz3<cʁ H]UzDf! 8K@z }RАqOZ\ n\I:nAS/SSl(~F%ǿQ7ư `\boLMlBa)# J/T]t?*/ r!giFM<.gs5B 0@Fc:s0]N @J@tE@k|#*. (B 0@_atl*mB ?\A@öZa\ ^> S"SDjviUȗFizL!@(=gRZ |w&RJ^$ ͐  @.5˝Ϋ!$Pz L,5A?!9  @`k!UD aA PhPWrA ]Zq ~ {P )F@Uj О(;Y@B]!b@ \i )oj3 @) P ;-` G "0I 8,-trX+ǿA7 tPW$rOP+Y@ ( H!R˔H CtiV @H!ؗa:f!2& e|:RJ`!r=ҿ?1A Rz^gg~tt_JM 1 0X H2RsSGL!@H/\Q:KMg|TAeL@_<xQ>z @\{Kg\@0+1@K5Jz)3/V =aկ7KNü6/4N<}FZ=BNAN* Osy{x}_X( 2@ - Fv!B7(O |fZJT2747mlҲ v씧3ۍk't |?t$ 0z=#| e&@ 0^ҁ/½Fo3x8Tcɀ |f\fOwj] @j`\ΚrQ_yyX` :K_?']XVNK,3 '`^6kOԻl{+/ 9/v-os~>4/-'_7 33Gj lo:(y~Z$[cxqOݵyޟzDߕje5GK6 Som ^쫚yYX` _#r B&ܨ_1T~ٶ3]Lszvbݖ!MK-i :U̟ r%wMFο=.dL7j N8}NI!P%AI#Y12#T%ܟou %'`]јFaɎϥH@ ["KA4sFfu=o4ا( ~YQ'@hx0 % A{_Dc?`Zvw֯ͷkq4v=߽䦣9Vb( :ҹpk@88$OG 0>WJo_jRP%M7YFAiw?ץF.o$n{hkξ `SOKn:x;U7נ5e5AtN ?zMq *[Bt0&~dLCGܿS(y_0 e9 ɟ*?ypzɁ ptoKv}O %x r<*THALLܤKpV[_HIߕ $O>[$=NFp*G@ Jɭ0@` pcD)#IIćOLGM@/|q~M=`H9(פ;$ (T]F 8$1~@IE!;W^M\ 0ItO D1LSQ}Xf ~@W~,}IAGJ3Ґz.4w|rPPZ`+%}1@` ypJ@`rNpjWB ЗSp/&RO/|^A$'Jn!$ e !./C(=g foS(}B_n i0y9WS;~yڴn韥* 2rgs8cK' ?Hcn  0u!p0uKl P[ϢC"k6z䱉0@x/!\@*/vW<HOV%N|sK;_>* ?1n ɭ%MEE\r+49cuA! 4\Ii# e/]ŭ*^/~rBfGv҃@\ %-nTU8ynuHbS<LC`|\gHͱG"Ͽ:,3,^UM7\L;Y 0~g"R=ZA٦XsK<(`xf98n#1A ʹI%ePmKzK@FK_oN,p_ y0PӢY @*\QP*EIAL*n&rA=TWJ!(, p<bxX@ .S>#8EK7ceJ@&wEp퉻[Z`; ԯY%=\ أTɯ|Eezy"@ Uwr29b:]3)s)!!r!J}tT uxceU,7)*E es(FMA{)-՛,~ߐ$-a*[KIK *g1M8J6<^GzJ (|"@$ ~^ȓ^fo=)i]۟\CB~A&M7¾lW6;0?f葪ld'6{ۛc~=IsyfvH(ѕM0/nK!.Qv YRYW +Gq~h(ut1L뮻98e` ڤ)'䫥L&nG4uydnp p69 Ѳoz[4/ЭM0Cc!.W+;b_?nFOunӣ;~Jk ]A`B| -}}d'HvxS [ SZytC*i ~^sK~CYa (wx <@IDAT.pRn {7Ϳ6, 0 C B+OIΛ_x.4`7c)$`O_J~̥*wr(5O|U;w> d.ᜮs2 /(}>yL[nyI__Jӥ|'YL&xOOGw&<5Wp+UJ+5:t k/\ҘrMKN+T7yM?h?IԞCA͇- L$7SӞuXӰ^TڋRJs<ۢlK6w, I{pgR_?NGRK:V$8uVӀ_,ZIS7)u)lؠ򸆸ҏYouG@/. 5wKMvD5\#Ic|nƵa]ɶ]rmfGc>8\׮^+8LI14N-1s5 # 8G|OtrA` B E*/?8!YRF@/+v]t8/k~y[Yv6+#7LZ%y$v=v[$져&SVn\[K/H>Ac~_]wwYJya.o:::o[h;W@G'iL 2I*)׃C7u )ـ@Y͠"d$OqѤgF/*>g:䖜˥&idGR.v5)hj)Cn@-8WKHҭ5J$lfͮ$.s_he©+>uҵR2У{^=W󁂐&uQ 2$$A$^0F;A) ^q!z?"zy쓗oG~MW+('4{|Ot0'IN37px-"}/Ҩ"}6p@˧i Fgi0fC ?Ci|`$ZK p& ݘ _"2lҿHqN?zK>LR&GI9j- BMWJOTM.AvL[ss_W,iiir/߸_WMVzw=\ݐU,l6hp6%>뮿g"Xt߯Ӥz^H8 (9 =Eq$ɡ2MKMA+#I\YԆUE75C4PJ+boq5ieajbmڴ9Lߟro/-C7Rux;OdL>Gr-^??Ҏl@ +gIGܢG|n%=Ixn9Vcp GmHߔ˒<ըvMGfw0/#X*fĺ<)4[VSS|y{^T]]&f_׿-?`C|u;`rd#'t?ᆿo DؠKZw⬞n8<6Y|ׁpͿby!P.jK' CÝhLT/]){v)( B?_AshΜ9х{qXS~o?@/^`;n׿/K;`${ο|Czyi_~jed";"03= 0 >v6AO`YяIw&~_Aޤ}-NYZ&JzT'gXw޹Ĩw4>F w[w;Q[n餾*å'{_q4 0ު >pT;?% gr%~elVCt=8m LђC؊MpuL G=4˅~o?AӧJ8PAsk%wy`@>;]?cƌٿs=yr_]Z*ީ{DkA ޭL8hIi mz(EXO29KnƀB`,e,ǰ/ 0qnԩ2qL^ =p=ҥүJE8YZ^ %֬Y͝;oA(޽;;]vÙҟHln\weαE!> : A4xYS 5\1--#ߟT3:ʗ~/ R+_~َMaE@opz۫94/J+V7}NҸ]*o:ag؁CE?O[E}<ȖB?W Pj~Lïu >'p/7Oώ}ŴفMy`Z?[;A4(+r)Fc*oxxZ3?iK[h@pU;'Hv^egqz4}zsj Mz(Qh"]ɁIK1Nߗ?7)jS#Ķ&me\F)dgrίhdWF> pG`!prrRȍ~<)YN-_%=Az@*kҟIT566FK.kݼ(s`~Z iGrP`̖FeӴH^Fh~׻J 0 >s>N='_j p@ӡtagEԒHYߜXf@ }M'N gs'3[Y\.iC2rȫjkmY5ѷeU2CS~Cу>=c]t^M)y\'JuҐe;PmoKF84:+\:,u9j<b@}LO ˘Gp[0Z龰ipm%ҍINywM|ܹQMSSԴhaTUWշDӧGgEuӣΎJ}{;:"zڥ>GZn}H壃rګjO1h-Y$n okk~KKJIIwJ{5jwFMt܊`8k>>z+^ CDR=Xڤv.00gzJ&m8iB p)ǫF+ *[ĦHcîLA@/zs `5sŰipuQzU]]4cŊhGF-+W˪Ur2^A~9 )V~j4룮t/wz}ϯuk}y$:UQTm۶-ڳgp 5m8p} AkkROe+m0h@lI-.K"+m-N ;a%`Rnr)DSW<[f)M>e)?];6=h`y]W< C5YrsDrH`|$XgώNܵkY j5ŷmWc{uklg^O>,v'2Qq+7FmrݜޯF,;vD56%F?====3b]ѬUvpH$픢Kz~ۧ5>l@ S^ =WY% =] 0 HO(/Z^~paE&.Z;,}-`Zq)G$wxTAj~ΙgD 9'Z~}4QVawOζMMrlb}8v wT\uښh橫т_BCXyUWW)N#:xP DqlK-/oڴuu K`x_7]exLl-nUg0I_jNuo.IHB )%eytx䚲 LCn^dh{`5#l^']-(y]IAgzjIONr'Sǣ/Ł]Tc~Eѣ>Z-U 駟6g õH}_Rd4!0 %яJ%>әk &xn;M5 $(KP N "~ ~SȏV L^OmSnǜ}RNZ.W7cFxwezsm l9QՀ>7&6%gu;vƃ&qގJu>3xў={uuuZ20"I]w-qh5jj8 H9USH2ZV:4)})|J|D2:)^f/QrO{v4y3%7Yʢy ӮzIُp TWQ"0u׾~~0?^f͚~=iӚ !n΋{ x^Rߖm1,wD_.+unT謩aƌ{N2h$JU>- K2t @kA"{@_R:[79M@y_?r_֨ߖ_*:%pkStde sw& rRps58)nfiͣxg?;Za~56s$j޺HBT3kVۿm +… ΝzI'eO;mMSCCC8V+?Xp_NQod`~DslK[zPP{Yݷwrʚ_yswѕIoEwk}S/.R$#@.0SyN˕NoVI)hO5_^/%HlX2U$(ey͋NzSuQ֣y/yEͺ겣YwVp[G~{-j^JL77O;|%מq755}o꘱_nSx.F]_@DIڡMZZ^w p.'ɨV` H@~z/؛;ǚC􀫄2Rkw>[?H~8~0Si욳gKJY8oyFѼΊUcמǕwMӗ(hڧO-w^v)Qѣj=oGv<+3ghllnm9d[ZNR:Tw50w1ڪ@72쇮(iLi5z>6r=!ٟ=lb:JzGhˁ[[0L9C L9MN=:7Y?f=&:t>=Իp?(ߐ^!QSAvJ OyJO~zԧQSorٿM4c˖@]] N5+ |0z?qGߏz;»sTҿ__wKIc}CU,_-Ū?yL mgEH29>7cK!hf>*D32ټVxx@oV)H;І^K븤/@?4zxϤ%1[9뚰I𬑊U* X7{͚h͋_-ULVèGf&` |xP˗G͋E3Wyf;ߍOIht[^'>K)4v#ϖc^3ǽUc PtCW0 qHS_vN?)k{m43]?t4qsgoVA7Tda)! L,e:ݏWlyl@nLWi Vyz汮)Yk΍_5Ι鏮j%n7G~x`%D=a5:U= QݴiQ_F+/G΁_X…QW(t9=aL_,g,_)PжcDv pYAiہۇ>jL)`Ҭ @nwd 'SIonTwAPM kFs,@R+I9ʅ4|crzHOݮec 󥿔_Kg3O>9ZgFk_h?_GPpuҨ1m@5veI ,f,[UȉKe$_X,sq7oKAjy˟@)R_jؖ, +ͪĭ=WMJBR EPdXpNZOF=7r=IlZ7vȝGVA?. (yDGщ_7E&ɱoRMCqSY3ι0嶣?Ѳre4CU谿40qf'REoꪫM/R('v=f}c>L%DTjnI[%35&9@5*mhpvjRB, Bx?{t)* ziB@ 2'0G#f|4&w޺uѺ?St_Z}wNdviʕHPk4ҧġ>lU76?+w p`EQ -^uuߟ8{IgDx)G靰y @<>'/Cĭr Fn`^i iX/(@ |^y_|}F "ilF'Jwp8ˏK%wVHvJbu--IxFtK_-(&Sw%)QA{k 0j}`C[QQNAow*q nuuriD{nٳ>F/Eb7(fn_7֭;7T+7^`@Տ5CBzJɻ`Er-JR{ؠ]}ut}sjVɡztWc:x Zuj?\v'oˢLoWد6;M`e 35bCQN-y.hl+`*b[-}vۨЯs}1]F8$wd0sC 13R]Qu`Cp t+O!P1GA%J%e.cS"L\za(tKZRztr™& /*9l-^9QxDݍe+2U۾?p9[;0<9j[oDrާvj43kӣlui8GwFKѡ* KDgqz߭:z{{gԘט @@<>LSu}iQ]ˌ }]m)+e]>.ÇsO7CTq7Я:1u`˨y_&G}mmeiϿdd?6Պv3ڹsW}9=د[-$kOj~qS(Ѓ]{]F]>EZpM]N?I;\wrOI$G ݪHڼyJfýO7p÷4 0$|;az]p륜ߛ¤ZlsܢJ%@J+-ܟ96=mgyC]ܩ+KXpKO)um5/*Z~}4cٲxtojwɩwS5}q.}"Ё5qڷnzԜ_x]AS sD-'o$_+,GgNmll>n/~h߾u&;Iߐ/AHݺ|я]ͫ_>A`"I.MŭvU35?\J9"8 bsy @E PBtQV`?Ռ[ML˗_<KWIfK%3/޸Q{>wq<}juɩz;;w>򗿎Z(Ы&vlFvezdW9qPq^zs\uJ8XmᏢ{ŨU̵ϋ4_e Fַ@G~Ӵ zIߑvI6~`DBdpGKI)5:#4\e,&`6R; T*ʻ(=ܼ96 rvRS9?% *KΕJ=7ZD$kO5 *w9=77iOh4-5AO{[T&s<3j^$#߿uq^ϟUC|mȔj?vvE萶H[^.]75u 8tvc}_?u -O~,ԧenytMG4 N! @}`չZ%Kr7,=N.z^˻}  cJ){/eV#wWmۿfv9g93] #7 S8LD57K,}_w8w?fhzJkiiNFrIeIlAPsMM;&6H5W@)<#w(D>uk= vBX|NA@6b6Lݯ&W<9 2ǀ j xRټy"Ύ AF | H[@0t(Hpd,j4<(p`<! kXs@(M b޿ ox&CFsbex& qiM.4-a̽B[@kchLνx?iBX06ID^)֌ OHd ,-_>3>@xx5J0pu7gÆ 3ZLZe-U6SO_jw?A QsKÞ|)R 냚ohv^sp h@v&?3警@ '#(PpJ.o9bQO}[(!)9e`1EFuM5Mk)[$(ʊMtVI%,9YtD@ 3@IGeGdY1J9[ \;8x1RŬɧzZNW}MZm> xNfϒzhTA>Yuukf]W;Kʄ'3X½ ~ ٸfY3pETTttyy9] _O/P@@Q\fz-zMvUᇅ RZ+BԠ)0`(Q  pM1>?Ϲ-\L88](nv8w/} 06Oe.fIK9$`Lr>L; 3KORke<㼢!2RHa:I9 r@|UqO`N ={t:dl۶ݒhGZ?uqׇ,0ܪ{ ]25!Oͭ5-- AO=LST :G< ،x囎6pV|\h"3P(I ܆aR(}i?xo/:p)ԧэy48FT`8jr 3p2.o_K|kAx_OmG{ =~dI7WBSkSbR_Y)&n\8>|Vxh5!`bǂ<>bN8fl6/ onn*0Z@?@B4f0cp|%K'|e4h wxMxⱨQ;'7 f-ɁMs؏R]P`5AgxlRY`'M,䂂Co0aWC?[@8+R|0 F76HHɓbDE"D1<3CBa)rW焙y}:()?ٴi\B=0 d*˕#F"-a=@D3+@gywz }=al~:XO;ZhJ]|R¥_P8,f(8gZ/y}Z0ASvԾO<^00U$a>2\>5L Q&I…2hE$͵OԜCd)dQF;ٿ-~m#Yvcǎl]LXMNNV?h%Oi%_{a'JѶ3B";WW3p(0 Pgx[XDq5"1~VtР)0(p'{\ dk{Q9s Kh}MrRZm qL׀QS.Wފ $m; (-oE_?iShL`7ɦޓ2m ::Jrrr$==uĈII6u0i\;=  YIZm@oASO=ݳ5DQw!KEgP:{b=~ܵ[$H!q %ud ~MIG455***KۇKe׀.%Z?O <4]BCC>Y|4h d~dc=k' 8Ё7xF4=?B}DkF5t Ǩlq([?zM&ӧ;@k$,>^MkAu gQ  |gvj!6VB'&H12~VBKή1_:88Hf8 ŋlo㸍4l]$xQM3l;ti i߈*;28 7oV۹CϠ;RiPR; {T]+M7 SC?t߀3ޙ#!|UW#T*:_k4 "Z+Ɖ@ *DA(|VDHĉ[X N)]iҁ@ iV| ?4.`< r7^~kp*5߸v!?,u0訴[ h Y M/̄49!#c eǰQ }{8 <3;w<=yz ~ Fx##dc\\[(_t+ AzhK2YŘ=^*Ͱ(@}y   1c4܋ۀ`csA,Pa5ku.tΞwHK?jvC+P ˃CNT]]<Ԡ)Я)^~}C/PD,M8A`qi14fΟگJ8!@(`q5nPIĀ ,sse 7Hƌȁwߕ:X.܆0pA`k=bFuldd"C?mw7Q/ݽ@;(@xt+0wA9c,$= WGΗ[y43τ}54ʅ~qI}ځ. n553~0+iPИI:U?KPhiIAS{hE} p# `29 @*F@K]ԕʰ{K)S^^nٳGLJP-Sr; OyiK ,^[ _OtHE2~x:tS@݃ҵK.huqub*F-PiZ.ҒƭU8Z { 4M4rqG5o*Q=u7t @seji ,y8ɿt^&ؐ!AS70K}> ;uZ8)I](&!vBe׫Ɂ+$X/ى8=|IAft v5 ~w\TK7o)VExmW\?ȋ4RKpQ0 (k4⛭_q=7V4G-e]@RzxVbw X6ޏ{sИz1V]7#YEsdԝw5=MP1fI^7P;ϾVJưB _('`F 0;vJ`NJyܬU0/@̊%Hvor|f&xLFl"-JJJd]K م[?:t;VrQN=&}b-tyvH{@^ GoN(@p,Tr_u &3u@ @ OW/kw2 뮕X5ۛ;Ztf0U[c.jʓ0p ˡ}$,u;v[&I(Iڴ ȗzX0sҢe1HA?a%Myylܸɴv\X C >%W& [ny 30@G4(m)0n7 w{)p&Lz_}T`B0wޠ쐑tZ5Jm P359@A`w-%-n̚]񀣀b9n#i>5-UߕUԹ@IDATK_U]-eph>].נ'L;RLH@:"@] iAʞZ 8 2ح?$>J Ll g$#XjUCqqt\D&;T]n k֬G :ւ@C[H)MءRNwEh [ @(AS@S`^\B&~~aS} ɿU)dI?V.4h x&i8Q&UwJ 4f** L oF@nm`m++ ̫K.!HLa7$2Ś+; P1޽[D]pQMB`7qn~K dD{3:УtsqKkqv b!4{ 0 |t>drud8*` ^OP ?]P(a )2[${\CAּ!]逦U}~uL*0 WjkkرR AAyyIEKxꔄ$ +ހC`E]\&<=rO! J,ϰT\:XlذAt>;ӀˁkK]SK,NB(j=PpNa )V+t +)g20M~O-P@QX2_j~;=q Zcj| G?"k-%-2'[lЈCL壏7񯁦A1d@PLq=2q`̺2w,ޝ}{(z"fIdoI5,d M"衻N8 \52~O?Ud9׬ܶO$ Е~ T oHx{akASR@ =< PMm,$,ϵ@['?OX=սqB8m%N{쐅 92$ OSgwCl0Al+KhKK:~,߁jHX8N` iFzkrx;~\t FZLw cΝ0? ɐv05w[g/͆Фk0[θXh-K`%@ NRI -PM Ǩo"(@m53fL@ wi O6{}@". 嶤NM*F2MHCk՝Uh tP vhrGEl`h1 ʘ%Q1]/ĠIPr.+W9Q8 (2'_ǎC>݋F_G kb+3[J6Mg(\|H˒ 1^ -0 D00(9/{0uĤO9z|qccBS.:`.~n+ 1$㍋5+Sd7HVx7Z<3d$!` P, pP_UU|]4 HAt?o-&&hASS،8d$Gq^=\+[-vU@ x4h h cq폁C33"bcO-aÄ'?Ujuإ}5:RhQ2dߕhNoiliOHT4[" (YM( }0*"9^*nABwĀpQwzsë,B`ۺa=944ktN`ϻ Q1?W<ޅO kډ&*_<4K ?Rui|=[࢒s|ɝ?~(fhѰQ pcyJK#gzk=ץfASƥ,+ߗӧ eP?{SCC$2/WR^$ּ<o PD-gMQ$`ʽ`"p֭[[f+@pDICXtœ>`6M?d >sc*ڬa(PD--xUf2k/^ 6B}sA>tU}&XAR̙So5 ~N 5*$_=>m]0^{Wi$qC6}*N -n3警@(19-p~&"<[R3+3ߌrͫd{pW֕GS^3 2?9K;N<@  9rd25P !=AP( bT{VXR13@Xz*$AOᕵ@Λ"_*Y7\+4s?vC fە tEؽ[*`mh͎ 5"VVV+貆n.}'6//-7ca@m)ͽ1 ZC MkԲD ,3Ս_IIIW^l9&D2ݳ* 8~);rL4=,Հ߁رc3"㑮 4€DL0JJw\i˄a(?x;íQ#ewɈ[nxQZ0cVCC k0al hbe833+ȏL(ѷ$YYcFK"|cǏHs$~di>wvgPYю M_8gav|4ҪRa5r*1%PRrLJK|{'z /QSSw'}Hk3O3A  fn9sv^W}KG@j{Y>mEeS(}jғ>sx Hl+FM~CO} j d 4Ȉ8yB| |#""XqA ym4YSe<?љ?vt]}P@DIy2舘60^kSWFZ\#9wa+%aoBLS[!enpBZmmOD.Z@gefOȵG!0=\p3%EoAbflF|(J)+;ٺm+V.u[tevYhu4:3NaiPR\\|n}vY@CWB:|~ˎ42 Ϻngg4aW@`Ss;MS2H--\!qjn0,c;.c!XS\O\1)NEi{9C鞑Eq}HpXiž OOꏟ#`K׭Wic߂S}.0W! `#ߡҊ@{AM3{P23SCKvQD@ }`lL1"(M<ܒ0c%M*[:2(9E`ZmfQ9 vc ֍2%}4ojOzE]Sg ܿd*9;BmR;jPj9WbkG`U:>#ќx&oA@κl\) d5s&Js 9hB @~#@?kÏ.Z(Zp .(r*-`Jԩ̥0~{={[0qq bo6EGDnd3c0;|76VS )tt#w;E.ʊ $'Ś19ƾ@ 1ZK"= z0GaǕ A./hh;y,f͖Qw)#nY,jGHۣJWݫLOm$A2u*^4[]ߊ  ɻcW@y| xNY:;Gp͡%e8(ƾRA |4OS >ނ@ ҝ|啿nO~~v=C R@+J=pWȒc.q1ql( ڳgye@@@S@ &4ixWf̚J?mW`rh˒!Fl/?p98Hf }BL^^}Ly I1Bc>d;4uf`t,缒:qd"> )jU@2dpf``Ȭٳ%iimish5 ^d4hkAB\GrssoS/_4ZbE3/>b2Y-q"kWl04]]6JнO9r1gGbwX9"@SK):6&͟U;7 {]Ṃ E_^Qys2Ѻ1t1Xufɇ6v}L|})}^䄣?Fۀ@=%Ζ##nIT*4_,=~3Bk8~ɱ+/ңZ̥f1DG- @VA<7W@b ;%IT e9^lA@@̝?^ kj* n#F Z ][R9ad!Pee~_uRZEU+[?ȷSo.Ne! qְWZ쮔>ׯ(px ^ :c]zzobb$4A-yH zB}4L-3 uȀG ;z(kjJ!Kw`̾s@.2tO2.;kgE@jW4tp7@s/H헅`! Gp,`i/||uiT#R],"6" >AiIW[7$#=-a14϶(,.]?Æ oZRӐ!\r@fW@P4))?M6J#j_z&&u-MipXǬ_faO@W G;Tx3_L*rĵ !RӓC?iCUU!RvKխB_ ;e ShE.821n\|Œmܹs vLhH u&347gq@o}Jx6ˀ$(#8ɘ5 P?j]j {T. '=c %A8޽[vlokQc>|G]7Km lP(asGGk -BS?H8 "Abo~3)G zpU-w?ׯr)|w/[u'0gNF. 7[[z.{eZ0!hDȭ&Vs+_ $ ~c;e:ͱzu%˶|5警@ P@ )> EGka7Q ?24i|*ʜ9slÆp:̿1bc|`' /Z$M"d|/?'Fڏ['^}M f"É1&Ak"nwX9]{ )'_%A`8 6'@2>yJ_̄ˆ9d)đ#I.Bџ) nik$[fUVVC'm ֮][Y\\4OͰrt6t@Pa" _"S!^+w|Bbc suuMо("pQ8 j;@w (@ 7j ߿c7~FW_~驧$-sIR 'cC{ۀ|GzpC`}BdZ ff _CR25e6^F;P kۥBY'X0!0Y0lQo\+ %;q_ANʁeϞRgՌ,'hV#& €˄PhlL 12HGLcI2\ܥV!+b0 sNI 'O(**F38cF_w+Ga@h9+ȳ˯:<V1= 32~Y%95!tW[+**I c__)~%n<@({ _rsE#9Q܍@n{ï ?i8?5'75N2\B^a`.>cLdĭ vj-(2÷4K3 ޷kwu Vܭta@'P_)-(oꝻ$}+;wwt}) 86adٲw.;=sy( c@P\\4',vM7~oQaSmx v[F)eeeL! Jw3sߝ|ne7765޵_iw_8Р)m to{~MSc `ȑc'MdHϔ028{墍v`gXPP ]wr-V"sO$yrVu \`R8t#05H0^nq^HWLF<(Ȋ";jLw!h c 1j:9G]VmPkꓲR74.F}mc䘜޸Xc@wP{髯V/+ < [y% .Z{ɓ'GBG"@SSXWZ[ţUwߺ>) hwk l { \uYdX;|ϸŜ> 9#[o~M7m|V4{5@ c81{0. 'JbXGwNn2d 1A{]?㓛?Ɠ'ajv||xI{LK BƂilv|fzGY ?nuuNMȾTXL1 5\kkkA#駟Sa| ֠)S hOɭ P`aIÆ Γ`n1F=3\M(> 5iv1󽆈d|cɝ7O"[s iw-=f60W+>L2[% djI[k}1%"5U1Xd _^?Q K]m 6[JA anROfd`hD?zэ˕ι7c>@ `|?S$,3Sce RQjnnիWI^5ot!fb+=`,z駟~5h 8P\P{롐q3CϺu0c%X1%@T/HH >ԺЏA.laB "SJLq5Y1E]TzAj \?6 #=L<~zkܛ?@\s4<ԁ ǵ}Ϻ@l< `XR8$M'K n%BwBI]0_B  )3&Mp_I;-n;#_=.\`Z#[ծ`^Xz}h{OХ. 7oA|q\sqqQʬYS?Nܹs`0'jժu.+'MЁNرn:2 Ża omll2$H@ >Ժͼ;oߚdJO8j`y5񸁌|3Vk hB)0&2^޷_΅3m WJzb%i:D!B૸,@ dlڃ4 w(G_gm4Õl|h"b@}.tC` 8X1r^ dr!`3M!3mePB Hx}}u͚<՗K;ٳfYWBf~t7,. ~9pLQQ9sD euƌi ׯ7꒮oXĺsFdDv&g ?v<ޝQhClLGn5퐃m)1 4h NOZ֍h 4csf(_nsD0~-h|?#}W~>`D:>K If{=gb \"N_injZ5>Xוȶ_ҐԜzDA[JK6v ‚ ̴`uEkCYY[AL/ `,( JSI`IgނkA*hJ DrlMW@-x4+kvhN<7ȁA N>eb'JMMMM͍0A#V [[s߮YƘs{Յ_\^\\4<ǙE GQ\v6HwZ*':lY4wp1 @#J`;S}fff5w #S5 ۜ\4Dՠ)= 5нהYSok5̟F]}U9YL#qqyP$ZÇo$U#DjW?8oA*!ߗ P W{'o ௾*AZBfה?*;wl_K?`o^/)E h /WW0x=i mwܜ*I)a[]l?kw49(O¤L>|EO{uz 䠙ǁN:_D_)ҧM)O<  {$k3L8נ]ۻ Ի zSRU-'$x6I`X0m nNG $111* h R{@Pz ` C\[8wxH;XIWY!V.YʭB%s1p 0[e9,0&V--=}{TDFF <{SXox⡰rYk9_rkBaLk>X(I ~h}0%v^}p蔡Гή"Xfdd[׭]SvPZZKjAIhݎͷޔao3+tF9w,r^l?GmY 0" r{"k ʰnZ1sѯg RS#)!=ۅqmZ4 ]`KSl3UbiE)M;c Ě+Fьp*PcP}>P[(}lQUqF43å& ): }ѷshYc***jChh^Fi0pn8No$""hg|Q3YBhr`4Xa 1ywQG9cvvM4U!fB/ta@YMoQ@ EY]o PW)`ıqSNFAŌB[w8t <4A+dƍ{Bڱ. pU ,p,k:2qwA B# SnhĴT!PLsS?]Gڿ0m}42Z5`ZO|4Hf  h`@+%&VW B]+9 '"f h@!G(;vH0謊!S@H1 k1&08ǂF-]J${ni>Yr6 D>Rk֬>kW-[x1|g =v,߄njG ,,'NJJJ1ʵ KAS+ڢ+Օj L7޸oTKLH2'㝷{ 1f*aH7$mTI@*:0k54,YB`ʩ,+? HVi޺U Jvͳv>Q`sPo:].`x_ʝ-J9qi,0`p;vX 1}( (̈́D ǜ1jH]JC(ʱ/q 0NccF\a9~nG < K-e= zYvbQ=y%?5$>-a۶m" Qo7kk%33=M:0s՗FY$ 4P߀ƹ'N41lРB7|mOγ,1 LE׿uK/Iֶ]KHE,mv}r5b62@IDATVkCÅQ=ߥAǼжlTJ#H՘n ӊ2->@DkvPY^S(KǠh``oB"b">,{ L>?x'%U AO=d@e,؂-$\jsNAv>H}{O|xxػ= pux2$ZriGӗc +++r„ qwo)-&sEyȑQéHxZIj?CGtI`>cˏcv7~/X@z5id}0eo"fzI͕th jg(k?lˑxuu W@ p7JK8"2 ]Y P VJxf(-s c@Ch{rwL,:Bh 8w)dzmnE(f@ C@B ,@'-,,nС߽ekq-k֒Qc- Sfߺzv |kՈm`qN'!HzS>I-RP* 4UTc)$* (p!z]`ܕiw`08fƔJN QFo=JJr״!l2iL~Q)Dp,t[om } 2U;wgc Kݺ-2va;RabÒ0M tN"E&*<- UAV dM0חrh0ha HZX"2zwȁ`ITY h0fV+|ΑjJTFr G|l)..f7[72'?nokn~k2?ͯA9ʤ`#2XA||NkWz1 `uAS`Pw4wIS&FU f1I;{cq؏ǢgܹcU\PuuTwck0EQ U|8 eԷ+,lƕ5;&|c=k׮9M`͚s̩UT tQ5M5]`P@;S{`Lǩ31㖜 J26|aVS/"/j d /(e! Ms8}w[/>Ȕ)SB_|Q^}_oN iz'O3'OJ`e bjhȸN0N'Nݛ( ynWc5qz9g VE)A-d`,1 "2#Ͼ*Eob ǂJ HHiUT}~wy_mCݾC G6:g7?x } |hF E3ܩ"ǂ lSeqz^.b] "oeo0{dze~ FĜ9E%ƅx5-g\s>aB{(Cx;52ZM)tqZ>Q@ D>}qP̙@^uqxpE ɲeZ}b{Еt (3<*`4k8zfA|Z*guhEpZL;Oi**N1dj`*> 3yɴR@@ASf?U}c o/l >@"Cn8 TY!-|K>#+.YK<\ɓS_ۡœxX0N"&7GSV.A7IjJ`eLG֮]k>z$0cQkeDj1̜9 p!cxpUH9֠ˁ۶mk6lXԘ1c "i|{޹:2zxKwQ]kJZiWb7 WzM@- $BKx)Zb`۸WIޥk[+˖VG3;sgΙ;wN?1Q!׬(0CNxBH$ MKnZ'3A ,{YY段o\Γ6L]޷m/RgOHQ >>Ok4G{)2%{dE/zs\gi:yX^4e鑡 hDkc^%t!{uq!I +vD> `^_~y~Qﺢ#R[R 1QBxs9. Pm߱S**7bѐ#[^3xޑx ߷/l (0Z>[ %Xk`2CYޕH~枙COSNM8 `Uaݺ孁g)]I@ΰ PDYfΜ0f%yOf.[ƉL23#PhkEKpZd  PX3.䑣FWBY}S2׽-y\gၰ ͛)OX Q HP0p~)y7%tC?!qUG\?]j܆"yKaVmAݻ$5f@`PWVucUJ6n`CZ(m9Dz,"~ Jrp"܊ "O۩rkN?4d ޷X(pƫ_ M58Ƴں5_mW<"@I!s*ύ㔞++AxTʹH爩?;u8T I;#!spE%g@5/d>Qh}5 f#łjI`0*֬Ypu1i 3RJVUWPQ±m1#q?b^Zvm X 9n1 t֛/.&|̇xa-`Xx,_[3ng"@ TP%hic;< [ʈ| ]d;vԦ/P4hIm[#q1!+@iE|mBK*YmSЩ*?OFnn-/*(#kXsΥ $5`LR@Uoˀ:h'Nҫ'@ bڹJn>3Cio,dXlxU)X@-YIK`LQ`X~DˠYÓFnJ)ch_B+KE.ZBk('IE1V߉0$ t!?@,R(Ǫ Oo ~TPRR (.u%0e98= k`?3} })'nH x9`-W㿓lhIQ )s" q9Ę-7@FZ3\Cq Z$YR @@"/zɓ.G G?тVY;EŸ`*ꫣ^b3R}q9#VS.Y9WC;[:fQd'?)@!U`iƏֻg?iY4>ގ%[$0 k0\gv[@\V:(E.[n!/ɰ$;1Z,Pn/zRukΧ* .ׁ&c9:g5hI}ZNE bRh%2_I k!27W. U"̷Pw v#VI8BXi^ :YRoGa}ԥa4**cĻ^e B8KR*ex4$# ky3gS ưsW[h 0d > /8aqüy`HM78Qz mooC%@UM D9m=&`4.H^  E)`oyբ@@Sbj"}ss4(`^^%iբ+뾥KpBh% bc< Z>?*t_O> ف""ŏ*(2?aS@a=;BB> hYw`2Bl8FqukH}خHz3?ޛ ,7cUPȓvťJlqJ)Kú.Ucq|0e*/{;P(K/psS ,#Dl ϡXZ#k_) WL)((CkԨQv*ʨh2lg.'8(ZUY]Um204A&km(eJ?lfu˳GFZbZvm=;JFWr$@둸o2I?v>KskM(뵬?;h@ V*VrX6 ̗CkJ\^۳}3Z !Ѕ5I# qm*)ZRJow@*(U` |(X 9Rn`K+(.j(ۺM"*.Q{gL+1T!qc$y$t /JF@ЪU !d5g )Æ.d"ysu*56!?@$+=,(P%PYRgMf]gx@@ʰx$1{ >i,JkA6{C@w0,3#]=,]kXҒ+dzN9CYوҀϔ9u=!P6}$)b\_iMH9a:6#?,<:ռU CEKXoLJO}}{ My b@#=<5Yјohb)5URcб-(4[?h$97ߨ-IwU9BJYdY-eƻ;#H8qPҐ<`i{t5+F,<#GO4)\\v\:D X5Is#=Gg] ("a m]}^ ~T,"\RV^ ϖKy9> 4 Sg߭YwtQ௸&Q:tH߸ճ{q깓u666s;c{Úp]wAWS{#ֲE 0bOdD20y}oQvDg̕sǵ;pm&S;K_@YSQjyr5h|cw;^ShrI[2Mu˸ͱ[_Qԅ݆LTPf@ US P'H!|{HN>K(}ES[TyJ6m%!K鏾u:1:(u P$cIg %تU00?+$,2»j+{+VHLNHHѣ{7&4wx檫(٧4|p"9oΏ@pt 0 atlptt~%T;<GuGp|Vr iƌ h)/=Qu?Y05K˂0v]'#LUNQHW}KŃZHVz[ ZnimmxIðD7AP9⁐!\ZL*!L3~BVA(H&`MOBpclk᫇;a[:=er@]'ux\ M`t0؅i exC2&4&J%z2$O*aPŀSvF̿7I8M[Zim˗i% qoC}oDR8|@ O3a}Oѩ'8+Q8^l7PF`l[*ȶkʔiΝp ,b20iӦM5D*(3D'=~Ƀ={3%TBRBYPA~X`Q5 ھX, tOdy-})}zLJ3ErrH=Sak>&IIA!Ľ1?ׅ|'R  Yʘ8Az͘Vq xHtߍK}VgvQO<.]̀Pru=!t]߷3هgTi3# *DDJ򸱒2a<zKXxV*㍷pG>ڡP/lPB@TqtV`> Fh>'`./rE'>*A LFH/0?O/aga/T'HLXG*|^ '/ ]x@~ue#C*qF^ gsmܴN֬]0 cjQ PgE@oѹ^fw2s NM&%(8A%v3~sX7ָnc'U/,6Zf DGd>" :7Wz~[$.TyA! ?I;BȻR{ +kGϳ]m B4-1*ɂ==;?qɆ\5G`1dX@9. Ysf(_ CHܠsLPSggJzY*\ /܅M]u ѳS5ϱo( C = XÕ- 42Jv~zW+oN"2ܧ,8 P` $yݛS @g-s@IK10~!4.TP$[=+KM)^N'VoO/ w% =C]/Gqt`<jP3Ba9*Xu׬YPmWCo\w??ǝYV3&-~@̆sߌ xcHիƎmc(ɣSO^BZS[#~Yяt,8~PQ-SRLk)@W0{p͌nj'ApoP-djOE変ʅL1E; tgkmZ`P,>auMYe P{aϖc؉_K;mug~ l ʨ;o!Ax#]b /)$ $z p ]c>̏SR.qb_._mI7m޼mGYYyQxuhw0h…]w]$ck&eMMlh4r5+ۛ|9N< wIeUD9׭]_aXhzxV- xTaQ (43Sbbb.CWL{IR<Q `8(P4?S06Zywk?&Sy쇵gMG'@!"+HW';d(\o=ki{V43|w=gm:0D"9Qڜy%B &@1˶oײ',Ʊӕwc9%c-~S{k+վHJ7oD.EknڹSs@xK{ _+ ,Y'J\K1 3k(p"/V޽=hժUb'@z с׬!z4 @ѣCj11q_#R3\I25Rgnf{n3׍+;Ƽo޴PKi"8X`Qx 9'oG)0O\c?ѽ{[pDxt66>c5OF@c.3g,@QNK7tu S2 @fooɠ-ѹ9jkCŅ 0]r_X݋F߽k(<}F'hUA}QBcՂ F_P(a~cL` $2c˾@WXIGK<UfцtGZ0?o0xPBxQ1?j. ųv#T q-c,a~"G=`Ic.= k2*z]~7bێuZ)4R- іy<b0>+KbYjc 9&?jm W9.vm9'$PPZ Hw}WGt']OEGia^EW7&+/w\sBɒZQH߆c&P~e9:BC$11I}ْ+W"pP%]^ &yx/me.󈤣X lݴ&r\nxu1{6j̛l{~*uC7[N*( 2w9(g wV]`B5Rs,Jx?s$לgГiSۢ6Tt2TPV٣^PR ?Lr/3rVsB\Gu0XxϽE~|8P@qQ#l>UMd)R'ˍ 6%< Lx駟zw8YήsGڰaCݕW^"Z%)¼ۚ gO(&k=W "$dPhʰ& ,۾C^4@~Xu2%5A@(:k2 P4{ɱߧ*cYX# w#y`7tbq+(-($88O<y͝;z޼ᄏiy%V)S&#AҀp/^j!Ye۳ w|0{ѫg/;yG-nVy\|%鑏>Ŕ8wMeVnտ_yL5]ژ"gJ; Zd {vktЁ1fH<sB&+"3zΰ2wʑ!ʲ|7*G8?KExwJ7Vߡ;T! ]?@DpN`|$Nqd])A!xlgRx4f ϕӴѣ$k*Jg`nxOO4ηF˟?xO?&״9s6@mڴ0!!A,-##Kd7^53Z`hZ~W8QVW_ c’Fz_f&Ok,ECl03+3r钥H Fo֮6Z9JKp֚)Gt¦A#nH ̢RL?:IrDv8POvro# {w13Q6zR[L c ⊐~}e(Jj OH8CQ5be22'LvƴAZt{Pw L?VX˶n2B0FU >Aq O _=$Pz|844,ׯC*G֬p s {>_>ԍ#ftw^mA6B*1(xt ,(+ЪĘӖA8S4c5.0?>͜9s*L);N *12g}n{E=yUv(J{#x̘1<)[^psGm`&6]v&pƬP4tY9̶Ң@PZf{٢" /bTpo1g?7jS3J07/V|;٘J}Hˀf[ci[&rweK/۩al1ޚLC|Nz q {uδ0]h;;+K?yN%Dn$iO{h7vN w~ӟqQ[QKxk@b{破_lh?ֿC6_r@{!Ѱ_/ LKE 0} QЄvGrmvh~ /#XS bfhK=V^H>LFJ? 5KnA8y}e`#1Y4,)4(`N8})Kտ?( J@V-8NI;\?N+kTnK/n_XۘGU/Ds+)@h2T5ӂ[@2; {0k߾}uyyy.\ > 'Tp%V)6y[ag䁩x ڽСCqotm X }q⤗g~x Ļw{%azVflV+1~?  'Dnn<B|z<tqlvM>p8>29ӦɰS$,&x|&g ^dGqQ99(}xdN*2l/&cxϪCI/;<{VeQ0=R1*8KR@5C8b{& F.1 t**R Oo-VP ^o0eg׳b՗WhV عS9"gh㠭a<#ŁOȾٟH0TD%!e[BXi)ںMKJ% ,`繃c! ʿI+ʪCKD^T !ekO=#):Z^縏xt:/m}sKkOҮ+VKo(ȧ~W)c0S@=cfIXÓ HCMf{k5)`)sȻ |$jh`o`*R <?ި&6 3uMҴSёa6Ojdh&F1ZO qrOΐ\7ayY'0_6˗gn|^g.,Dk[LI'JS9a)Nȧx$Ҋ|@֭$iDǃ91ƀKIY4b\I$ymU\JenB>V 'OԔVF| eO4 Ϣ"N/.--c8æfw5dؼZ0T )xذa jZM+>9W]W:|.oXr27,lPܰ~O8ѧ 73ˋ/O1ݡ$8F^՝@3((HR?my$DGjNyNn|B? 46!u"Du@9h՛}ѽ555gq<[ ǀ|v,O ./S2ƌcn~>OJAY׽w)?B jIpP`u oq 1i1bC?p 5H +~QO.ZT`k@>8!d1RV )IF~)SBt9|H@ Bwa(zSRā%{TUV8ESQ% l0 @r{J(L۶ -647hiLUˡ"fj4ih0k#cG-C$/p `)(ymPsF Ny( u birw6[YLPJ y EDsC* .H^<mLKp?nzOIMu 7'?ɵ;\'3NH-7VT!@ tr=t:oF%KL3 i߯yZшY<;A9$@`+fj%!ANld}K矗/$Q(XUV!˗Fm cUЇwe#Nb G2*C(zYP_UxHr w (anXM"ҶJ^^cxYl".V<~|ޝM\/R%p8`Ԕd*lS8;vȊd歂iA_*l7IqȕA94RG"ޭcQ۶Y0090@pK6d>VVm,A S @Wx\PńZ`Tf0v;%7/7Ͽj҇};b| ~/R hygqQkہYtO=f예\;?촘  h[}.ߞ| ܉Sć6Mw)unt rAP+ٸx#}  dYگ Kj%319u;d;dKȖAd~qe/@<Lv_uy찡CCsQ5?Zn/8%5ٍx~ͤ}1\qs F?GOCWCN?qAxγrpO2? L{CLm֤ZƎ[Z vJ-mm9aJ=Z 8j"sf}˖A$*ۏLv*@! uo}+s JC%lAP4’q `@;Ke5b/P/Ubn9vfO1Bbb1FX\~D ރ*p wSFU'{>TAS6̘>MA0t0&naG i 0?}zK)S p0Ѫ?p>LXGfG"3Gx]]iPxMկ~u7MQ|ji+1xg #SGvɅ^2ejk"2X @~:zz|g|ݍ3ƎHIF͈3@>3m(XVj/$AA(Ɍ/Q~ Cnܺ1<K~B y{R`%^sj>ut{6OMϽ;xzLpҊO"ssta_~%'h̸u֩29j8rDvfk>ɾ I:\;w͹@ n g&[ +Uyх!}֏rFxXBRiw(c (h8(y0T2ykߦ9dzϼV2'M?P*P_}ԃ`ôTn9rD6獖ڴq)<u#y#X4$TV@8{ lڵf5p* 1t`LRpuceCAf ڞ rSb BR2`h4#EM7YբN 5@ *@;gu/W+bb{xs FсR@b%.6N\pi6P$z"|(oO7b`-A>E9D`0v,eBm9!_Dgv:$Rg?|8vA|~8(h9OF?\/ԬYʤ\ˮO?1ܢq1yyJرnY%y$Pbq0{…M6u/} =P<VYugkl^j5˫{ˤTD[8ABP6T)DA_qL#<4c@28b9z.Ɓ'scQW#&1t6ϒ^Q5A7@-Ӂ09Vݷz멤\TPT=+]|1;qʰ/z% pJ^+ؗ.p ='ϵm6UTYOFOl |THoU_%OD}霺5+L`<9*N kR)@Y]8@v2laO <\L:^S4ՍӔ4N'11IbP*<yjeg{޹7:699UڝL[|しw-0 xaVw|N_)<s=yzCHpBK Xb?xJd53Z =st;!_]7#YT(=o5C1'̨s3D}»hѢ?+lur$N` *V:aeav݆ (`߰ʭ]sml٩8ɜ8V'='WNѥ$ 7 Y"1R~/L,K\ȧR E0dh–/Cύ QPE*03z<ڡW?tA-[! Up0!c=iON^$$`Βڒ#*"4WM PsEt޿Os7kZשx?z{XcV`9 _͌+/W!Ӑҹ1wók<:y/0קO߫əf\^W[z'~k!QxMqp>}(+@yZejmz.OaLϐ$f8zzW.\G@p_OS '^] {Μ%'B `Ԇ ƍt0MTx [ }JTv$aɧ'.y~47~c]ּ^wsBA/9)Y3G@A UA*Hu>}{E)܋b7 &? G,@<?w60ӳg3ǍbG84YZZG3 9K' N <8?M'1Zx剹YI'&L _^QBq,&ŋ4׀uC\ d |K$`? >+䊁sPX:?HnP^eO&= B34).E]H6Yo%{R cy*0=_|!!s@FKB H.oz_Q]"NjaLV!tϹʱy'*Pb ՂI@We l:Yx:Ŧ4<~<ۑp# !,h@fO'Z- ;٫<0:NЕi_^eqXrcQ 5())CdԄN5L?l>5&xUK%3V?Fn8u:%[7 ,m#h6lsʃ4/qSw%-5Hiy)(mG ~ zjѨTȄDϗ \4= 51!W2%>tR!$qt/^s87w/mフK9(zD2LdJ(@&/^a ~1oG!Ź|1b27$COrNU.zc'$7HݤM$B-& Lwn;?D" WRAA,- PUydʠCCD[*4?n Ǚ._ +WvO@SPr$+{mI0݁/  㒮 [`RCc6 qwy;~C6 p1$ v7lcA(:^T"tE]xCO0Y+$a#vSa?n/[}Aqarʣm9Xp)rsOq-< { BA*+#, ds9@ߘ 8 {Ƙߌ1,۸q\7=wa-=lm f7l* P!ywGєQGDwi˱{eɃ/v?^ۺ)0 1_p=wp .;26B^s8|:'=H`nsz6lfǴwCۘҸ'?v`,OKUTiB+p*_Sud\IU^2)1C! Ipַ$ bY<;_{]PcsیvŒstG<fuU6O/{( Ӈ:ֆdAA)rGOU\tV`nc`0ttag3= B-~ח7TBC:g D8 ONDt%=L` OeASʈJxW^BjBCz[d’ŕQx*4j hIJuV9] `e $;\`v{f57{Yf/vfd"1cOHퟭ6ƾ ԍ=.X]6ܖ-}~:-G-UmS׹t6N[3B AR@T }{;jes2 ;X2.;wgbY˗d_hR??'SapOK%KкZD`BuEU$نY>˱)q&ޠpXn"E_} >˗k8({RP"n9ݞ{6{Ȳ|.Ta(o AƢO&'!"AH2> ղnM˖k V %G*P09F耿 ܎~e̝'m6_cCZ#Wsޮ>[dk}m+hENy衇2ې|+2Eį[s-Aj B1 &IE&7K={H$^:hKbLWzvs;wH-̔oᆭ7xtܹEF u6?u| xp/;K&~.If9 d|f]Iiݤ5n /VjoAKw…r,Wu`{NcWFĉZ2GZ ZT\k3X> af9R xX0S@>}$Hq=OUz4av`(C9ŗRAX4<LzrbB&Zd .@ 3V*|cϐ!fJQR7` B*iR /.&/s']@2JV6@[(Bn pu@ Np;<455O؂1J&$ގS\ynW3tlO`17We y7wmcY%t'nܭòs(7ɛoSd7/6+?eQ8;֕J72]o(7֭`ஜ.FƱb<Kd#3졶e~B1a1C@~,ɯF)# ٌ1_3{rDXÜt+]uۚݳi֬Y9 cy[g@_EJ$G,$%P^fw:ЈH-GKJWfwqn@LIޗˑt'R {xrŲFB0M L3A8FE+ÆJjnļc xz4_* ί"?N~Q$=ay%d E".M+7a|F3 oF vKZ.}ZP$WhͱTv!401m\{> 6C JҢm (s+l(գs`8x*dѐϘω#" IP7NTgt:Vre>-K?UdS͟Nj'0n ֺ)˺B=6O5x {ue-67fhV +t{0'|,/X/d ccb-0NOO*`i9x=odC.P3ƄfLvxzcb@ ZqLfpe ɂBԙ^q=4ܜĐUBj$x6n6deswd)ve W%\n/LՙHVk&+CLLȄȖ풋{!DH=mqj\R9'Jk/aÆXhӃp߼.@ g* ``sG/ZYǒy߹<{BJuBn6 ]uw~玈rd?;wfūyt^D!OLX _ן${u' 䋍`` ؠ0a`b ҀL׀'ufKܓ VU]% #7)SN<`N@Vx-Tm /a'o7;g&㪫ŗHa`Q.Z l^L:GY7RgKWZUGF>_/,=aheFetՒk_x$&JEvs tQȼ `(ZL ! n"ZSOJaʞ^$a(LqT8zg?6UʜΖ(kYcA~` sLg\Nϖ2/X0j[pQc.ʼŋEk4I[8-AҵmfxfO-s' ؾc|tN)̥S3ݲrJ)2jʓGE2!2zy-|T,]Dvcd?֯9P{>p?ao)]{53///kk+~JKnV\/N!ߖ7|l2nXL2N0&pY '2/grvOZA(3`r@G3fPGCl >lm ctM']E8p\U2 w $grpҡvbU=ɱDJGn VUbgՕ>kF D;7$]t"0]lf||ˡ#ӺBk)Fb;VHHDs$hn(=|VLxTPsf 1#5)RܳW-ٌ! y].7@EA)ߖyFiJ1)TAWc<9 ej3%Q3Twtߢ+ FX- &ݩ.vz3(([Sȣ=*^S&8eTN]:=}?(Jgz F)X 3f 804))wxxIKK7Au7yrp'lPGͷHG"B;G)xO~=sD0JѸ!!,-XạqgW<11QB>1!Q{zC՗_2 ko yp,krpR 0d9ΥKVT ic2 |L|,8)pVe|ӑmVUA >w#cIW}c^)&׿q +|2tp6@~qr W>T N9Jٻk$SJ8u4 J.@r6+@NğYs>y'ۆ?ˍa`,0 p+[r&q9%Y~&t=:`X#~a\B C_'^D0Q9y2g3{Ѱ*0VȧʔX{Jp2B@-PDS(|ʠ`_">"4&0V{a]yUt2a.q.!jQBP0}c-8(gB' PdKnVF*lɻQ @X yaSZ`&K$mơ!i1&LHKO4igdg` Qٽ~׬Y-d{vBnӦˀ~$ 7Pˊzf%|H` QA޽uP*UWU3I3ۊ*a77t=6^7 ߿O| ;;rGxI-}"liOa0+zM#G )/3%1q< 30WWVqb wj9fFWhfuBq:ArnlO>de?R:е&9LP L&{s:]R|s~WmPx#I J/JkHEA(t$$ GWSb`4ڎƙ|.I6]vϛL}?hq%]/Cx@_~|R1@l`x* p'PQuC9… %+zgX!jFhXe"1XVks?LJ)5EP[=s0ʼnP-~Zz% w4j Ca ] b@Sם קշtf9r*Ղ!$2'Ƃ5x7CD2 ϲ`W@gMMP~<a\ޒ*UHE  0780Čp(:f'*>o$,~c'Mk)|Bր9mfoS=@lmMR"\_r4~_X~Kc¸n<*8E4MDžN,X7*s`h]5]eg߭`rQGkx)XÅr֍؞4L Z]yNV*w(%% vSVuÄ@c *`ha'_6Zp^3+'Ohx[IǺ‹GJdc~+)L2ѷY s '5S=*]qMzu뭷56N7~k0)@e0EJ.*j7_k/pWNs; ߑ]8fZ[/;A1Zpٲe} _26-15Mo[ʫh-2]wCf baRIS9\,) S]Trk%j5rկ6Dq56JRlrH}FP ӹ5 ͥ`{ p'?Ԓ`%'BdpXf^aA%Җ xGڡL0+<1d~dGTc7!7K'(:꟬:kB{eb=Dӓ\lqJU|E NXs_R21[zYb1E8!`/uqatgwG0{?@ i2A>}hlQ2\mS|SSV0&Tkq4ݷe=L56y?nM#̒5?Qp27`Q~R5^q7$<Bid]ҜIh+Ɯf)Wk}C59.4 @@ۥޕOq8"7+㉵̊cbAtv,CE#:e~͵ȎPd8\;z%BoMT]"2 $U'{ǂnHk<NO@B}2WIP'*}C>sM7\G8=[r-y{7Y+Z[!o*&'[|b3EE\~KֆƟS?rv[c ^S t5_.0 M &:1Լ '89?In5^gjc3iLSh %蛤߇_KDK+lHikRL>q7󆷘=B2. eûo}|@~u@q|J',Қ}3umB^7zԓnO";S]?XQ: @\みrL!gvmS`>Apffu. Zd#L3?5[Jb7 X,H6|;i{Tf=(Ľu+1,_*4Lh#enw.zZSKzXK} SΝ҈{|T|,83 /͕ʪ& xUy=]|)½zR7ĹF*@ 4r*vk֬q{[$8fn)<?5~Ƿf=m(f0#U'x'4Fwk@qB {횵j(t{h<ڽ *0>poZ k!"#@ʧ4+Qbn @?OTwwmN#aVB&!\?OlUSx?!yJI`  fh"3h<@a#eDqDZ !vk#OtI|6i)Yq hnڴ ;lr*2]ʉo<zRlTn3>D\wu_|}0zן{ CҀ[1w3z]~ÒCk|yanS 9~nues!HM.5k׸9s@kmkzUvWo.5"ӖQJ D gg)~0y߻'`~~kKx:SgAI|[ej_v숰_(b1h!O LѸuTGm+'"8)m6w dSڷ>sy354[ Oþ`lHBguݻv<6#Їq@OzƜK8NtJdfvJ򪤿ٜ9.&؊ʄ/=,"1T<(+caf@#my2Wws'MQ[`Aٳ4MkSĆ# ܫ] vnq\,xEB@̒*y\:#\é}7B4rԩO?jI]!imp'H跱%8^">h̓qC}}}of.NmJCR3 5mTGZٓtIj~B-X>ix-D5n={Ew6Υ%KL<9F!x $Y+ ?"xwA܇g/ _\U1k/vL@f=c@yS@ss7 n:m۶{ mʫ@H\fKK4̘1wUNȪʫ\gp`Ȝ|{5,kIba/"ӤH,! `x*n+xLxMKHaPX)_=RD W똃0.6k>qr7l؀T*ZMoQ:'lPMzy}+Mx$?,rλ;=9FzRY6\|[/Y7da엳%*\㛮b բB*M%%in)OS骫Lrd}#DtaU&s'Hd- NX?vEܲżC\C|v`IQ.͝*9^,Z$vnKk!ct*Ôhyy;%MA @|6~vo(x&"k =ት w6(~!(eP3+ 7mYP9T^M}ʯN8V =)S'XdkuEnC~=/Gg}To¼12! Nw_!h4>ַd8bQ@8r 9RoeG `SPęr6;_2Xd425M `HtGL{ yJ~FS5H*7?W^^+2&oZ<땤3N?@rm8c>`?T`0ÀC$2jk(GB2"ڣmԌmR=pAa8&[{ cՕ9TרV@Ssk.vFӟ ]5* sK?dJY!5j."͌1bIsRdI߼Y' D{',^Ze-j/vbno1oxtyBoэigo15΁6.kT{+k_nO)_* !y8~&0kفg߮<1vk%{6587yUo}em;n-{m{19})%[] Ġ~p!4 ϯȑӬ2CeYehßf{=Z7uT[/U{l L, ubǕ7Ļ*?iC~A~3j6plpgV{׽OY-Vt29%YfT+WAQ l4 J YRSNf,W'I!d,by~/]/"'~Ca7\A$PY9<O ֞?4v?,Yr![-':utLk3@#͑R8SbjZ(Q.Q]1 Drer4C2gtcRG=vlBBV)0ffd j#<px/5ԲvKdB@,Ov9."T1"!2l96LAe%$ݎr;xTs}eI*ɛ A?"\w+V%ʅ55\8}YWV'CLBM?5\}rr/Gp} 9HfLCROL+UKeB9 ۺ_aX3&S哝J`Hxo '~Cӈ ujwŬJL}yb :LW(AU LFثi1\1G .SX^ kE \D?V4EMu$j weK߃a/Qm;:`h&fR#{">TMv;qeH~`VI~#'Wɓ,Sc@ J5GĎ!WP -(\Wg\@]ֆb\p"-r`S*nbcc ~;2VCLx͛ )޽{Q=+RF\ӯu pǕcKi{f|9F WJ8}l5?k7:|ew:y ϕ(_! u ouaDŽL%L{A&{*Mo~O;HH'43g*yG%!!k1L'caaϮݮ]f&mbTasĸ˶dZ)S\h A`}Fyb17o9QtulzHW;quҲڳ۵J.C MODTH/^\5y\!x:4eyv"n噷}1 ӏ?ֱ] _Cfq$i̒5+ڎ>aa9_}z|#*1 x x}W3"/}x3s|R3@j1[ZA} c"K-A:޶O8AI !Fj@m|ٲ?ֈTYR5?,N;Fp(ߌy‐ @C8b'֞n53G)(s" N`C%4Ajכ6ordb^Ө';WxOe^s `#[Е9C?qe]), :nџ;wMf})IR$l>]*9Ln!I0 +e&鑳 eE-_4!q_$Wx[̦M(efP f@:sVhY @>3C^FvSvбiS]WZC ٞ( v0K\[p~ϸf1˺w{W4nʵ׺q,c)E{RoP^'^&! \M5”\p> 1aL14Z m]niN(Ĺ*P 5c %⢉ ~nBi6) HYA!^F, (r=vGXhE }&hNbps7} KO=G:1d_ i^mP#E035 PG YR3gL] f̞;R,&RaA@𲠍sg@V׮quJr}BE ZvߜjP= 3!P01y? #%} ZgY +sk9b.e9Z{ybpa ccs y36?TS.YLnP9}ݔti;z*iąxل_Dx}0n!s@ȃxO~W0QHb5a+cdD.ل)~l&0bPF)3w !@H;Bj\# u#3oT2;8FߨQCT풟Wxiտ W"ƘF 8K XE%/`2sС;Ӊ9:쒦~R{930iN3=M>Ph㯸\ ,\$"rob5tc A`9Xa6koKGS _) :9 Ə/YBk+Jkڵ32Ȫl9,U_jk~ыr D6V+UI|yDmݣ ٷz?Qv3`1PJIX.`"(ߘ=eb1ƍ+VElfNy%jEHNv~a9f㤛|\}Mok9 --ĪJuʢK1TXSNY b %I,EJuDߜJ%&Πڦ/vIAYL@(4Pa@ 0Q+6EpI9*O;909P!q(=[{>PGQ$t܂}͔(B |6v?Y ƭ* st'~H/;cԓۥ7Mh03(I,+IW}{n1dƉϗ]Ь}dd VH&˩N캶m7LZ0! QV@CPʷ̏X%sjItqh#={8j$]30`T10k2- 4 UPQnzWȉ(0\dw9Ww5D0n3qY|1`4@Xy'{OYU+ 05jǎ3\T/ۖ L hyANAʜAKv0`͡!ִg2YV60ck}X &Rp'( x#x=qS\  K捛nڴٿom v'[jf FF>1C,qlj!J$5mNQ"^*^k^)PW@xڐ}2w :ixEaJzUU@8<#1 r9axmDSO6LRg(58VU 67KalBLcKlL{EpF0' !fx`gb$^= u9WБ5rg+D.e5M1(h \wSOi>xbXxsz9 b̢>!ldYhVP~e3ֵ#//b1T{n⛯V13x7@Ε_9\Zd LկJYvf%--.-4m/\$dni˔ܱb /HYLL @^&7؝""ߟñ !kLݣ\a!\ W![0 t>RP%!de/]&@d A;1Li8q{\h-i嘿uF̛os]o\djS OBO!GVlRM~qꦊ6D=>Fr"?AlWXdaziZLV,ZhI IҌID"ΣǞ[cI`" . /uBI.8HZLwnze>Ӿakj95D8ĸNRWc $,q}Q9{+ϸ-gZH2+,ć pDN^-yHcp?mj} bRw]30e| *]meӧ! gAOm|ad+8p ?uZWcʗKqYyS|Z 0W9h܁ 1cXW ~rBa'0A92 n]5{5h.֟1q%(3//)^?g^-En۾ILYmnR4\51FD. Dڈd ơ5)i64yTYCP3Ν6(`97f@:u֦_װ`h݋iIPK-roe @*nRTI聍Z*(( ƝCx7.q>%vw˹YK7xEKA"TQCn?PxD#w G]sUn$ +/u}2I6՞@5Hl>$kb_ J}ףpI k.33Pl$Am[u"T.8ܵ½"c?hD`zjK3ח0Q잁a/ѯek# _TH?#@M 1:sk04F|$ W =~앚m~DvaSm[+NKIue63F&@ I&O,jPIFnuߕk߶-驨5M^ rēĀ|T & **m5'R h!\n2.JښLA6^vS/bD## e^V9{+o[A?0h0RBdچ2ْXSW es?B}'x.0NTʗOmg̀kq.P3$Je=J6F9Êyܼw[VLُ&Svp&Lvi.B&p 3w põVסuu&B6(9C雚K?V@Pe]Bh:)^ob~A׋ZmmLnj)nV2%|4"uH4sÎ@f &Rs!1`a`qk?<tn~{D@Cʾ?(2߈c+,o;7Q= nܐ:+=NRU,N 0{oŋqx2gܧR]kq*}H#ʤ%OPȚ1bҗCH:FwB󊕮H݊n-ܱӭ1dU=k|饮LvlY/0xP{"W.&~p Fie2?1GkmֺOm3NO, ͖R>5H'^r=Ә,{VO$%0uZ”st'&rg˼FH|4d64qtci' _>Ъ>*P^k$7vOZ=ih*k(iXb$ o.b^ ~މ@p`P=}`ح{]%WjzRX&|C>HvA "9-`#hx?cP.*VS8|>1|ȍ abd@f>֋p6']< <线qPq<3Dy !@7mWY1 <@́! 8;"yb ' P۷ czsyʿGyVofǢJsh0{vT5gMCv[R5Ev3~q7| .{350/fl?L A1)t#ND uC[1rO J?@-9Բj(b+ܘňNֳdKbd1 P-{>9;xi&җ\YgIW]j2l31x +[^I<pZ}|37sVFF8t\yrlő!~1yaz gpa`LdΌKBwPjD XO~D_DOffwߏէIk#8Q) E8gaY,!0 CBzn@;2 ?*ҌK4,zߑg&H&ӟ\JŽܛ廔Qʜfv)x)OGXjW$G"! /[+ŏ-\9m!> c=`8\SX2s]~@&]RK P>4nXÒ Ld"@"uVmmUpZ;w2BOA `@xȏNB9Eej鈁sq 8"ksU땗(^Q+ n?mdR8l{%/?qlω=z*=üDBSt=9mywneĊTz?]"Ոߥ=^]o TATo*sؗk[TU+8 ?>13RDw$L^eSW͘a`FtV$77v="wIecdxeZs-/p5zn-V$m@AֳdKB3a46,v/}{ys҆s NKcHW;Bݙ'd\Q)OQ[\ nPiLyi<3l߃$,CJ2((_5@!e$ϓ?A+IuPa6 1>9tN6 _mn Ыd.r<"Cer@[=at2YOL;@eGAa۹kwKJ7MpׯgKұfk|[ұ^YC|e hNuh>%%vԤ[7nt5yNP.] "b~h /_dFj5jS4CRUg?oٍ;l [}f-n r6\}pZ + `M%C?[9l,yfcrtޙ/;EbƠhFeN`#5]rLy`+JC4CHh9R(3c2W,FOτxmvG]?hi_3-`})jLa"! U! H3:7Z׍ @;1Ÿ2D]FgE2 '4xy|oް1P98T0!Y"31쮳GÛw۷Ovc*N̞&nM'Lt4m>Cjrv ;`7dC Q/dBWq#ubf\Sy 1Sx< 5izh"ƔZZZ7:(O;j׸";qYn )n_ft;# _̛ov74phW+UxO]j}R+N4!#&8D9g:}V;\޽Iw_-Ue.ޱYҍF T3`%.>G\%K,B!!ȁN?@_4:_v[=KuS\Z7XGOc, GHuYg)tBٞ-[ 3`ϸVy?Qu3.,R'Ou\=` i .8R"ia X9V9' ~P=53 Tp?C@7@! C%=`14Bx4sƐCF́U;:ք?!9M ZJ?1lfR'?5cZ9 Xt: @#%-p<`ɲo??P1= u5@v{du!ǐY:5ka HH@=WGMz09+A] H8MdcfR^#"f­F:~~u_ w^TJ_*7\oZظ} DO4!}kGe<\9Ŷeݺ%;8.K(06"_03N o+X޼#M4|1Ȟ=N V|((/3O3gY@[^15%qL;<9q1$;̚yJ싍j0^-.ߕs2?P~B9@j$E T|T߷oߠE拰ĘMqE 6¬ J@GnM،y_?&1$:3&Ly_ߨ{|6 77뱤z*g4`!!E@n$OA*W8ҫgNkXOb31lw/,>e!iGfH ! -NGBffq-x-h? ;rX,cLyԗhľ%:Qe=a&R͙3gĸ#ۺmOЙ_x4M\mAt`C /Ģv^k$H-\/R4[E2%gܯߥBmm@#@_뫞Z 9~qn}]gZzL}v*`L˗kW(_ h>9$:[AK&ՙ])ey{|פ3>IgQۙm+WnʕI3G9U4GFY>S6ﮯ/߯#&N0h BXO:mذZ˵fr\@/1:ޏ?/dk6_:COnk㦙k `x`YvHY  n BàŠW* 4ԸLƸ6Qx,E')P#%mEd l0ڻݾ}G[vC6xwG0㏛ͼZ˨ jJSW ϹnZvseo}0k`f HQqcFnxSݗvqGݎ;%\, sI зX۽{:=wNE*`67UcdFFDžЮ+e5 2#8ӟvIۻchh&l~c p8KLŷev=r(,T5]}u%s |^5 `镶^J2FHhq=3\ZVgNє`% s Ӓ 4͕NnC`Yk)/̇7&]yz ΦxQsL ߶=[I[m+ պ]Iyijq࡚c'MD;ޕ)_?+{Lr2] e*ĸ=/ć?_':On"@r󗍵r8EupS+r!A;`ݮE1B$ ߀u<;>g P׈t_^=0:aPXugf=ܴi9NZ^b-TH-[VXտyVE Lx@IDATGkddc9]rUfXD290ZyB`;Tw`ͫgh9ݚ4Q;b"c&w2gZ!\zi~G!ozA~^vޑGH3~j=מyC'!!0 ȵBZ/[Ƞ|si^bRT=VZ 2ie-4erXبdW,m$y?S0qRG uzv,VsKtw*8p eO*<)3_ܩp^,t'9s[o: ?<[SBNY֮] %ew-BjJᓵky|\/s|@>Γqcch% _[[<30i/[漢B T께~ n̸Z#qxKs$Dd2(}H3{dsHo}1]I5>BeܿPdw4Pk6YM]z=΀E)xE #'c={Iz%-iLz: ;kw G 6C"-Yr1wKﵶV= }{ޣ_:B#IOaV6BP6ok&HW&)=h4K@!@5"x&JxްFA[͸H[o|mҮO:<ۇ{8P}LОaKqɗ]_w+9f}-D=l O? IZ#[|l}oiK"^Pl^mm<x95\tQ0^'M?${d:a5Ȅa;)b?Ccޕ!YKb$?/+5Ӄ=s`e 3` *]vƄ=N<b1[\$ F1(UhUwiZ>OYfRqfNfNimsKDt}n@ J,xǻ%:(wqyyEA}$4ܣ x劕&ܪ()~C~\6B? s." iznw^{ML1?wx!,:KB9l W?_~A{cDsϋ/.WGecjf bfV )(?9>㩧r5Dcq .ݒ"G~msJu6(G%Rs"܉Ov9b<\ǮЌ7uQNAOnذA{Zѫpq;,4BfYgY-JY:$1 @5yנ-bJ 9L3x?Lx{XNh YV4YxW3^dzm^"=AT_ T~5FaбqI *M *e)SԲƩLK~i ?~%nL EhߎI:ʘu B#lշvHm@{Z*8HY 8qLWAUDQ$9-\D`Т--+E:ϕǟU0\ƌV8~rr4 @H佳ejy ӡdC=l\T ]sg1iND@H\f[Kʓ`{مrȁ] @9˖/7uzkp"#c"?~Ifp|!$6h!e5}B(D0hFW :Z`!To9W3zQ:(uBT's[nu`̀6ORBLQ[4m~pAtsNWuV[ZOuzIS gz+pH 7\^࣊PZmCB~UcOj1>kvޘ ;66#[_?Y`SNt7( èg!/` |8F7zgUhN|٭/]`2]->%ضTܯ#IiZX܎O.3D ER 2|=u1~<͑o<@3]"CH.D;x3w0\=lv-[ӵCpw㮽`q"ܔ+Mgw*Ah1-U+WwP%~ _*cnFXFͧ^'|MDU9v.ĉ x?H]O?g<0 YOa:^I{T8߼߀R>E3y&n$6MһWKZ'Fg|lJ0PŮ3[~c;Ғ>'}qNx&&x&a>KÀQ-f6-0bL;q>131R;P)^S%E*lHQO5{YEG }T d8kO94O[/vkB&zB5vi85kŮE„5/|Kr{_Nûlҷя~ԽCaHػqijOc4 B,C"sG矶|4mdf6pT&j1^~e&0 (!{%]55VZ%-͆{-koa=ގiz2,-vTw 8v~cT :): ^* )iFT6] T.9hhpǧzSZ)1[N{O/ Os4=Dx&G=(j!?jTD0S8]“$ 09?_|~gyk޽r&{˔і|\ oMO爠9{(rDXwɇFBI\ W 9L,4pj-$4Q {n (>]Z]?{@H8./g]T}a:ojbsd;X̴Df< ]iӠ[_`o~$ ? ߸+nwkr;? & ?6]iM9 -b|_PTX0eʔ\q|s K'M2a1e~C)>44Z8 ;+V^/W{0?g/So$v)a] M)hƹ|=\Cjp'-312YhFC^G3ϵS& uG?x-x_cSSy,DN,x,=O-qؕbLGQT*ρfctlۺ?o6s2j(ʈhѤ2!?@4 Q7 @_tμ&'0# =OvtIlW~{n@dR/͹y$dT7/+Ĺ M"9ٷ_ezֶS!m>BmJr>AZ YbXK:Y"AO&±-3JoW[֭skܿkOW6u8*qz|`6cI )<; !N< Ԁr5BH@Tz )`V%. hbe;s׮lV/%)>عsݤspvT88ScB)91͐m]/!0@l5kݲ}ݵ%.59nB#g#J pEY=(TKUeSgzxʌկ=o(&1 }Zc̖^M+WLÒ@@MRǟ̑ ʂuQQGc˵x=?Cc+Mzg*N]ǿحjB? pG{ۿC1\eB٬ͬ B,}'~͒K64?=Hީ):4_*]2-=gv^_r?~0ϋeFG[|Bepdgp \gvqurqv40Ɖ_̔p80WtD.W+aXq|"@+*.3Gˋ/,W/Yveqbj3iܠl}}6n8x嗚QlZ\$8~;6D[oJ<[D3 @FvVT`B% ^y/=Bn*\1@1?}ŰlcH`#K.Ot>&s#.&8 ;JG/x;05FqWu=V}+;G-R18l|D u'd@ axхi FH3:Zd^h98K Z9KT镐Fw&K߼@I-> y8[ ܭypf&`08CЇƅ'sFy{|v!ů/W8zƍn俺eZ?Zi5BVda>o~ß;A?*?4@HgY)/ھmG8C^v,j$peez洯X\rq=G384.3.0)44%ļ] "v:]1{g9TU\èSQUuێ yԭE3 $yʵxҷwӦ*"ƒy |饤 V(npS.YMOՌf 30$M1BO&Ju^11(WM !b#Wc~6__3GVo_kٰ!xɒ%sE` X :_xD@0#ˣN_"fzrGKq{pA F20^}eo*.-/g.n ?GCw*hn۶M橿PBe]߽g;:Ggǧ/=`]Ģ!^881i8вڭW^ZgK>|ont|,jqi&@^782ri%k1[y\|DHeu0P/;&![ر߸a~K6=3pbG~Hxs]\VU]9@WO⌆D#jEO<pیDN]2!'Ns| X1g tp1[Ĭx[vʕ+[rOq՘{n q< NX:ur$ezPS9*ƜM>7=$;(Hyb^{< )J!BrSn9p{wgfgs;A0(5ªo)ͥ-"^`,7]-yaנ&CJ믇ZCEZt1=`?x05vP`yIix85۶5R[jtajpPϛ/k&MCX7KM dӧ )m~U;O<5XӀ \V-+AXO3֯ې 0;ͷ(.j"0u RZ[" 3:ݝLtZt#I$ܤw &?s>PQpmHW0`#F▃E; sg9QzxK: w QHpx_ZLx zB @O"Z)!z?uJcroo>F[h=f9vs)]^׮fp)5PlRIi1=r sw$:\{ ?M^>) E>oҟ_Ǝ+o\0 >-p97sj L&m^\܃*n*!dغe[vttQw`4.}f"dUkT+6u5uިQ#t#xJiX"xw0j!oLH@1AZkv=xFXzn݀J1u90R=9_ 2%o==pp7X'NN ׷o_]-Y>9!5=~X9h@뱂m4hYcGh7F̣;sJ}pq٦Duf>0xYck5>k1m6r450>\SQ |w=^C25@ h0Fj`JBJAOD˰Ӧ˖wߓ~HZ-ݠBg>sr뭷*3\'.X@bcciT.:5ჁA\„>c-dҼe\( 9༃ դiٵs'ԋus˵^sg5jPN! 3J6& @ޓ~Y? Lǵ9J?RdsI?@DrkϬu™7\WrH=sx8CGOzD}=V>wߥ@ޖ<' 0H&"/_%|?2AUr/|=T+ % L"pSz]ɴl .p"}~.׭*k@4]̨#Z22}uƄɂP*nR3ke$zjG@8ES2,t&S\;w.}G[Ѱa#:/Q s z\sM tyseT?<?r(W HS!pNps30.ٔ^F/ES}$.A @||~ߜ(88YX' u2r^Ym0+A:bwY4!oN.Yc&`L1^Tؖ-~3&gQAH0+"^U2RhM9Q8}Fb?BҐ*WF@J0k@YQJ<>$-Z,|+̀{qfpׯD"/7_`M,tڃ[/YpQ!kW_-7x՗T{,(.HP1q->sgϾxAkjdXNnI*Ք4V}Nں^׺^g"1UͣpM O4ܣߋ'u9/\aR"ЧQo^^$IT7?.!L/P"H d XNK +W- AP6nښwN'aq*r@D=rPsWy\NЯˤ^U撦N9@8\ӲqT[L; mYq ܊oCoULKP } C Kv&aC1`_&͔s~TTπ,l(LZ=ZLa}!f16hߊyG7l5WA?}݊9,ǫ#,{}s^*65ϻ>/XȚ5xӍ PXTQّ\{k܅kpgJ@>qa'a!8ysLXrA kf(`G|ItSHbz0#֫S"־@r2ѓ ɇ ' +L۟-C˱+vgU˯'!%: 9i[QJui$u,|MLrCVIJ!Ka?{7ҕUGtrw› D3q@|/_^] "ML9b)K-h[U~&"g% n5x(m^ /" wԔ*$ߺE"|*+N\Q 7,۷/_΁UE5e1hYPm@**;'NLvZOk=2O^Apd,0CCZi@jTrRzM [61.gIoakҲ@Qq}p_f!!!HR/y&܌>;zN zr@y5ɠwpfoniOqrmM_ji8P^{ydl_~raQ@%-q3q/Hf͜Y{Ԑ)\y(& tG̘!Ε*g9Hs&.N+dJb?\N>>=zH{\fJˋ9̨@V`8ˆ֎#V^T^<);l*{>L 瓏-gHVsD8\ۀ@DXOK:,qv}oBvkkк([̓eB>@i|鹙 }v nԸ2C`tuZюsil=V?BЀ[GA_ϵ'UhT@E|ExٗB{<Ȟ;}˖- ~LKgyA$:Yݶu͛r-[_[Ci@1 H+N)ȣ>Mj##0(w5HAd0+SAxxG2G֮.G _vNJX5 Hᣚ T+3IEڪȈ-*]}nP`|S=0 98@'Aa7rnbOPh-Pp' 5;u4VeE@DvӛS$abސ( 2pVR>{y=j+yq i`+ (K/+ ***jj*aXF6Dfcy `\} \s&$]~ Hwb@ N%) !׺wi8BvTʧtsBѓ M`]VV@z v4g -=s0M@C,Ȝ˛|GłI1cdɈcwDկ/,r|XR_s sc刔j5(k%y9?N=?π75dVKD=Dɓ kp;X8wOHEG^x Λ/p"Hx]9\3 f Akr^̿uqͭ}:ȦMCw@NPof[6)Pl( A4\nݺL染NHT4N&Tj Zu5~Pֱ2 Y9S66"哻{YŰ ?P84TDj6}"^:M3kK%J`h@%ӹdAԗ˘M|(6£'%+}_|)'}a@R=RtO!AZ,Y6 &w!_])vt`j9/Zr1[쫗?D*h0* !nAksWWIw( Rr [px_ a .*Ý4]+9 `$￿0r+?'X]0j2Vlll&ڧƿ+W`"'n@Myؓif]MkqU Wwȴ pROD9|ZYS_5X]r(2P(>޿Owr382ӽ+>b\4 y ,/ꖧ*T\=+}[kr׳\Z[N疊?hp=2\E X׃U\gubbbkeX0D-Z$ JtɄpd+~t,i0ڱ[#Cb0%!({t7»#KwQ {>L2.*wZJGΊrgPW݈ն7 f{б.-T#pq*3b@ȣra$w^9~Zvڑp89ZZHTZ1- ŧyPKh|xhҤI`a&V7NzB u}N$d1WرcG6ڡpR} uWp>ڙi<*RSULFC57V׎Uap8#;sq2ܾʖd:HǶ^ ܼ@8hwK(83iHXݺ*ӵMȂ_!%ת7q^GAzjt9✞vAߗ'`N_~ /ȵ^{Q7;I|lzI]IoʮA`>7\}љ]A],1n6Ϭg}v×!xiJm,*KI  ܄>822ҁ| 7/lz")\98}++cs{$B~!-TaCU$q> f$2^8?N}?GRҤ>5͞L)r%Ŝ\@%?,Ƿb]0eA h5n.t0dcT!3)p·7< *>!"sо9s'7$&&F{9 .DF0S^t\0zZBhq@sݺ:K.{ի_uJRm@Ҿ$^\7vz'/hg8:(`~/Up`pIxBW_&^.  Bq`K&0AǶ1~ga=zJUbr%@:`$.[.y2er 1]A@IDATsW^)AФĕ:IN-ͷ={dŽm,΃q>ƿkײcRy qJ#-jϺ/wt `A8p  \o,J s^]+Yh JHɁ es2drpRI@_c >mwoE q9}U*O`z.;v 1VQ;w\! .|}0.|lI\ /61mڴ7oZZc J+omae.ԧ@Z z Ԗ|)s9Գ;w~lSC~a*ݯpؑjp\C5X@g~H=s8l~ek͛>V"C ^9d+pF9CC@H* =q%c #G/Y״n^# 1@MS@Vºϖ͡E8n{!(I @IRZNKKlɏ*L?^@GU?AzZFa2KuA7B+}k8 _|(511Km׍ML!WM9qAs j/XL ݥ M1Hb4va"4csd(`Z/BH,S^gkAUHePtLC O˄N-mtoClR!`'<}͛K׿GeN\4`ZǭǸt `q[ ](}#o8:}Ҡ^4>(`/>F&?QjBZ}}Nk ڲ>:u~.p#]i =f)0N9i=T\,  gd:aSEK` 5ު֏S!u;} &Tr5zuTA>UI>fVKWHrh:|JK/GN}8uZ.Lh|k(? (m/\ Hnݺ?/wy7T-͞=[>S9 [<^-e e 2=V{ cƍ{|I>\%Gɘ FLḥs̹gڵ=7\(WG}}}޺BoȺHBQAon2D˥]Z²LHӷp b,nR/]I^=L0Dm` deP sz;>D5[½pth?@>~"3߹G}Jn]:::=  J*wf?o[[]tYuyQFIӦ\J_[o7IB`B_{NKmnܸ2 ho׭> Wbxwu>@<1;5pCffӧ/T;?h Pk,9]G+ETwŊYqqqAv u`^6~2dn*ĆJYS?y e.ZH ~vCjb"WO?, 9]#n{E}o0? #AߧfGJfTP>S k3={BP_=g$#%iE \"7MMC)9&Ԅ*PJ0W}Vu„ KnFF].J:÷ ,o; *~ `Hs+\0L!TcG:>iwn !XYfPf flZ0({g͖ah?Y)lɒk\eU) rE#^OX x44VwPJK\aٲeq%ӧTFP<:R`i8tAZQLyWk],_\`Y[. 7pOq(CÔ_0_ESX8 HA0i,Ag~|㈘i>f4\ݼVsUR,35MnڌXEB`5$7Q-_!; \Wo?K׋+pa gTE&V;R 7<ЪW%@=6  \(8+O-+[vؖ-cJˑnuԩHtH罢~D?h;-,BP0]u\xuoֺϠpoav2mBUYe9@THM<$arxSPRPkpu,!;tl2Ev~VT?KsXŜ,>$oty`7 T:0ɹQQQH+Kf5ï  X]YY. @{C5zѢE3_{5 2/ (Y&`s3ñ~QzF鰕F[}^3z_e}L2y])-`p+FV`f6c$oܨ{g: b8|e6GNţbÇ5L!z=40)^ȺjL?PwÀdgF̴rpb_f'M(*_/VSGw s7 Q1o  Nw8-l2"'v-7tk G0ȦRa ,ВF:52 .׬A,PeoҰ(2n *km,2FG}t1c6oZ(y#(vQ !h pHhdɿfйXx]ǵq}Z;b]FDŽMWl`\Auq1@'`S/}bI?uJ#O(%g_M[`D.D1`^پ;z֛xgzcϧ,䅁!f< qg׾0G:vtp o-;2Ѐe"c@7f!F+0)  D̍JEoe/I2e jyy> g1w͝;Wy{Q ` TzOv;n+Kf[+ǯfq9}̺t /'N#-犸?s @!)Kh/ ~ȓ 5Sk\o;Lo]\}ӧ~b\Up?T563@ 34Q3H9̐qV p ={w s4e`-c>)|JB;|DCCZÆà6|׼zo|Y72ۥfN̿!x ]<VDi?"]50dCanqIZJV=z/9 \szH4h`LPl)1h^d @ŧF Պr 2wj]o-h_ףK-(Bɓ'{]`OrUM2C֯_y—1$^Zx2ݝVoZ*FyjpTp$d'm̀~2>i;q\a2ta0&_4H ##~MjpY?9/78ߤǷo3 */.05T|^t ,T-H!v[ "8wJWzM S.=t{fk(P(9DZٝ)+'N};>m۶rw˫*LLNN<)AJո8I?xQWur `|{֭Oх,ͬ2Yǭu]>KD쇃{7mڴ m TYxO .70KWhO\  =z˺k1] |aCΟ F+T*@'c >Z/=q@I,JNyS/2h*_2C[(U nǶnWݓ1>xXePZ1Z䇯pEJXD-*\XPDgZVeG!9x(#yGL3 Ljn=&7T+:`i_Ꚓr|HZZZTڵU?k ^j&]ou9o_ؖ!=MLL4 `p+++P͕H -8l2˦44զ @6A~#W!}_ZafDm ,N"XŋsL"۶A{̉9 f>hb~fqݣS_r̭4=NV,n|IcKbeAy P,~vKf͚wjuW6^1۠ZӋ֩~ h^RgQ.`u1͈2ŕ bq׭z<#% A3裏.@1(` RISB6lg̙bÒ|K3m1c}݆fz^3|ٽ{w.Rs ΥMwMÇ0oJI9Y!O N~qД[B1\a70C'$$~ +\0h2>('K}أ-kؿFOcC?})HWTDaa.ng Tr PxN1oO>ꝷ6蔱MBZK|+#̇Io%@=e}SB Otz] +mu{nbP/dl5w|x%nQ n<"jp9s9};&Ͱ\2d4_vmvbb"48ȧ?JÁmZ#̆K+z]/UfL)h,l#}mXd.1?TG/muA`'+%0}1@ש]$ISdا{eqoM)y%ɐTuK`BGY #3(|BwX0SpNiFTېV XC*-[%ן\m[ pm?pV|aسg@jɤhmAzrֺ>F|htG<#GsDT]l/&v.Lw}_i i xfzs뺯Y|euY}L&Ï )q??8ԈWv/̨{Znm2C1=kUN%vpjmiXSWQ"}%s ^RBL_ Z[Z\ !()C[ɡ+aDL4GA\@oa T4 =cT0{fRG7"(uឯBZb^>͕wR \]h㽯Dst rɗ+ޒ9|n]1}U_q^K%}} Z67޸A4ê XLA #s率Mpzzn_󺌮Syײ<}SO!` ̼ׄiO?wY |~}a@[]B<׀ÇKt*(',zS2OB{MK6ml}}[0_ _XӇ _~Q Zb)sZο;W&^ŢO8LdxiC(w9LcP7%iJPfo5JHaw2ּ#JKg74`I][ UEet1}KfJw-[֭y+ͭf.SֺukgZԩSzDQąFBqM} ۶m)( rz-ɵ>Vq2d$"2vݺuِE"~l@)@hZl  '} X2c hޤ5N&)@f0-c׿k5~1W9"2dϟ:,`e^~^Nԟ]/-,yuB!7i@hdb30?E$ܐ58Y CzQZ4MưL}W,-Ӣy܅>oi]i^ px9Qr @F/KW(p_XOs׆nlM4U7oѣޣx5Etש2|J`@2_K0ڃaXjjj4lgPAo}U?ZFk?5)'ig]bir UA3[(2`,P6܇-S51B'.D0;h m#}mX9`]E dI\ T:?_ {L2TB 9Zu-f01GEE1Ai`Ú5kfOL9@)<$ ` +/hԬ6 aow7˺;ƶ񇟏bibO_@cOBP}6Vk@ QvϘ!GV?nNNjj0liS:C50@zt_}-xC2RRJTnN `o*G\nN2K]92+I=-cAtX -,=%0 uBvX@Xԃ4&sq^Y_/V o31+Nj0_{ n==xSҔRi…\}jZiR@D/8.?SF׮]۴iqx]e.dyW_uYV"d;s=s= UC$=H[1,Q`ibzP[[/YW}i B 9qMfЀ)x pV8;FopedPD:G|1agc͚ * ]&[{OΜY`Ke "&o>xv޶]`ש}T3ȼT !C$ 5Qhխ(w*-$/Z4d@@`P$)@ ϛx$$%!7`7| _!)Bٳg8S-(h&b̯iR9)#H%@+'.hF!VCzo}^GH*(YժUs {i'FJje>$5} S1%%Uz0[2s[}\oy`o#rbgg CU mj$Q &B; *+F=ж0 ; (|`f1oKc,NT8'vOj*] XN ,jC\uȴdOtm2Ij X@"~c8 '!8 ?OTLfuPS)b(؁ap;A܁L'5$VmH6>Dj[.rP dKmBQsw}ݧғy^J%o#-x"o SOx~P YrLw^i~[uk=eTaVp-ߴB`#ѻwHc>{+>Jp`GO%'' 4Jʁ%`Ϲ>Zyc?jt2'k}K@&.rrj 蜈!ǷmLPV b~Ơm0 W> `Lq:>dVðx> WEv,?+'żV9Vc:B#(:~9P.n<9?~o=8 t$&tCPsx =Π8_`ky[-0:{NY P㟴H7mCVZ`qm YC}ׂ7h 8P;g<-npdaKʜ"Jރ,*I*-$&Gξ}(i - 2cwEM(w| -5:"d XlٲڪnjOBEvnݺ4Kg 喃[u_ey^uW?'?U&z-Wku%CM#3=y:A"f ղҢt4n4\f(@&H:;J,#۶CpTZ}cy kRn ?L!^69KD[[Q0`8}73қiT9sGT:q%Q&mnA"4 X֌nP' `s<1)D_̳r_ P}p)lW_}Jw22I ̯ɇ;9 B G駡 իW y"ݥ $B|G<޺oCg\ $9.]7ܱ_E{#d֑} >2uOMF?Ooݲ+mXz:RdQKiFKu)@+@] /-*6@,֩@"OAliR@3Ua u7y}O;ĵxbApZ@g@ 2% l%BS{oZ*6xM[+2:5ĝbi=ziyUR)P_3܀ksOVhڻf<*OEN=FB>tB@ UK(XbQl'Aj3r A)WA@a>sm譶u6mꀅ1 Bv1 B8'UiF?J@"ms`z*؟6uDց}^"A-i'4}6@٠Wh &6 dL0hɛ I\fͤNj3L8n)C&t®Om`hHׅ+\Hiy5b lăl`*p КN%0_=r%S#ɑ5kUaARcAo`~ccp-FgyF@dT(?C(e!)u'_͜-e 0p'DƳlV:ܹ*?d1 ׼je%JNHyo%\TrfƲAaqS׃>8&`0ws0ujVvJޘڏ~P+gӦM0!7p0hQD qrj!mެbPSKm oqqeTr `$Jw$fNNraB;y.YOzcse7OB`X ]D<9MԞ7DM'=x'w<(0WB7eVBQ~sC`V4M0A~i?~ @8ע?Pp  q MF/ILL yh Vߺy#}M~[w$LA@utYfӮ]eBboGƺ.ƍ;or׃ݖݲn,>溥 ԟ?@YIIIPH>@٧=0~6 5*I&.͆hZV1m A.yF Z{F0xŤzb}LuOOQ0hFbON']gּoP> Lnv<ڤ‚GEJԪU˓WepDtE>HTLd zr:sy¿VNB KjQ_]RǿnK`Nw)ɔ"P!dQ@[Qn@ˇ.Da\c6UmiPeB*{4o-*G1(0G2`tϞ.uB#U9s=239v~iqZ7*ͨ!ZI\\69=4**}`lw["5ȹ`~MJ>3[HKO?Ios VsS‵6]zy@eef`Fg("Ϝ93O>pqB3ihhƺuoLףGR"M4(n[!Dkib@E 0N`{c0Ў:8#ZLӦ` R h"`}{>%Rp+Z-/5&tؼys|q3p sXTl0f̘VUpR3gڼ 8+π`!@ -8?]FX 14ش2y]4dzBЊe4-[A͋ub/K |4ĉ;e|e۪OI믗Ԥ$ca SɷtI?qR#. ET Mo\8.Tpmd6l`G_beloo_+"?<#rs@@Zr` Z@wr<= [Hh&PqjvKa9n-YD㫁`HA )0?oj* (LK S|5?T71?ȋEc %>3-:/pI[˒lr=x/~ʼT*dnܸq_a5`ԄW:R+QӾ>l2l($>tm/ dY*6 ~}4BLȆR?66\zI:+S ~Νjz=۸>`((!fP\Wp5Uhġ.a]U_gtk @窫G ܓ`\scݞ)W*u9ۺeXSqrT7#%z L \Pq ?"_BkėalW3.5_ʌgdo߾=נPt'gZnotlxw 3.>lXX\,rr'* 1TC(ukוSOI|!uP? f_1H!K,ɀ o'$f?G;tl?a<;o(//>C۷t)%]@D4p p$08H@[ }13ozI.c `+MŠ@84 (~Q"<{"">iׅEq~,ŨUp0s bhg AN  =P=Cƃ춎3wb+"MO>,fiL"|U%hi1=5c / PAY9ERO,eAQ x7N@ #v4\~Ű m1K`lr|fcP H:t(FרQĉk!~5>!B*f da}{u]3\ߚ?6] @"/oe˲Ż  Zl߱ Ԟp> B fãK1u˗/&baC^ƚW?x@ρXf-9v2g}@׃>M'ѣiOm۶]6U>FCv?BdPLt>#9,x'SǶGm]W 9\7`$WlZ-HP,ءpJxRq*,fаI6)1/1 {kԷ$懾-p:yT9?;`6w,g4_/VXC{;\+;>D@󟊔v.]ȥpیVLBA̿dTXnƍhIA!̙#A%\v o H 4m;^רa|]真ף\0(>8kr0cwDA%j5ߠ `"f2sObw$3zt@+xx.`Jū:c,oeɃrstZS76߰>Ӈo?D]||TaxԀ/X908WCmUA߄UJd5p:4Wa?WQ}Z/Yqqq٨ |0L: +pØu8 .G#Gw6\CV/8pu-Si]Hn ZTb'sԁ2W0#)xaPD(@' Z5oT}JDd*8Zb lLϷSb-H0,ͯQr8|0Ar~ޟ!. ) DY {v7`jrj)S)!Ue'aOvv)|idZ+Ep@SF'^?ɔful~v=2?{jA9BW^ɸjt* 55M֯_۽fZg !@2Ь@+ C0Kb*㚛ko 8ϫտ34|@|><@JoG u)Y+`㦍@WLJ F_|LX2MȒ c\pp8QQÌ. D֑ǏzpsI&LG_kibŊL`I@hU8l R`qss8ÑrL⒓8}HoƆV4An~'jke[ w]%"&ZhOXR:aP$(`ᵒw=zz_o&Nò sn~{o0/O? UZCOZLqWK ڳo?y]ZEY.ZHgݙ&3/r7( o2fh2[7uvd*E#SR@CrJ|ēv^T)!@S_iڍ@FSW^fVΝ+ ,(F% `[jƊ;,,y`Uѫ?cc 7#T(p)G3 626BhI| jZ{HaA' D,yZBtNby`y`RRR}0n}gϞ}?#`r!PO #= pce :e8w,nUqr)?4 5rz.76#<|zLiR}6( W>/!b*ЌN׀Mi@IDAT} wMi]qԁ\-  3^+F4{ 'joivNN>5dJ'SߺU:}d K7)͛AsʬT/Bv[{0o>jҠo~$4% L~{T={圇(8z"ITR._3r)#6P(]2a.2TX? , O-Zlb^a*,P+);(QL!Cs6&<7 $]vyC o2F+5~5]]:^"ʶ^iEZǓF< 2,|ۧu^XhqAV̎(`1yxD,H8HŠ;1\0}9q@,!O)3?0&ŭ ,GCߢvUa99Y_8M4f:,U=-S(ddd؝u -T:'\L2Ȏ}QHj2BAJsȴN 0  I5bjJ3/ 1xf?{#rj>yNCƛs}dǧɺ^Bs]kbA$j.t4P#hkA$.ki:|Tomy@[3ݑ%Xr߮ fS(.l[ 8`WY#ۦMSsɁI'J6z6Z|\S\X1ߦ)SCδnZ)? GsaS{XJt¿(c1/^E=4_@HCöm[K6m5ؑAYFcDP.pwB*!g/&t˖-4tDǖrc aE `}8͎{9*cC~u;SYy0>ShBuuPbRbAkcà \pamTGUF#칳jRJc?F]re} wBae8HBSB[$;O|GnЭZV 'dhUqc-p/1@_mR)Ak$~5b@8`6`(`̏~A-Hǰ5ϫ$ω>re"}>d0iyUJ4i\,04D$l(CoR*,'Ryt{!.t3I$Cu;u}+Zf:Xԁ >+M3K*>1?T=!UAF|߾}GAZ\%`30mVZ22#+WY-{?S}`ϼ'$ R 7H_Zsɒwuq  >V0MI{׷@Q|?vmu E@dpI*n9P"]`y@.ˇa px>cȐ!!tա[\~U ](q+⇳c]#/\i#}Df@p7%gy/;?"ֿ6$(D x3nw@bccs~&u9WN׭[J<>ri_~J[ILV:o;?:M]?uԕ0sɆV?&]PO֮lON }$x%p[S{*}zK1c..G &}0`(w iޤ{i©t uzFD"adP+ЕOHՇLPx8A2@ !\Fx_~%ǟKXXT$,Zv[K"ýwDZ?ZRnyX(P rvr]@aO4IF̈]^ӧ4m7įYtbf2* Af qd:F?V7u\2nG'1"auʩ0+۶mw^FEIZ5! r(,s*[8bMz: #ރ3q*>l`w Y`#>3F5kf3+ev90݃͛@9(xcS Kw.JQR?OY8K78ӂ/ /Y>Κ/iĉʭxzzb^iE8VMx#+6EILhǏE?Exs?`HIkA ml'59at dB 9# Ý9{ԔԋEU,`B@~4haa23d2B|i`P" plqmQ@4?,Y$դjg4/HEQ_Z@תU+tٜ)A8 Du!hӨ"# 9'@,s)4Dɂ?4y?j+A@og, X2E{= w.+pO}_pZnӾ;w*K@"= .`j 0o~?>0?vO@i- 9-i%y7ؠW^FZ-HJ()yQywW*'QUe@"D >ߝ>'lg19$DFrzOow_}oy[ozzzzzz:TUWUoXaMPr8$$ffჄy9TkX5mˠS3_T6'fv 0$L.YVwcL;K;7` @}Bt#KZߒ)b;*- ~̈́u`?^‚$ @0Yt&/)W=׀{FJ9s˖/sn?Rb4gf$t:lȄkXK«c@  " [ɰa 5xc9B0q?X7B&W^{VONtByUrs~(W[zkkNDŽ&1t~ LK$ݢcV-ݩ8i@ gQUC%2;$ɧK0KЮ ?"hBOJ'쥱eE`'Mٮb~nƊ"l_Μy5|!Wݰk5*!Cqmv2m`嗹\*V2%\Կ|sk>HN f-9ƧZm^ڽ!?k+fTD{Mت\^ae>l }L$yG09fnKUJ42W y~.-#4.v 5 Q?\&+eNu~9:I]ߴ*8d'# .Y"l~X85f&30 kʎ^#8]@{i-M^y[J-)DB m5`@nI{{4ȳ t |X[sjU04<<&P&F&/1tMGyE^e\h,=/,XLlR@mib҄Q:$LhMPVZfi_9 iM`<Q=L^GM3 b{JMu`̧ʕ+رmyy3߯@| yE!ţF!A&"<:Y ,|CIœ?%)5g:ko#LlV/Bvj `kkq/ME-tv]chTq*k vr4$FTN{e}׾.b}׳/dPy~kNw,BjLiOASIG~W_};s\e z5i$%`.)nlD96a 8<<@3.S|Vۢ)(3JbRcwy4.-p"1$Ԙ^L8:ڒ)C>9i1'Ӣ:ھ}!:[7dȰf98{{ށ,8GmaR6>L0[Y`D <4! P{.d,.qb!-08JE$36yS8V_SX2e[.[޾rt6ġmbgl ;]ېz{$O%: {`m+ds;vRJо~̉aM?w⩿]J߹d Ab=&!5vbD7?f lwde2``B ]Σ1Y9|R a0ddӦt [DAZ_`IܫYr,Bl5B`i4|kѪ &~Ĵk$T-Kϱ񽖱!BS^˥2_2vc=:WͶL UOvmnÂ2a"w?@M? Pmc>4i-Re|8;F㼯70É4pY!^{ѓ""M_‡;̭?$x`7CE=m5kݜ9s=.ԉQG MY`k.^ӕ2Nuќa_,*h&H=LB韑JO_GnULZHe!?}XGqPÁe@SYYY&?É<,hI k$j{?>WBkZˌ_˖'h~t8Aɻwֵ`'~EN8 t<C?R װ!LP*PaĻh$6Uv!c")>QhQr5k(06XA*%`{- O=̣AAP kf"'zO2LLC{rMfZy0*;NYvKx6(W\i˄l_ 1o}ΕcǺW]i4xnWOOJw }.5eP%'Vx9hN޽ىUn,dXfۿ>> ӏMcoD.m',&!7DqOhO€OpL -ߖ66vz4,l0I>&OزB]Do?2e4 q2誣-"v[؎v"!#3E+%l%(ߢ o[-"dgW*!%-Ze{44xq7p㪥,t?"[[.nNI-:v: H3TwV R:-u2ޠԻp8=rԎ8n,``('>C6EcHbs 8 \\rӲk*SN_y?_6foW/Z'nlvHնNPbyC=!/c`Fme@ݵ]ڋ-栺ܹ+/ng5VA,5iLp.6Qie6ޯ7oxFJ C62znӽ\>OBuVZT#3 pҢYȀ@OxKq-\ 11@l $x6, jd5,m C窨5QUk`x͘hj]8 . x#-Rү_v0)'v= 9unk`AA|KOsoC&z$wymî5 '%ljM^3W]^Xdҽ_4_gP&i9˽'^̱xV1P&a8c3v`vްKm5?rN][?%0y< l:.?U;BR.^(hOE^>2Z+hXOc'N,W9 Dvm8.6gu &JЁc}̿:c^Em N' NB<, ėpso(cQᇒBysÐķ+kl34> 76_$8kSc:v/ qu^^-<<0Xq<=܋Tq$i'|^vk]x/zܾ5x?:ؠ) ' 1)E6;ܒɓ݁]˾F4 -COg"|ٮrnLg6ة]9;\y}j)nIn}XҒjkI?Kl2&&+H%%5=Uߺ2ZK`}[2Ɵ=HbV P˹cFH3NѿRߗt[hGPCaeEnJF* u 9c;|$Q_ lZ]"AD#F앓΂l>ڠEC y;X(_a{~ /nAA&-B ïwu-xG=lMXjv52Ap _īa}|U?s1gBbr t\$Is4|k4i< b_|Ո}g=ۧھ]a RK5+τ $D30o{'?#݀ .pnDv~]ؚ9b)Ԁ42haC]CqD"ZfQe V?C bXQEHIʯ4˙TyR?lO[ߴݭҊTcF0+gyz¦٥5K/1wH`jS GnN+7Jwh?"ѯX$ZXs0e)_|ѽKnuFQoVu||L-X=&[LVj)İnc§韸^}zk iX*ϖĢD ЖѪ?f3eh-Mn +-S$l(Lod:z 9e }`B8>pȾ0΋ `|tC#q58t!Huk`iv]P{dgȐ!$y,cb30_|PΉ_\Q8HT 2i[7C8W--]|O8NxaNaԩnqԵOw t-[ӪbdwZ>[B ܦϖɲ7t;BN;l_ֱBMŰ@u=P\60Fhe Liˊ"V*SL'-#;pYhO(ȠN~iF1@~}?&uډBN˜5g9̿L?Rb?"{Ǔ tyr_4ȍ˵=1#O`5.5kܝ_Ù Վl <$R)\~pլ3@"UIZ8c9P}z]G4DF-5Jk/|uݟWP!mngu"'c Þ 4Ώ.ߢ N jMTrƤFX#b4:!8זv>/VVVh%!$?BLN͗(+ R>=6Bz ֟mCpd/YE|\>4!W 9N W,F]~`0!Ex+_g>Y<_߭<^TI9oјtƿPi}p̣#§A,?VZ +wSj!vР}'r1SL+L-HM :hw]<_Wu)6G` QPdv#|-UNZ, {:|'ܪ%D}KxaF{6a٪$[I=1u2 VhvB"Z}' {"`^{Gq\{$,Hxp3VI?ݒ_v\|hӻ^3nt5*yQF+6F.D%?Z|}Fitpoa)5@H֢KgsC q1ܒO=jf ZCΕKWeNHŔԀ-*+rߊ|0cW`;gx 7%)暨h;i ɔxf7mT.KYޮkf[+3GϷ&U UGEF@z  я>9ꈄ_Ù]ua ϓ`hKjXȆNK.v px^K@l1_Sb$[6HL +*n&mg)C$1a˜dF\ZMLMmn][EY#x.j@@!/5z{rƼ)ʚ63*[K(u[yzȡ^\^?uueMxg܇<Ϭ S+GkM!m?C6 2,Nj⵾s4?b;Yt^73?&fr1ɝ聥x~mOB {SP|:i…j=]G[EAmV=hTΣyx!f4bhM5kH3N&fvy| 9m@V~۫:?/;|4 O?w3 Q' LuO| ݻcRCAm|߂xS @Ԥ-|-³hT s KWr:U:lE(@cB^ʴv٨6kZ>*|oLʶ.Lʫhfd~v`L,~;suuVW5t__A1o {4pM4X2HV(8FxsW:4<>pրA!Ne\΀gxxKZQSٍaVY!k 5GMԦӅ3>u;?O| ae*7'͢}D0* ' k?p oԠLM7*++ͱswkcE;)oR9BEZAQɦ6\>?t5LטoxR]p' xG>V> 7wp@j[Xg,.3ȾCX@:Ti_}U2綑MŬY~L_Ŷ'61ڎA|+h0Y$N7A~,TT7I7Do0]ԀxsQ 9>KUeO$Ws:1e`Ic.k^NM%g+o)( [J׿}#e\X<(Bnkup1~WDͱiz"_OC,| ’'c3fPP9/}5|[ruda'x";NMT<2 |S$ؕ {ћD ;_+!L6@_auI"+V= fFf4D  l_nlI Z3y' < 3!a1\Τys/:08\kƴ1r]Fcu9-#(0"nB3D3j^{= 폻ᄏZpÁri՞vGD mMB(iL!\" X3r* :"[ZtZ6k ţM vn#C]?h<;oժE+=*G8:sx0ԭ1V^EZ?E@=MH75YRI͠%Ÿ̠ѡi Mbg<|+=cqI/xޜ yOxEޗ@F{1J7?p-!}_5`vo^UO?ΫKÇ s>L^zk[YiYl9{b׀Ƨ2v9`jngW o3OUƤH:}mL {{9z1XM2j4پG]w|p݁g;a2 _.PK,q/;>m+1Gh$9IbbꠅkEm4^\=(/i? 0@ NGX-VdÄ@O.Ҷs ڱgȟKmdajψ& BA:`?W:gZ6]}~r>Ju h9g^;j!GܨiS_sVbh$ظGhn=V^+sy7xΒK%[wXC9t'i`; ߝ0ڹ… [A29O|8[Xn #XMz46,4]|8VژqFF550b:4m(k04Xc *b܎A-MeÆ ۏ_/[s knovL>M^(]Hv{D ,*7Xz (̩uGt/uRďm(GPb w 3$z)'[nq)]33ؼeJ{}l#șݘG;rNvd򔜿*0ۛ|$j5-Dg pٿ{3ޑ0z27m%A6bHPu[6s"4d?4 49±dPˀKSᚎQGF5+xԧWTbpa07 }Ds^5 M?@Nyj1oNSN'KM-_ֈAX>fZz_m'ֻo־߹I ,qyf&L0geV+% #`/B6j}SsCr?ɶ 4X9l18d+5A;jXnCjwKa\"y,#Kꋴ%`eeҵKE5-{5e%2 2ujG7+ 5MNe4hy<@x ?v^<^ i$a8۶NԆh01FSE 1[Xâ#v%VA 0aH)[Vx匞'*~n{ 4<ߤ$<#TBǓo]HCz^ҙ'' sHy1t+/rO<ѵL,6sVŌ3TxԨ?YL^7s]1=s2imfn=˭lI qO'8Gy!q䀖N7z?x"şka .t\h@Mp}ZX51P}O 0u*N#yY꣏$!~Cx0:zH @& ̙3u@ =?|;Ht#_~3glt%|==  F= 5.|/]8,^ dDj,🪜QLC_RT$ثMȐb7&KAksCLBZ2S8O/al&@"!.: z|Z˯40s=EiX0@Fp9a|$,fR!'o>'Jxp`V>ݢ_2dJ+[YڋgPFH9ysøܼ~~I'Rv/wj"pT_ڙ2x}vr帱D n:/*Ѽ֦;M>ﮘj^3 }c?4#! TE9%|*S"$W0O>O6qNj4rYwG0`ǹY%|WC1ý(-Dv߄GlB`kծ8 ОQ~OCɫkٱ -^1bD'W Z6'U~q4cA_'&=裎0 !ahrӕbO@@IDATFO}7@`Ui=|[ CJ7^x|_0OYR!ҋ4>v֖^xrmdS*a@ǹn=zGx1 §h, <AIAkȥ!s[=^bHU'XqZSrxz| 7>n"&n{hҿ#.ׄ_*IjB/13gGkΟ%e#; "j .Mֽosp!1DD5>{X{1D3Dyj0RoӘG'oz>u>u=ضz nU $7-[>VlTTs hɸq~~xj:t sX^njc; qNƍ_`{05D+jB ! !|%a*dO?uH3dcD`! VaF`y"Xo24i8}8LG G>׉y@*_{lG=W87iĘ0F~O $|B _: 4@᱕؟sa fT4Zycz>}W/ÞHp_Vr ORSS U-H(bT.y!؄D«yJ<{.(K˄#95cuu?7/ڃJkFzYb P{nInQuTSg6S$jockil*mGmeg#c\6qcl痋rUԚʻ40͠gKbc%<(&Lpb' ŋwDH QSY#, @wu'H7xs=nʔ)H07^ e9{[?{1%N! $ V;\-£:.B.\М¨sG~]-D#k״o6R~,"4(5N ,^qUAX1@`QoV{-+,LY h@~$Rk6Dq;% d! mɧkzRoVYYٌNVC uw: Ú׽W}ψ0D ;U m1uj ?:VW(Kg9(RQEv9]˶d3 ̨D8@khvBTȧZ}B*bV3'Y5 ᰿^ӑ1 H@m (-ٷ=G3 M$sh|#8G.$Ǫi*Ǟ&sUի|o2[x%!&wxtGLًhޥUVM_S]ћ=mS[J; !ϖ}:Jֶpu`e[e1L8 af=()asi;V~hlV< իSNM@MWdѣGa:={Ml Gmv45&`M? 22 w */+Eک V70UdE*µB7^zhh\VH?[`@ Z^ xK2q:{% fBB/3n+6,k&ڧ"k ؉L}syb_Y:.wʹ2qvn]۷JVvn6nc7K_ҵWc#}&[iu[~RREɧDɐ4sLmZOZ[Y,6b~y3`dž\+ ȏq̉mWGuX_]b K^Ci@m!CpT;؎:BO2?!n08U xSc&K(.f&OFf_cBlܰѭmVF~Jҁh+|ԯ%knS.d1hP׽9ީ3s០gtP8;őxL !W'p'RnȌܧ} Ekt\ # mh7DjA]Dcu TZ=>f\P;:U1bq V&ߪ?'d`ǎF3>D_7_LO\TaN`>n_qqhRD0E e ٌQ0s/xi״u+Y2q:DC훕}Dḵn HfSi\F]e;]nޓ]?ܶ#"2 4Κ9Mnk I#eR|[xaՔ~_6m??UbLo׈ 5@KZ~}u՛z<(N=6~`<ШgdɟauafDZ(6RV`, '; (+ &Fe/LTHV1ӗ(ovڱi[!UsyF7Ue_p]/ZŰ#0*ʎn?'O}?2y*7h~15Xw=LҬF4WW2$(dX'Svn1C{.afa0ʕ+諌)N-[yڙգmI!̣u޽INZʼ 15=c"m, 0~@ Gq~A1|nݺ (7DZQ^uV_CG&~ \, Z]oh8M B&ڠ&O׍sÉFpO39O~k`Iox?q Y>1޸Ww֙]P11"܊KWYɟJs1UTDd\G!‘sM!W^Y9wZ9_MΤ+N;՜l eoöuGvsxm\+}zS3_ֵ_[y` 3. >\y3̯u=k, 'O6!Gm>B&e רVof+sE5`ed9%X, GȻmxV % =< m^յW %cvqJ} ǟl)]{z8ri";7"!0`P#:Os}*v{ν&Gwc|% n7p6})VvPrb4Q5XjƧy!WbRzH{JPlY;2`xfҘaOz Ua?sLJ8ᨼ+Y@0,s}Ld7h\kMEq틨b0A iB?}$qf'@V|, !1!kⶊH'hCٟQ sͯn0aV~:thxl2 =L0~yr/7y-7XUG1( MnP='@SV5_K$*;6̔ |`Li{q%?!MWp^4].l{u]T>G}k´i$KY9/]*wnsϛ3^ݢKD}t6[̫jq mZJsuN+5F 1ݏ<+ ft-qCrN6ݶ&3Nbek;ݧݼ_2؏mƍg>}eN A***N)0 @0uT7]m/<;[؆Gzxx?c>Be`"k'ɍR> SlЂ!>(m$./V0lXM?WTɏD3 K/]K=gII3IQ$l(@VCC@#;x%[|2VǚPOU;gV ˳1++0$;|R7oSƹLқ ӱV>V[ӥf&ڊpWz+>< )g[1?̝8};:1J}sg;3乌WN%[bwgS ]LEPwdE:NVmᢶ{gqM<RbOR*j=_(4h3j!Sp%+|ppZ>:/B0@ A(FA2GӇM ~,yB`E4xl٦UށL%Ld y~qQ2zyTQz]Kc;4/ooq8 0 q@HMǟYRۏA5 &PA?.Ń]'#;OƹxT ~^8 (S &Q>Z# 6+|hطBa駟vO>#1װWݲoXlۻv haDU _Z̿kӐO<.S.[?\NQ^xtc%S^qyi08PsyhTO|aj.`0] A۾0Cb1~Z50@>l9VgC@s,L`>5yLT=v @+. 2וoș-&MT-9FHn1%3sc߿CDJXsU>1)d0 DXDP.nwDc4lk!YhԀlDjL\j[Wkm9&1LppEZ>`fw[}L`ۜaݤyylR r4-¯vzai `ܑ_x. 70OIukkg̰VZ %,6rk/gȈ5Fki&MMK%o~](0Guy@?S DΜ-bhwߵUFY1Ol~a |:fᗿ$<;L<H&gUtC515Q2E C)3T/ p$A-!MHFӲ<75Cs|hMG)>gWPW V@xOsX Ґ.H-pc K_Qjl@E]<Bcn?ACq$J4Q7wP&I_W&Ί HV ~“c a @?U{$5|u4A87X"}&/&S퀾j -7x;LJ*Ke8[NtC60֕5Ӷ|E+C}n-iO=)l^iwI?nlgvBw1h 4A瞓I5fd@vC1>{ % WbеrC6TaǏov=a^6o؊?9 ΈYgEc5^F6<#Us< 9kOZE̷V*{.pm4[ZhEqgʺL~l&ɟŸ${K5{u'+ W;q#Fp2 b2?Џ^?!L$f ]ruq/J%G||$jwO\ũAW^:HCi֎f٬ȋoA [}?cv9nuؕl;O2&W6 J >QvLNu3OO=\޵{;At9|bb.wy馛||lg0ޜ C~iL-hZ)Y`LG[YYg0/N^ŋ_}Ġy'Gz;vJ_19i|||eժD &:OM n77& Z\uU3j88ONp@}7,јroŁI+@ `&1\hI pI{v^?# ^Ǣ K_P` R04}7ʠ!z?.׃}5:rc AU۫cPVoJ"MnU&j_U7($SKiakA7BD 6o+&HOt΄kԃ?_lkR%ut8_+vI}mMN*oWP.ak&[IS9ʄf-nԪ?1+^Ե ycZ7?MKZOr{D/dRuVsrYgGV9|jg5c-`zjIjV&`T2exx7i/}l sVϗZa pF]|Gx]圦y^i=!?8`}ZaBTRHԔ].X](ip /~mw꩐1}s蘪)M<*++Ok X!?VX_zVIV怷RcBd_y4mJ.E@PCPgy"ְlaY0g5a_ֲÄ0mR~Y8D P6owjB6'0򊿻=- @*9znOTE%Z=PYh4 +R#kkeV`Gm뮻l%m|S M̖{׺۴tC\2րkbb.qc܌I]>ryX~ r.xR:0>*I5[~ֈ!6 1Eeŏ$#Ӻ~4X)mbNWdזoc#&U?UGH+}(-VYs=9hqե)~F0Z/Y7lhz1Z AIG| )z_>V}g,p˜/h@!^  `a/_QQ}ilF'@j X ui2c-kvKC% hJ30C{wAd~ww@{Uph/G!ɟozc0*[pY7Qb{笊L@80"*e P=N`UR%:nXd(M- LP;G3]ͣ.!5 w_勁XQQ>Gj' 7 T~Txp0`@Jn_y?t#€0䇌 9\d'Ҏ2hd^}x2&x8E7Ѕ$Oⱝ!OK+ce033WɞJ)X=)}xvw\%*EPj .$ر Ad#2Ae1"ݱ.Q>qoC iߗ#r,aQхh<,qe!R?[‡q2W9R+"D^h"B"C"ZStV|ϧ'W8џ\r),Bzo^$O"|! eF2#2jbfz ?VjSۧzVGHxk,EZʅ×^E@[ Jΐw5ۼEB/58X\F00Q۵kYTv:]7QU~+OKBQ9 2Z'#@̄=kA";jm65_@Ew/;S8*Ksƈ1S<`+|iG˗v_WS^s/ dif+}k.fkÅSjw@o1yNJ9skr pyں|宙Vv˥qv6[$|/h6ryˆl2}HOw+T^WƦ(Ú3h1dUYYi[zAQ@;0x?l p#GIB K&?ÊuoeG]OBE!/##蓱ZO={z BL›u󗣏>J)|%2(tPTAhmenցF AF FDo7 ӅN<T-ƚ, ?c ByS@Qo[ jRg*=%4:fj׉q}1Cjvu£˰co^  b3ʌ<#rԔXǥLzx ~{V s#>s***́j6s?K6:}(U ڂ T.aüy5%_9*$j4I[@.kaޫ1{On|)œ&glSu*^xфMhh&hl]ƞ{6Գ\p VT0W^{vD.B >0驖9M* XeJ B+.q1iWM:^+ ,UQr"8^coյKS^rd{C&TkzC>0<8 ٳMR5הO|d-T;:7_}HBw%Q\3{b}QzQ89w衇f(bp>1TGQ[ 5ߖgiE.tµ3RIŭib+B#GY^SrfZp} s. C }mϗI{%7.*lk QhV`ܚj5;-_;BSW`RU,ր65hXUf{i1 @,Mo?O 塗 {39C m*$7͟c*t^?y?|} W`J~oTG6 RZgKu.Ҧh3D|!׿nۿm雹-R~캇M[6QY[L.P̻jN-5>ߺAF?9$Qn9+O7gt?a;^Cu4x&iW:RxtPa;]aX,]9`\rF횲C2a}k$s6hcǚfkN<ppr(m |^yWЀJ ${e*?eD# `i$CQ Hi |㦍{kteiaѐ#C G 9o4Dbf{ؗsr!_F e;x "@8GU}?&+ؙ8vQ1O/ $Sz)'L {ٺU'l^s M*N=(ue\;^ovd~}!7C~(vȪ1hl}83_B6_-]lbxTZ(evn#ǨpQg 7TukTxp0*D섐6^<@D-l@.y0:aI (U7wһ>+\!$tCk@^BZ y.dV  ѧaDe4rAӂ ճ[h5ݲD=!(=0oQN΋?:nD_7#Hgi{!@% vD$]`ih"^!rܔ*B1l:K 0)ΦH53,mi<["  -~gS, ̿4|6"^38(7C¦&Z4iWw֙r8F Z M@oUݪ8ԯr a_8b,:N# x%u&48G}8#aB{&  G 7gޱ9_qe1A-O@:)C5Fe&!Pk__5X]fHʰ( >t͞NpH;LK˪;GNnSb7r-2ׯ_8S[Zn89B_[A}[c{@4pI&U"r-Gm6\Nrx_i4!@0ik]ա1 h~h#ޚ#>on|RA\  VS/`#%w6-f.w:ʼC4F*'~FPkgAcBz6BSP>j67xp, 0L)j*fY|&גO%V~چJ!Y*ŁΉ¸hP5]!ǵ =@q a{ YHC{Be/ u\_ygyHpkMLXЙ%Z˄O [+1NOyVUMx P|^jz}ݺmkG{~Ҙ}!1~%ik׃Lb J*++yg+LҾAsLzMע5My*ik3HGQR Q:{°!I`[c8q"gDie#hN; n_Qم07N9w]w4 /z+[y?Xqj+!iumc[.i-RnH7!ODv"Kr|m2cZA].ӸVONFWdU p }"ȫ0]`) Q3­BӞd,fo/eC<mH||4B%lH+Dn,lҞ PW[ܽ)K$ 2;D3o FVؘ7h{y>kt>}#qJgLu{Lk&)Gq>3ޟs+MArG<-IJ-:S* <80IR8tg?{}ksܑh,[~]vCʵtebtl@T`\%*;k;jh%f)I%zֻ}VZ+$:߿Z֖hT׋L+ܾ>;OGB0M/d|PfW4&гDs)SvPIn辆~n7m4R/NS1C;vt^oXNx [4O|(a\1QL ~kR^Voۄa-ž hfr_TN9r_8]"dv?~];m@؂!j?m Od^C%, Kg I[\ǽN{ 5@NLzp@:p=Ff*w~OHDZlQ($(M8:_A[6'ޕ7iPe0 OK7[0!_GV)rԇ>&Nh^pΪr.s`K/W]{1gxڐhy kųml K+`N0,kuqV]ykY\h"ՂDPTĮXPM,Dc4FM&6M&M6u1ŀ(*(" ^2 [3gi̙3'{&W`T@IDATӺeW"tdf믻׮[*&gyyƈrb튈z`4@>H \%a(Uַ%y(HcQk'=IMLy>~5 (bZ80(Jg/EaяYh.%yϓd@FU Vvg/Ά - |Ɔ2,wSLZ0^{`>%='7 kInWƷmP#Y(0ٍ3F2K:xfA| ~zqE1A EmK'}kځD].^>JRi~_U.FnxӶ^ Z%t5A;`w=g}舻}c[% ںjNꯓ5l^_{G?;{Ybםí>>oA6S&M`.@2 ;=$jN$Q_:hŸ'j iWefD1[hm7[`jq}ꃫ" DC/,%Bސ#{՗ j&HҞd] lݛ؟ a嬍-$ -Mf08nmD=GZGC i`:H'ߺacXf`2*DOqi@>%vXon<d LqzsaC<͆I+ŭrPzVn#tO#amOuJ<0B-I^6pCuuָǰXgxO<{4LfEʮb"B ΑBAxP?,&jz{;HTzٌnù&wO(5εX+",PsHy)^ knGIABFDt %$yS]H6oDފ32z).η˄nιrL4$ F` ~v!ɷ|Kz'H'{U|8ϋ#"[~IgG"4b~,GK1B*4~ 0.]a<"2.D* *|@ m; ]r9;LPX-/0 hnI&򹛿gaYcmG_7^ ̜񿡕 O6?d%foU@e] ѽ ;#}gd0}{˶9dma1@}% ?a{$yF3ìb7Ș(#aRٴS+{i>eQ by1&RnZ!1ةc~yrOqyN ?nO~kŶ!-?,C5k = ψ5}Dgqmd{-VDo+b]ήm{wՒ n?`$G?Àt0_sLk_UbWN0M:oij15A8*gQoT H&F>L̒ݸ@Vb q G}Y1tw}\O /fV{TQk`r{Z7r6p{!PN&MPL\ۡ)&l y L'Dl`$d$(0o~ӡ ivI+qv _t]}?o V(Bջ1j@1}`ŞG_;{}WS н['E>EWCu\S^iA9 Ƭ^t?DNI)ƪxjo!#fϞ e/_8r:E\1>\ _}1l .F?V?܌YJxoQz߅ \;_xpa!X);ޭBP$_` rYBÉgbG?mӱNK5rhW~>\cPгgf7K2-L.[I?4 O"- Z̷5*h[?5B̏lϛQZv ,BO2øIInrIq,|O\N#ʑ\Dx`Y甭nYR}>Ow@#+L:3 0MX3cMݾ_ҋzpwUM;켾j3VVG` O\+sYs'bDjk0qK?zF=XG_XO﨣D2g09;J6cv$11{7;O)'l'ƅL0k3J F_%1)}&k) %| GFD?i7a'\!P7.'Yvwźuk+x=^ q(OM,o34;f.pfϘm~xVNg> ôc)L eiETLj`4!wXrolp6f윕edf7RKc0qٓn640z&Jk08KSȴP8nPi. /8-lf}ֽ5iI4SL`T 3)JOUhXL5a|~C 6zĺU@O>ݻh#LX R[[lX,L[n)LKa`0<`e S/Yc-ǿRC$F3tݨz?5~ #[lvLoax. /. a騘 :(x]`IcK}޽$` C TWԗ"85bwq3f_36 wM6Q7xcgؿyPfRH+1o?7[gk=M@q+觕Hϸ }D\ٟ_C,?F8zU ^|EO$ms'#t]=@8qͳ&ft8>$F ÒPᏄ 3lTYШ50_='C@BʍVba-ڲ^ֲ$̆Phk5^UFʧ^)1`75|= !AgCkgL4OaeAXK7)HkPkhu6 KaG^Og X\>=c3h[zI$ܬcJ#=ߞw YN)f]]n&#S Y+R}焻fF_)rT}<>w܊( dlaP: ȑ⦕Rt}QwErvH̍6w~*C;h_Gw떅IҫP+?GAyo[k`>"ON"Me%;%sY׽Gw1a3dKm^M~3:0ٓLK#4 g`v3C\$a2@@\O؋o>,uc|ڶOb +Yi"T%*4qQ-_Cj[ ioY'>wO ;tO80|>0\1L!"B4°Oƌ oJq@az$P6@0*.P"3ޜE[n{{)m3̆v"r=#HpHϾV_55~w _URm\N1v+&X 'F'  SE+~0ސ{S:LW{@+dGD l8+*ɡ,btbAO;~ISLU~"^*RpSEUHx_F$a 尷B$3V !v zrGf_M,`]mF@80@Q(|?i6Q_Xj>utݶr"qm,rUI-* /GRfDUWޣ`b  8v²V%42vha 8Qοn_">s;؋֢>}K}/! ˧7ưCsdZФNb ~,,? W1 )&|K S* Ӊ=H:aE@kI9L#aw؟g+psF0`a8o s4{?~UZBmKS,UB xr]ivRͮ-~ lޫݥ" h-hBL؎]4|+(\_ BVۿ"}*c];Y͏E{U(XjW%F@>~Iwz 6}I'f$}$Ǭ/6 "qO`6}!Q&_JN\I6c1b0o6zŤمs}V:"qnl9I %6h'V}q]z;$a-+?BP.D [Pl]hDhs0eX@"OhzP@t7_`eL 3~>r e-J#L`X0ȡ.oNĚq93\j9D9f.0}2Y/4-3>5CP")?4o6\ؗ8;&<-|ְ= 1㷶{ysIX3qZq$4(`{.5O10 ?w1PץHB AJ ׋9[QVf'8Qk;r ڱYL&re].N^E,w_w׻QF_#B=zknk_rm_IwF^fր6 'YIS;~psugӦPODQwWkφ%_|R0L!_2DDˏ H13nOI]~ W F~?WʝnctO"_8B&Z[ c*a{ NHac|jIvnvtAERufijf1x0$Ng0$in嚖1,I~ T JVCMHk(G5#O]_9 i!6Y:[\is lfnfeZfZ8=:voA9J`]mCiJ6Pg(1 ISjA"{Rp`3x ,iRD/ ̄SN93QOxɄCX Jgk'w_5Y4Fmz]wi_([@D_k[@/iS.n% #%1~ n0NLwɻKuiN;m1#[@$ ?FuY/sR!;ɜoBL_3},ܸG G^/"/Ř GvB#̓_ʹl&f4 Û[00~&Lmfc1 Iz-^"_ ݀L'q=W9(}a"ZP(?[p+vEؤ4H#1|NKթ]W)x>Qz^ YNA$ Ɓ - 4LbE:Dbp[…@i>FgN2G}W oF;i#)'vud@2U٪P5695f@GY>ֵ~o[rLs;ꨣ?;?P7}qÈ#ı$[XW2){)r}IcoJ2BIQ˟5n(j?҅‹ 7%Pkv7ZxSdG=p v6 W~0[>tGonap=W\dkL ? X GAxnPeTΣ@=1;3OƭmvP> Z͒ -ofx$ #Lp[3-~r0sOg!W^C- ߳g$ʁBⲁ,\afA͂w UX3p1` @&r?:?n7(MTu2_w鶂a\zɁ΍ rTn!5qV3{ލo2ii̵O=[ wwPH\F$P^8dn1jv@zKq(Y;J_~e2 ճC}P'˽)GK2bV*Jp[aүژoBC9 ςcٌ4tdmt 0!|/ȽuM_Mm,MR-vl󙛖pʼnOl0$7'~c:OeK1 I@L ΃j;CS1xv}>3?(`g!jLNf>LʕF\P?~Ε.SG6KfL 0RR+of S1B$C5sj*vXxv &- kHV@<|3\H2p 뢋ܐK/qۊQv]k~ƛ`fqkax|A9XCߣOb汲tEG#Y1 ̎G{ktPN8U@?b |g;q}0Yg €80,B7 b|a:X3☛ h˴")#4C{=JMyuSY@[Gl|SsKފmI]@6;uAoc!.;묳ܑG33c҄+߻f7GݰvkU*rTn5FDgLwӥln-ҏ6N?t>xF}ѐ>vI JY#Y~0S+K_3W曅k055џb,C.¬&٪X50Q=,A8SWGɏEFw!+MIʦ,G ?>i%ذp5,̎i0͞ 5s [3 $ms7|f77;u2΅bH>߬RⴄU $)QV+t_WzwЬ*A3 cX\3 oдtB7_%0mIsh -=3<2 ̔mqʹ8700Zʮ_ft/&|C# kMn#D5͕=9DΝb1*wo⾱c# ),*߾o?vOvA]: v:dnv.1n16e$F)5p?ya oJⷿ?C?9R:yP7mKvQGhnϔWDtqzQWꭷܻlM[Uٿ*dc+)z_ N3$Pi½BP:0,M G U`ң 6@N,i)ٳaX SiacZ\ keg[lmq V-Ŭ2*%pj=;zրͤf'L_dťʼn `>lG$[XBa-f i tqRI/SbҴ#%/P P*@U wRG]vg 'rj8Hp^Y0`5HFRiF?@^| a\@"!u#:^|Ew]wI&y&XPbO]r *iyXfմZH֩ ܌1ϸ%MOGꫯ 5撖ԥOv,qC1$ _~S24/ "G#Бvc@x߄#ʤ ׅ bz9/ Y\`wYMIڅ<01^>$ܼ9~cCމ`n&xݒdnؓ0Iu}Rrȓx!:֢U@:_s+WfAlN@Ƞ+O40sT%YxL$dyX\s؄aЩ.LH״Z\63~%\̿n] ,"K9ΑsO2/( } ΕYĞBo_y4`ZaGh?c{_zA˪^97GܴFjqcRH:ӎNp.JHq@oUƍǔxv 2M-em>#vIEDZK)xWЫg VkvXa2ㄟrŸ h) e ߅o waa])iw^.W7d%,\<>ZXy0sgW.v1)Դ ϭ?_4s=O{N"nCI{k#=68MX-OY7?uR+ qvG>`⿥c ;\9\#~J DFDb"^,)&??To)}Mc;/Ϝ2q 34y~Œ܉,Uh^VB>9BzNk͂݀wc`I}޻֜FWܬl}^+#xuC܇-~?[8L,a c?$[sv cklJ# 7*6sy-Znhl\z777߰.KGlotv$)n3rLap33W?dzg3} .c iBo$b;[X?އ3(bzi/,t+ Ih 0Pg1M ɖ4'w$:S_"yH0~ ew/?H15 "J0IdfM*ۨ"VjC%K_{='e+TIxpF-`53Ų\'|^0>/ )6*;o '9h~֬]#`[]> s,}ޞ3KJ 3+Vi77[`#@t5"S#BPʆّ7=!_/%iF߇ ۓNc0$lRH'~bJrݒ-3s13 md@͟g3nIPWWHVr ےs ˖DpS%i'l@Sjح Goɵɞ ,Hbߒ+ /B4X[N?O=1DzRnًgeUSs3L[E͞׿O1ڭ֙4S,/R@PW!Fc> #[tYRӦL!0P\,\!o6>)јpvOҭj %4#57Q>ݧq)1 WE?;}W /B`fH+Y(5>Ax1ppP]*A'F[/eР=.Q!YiCq0 Ú[lښ9 ǍlnfܓLK3/v#cX 0GÖ`V«d 7Űo8nQ߻-O2IC{f6 1nn!wc3LYB׋3b*/K8q>).;JȻ+l*P(`.?`orE*]cC֮Ǹ݀q[x!nqTi}#H AO26$oy x†Bt!@K7) '=PwtfB*m1y>} <^ na?.ݪqүyև|ҽy&@ڹr5331LflIL3[`ZMŤq"$w}ӟ^~c{ 18okZn?\Jҫr-\nv| BDv=FB'R9sNBfX2@NM0hu [nnCa{ \zU>5-㕭4liv=$|{fƦ39v7|&qB&hXO%ͬI)GU@>Zt:"kWI؏jo$4ґ0IEH8ORKq#Mt438Vd@ 0L+[z/R䛔$/Аw?iMZx5~4kMfPZg~9 }3O\jd`vk/f^b%t0|v7%Lk~If?ؓ3-X ^&vQWZqk1Y\HͱBe;Ԝgqڴv=yu#e/.Nu'Mqt~n&kVK?@ʴWU 0ؕDzHvvܐz t#O_~xv8".c;رcwޗh7LP1M1wtKfig=nnX{iXhH *.1mv-08F]l:~'ꎱ>I10N7R89 ltbƕk sGJ h@^zz+Ĝ6]'T'!pP/O\ƭv"( я9CpB U;sXfZ|ՏoyXq ߶4;qBpIa,YB,3c 5I0i0J#@oO}4EzU@ejQ-Zqo^U fƝ"@v+0N˞}LsO2-|Bp[h?lӋz0-M{Ks.[ ./ b)g &bFoOw?ڬaQV۵s>w]'Nv?,Fn鐽\@t@>--֞K~  pvι /ebR- W }ꩧ<r1z+n!^:p(6+ Dx߇wܩe B?;s)oE_͛W6 !5N,n?Wfƫ rgwn?{'ɍ%ZC+O>q1:[+C}8y~BcBne2ӑ,-Cfem`Xc02ޑP4^vv|I,>pwj?'ˉ.@g tLS_%7٭VI\ᩏƐ\{[h!24V~6 6çIAu2rfƵma\vK+4-,=ǞLs&oi@nq²0xN^+1m:h%ZsuLڀvwyd4M nM +rF?'.w}pQXY 0g}y}tQ\_ϖ{nwEsg՟Tk][6}3/q[`oBɞ L;nXb }]r{`/>}1 Cn7j(Ϙ ڪWƫU _JMVA[R+q1X-US;;ʺ;N{3b{ ^&,4ղ7`bFA# ?/ OJW]-f}/n:-B*יml mF9$!g<3%[0${866yX̤a^ă`tPWi{` ! U@?߽,{oihfb؟ :9pv`glP9숡n(RQޖ~ pq>sLE Zt1M%y0 6"mnl|aP6:fcSNv)ĿNӦ]{ڵ}qnч:M+HY[]ƸNӧxug*>Ϫ;޴ph* fI<]8B "M;Hgi嬩R22PT>"T+ŸX믿6}])}>]}}aœCߤrk@m]/K$['kt3EQ~QGN;Ki ɟy9c4GR )f%k #ksbygy&QG Kq1TQB7S}'(yQ5&= 駻 P~2GNXƫejrBv d?ũS#T8O _ΕY:962kw+f#t…%Ga 僿]at Y>+seq PMp筟? DlmL=c` y]4FPo"c.3Y٬#ٳ/)/),7X~~lfO=ni<ǫ[:~>3mb&_ލĴgHΥt3'@IDATN{CB$ֻUz% H>W]QϺv/⿽Ɋ&>A!0P܇~$ !7i%v8 ?G+k+뮻܇ A9 \%/|g{+\OtCuMWARwSRUTm+JGL&Y< @"E΋BF훶P'8wN<6%_6M'] 0nݓ.fʣ:y:!\*TCњ>'|xa-G&Eȗa\Zg-M9BiCoT_]ί韛=JɌ~"@/U8\gү:t d Ӵ2CM҆H `ݯPe5ϭ;hym!Iv@1XH)dY؍!N?fhfxl63|GkH,%Jɣrh_0rH7H0hϩm)驹v{bS?Zcط3Nv<ԭKp`MJBj=(-#[o?{[޿g*N`"]ȭAk ?eF&@1M9Cƭ/_KWP «sjߊs+"g}CO;X30`qJ0ُP?o8?%Շ? ?~:JBB^be=4.K5n]Y(շ AoF~AȮm`_B<(|G /¤BB`c65Т`Ձ Ira1un/a~03ϙln63[za744д0K gf0f4)Ӆ*PW:f[v hĶ࠳+!f<b.uvYoYx.„mp ?'߁0'gd?R}3%jViz# e%!j=?ڴv;?ku? aby4ql7N/f9lz+^[F;zJo]n^q}~u[|n'V>Mv; ss"}ǔ)S<#\wdWWO&hC2o~5׸c=_D3n ˴MUt4N?wB5vB[iy;7Gv_uu$+2RAsLK/u'ON<Ж,}vDb意R KaWc40LRFs5eL/ώ?}e,Nb~ENj!7T|{UlRګSb<z,j+Lk_~]8HIXƫX\7Jx0ipG G fA.ٚ8Kyf Ҟ.3J/@,R^Uo -NiWSG,/vKr.Wп;X^̴w$ʃ_h癱O*[( b %v@WT~t?,S 䍆J㖧t4 O޹gK2s3K4MX>< T \lp-5otꩧzYoЙE}_7縣_>uGຍ(] oɗ]>z-[g܀:OE8,/VR desĝKS6g!$ߕAƘ v$Vs fMa'?{^"w} Ir*iK+nt 8Tez*;yo14|vء?M7]7j;-` (3%6ʛbjk~!?9G + 7|n Ѵwˋ# cƌ6&I4-@i|Nfw߷,\C(;"&'a79(VQ6͡=R~2+|IE`}edvx7ofa xF8n1 0NhÇf7$Ѝ8 ִ!fp- }1tl%р@E a]v\7ЃoL4^qmxiKnnv,]c]u:6mk٧ndAW-EDzv a'ednBذX }#cT@L0ʉ$ G}ԋj'E> ;r3Y}/v9ǵ׽UF@ Fÿ&XL|n^| a@R6ؽ-rI9h>,̟0Q31 GsL?@MM>Ӵi#>7ngӕOr~|,rˌA`K@¥+_Ƥ${“TREJ;e 9sCֳvk (Xd\ּTVVi#ky)nY'Q ֢ecҺZj$^Z`e4|-r[s7*þCKW}?x\-*hְ -0{+uZ?abb`pAңLff2XЎ[᳅79t [ IiY^60X:&a:~7*%~Jɣe;[(Y駟Py)];Sdkê]{m>]괻6p>[nn}$/,Sim-wo$mh-|<͵].=zZA2}1NDaص0Ϳ%!}6 a:03;c_җý4K/vV̛_b<+1Ǹ^?  -$>c1n;-cQ (;A<T 9u>u*.j~In$x? ܜjN,|[7B@& BUjFe'11lkuMM/-&eAawyJ&x ̂ݯ51` 4BX61:܈n%ea9paViiZfͽ\ҳu~Gsu@%CZ, *ʄm#cpMMMbc Kɟ& f|6̖^ 4hIzaOC473-=K1͍0fMVf`zCszF@wpaF%1X~#<+c6q|Tgۊh`'M:D@;1M"b?q2ĿQ4w}w|CJc[ag7Ϲ%p}xu?Vz>Nygs_'/`g[kCm;dgLwwЊ)4uф|䇊>lVvhXDݤ{u3!6H9 }E #30@=A|_V>@JQ9￿hCR_.=ԭչ1n^xYn%NzX㲾*1|&r6餪[MM;3܈#|tH`%|va:O8m0(-Xw8Aktlh}Ί:0`sSfr1Lo1(vɣ +};Qx1"B!D?_ґIr0DqFcxE{3kJ[Xg,Y3T[¹$Cn<&0]si}5w  (\Pde`e}y:hpby qXP/,-M:VΕⒷ1d, 5wgI- ߍ&pwd/@iG6ɷe=Hnsl,h<餓}+6:_e7︑^FITOv3f^|>7oe_^Oҕ,5>ky$%٣Rap_~AȎ{ahwB?.\* yc{ 3qf\;'|V8Ygc󗕍psFcڸYog<']잧%yYfں4|f6^ɑ&^D!|&Hfl N,piְ1g ;{V,tYؓ ls!;ל$-܉gfl9K7B7-?cqZ׻>$jKTTOzCZh=IbZ8o~Z }7KD]N3^||~R|E)ŵ_~^[<>ϭyGa"R ZP\cnE?\3XdB:9穹5cv:}Kr~#!4D"6F功)UW)L>hw]w^{YieRru骻o|>__~$̎ߒݩ"X_>ĿVWmnȑ;[{_Ls$H!o0PPdU)vy|`[AmXl 媔6bNANh\-NF\QuM.Bj}M9F:;&@%__Ž.}(Vi6~ǍjWDW^麋JQZs?^*}i; B;[6%X_1I%+F@(eWd6#XsbP/1=SMT-rq>T/I0@'lj^>%d|p0.z,wG1"p[:x/;wJu׻]zFinixޮط]y/FT{ m֭컫۠G6ꡮ6$ K]]V%C@VLba {~7\ac Rs%}9h~8j~ꩧC=r3"2N> w\GnQj%%2[o[s앆=Ksy~!!BIMѧ~_~e2@n`v&L05 {лYQ0;#@1K,DL WȐ| U(DN.GQ (ɪ垫@X9KŞ'0Vu|7\DڸQ_zgC^`5n6͇xLo>74{^N>{Sx<|0S,0v$Ӂ\ EEWEmAZ77~!`n3kֈR`eVM#7iR: b+s%11yB c`-=cN,,-GůO\̭b¶0l ;;h۹I#;|kn^rdx}6䂳ܒ}qO_uh~©Jrמnn@i`=( R$YA&^Ou{CilK]9ǏpiLߪ7c=D:LD1t/a.7s)0ȋv@e"/ ?+ =zWVwUKwtn]IezٗG )so\UP;GBJkJN8 =_ 3kmGsk88,$1c s$1^W:j31AF /$D_ JȚG @ d\!`&='|Rp9r pfvqo>c!aS9vx 1дq:7Hy'|6|na&+[-N:0O,@-2Mo2FTZc5w׀=^n>>;e;$f`6(P' -<ݿ|ḛ̡=_nRx+?~/&b!&񣁛6r=֖NJo^Efg{Ju)+\5ݾko93݊~Aܷq/-8f:anyzeGJ-O(J~L5JZi3u}o+S6.RauQk"':η]):󷮋ĆP;|^?"6v2 *i!.FtI*6~]e}]1qmRJCԾ\jNĽtCEGw(vurapAh#׈DLvŴ$0'r|ңc7= -?gvb,RbpI65s9mP|n3A݂F± ,B5&_!OX4!Vj~aY%tdmRH"L(|G!TE(ƒzl6δ9~0C{&|Ⱕ>fXN慽XZxY̦h/ݍE0ުP\ cи,4H!$XX[Q?5{FS:IX>S.ҌMua3g M[:aXcqFnl@xO-&ĬE[@QO6m9?tE:vx8Z굕vVj_ f7Gw7kuA̋HW\- m$ڿmon7Ɖu=fp箮Eͺnv]݂#u fk15uk zOjk~vbCZ!zP?}Nߎv#\fei~8m?яKѿb6[l)H{nUW^^]S"XnzھʩAؤS Z׉ʲN4p-nZs600hcuH xs?GK֙wb1(Fݱ" %I-Ԏ[ ijn;Rmg F%Bvx57BvluȒf݄ڙm̪(CpY) vh) s  g͍=16{o;P~CFO38aZp}YK2-=4lmfaJlt^{6w2B)X;ίҁhИ  Yvܖ3xu"Ht:u؞ԹXl<׎FOl'=ig.0\NI@\X\igˊ}'{e,Kܾ{ Ѷ=Ӽ7f`VDq ψҦ>[߯k> Z7C$PC]:Ξڬeȴ}{@_@|~-p=}6)**)ܢp $B[I"f%[! 8;0PZ߲~Tn0FC&$7pq!c!I$y裏Fg7W^{}wstun"zѤA:md5"R?0ՆkE?c3n%J['N?ty]̷Vn=6QJDc2ĝc {O^2;il6!0 RxF,213.$?!EJ[u)BC_>y%)L=g _k  0q- ӌӱ|,f m,@ׄU5.Ƚ|FP3N噝9ݤ%Ávue *0ca{J%ƈk`lЌg4-ի= u ;@qa|~x컕Z',bݾ#tm -rݔ!mrZ1vrfui嶛[.+b)&R.nރݢy=ƎwwVI`oЃgpm$NyOq\wǺΓ.:蠡J@B%GZ@@Za{スĉT6aoe agFx<)>|{ @^gM>!9'ݛoWs C\'w$1!F}r\7$g}3=*L^PoΧ]ctnK70{oi^AA?8ߏbIPL#gdi;Z|0M}7pOIgmFle9Oxp9VFz83_Oư~EJ bG: [*0^0z)V,!Sfˮ-}j#-lӜ?Os>;qplqrglZZnLs/$~:h5#*CU4E) iY{ݘ&@Wz"Q ̏hr̴H#pQ m uf/, zw|L(Y>F;X* 0J>V!8Wή&uR`~VbJ#Ӣz>]e+\QO q镨3Ovǭu6|): }G?75mOV ft[6:,veT)[|b$hGY |A9U~|W#}[اɛa 9rva@&xi7)oc9_8^"^3hJ}x|Kc[ 9Vv:Fzj'V߷xH9 F  FeZa8c;ny\)s`4F9t 7%EtyRwbH/Lp+tǽBlS&¿ SI_ &i)wv˜aafmn+eq̒ [Jo8IKw\Տ7ncnrgab֭u iڛC00N{63Wt 얖5$m eJ+l -t])-H !Ap[Ev?R3`,~bl, MKߗC}fͪ/)bi{ s'8"F2e8=^^.k)1҈Fs)_r$8<6o[:]?Lnk\'GF2<1fa @H36m&MotiC&% А){e 6`Os;Տ$'[G:ݿ~{ XkݶllЎ O{F V;bX!}ٚKgZvDlݸN'ߢ%睥ԩ?)Z:z'&3v9B18rK1$c/KUW]wkCe^.İEQ檟'¿訏گ++vNS rL2  s۪P"z]dYppԚLGSL)qKBSϝ5spJ3 ӉrA=pl bwJ\Wi͙~ E =$;}ZE`G[ yLR+5qs@*"}<WjtʕE)n`"xߣ\c1kU;%Ư@yZ'oÞm^Mo+Fzi@b?U eu:NATA_ f0I7 l>tt)Ez?(-$u<ژc0!aܵ!_d9Chw5fgqO9mΜ9!/>eԾ±; GE8s4tfnk( P. ӶH`Ps7c1ƲT.yP}]1~!~?q狄W /Ku>'|>CvH`-^8QMlK9Rk!6O hHaa{|l|-(yLϸH힮?7gz~I$8%_-@^yu!_(,t:"&=1cRA`m rx,, E{)Ipa60z[ @:ԅA,{v9, /RPϚ5x.5_ &˗]gv$k/222}xF~:V|öi6_9J\e}?N!IP'Ƀ&>uV*cm:mو'fFzRyn-G``Ѯ dXhn4`מqz&Wy~€,![ 1ȵ > ;ξc"إ =w} U>y]pd7j"(ƻY;cj#$Zod*oڦ mp]);e'O 0o@xp>Y³ӄBVH;06J{䫀WNkmP/]1e )vhc:\SO%w <_7~<'a{q7/_>3}3γvaW?dYy456&SFb}QJ$`1gG39iO2N Lt8ƻu|4U UOh$\p 6@)Sk5?ի*%(F˯dbq/8fG@ˆ484Z6jQn]u>aR[Sw"G:AJ5;|xiU>ʆ?[XzZڐ瞳Sߴ5i{Xےua5~G? ^oa{H A׈576ph]fm=K47]ӆ f{ -a1{ߗr'4omӼ ?-dGڷ #\Ț 9c&Ÿ5ׅ({Kx>A{#%$IQ){V3aOcN=qn>6ݏܓfzLc|-[9ކ^IC@mĀA]L`;0!]*C۳e{l&b0AA hz/{\GL?ݎagO \2 oy(ǔ Ӡ tKZ|uB Ƹ{4J/}rv `9h&2~6gj7TJ{Oo8kz8>QA \6G<0m̳m1UR>XaA?n6PQn xz9[r1MQ5uwœzc1ۚgo|4@2`qc_{Xa:n(!mP2Ǐ Pz?Q/˧><þvhQ|sw}ooߵ׷jx](3leu;&@|wCyLxZ/KQTJ?JYqp9XSuN1Ǔ|L{SWy6Af}i8֑+xآ|g}tIO<8kyxt.pk=w&Pmz'eoc8sq?3Eħ>;2u:pǰ+{}Ck5n'ϐhMShۓU*@CI,W$=;Z &\!LY)d}fR"àppNa&)9K7 :Kb0SN>]#ɔ=X!Ϳָ鵂QH3'i|qw{8)q.fnI/t ^@r,c 3-b xF% DQmM[&;q^yf rMO.ޤ,+# 'kwtRlےD \vea64>Z!)E;z+͕8ޑ]mOpE]V)΁#;MUJCOX7}lfn) $~&׿ xs_EG[B'NK͆<~6ym:}@;Y&n[&Nz+o'/vn `؍})qk{ t 70Th? EUUUA:hM-3ev~a^:i?fg7r> nW;n}W2)|m" ;_4L)b@7W/&k:~y$_~IP@^ D"91?JgK3g +C ԨM] 3\qzGx#j?do3bSp}fz~+&qf2c8I=Fk=dxǤO cOdK :ٛcañ@tXs ʁls;^B>hIH.kz8a `ld CxMBQһ T! \# >u' R*Bx2po(BC>>?C'l>RwԯN_wP@Mua{2m)A HYKueNa}E]xMWY 0pumUէK6_ iӦ5`x77h_vٵv1!< G" _]r%&W)G%R >P8s 2?2_\>35z>v뭷6$?lp?w>ms| 5{Cf?wK.ґhQ8YL*[̜WOh_ù¿=:E>(eXPqeBؽR e|o "υO7g s f"v$ ]gMTE Ih)| :?=$}5f}S;udg懰~#_z]KVgdN,]I`wb3K ŭ5JB!S G1hBjڧw J"|X Z;20n ӆͿ--Bӿ־To3fϙe )4=Mw즻[ķP yP+`CVQE){& Z8Tbnd8.6 xtHS0%.6kdk8^kG!4 vfqNK'rR.=MhCv?W7\xGʲ6̸vguݻf'$z]/I`WHvܾsVs°Tqv/J9e%&qVUU&(C?>wFLfz >aZ6 W2QN dX^{͙3^}pĄ>\˖kxO9唠g5$sM?؀1^2H q|HaPnIO>bЙ;l~ZOձg|:xO}n#4/>昔b$k0T}{hJM$Onj@!t1mY E%{ _&2d>Bb4c/ nfX#OZ_AD+*w:L6|𽗧k0Gq3N%7 1z>IcI5w{(xR3avkt0 >@';nGRa& 'ޟU\^>،g/7K:@8N`.I?/`x5f&͎~ ťxK4,JwS„ 3$0RNä m+GB&uhCkZt.?՗^jcv{ՎQ,Qp_mql:/3'l̝gWg{FcEVncz z3j>D :gOB |xޤ ptuu]tE!NR މ~ |+8>O8qi1![?2O!:TFڃ:Q UogN$;-0o]}25V~>j{uc$bTfpĐzPUi~J8S8LR_S׼)Y!Q.K*|N\xH-ja>|(8)I2oпnkҟTƠ9e*T>q4e3 er3v{Ϟ?7gzX7}o$~g,6P$Y. yݤ#bO +ܓw| d!‚ z3u |&qxtٵs{=u.0 gp鿐V@b%gB-3]nOӁIbO |(ʃb<1> {˭G֤OߠGDC 7I'[}! /_R2#2" }%نb.{yWЍLN`m}KB`՗w7nX elTLw,)+_- _Uye"3s١]صKlmҚ|ȃݦaЇ>o¼y±aQI=!L =ɏoI3äsӧO:B6Gw+馛B='a_Ԭ¿;Wg"@QA͜qA10(qAX҃3uAS|o`Ba 'aOKNd !@^e@bFik{0-`Ti <}宻j<ֵΘ:^J>1==dMpLkK6bh?OۮݵX'O9͑jp;zzUR -q#pj!;_FVP~7 _X0y"qB$2`-0|yJ)33 & pUB`5]07^>y8IJMc[e/s)^O#9)i:|C9۩dRUv̖js=l8ˏa=dpq3`T× d(,h >L{nó(sqb\ fkR?I {^nqC8Z7YOMĞ@pO_. TϮ~+_i5̑p"T;JdU7 7[eIS@>&YGCq~~AVHb|mݬhɧ̆yQ.cu}m;yjeٲBb)@q, >3--C s 1`26x7(~% @ 7I! 3!^wBc:c_v'/b``;pmi5A0i|я~$ NҾ+wk15lWm'f&-ݐ:e6$^&n׼b$a.~EXa*K|lM -3D|BaBfRlD`%/!_0>/DCτ. kA `.HR޴kK@GJgx&L(nƹ56nZ8L6{Ki֟)gcS1=_|tC@L!%0 ;i 0ϗ;wASO%tzYB,SA%/c^_^.ljy}13vx=~8C:=fkco,g9*EO_c5c^cT0ldV-؞1#\Dk1.\3YUU@zy!^C8  |}n>ПÝ߉B}s)SαB^H09` !x)B{YBE828>Ϯb ˄Ҝ0(&m!N^~6_D@x+0f'xMQ*$e~Lj bvX\a+'fxo L0o@mƏq*fե%LGYM^"1;W/#s x?{I$8͌4a==}>w֚k#f@W.W(x>ǀhn @t?7YYDa .x7Lep.gwwf* 0 |b^R2ٕ#)r|1ɲȘi-,{LI̜Ԗ[A;/}G963\ʙ)#. v3򂠋Lc75)Cs %vܭˬvDE޽ls׿٦ӧ OM]90څ'Iة_`A)fo'hF\ 'ͣ-|s3coTN`!FbôV6Oo=pF7c! vy I;\!!njQ Qaa Eq.GV:@x~baF4,8!33#keaVX+LG<2W>(A;.(dsXg¤q^"-q䟄8Llerlj6.'s:~mA.63km<[Nkb_qltX1= B).F]nPnpIw܏ݜ0t'h|Oy:gt} Yuڑ,@!x;pΛyJ_4V6MK{_=46xgl{حd@qH@#"\ bABXcqnݥPLzfX{ m]v+vdzVթP4Mտún_1ʴeI1n"(60QzJ =X!!<]=״59?{e=H ;,h+7l{o~Đ~)xƉADvmgg@z0Z&X>zᇄ쌯@tB~Y),`O—w 3{ |G$kQu={?xtON|<}73%ͯ<"_4S##_>hYhӥ J٦:ﯾc}ZwM8<ܤbJ)HpӅI¤ϱuh@hj0Igej2v{:ifZ)Aя-@BD@!َVq`B-uQ ko!)wo_BD)?9Hp|r6;(sՈ:#J\6Ӷ8t )1ڢo|ٶOo:;-zvwũSXFex>R_0跮OA`2qe$;Θޭ+W+RCѷz!&D? UNh!&-*g G lXBd3 =*__l#bQ)&ER5gL98{5s[%k$`l54+ưnOoO6i.)L-]qvQLG9~ɾ/8LW^y%HE"O Ɉefh{aqmGV>>$C_3fПA[SH=\_Ki/ošZ1{u\}|p ({LdEVm|pp0{WO-NoANӑd]:§f O^oyWxJK%8!0Y;L/ ֙i2bz^ɴb?'M$ݒϙ$q8iݿdx./n)S- ':wC,v'@\ fs0 taDŽb8O}b2>=s@^/e8v5kVQ^s'@voUr޺wG#Ns u^G6Aۻq ƭ6zvsf S4ʵ˗FD"ޯsHIP҇φg@p }ko>!a2N`p | >߼>vꪚvKB#cc8gqv ;@ݭ>+L'#5UzGBI-|BBx QWQ-`d\HIQP95~t3A >y`b?w p B%=[';i||E|.~Y\Iap\Ii#=?Ӄ{z&~.Q.q:jXP6'_wc3Ń)zI @;sʎ@]30olwOSSQp;Wb ^&cä@L ٙr-;"Yйei>3(;Ztm$CN `΀{h39!20IC.աȿR_ga-[,l|9umx@JȡQ3NhąVIDPStG uyaj 7C#ϖ7q&(€!LmܘJx[O LkBΚ *l179`o@֛vc'ג|I̟~2nx\7903 C:I)~&p EI.n⁃lӶJ]lP}V=֞}ltࠝ~\l2ۀ/[M˴:g;M|m29(,<ub;[MKl鶫() >\!O8qbC{@|smrI ϿK[X/wsA| u;{:uev4bٗb鶧m/ܢdvd%\ϑn&]~vs v /P&㘏aj/Y$ЙIyN-J0* '/03d mivn`#/Gsg/Jӏݍ`{lnM9=?/8e2 w-ͽG00+M:M,xt4tM4>9ۉC1{~x`'Ñj xW)/?=yvH*i"k@K镲+k22sm`UUl۽Tz;y.{^rB%vn}`h( mLvݦJ{t[ey. S,菌?t "?Sv|Iq2o޼. D{Hz5ԖV3ruA9'b鱕).0`Þc]w WY.^fl[OjCńe9Ler!0azA?IL0!YJo!jO>Hct[81p< G}z2J~W;.y>T3 y脜k~RF0G!b.P;L9ІRWO_I֒?x%* U f_M*S֚_s=yWs\؞ Gzq|=fp3n[>Hg]TL("DxK1˞Kڝ 5G:= 焿#a< P)9x > gy&HFz.i+MlU.J1FXJ/bbX^,[kC:=ۖu6MoR|TZpBPaʠrŊo DoI\s 0$48rmbl 800ʐ@nx6gL9!R]Jyi{&RC@[v͕g] %lH I!:kodG=Ik.+d1lW*^{BsXlE  9EWVyY10?}~U%sϩ|9&qo,Wc=|8Liyx.[2ˡpd4<)}wq E&łb63~1$~잱mG|d\w Ly ݡBHmkS =9Cj쬓wDwA[xxn'k %: mdr 7c18ob;vklQGʏ\a.:/Bf3[ĆEAsϳ56W׊kfi0vwO&s Q9NZ?[v @3IDKǼM7n\`9v҂e?ıY2Ҕ^FSz)mxٺ- }:xMpe_+# WJD%9_QʷA[υ qK orƿ#A)VuH kRgb|ʙ5C(G|run,\~nz87 ni "2N*d4m ϙL'3vGH vY3!b:ßᦻ{|vG8nMa}ğ"J*eq.3Xd >K-f쩭+R["=G.}֫weu~2{mЀv37*mnV`p"Ğ8㌠,^ ?Nķ14@N~Lpڵ@Q;QeY=f؎2?ZG.~[+l3Sl#OYYY+bxi,'Std~HPoC3O>w0 գ]o [{_G0GѣG@c~ډf${CjlÇY3ۅ9+רx_v:>t9jX~'?&d+00'SP58skn3-U~h=[~.g_KqnIz<2nq-)C( QmNXat6_;~nBM@9PDƹd]3 ;{Y2=Hfacxf=O"y4C074/N$2ӿަMypb ^kEqJA^/+f6[=;K{n]'LfgOM1~seM`Om;J B10Հ# jG |f΁b_ "(\C1!\rҏu>br{R~♶S2ŭҺv;f}خcmWmOY t3bm9Y´\ei.u{e:sk86@z`J20=&\3tv6%n㾟) A`̘1Bcά*߻z҆?j'g/KMxs4Λ7iWni{La@[Qvu`϶,e%:xi=9h;D78dc[;,@g֬YA`ѢE`JRWmxa^:g!:J着? t5Mƀ3ʐxlΜ9 Rm=wO|8d.\/3~}؏P<ڿ%< ۾(Ga#Vi8^_#kYoލF out8ޡ6;Vy2L[<{ʡ<Tslr)Cv8O61q&6pS`SC@')+SNb3vGTL@*Tw1>Y|ú8=y(P)+mYp0#LmLMͅ8|N});?b{yFFz۾vK vi'첓& ֝]w -'Ɯ$86ۇ'+߬+57?+IZ6zX\yk"/_C:mfǓqH[s0a%}e2${ߵn[b;FD{[=\=yXUX~b/uC` vCm5z1g(xM(c̖/}?":(sHŒ%Kb:9Չ+Džƅ  : I@>͑}x/@wVi_,|@;"X0CW8}WOI `8^% _eJiᏄgrh!2TGf:),SpvBC:L\n;90t)ޟsyݰU֜ yt?{LҎb\_:dpC {>=Yع۝@Œ;81Sŀb,O kzslu3j>Ya)x"mxY[ZNY Sn8jjݴVBl+޽3ؔcS{c p֮%kZw-].c u} ._}[WxYe}zNпG }فHAqR@RNH ٙ߯-u}^B,j -5G]%^!R Km)Sl~_ЎI1 ?&%ŀr~ ߒeT52HBu>ĸ@.W[?iӦHlܸ1\eG 2dHHm;bxarK``y?KEG"ywUc1&=*UG @!^OB'g:D>7eʣ-=s 4[ay1G-~Y4a7:e~?j𧧇pW &ge9 8d=/¸=[zv޽KPE ˡN@c hmjbp7_{+joݒq%wqonӌqw,񣈡~1Bg{=h6"H{@LSWg-[ǟ`3j5ۛ tU2]6k}xE1 ڳc8AooK 4,Tɸv0_zN{袋lٲe+މ|!}&y1I&5@7Av0 >jV3ʖ}ڛgr|M)m)l@U(o :~0Pz& j}uSNӦIQJ(00a9ӭ:@tym<\шm8\0⿛K>8|*/1ޱjcv%? |Kx&90Jhgջ-|YZxJ3UJ );p0%W$K#^!A0wx0|c uF׿- ρOzw>umaw><={63YvLs1xq t\l Mʸ:B$,wF' &{ ,(`=~p7L?{$;@' 1S)b4?aZN'Gs<2ُ$ u"ۂYve:_n3a{ľhX~@IDAT7FRzh])qw%njcTڎ]y7Q#N+Ю!6Cs>>S%[0{ zαvΌ,Ucv/Xd$5]bgnzIWmF+C`uٹ< ծ~D̥1w mb/HQaI$(6 @*;|@{:~ ߗ|SSWe_bԿmc\ytgm*D fg"dGhqB1B8Q-kI/V^%\ BoKJoSjb[fX%K֧2nuk kN_oeIͤ!O''r1d,&@EEL;;%C)X4 #LwHtn_5fWX[En7 x&u;v15"UIA(6LR)oFv¡kǍaFka [koWQMwWۖ]{sHq{Vi: qꂍ!CFG('І!mhAG_!Dnݺʐ"_%._6{Şy ON3ϓau6|)cx6皵ɶĉUJ!qt+\;n :*Y}Ew)$>X{8(x6Y&A?,?~C 0LQ>W`:/[C)x 0C(u۷Ww˯^etmcM=mM:nt`^ ) Ւ҇zf-prΗ ")A]MB)V,MaDHUiPX`@1d0ݫc{` $Is23[Vf5jŖ_d^[|'ZUHf=iٓH]wu;|~ܟ3ngOLOTA21;P)[~~G R3Ϟim~kCn{vi{짷m;oW صo:"pW D^8eZCG̙3 ^x!D# N\s&i;#H (ُݯQ8RE %>Yemkiu]1 8@== whL~tp B+HiKHsD nM-_Ҟzꩆux\dcD,UhjY$ ?ӯeUf [7 o)LΖvb9MDZ:O9y焷 y'EgT_#NxH~ú2tUEz}LOL-y]H=1nslf~-㗭<^b3xW7-^yGti3YS*xl# /t^3n>A4nܫ H G +mzwk|&R ڶ8eO㺪/UTvՎn/^g?&6iɀk}v+58 0wܠ8p>` |錀C/5+hI>c~ 9a_l?^>h]ncFٞQ#±]-ɀgm𔲒X|%҇ rUc\Ҽ*倡8Lӧ XmB3G`0z Kw5qmɭ4" v]w/$߿)z8BfyfuQF۫o~?#*/1 -\'Ld8TB ۟dȩY S_Y 8EaRAӐGSSj0} hN-8ӄtӄ9*r z!2UmϟB>|q8쬧n[ `;0* h۪$^ 8)Tnj$K)& ^$.$Mnzݓq=,Hg8MwfT4CF YxCk]81$OBP˥ =T8E{S*|3a4/VW=mSc䰬'i㴺@z7&k?%{~no.if ܳ kb3*BHU!2&rc/|G-Ӛafޝ- ¹{\wOg7=^lz;I6'TT\ClHCowTЯ®߸-gV;JۻV9`W``=2gm܊}RkgN.]u7V}ku6u.Mַ7LgaF;=Wǽ4G~[r$/q!LΡ#ǖd|w!L}!_TJX;]F{lc\78!뾙" W|Ж}Z<{r;حtl}>(.J GtpZ92Xix9L}-("7I_B]}(>yg7>"ɑ3J*ۧmʅpO$0DžYBAӚ:Q@AÐyJ H 5pƗȷ95sVT  ?lxNmLeV!PMf{b?H>gJ-n2O'3.Wk>`9b' 3OHz'FS= n|PCch)^KqZ}-R~)㦝r5~1`lUp$1 vq_uQ2lw0EQ#-i'c^d//Ӎc,#.fo=:gg(NI:`uW 74@?>B?A b[6 3>ul3 qe]\H jv7[kƌݵVu۽6Bݶ@Cޡ쀎\j nd]zڮƀ3 ]!,?PƘg'^&BuE0C= Sox;~m7|S|~H@PRs],~bGahx㍆}'fZRϼ-cbm?Uwpbx*͟U*[hKƼa,'nao% vz|τ+A!Q; ?6]R09ʢK{#k 'gH$O2psx0nw3 ?i>ϼ3b}SC>f h:3X%;o1 @0pEqla9=0qĪ6< AäKǒcD,;sN@5vha?[S'YWqNt1[fSi#Wd ?t^u6;]e{=0{LWQ}ߖk6\;v4\>!ZM]z\aۦ3ϴ'M1wcG&MgLʭ;lpgG VZ}uU 4a6+=zK;IrNy+PAv{/Ym{wٮqGt&0fԩ p|o mA$8QUUeǏG5I'WHh# a' ׆!n61b`⽘D#gO8Nl'~\oay= ^|"]mW'N+.`q\r(P]k`[X^}T4{=+{?A"j7{Ha}nggΘ"Gug={9٦m:.P<e>8!8*~DǎkUUUXi2פuWm=~XQm׿+9Y˾` <67Cl rtZ(\ܯc))^.a[4F>>jmSueeJn;\΂vk@Dtm0K^?FnzʿK싟e}KZmO7xvHک\\Ńb"WKD^ e4g4ЪG7 D'_/VL+k!+ԅ$ $!yBF5#e$*9N~ة,:B@4>[ Kؙ1TE޵AD3$1\*sW{f)G?Dl! 3 Ž ㄽ̎ 4IH4urxVxW R%yH`6?;Ounn t~!(\4lni0$a}2-dTzȡj>l ,@b }DtۃG?c:;QD`Y%\=Hx:[6;i U5/@7 a"Irl YrM#w£#52}]y>+H?-[zA%ղ7Io^^\[5Vosِm  ]W\qE :vzBpRZfpM!7$/_ k"Իu#lІ=γ^`;&.5Dw]e_Y`G澠7vG2!g=*Qr;`Mw KH!$啄G^?HBc`{-=w{nd[#=Ϟsvfgf+=Cg|"|بS@L dN)$~@xl$f+5MCׯ-?r4I^2lC\~C]/> ?+ $=::CdL*]zwN=`0|7.pscnExpj]miEp:SL8I8p\  %Zո"׬1߬C6 (߇ײti>KÚG7Z}`? l7^/w3_c0Ix5u P Ⱥ ߫WO4hhT:1}:Us9it@ veckUSwֹ(F;XVz^B5&B P"2gO1bC5/uw2?/;1=#JvIx.{JbLs[6jr4ΏU8- [vsnrCb.33;v0'9@F@@HD4Z0 ӑ LS&KR $.@W'HMG!¿%;DJEJDHaG3<ZPc"qtDbAUˉos#J5Q8U&Ї Ƀ܁b:U y@ N2Ph(4/q^JI2Z~i Cz_6)?|`:Yѿr)L\c,IN?C?$L zԧ[f968ڡ6a[ 5C\Opqpֱ|sbn*b")ĬG{qtQtQEܪx#h|fUoѬ)~W_kߜ<: =Wh=/0vHykzhaXπ␁%*bGw2fl1;v)ޏzo= sս{?kQߟE6 RVD |+= \y7-C_k< o„ 2dCx_Dʋv#(ط[Kw|ͱc!.v$~ˡ p?\o3$V;Er|L+W#= ϋDg^M Jg:2 -< :pQA",H s7{ut1G-wyCixfb #2Č%QvJ8*HCw*53 M2,^Ͽ& Rn햣>%&?.WClsx2dffJ~iL3g,X&"׾wdԈޒѹ hfYpqNqPw| {2uۻ?M]TNRE/'-'?}Ye0}ǰXxutF|Ǒ8́E3?6+H)ϑu" vRzĉȺ`+:Z"NMKvS,X%pLl%wJ N#/[/8&Bzu-ۯ;+Er6'J|J;eT|\0@oxCFrҤIF2'EQ9pz$f333z4G{$͑IWYqa8I_QڮX Ҡnߐ}`?`8 iV^f>N{CLZmZ\eN+(k0(1jDfÇ8vr0':G9#7n4ϛh;~_[ j(ofbx&bhQ, 0'm~%$*b r^2>w˫eXD7Eo8on("Rn8vMGX:6;`(ĭy2PO,uܺ!?s5|>VuYg>l-Z7M.G?8O}DyY/O7=Š5~w.:'u.95tF}F ѣ )4M- 4   U.BP{t?={s/Gs? ʋBڧWHvNa?';>ξ%m[Y `s X5k91PTT9x;($#THt.D)m^ 3HK8tX*㌵J G?-9#:6Zz% n ?L?H@ /3CmU@u!2 ѩ' g)2ȀQœ/)8L (NaH!}j3W4Q7Xu ¸/& ԯ rPCw;BJ/=mcJIKqd&ĻuFuڋU509 ӖV!;0" KdlAB8{^WZ<|6}| }HQ6*_jhS̮ң+sGG/m^h::Y:eAԷir*-k{30@Dka oD8CWΪUwƮwY/\ƽnw֭sN커$xV}nn9mB wmFL6^'#+CX!RƏ-.N.^d)ޙ86K:HKXT!ʰ0WW;ILt|sZ deeeIff+zZ@ Ϙ;|gϞ5jdPi[R7"u!8qd($HdQ{CtuS}6+WKʮ @ "o*}{n|T}jRb㏝/sD%\=Z΍ FF%‘P?n|)HՐn؄ #cfРAfرcF"jăHia;rн{\} c+(ekvɌWoˌiИda ﲈғ; ^o$|T^ sKyYpJ:_Gb$M?~aGTLxJ"_8"c;co~{?a Px?20Dk֠\0q4@ѓUnx]Y+4=mj&3Fˊ9υ*ú`e9Opf?D^ `_ :Ym"DdMqm*^)`}RΠ H5'x tr^wl']e`EHVH݀ODlKxZGɰR1v!ؖ?^8iSקHIi 8/ (Æ >}]1)Ϲ3:Xi;}&# Ft7CrzTRFJIb~ TVIU$ypF!-r Rc SF:}4O!P,%ʹ%w/\^mェ$wP Y8ux;T@ JKz?%XO2R<tpaC) 2( Х $,l(o>6OeS~",s1=way">wۏc$p$y TVK.2vOFHؒeֱ2pp"%'D#?R\lR3ݓo|r=&O?m$_A%p5@#H.qZxr$ NJ8י}ekfNg_j0} }Z7{NMvyͼvK kڢ܌$,k#5@@,dd[H> #~d\FǟZf{g~CgbA beYҘ~Wc!ľ!G!9rϴ yyq1bK-+pn;3 >q(YW"9UQ8 `* gT\.'I'[ga , *PgSX~{ߑȖt2F;=9͛kK:YohA1`V+@:'-[f>x @#5 @vS"衂0N 5+m!ndDφ wbXC&B bY&Mb,`,0Bl%FvH5[R%c}ɇ`Ȕ™}S-s.[JP-2M&EBˆ ~YDz0ʑgKQi| I)?+tX7W LO푡sƂ|ަ-r?_7 ԕ)~_&%ђAˠ_9v"3jBxwOdpHK.ܛp'ᜁJ1$ÛmM|#j/Y_ 8.9EgϞ->h:䓷z0p}ym̕54j$8 s鈪I>/M(O{鼶9_C=mKz5СK,ݬ;v1*[A}~]5*2иTz!j^= wee`85&a'CL$Γ^H`> 3 K^G:̧ĞFQ`]f`!KK_ [_Q|jl$\aW{3$Rθw2 HLxZt9mܸq>@0snC($yTʜ2jH T5rOƱ \-;~`kv%2F/#e˞Dkv333 \1sw}&#T Ȼڛ8[;iɰ5N 1')R=89i$Cu%mdFJTI:,[$Ab&ԀدLn0*8XT(a'L8r\"9#Iv́1'l 8q#A 2KKO)YrQi# Ayjdl}L2&$`Rb1etb& *=ǝ 0IF:&.hH<ϴV1[:cX Ch}{ta Gbo]=.͆k GFgJ81( 1/wÍn?}2@\b ^} s! C]9nWrmS(EJg5qy N7x k@f0Nk<}-=닛W6xmt?A*l'3*00B1>ʇ^g}߯=,a ;H w@۽-/<}k͜ຘ85M}kw.Z>7PKw:$ pX12NXyuy$*!W.:DHrb7;go۷OːF#hj`„ *7"NO˫,_$e`a]] 8 jdry4)?aH59*̚Irtalޝؘj45l鷖8qLFiv#@Pux)Uy͝g|dԀ u;sTJ9x@P ؎N`Z9~|VgwL>JV|`ltK7?^-gq"3y@j}>w0싏YbgyD pضHv^9Q,QIH {8ʤʃ=eA;-(ߜ~Q+p 9|"#6zhW_[`$+88`Ζ p,QgF`GGzq8kiRLGaTZ(NkT4{=]g9ukGG:dtpUH1!FKJ, MS&Gո1ĹW:5hЧoo THR;7\O0k G8?VI"AtGeiGxmLc~i"L}6FSP H`5õrXj[޼xQ$)n?xrG i?>$mߵkWSN5:LFHyȀ^F0i:L;E&_cRYE]{;?e5F˜Emqd\SU?9L⑉'Ft$˲n>TՠS1S pj(FtAa/Lrlt~Iv$aHUl2+k.YovSN4E uC8l YPU}+H3P51x9!r㧌ܓivyRBcݺuslX[#dfhw}q_'[sM[ Qd"_x|N8;S( 1vn$O}H"D?empvLK#x8.X*  F6,PmJ=s46KTU>2xd,URPǕZapb&f-õIuR8&p5C.̬SiGxomk=v߹նtq^965C!Y%(᪫7L>]`.\] @$QkYX֬qЅaH\XϜ1✧[nt=wyK $B:8 NU`wrkV$Fu MZ' QK3?lJqwϕŪ̓s*ұK򓻟RN$6{&#%6% MBUےe de1D/V:gDJyE7?ֻ:{jv ]]ksrg 3[h f $% J>_Jڧ;s=*Nn26nhDuٛw¹^ Q>JPՃj۷7i|\)7 _yE:R}~Ǣة?!~.QtQ%w@o._z[GO`R.ritI_ @W~ލF8.(O&Ş>NJy*^cx !ppmƗ |H~H Het?m9;>oFXѡi)(2pG\QUǝjķU^D7j [*F#p} u|IC3paIcW(O ZmF~ݍ܆YYτ9B_5C8c5s^V^ve^T㏶:]4]Fzλn 7OX\P݊'TgϞiX c#mY}2"@td>Ȍp0jÇWGx {%iL)M. ,IT1@/Ɲ%Z ?vRrBAZGr-fbX@ ('Tq!PF8FF x&7Id5?2Qҿo4W|ޡS1:6NUHs." GAD5;-E6"~Ϲ^h-ݻW̙ccޖq]ZG ;6\RaֲX访!qf]QpIkMk]ﺨKt}> 3tgym4o5ݯcn{^=*W鼎;d(0=XP A "oQS%Hlfht\*R1 E8:ecw&M 4]ub+ݥ^qN$f&w!5!@QpHόG'9)ۼո;RZfKe vVmn 8;8 G#I~$>5uP˒!]T1s{ʔ)ү_v׉g*/t| r~7:r^>NqA&@IDATHۮ˖8-Y#}e$H@|#­7]'gcF M Sow!M"2gHٓe;ta5WGMۤs<^^3 À {.@DI#˱P*U"(EPAD_(D̷1M1&L4c|j%믾\i6F Q!iP7k퍤$˸Ȓс`Pߗ+(ȀK:W%As'qC\=r1υb(] ۯٮ]?汃"z:r7Y@;3jTnwaJ\IaGCDZk 6"[ۿ^0?lbMm|C? ~VVa޽菫~σ& O94lFØ1cL{$ }3+YriYUGezPB\?yzT|b$'Uʰ~ pLlߗ &C/TH\tL2$騫 7n9EBC&Ei$dt0}ؾ+ Lq~#%g 苝xyO¾< xRqcvD@l)oOH~ld1*$}fgwb3T:KqNLS D?ssBI+df *P:%,r11a D뫅4E&>)OȜe@vxu܉5h@(RK̴#33Sq].Q+%Kcc*:s%֛^So<ĽUPYJb]h| p-Q03*ꜫ*\Nշg/o&ew.=c92W,J㮀}pwMUݬu3afUܹ\K/O`nuj(KPҳ΂eƬ[jo犹ӧ7Di{IM)O^yP8TG iYc2؊L<"h( ZԢefiLQzC]QI,0h!]:ZeryYLݳ2vFS'j<{{$Wb$M(v<]>@_X+ȍ:U;.OؘJ߽X23J%'?RFʪ0y vD|mņf=Ə3i>}τL2Njz sTq>NNJT8b`!MRn>T%u.Ǥ;Ğ؝$eACb@.m&K: $Uǎ (Nr<:))),eIsa3n|@͆{Ue񀗎ӄE`jߓ/P@8 ZKO`_Ww ΙGzr}I"W;n P%7𥈫+I@Ė8G^HCom5i>QƱ>\,m?޺vkaX}ΒdyL^h;:YΠy?d`䋮7oڂo}; ^T J%,=lPqZ/6F֭BCNs=h .n&U+.C۵7:ܭQcZZ>p5]m"w2iv^7  k%e9"00 z=kTݳ!XyHݬޞټ̑- H%GH[Q8 7ԫdp" g4H]z:Jk,;A}w Hݮq j[ڼqa}w(&B&|na DCZғe ޣqFZ`DسXX`ĝz2iDGƖйx5x>ql0 _"QyMd wRk`%LRxm |.kUJ~99l׺\ 1զdTSʷ|$iG!))Qܵ'AtOPCY}'OU MױO8T/Vǒ,.-?% K.ȡ-/N͗QrlMr)ẎׄqZ Zwq|n2e<:D$@_>c@./7SȂqдo3.<.ICEބ ,r%Q^9s,AUVɻhj,(: 3!~4A%Ѿqơ\6vOi}u]CӷeX`cid{0s`ajOC \C޽piptHb[\ rl\pSpc܅0 hܢHbp,4ι["J*2YY_Fq5vwʧĥyk[IQwė ɓXޝ3d\uȜ*&d&a["t 4w(1%Z޶m\s5>9K1{KNs `;aүW8߫0ogm#CHNe waW p<^#*?߿aP_E=K,HR"RdM}wP;w%wҲgl^`HX?J)TYzINz OvO0Uv㸠6'{KG }s C >O-< "Y& `4v ֻKhxd%} n1a8;pA[$~acP{f/K_|ZIcczh)33:Nb"o ;$, S$:͛gDݩ@ `Yc~s\^Ɖ|qK9u.Q=gܡ} Љ9w!Za{,G]\%"m+Pj P2C2$9OOTC)SςsB֭8*^T@JaC߅inJ$n7\$mi % が Ղz@sǛB#qF47 }>#2Vh9#8=sg9uᾀ b%%Zq}pD %*3ǸpQ~4G5P+VO>$&>E|-~H[m8Q7׵a+hyg5Ylxg Z7} k})@to|m^Ʊ=׭3u>iӦu0[^4ytTߵ@ҋ>[ 9O}󔧡4*"lSI ,fw}snۈj< :.?p/e/żOO>뷖&s*̌{kٰQDB 5NHN m{9G 3 ~Q~Y--M݇⍋(jIg[%SMg8Q:q֭Q ?%3H B>iyë빇AJ5kUk6'9?ڍ*:si0ZAiKEpYw20FXZ'U;xwW/W ސAWą*u2i1:B"νܑtm9{>㘨oOvia]M)@\xʣEޗ/|vvrr*4A̓'+wH2G]+m&'@ZD^|;? P`VhiSܝ'#"܅.?w;5xwW_TM"$@߽+E8ϭc mPTn}%.qL[*$Ky-50 ^͛>4b0*eܐ|oC&$$'L`$2H\$#麣_|7_\4=ddA"D-G-0爂c6 s@ K?brIr성P($E> CFO*Ms W*`!J:K#d|Y=W tW7۸`aj4#pRNH/Y{1FK-2)h|PGK#Дnބ0-_k! ǠݸK"-:7ku\#-=8{=윗=ﱬSxMZqolB  _Pv|G"/+RRlnv)=W'=se,ωjC>x?"K_r<GH3X  |K15ҶuT }²5W54F'UR.&ɅȘ %tF-z$ !<9&t|wIh^{9-~k$HL$&Խ=ܱB=?,;)7\'- U@bj+{A=)=x99T^^!Y[ xQ˒AJ\Q~-QyP XgeZh;eR*y}G@*$5÷fw pܖ/_,g9嵊(Lh ̥;rLCL|S}*i lXVNmln8 cƌgy0(IҘ@>Gy ˸kj2aC\Ӈc~kF}kme:=̺5Ƴǰ:{/}2ξMc\C d_cgs 9u2*đ=IwХ3E ?]ր)nZSOw#秾逓MK{=҉ziGlc!K.g0)2 kb 3e|S;p; D-Zɠ`Oe >0 d)cMs9P"8a}k<\93\2 1w6:xWЋe\=?O3u76suHD˫yP(=wA2;S(Z Ӯ.'9-ga<j{*УH2J&}=ƑR6@xy&SdP";T HJq 킑)UN+e[P*.J Fs@ ,0vk_Qmr_A^ݙ'GX̤u2e'rypG#hRU&L_f̘<:}/x%Vl%c}uu=A#;c? Gǟ:ϡO8prn՞W1\9ޮ}'mV֭N&&%mi4c1 nYW:$}"n.;jÆ ^(]JϞ>{*SMžDt=^LJtּZV\2?&̲\F,qB<)ϝ Lx 2e6`vy0Ts *.sq@qa d\}]fMsWyE$#լ{Epe +1憵E)H;gwRj);pmcT.xH-]>寘1: ?ƛLiuL?s>Ow䩓BJ vf;z- >m[gF?Qǎ gdl5c\dؾcP$rZk<};kOBV k൅y HPXU=R`M+/CO]c_ZV-XTf&Iwȶ@N0x:5\Df<`\ܰT(ˊ{m/Rnh}ذa $I}2 >[W֭[^رc3; λ 0}|^:^)8>1.\FaI3S;sS aيVscʨ\ԮSY_8wISRQ'{Ld8C qظup+̻w@3?yL\SpsQm(؅PGKQ#>b֛6а8gئG Lw|zm/kÛ8]^7NCuFclݺE:wq8vi%ݍm2.w),aMGuQ2.\$@ pR3^T\d,r;K,1uO6HP:!?n+9J.%жm[s, kZv/3 / qkp@\{UnH{JX#X*3M@4,EXPF@=̎&>HxCa`% [}$H9p EioW<SŔwf\;w1C&:[ I1`AU蒅p9vX̗<3$ w`'e}#wo~0IɁGke˼١hJVbFqi{.4h7163{fCTz 5z>2_ wr-ٽ`7!wH..kbq-\]-~ηkb*^2R ږ1xlbT=SKx`ʕ_A=ۓӸk'M^>"gxR⦷6[^K,O'x¸@$8(n:z{>d`j7˗If),gvLa$FP\88SH j'XQ bM$zW1ƛ5'"du bW N0):! @}'U&k` W?(BaНɒ#x$OC46E$I8;_Ҳ$dix 2 no;Y^y?Q2ڔHn92-I22j$F+0hٸ+YR+ ׭H;>x2IɴPԿ#NFQԛ:yX89|<)F-w޴|V ųIlIݲC :{{)SԔ$ڱRj0m=.Yo#ГI{@표CR*Mxd3C&MѼ  l\Ζ3,v̻"OV pmseСD&MTD4… >BZPa}umx7Z7KJĕk]ZYr5 ^J4_\ZbadwUOq׫),NXt/?-B_F "*<.G׼r`B´pq\4Ī/7ر};;<嶛 ut_5wL I*)_lvdWI6p^A%l e2Ȕ=_SeE' PFrT ,APS?LOoM{n:#ZWhY2eb9}.ZM ;=[j!Ua.¯"N$QE#!!\sg@˳ 2Wm 8&窴C[#%@Kx-Q*mUNO;{X3ŁY3NYIsXGsTi;*S_(/N AB.$p)_̕g?"gsˍ}Zz&v-}6[p{,v!ʓO>iTjn@Bᣏ>2LSo 2l~*ӻw/ێ6I.UA] UU0#VE|zѹ--bԮ檝f?\=eXr Qee~K8uh|>ܝvTvgff lVD}c+/A=n+r R A_>u0/3vA>NlZkC^ƍ%$\xy<Ƃ=},g{[)b:ZaGg-kc ,ovKxˆ̕Nl\ ׫G&D}) aa;L )nL47rw$VFm F_-+b˴<`*c>@֭kw98`揊kL;͝Zxlq5!# aigͫ#!vKj Gk[%W9l}@ RvYp6'F^N&Hđ`צɒuiҭS|SzAة}.h` vPiwD`]/yM`^@u)aof<.U8O>uUرSc# r˜JVV۟.,xI'Ȝ 8ja}'li˗})Nm%SN2/Z by^^{5ٴ/rg t 7~!}Ljc:'vc!G"z>& г   h LG@&Mo^yh?L.%opd6SҩC|T{f\yss,kgIkUnQ2k:gUJ$@a L!3T ( G%i(_cx6-n4g&X 7nH26-{ɿIm9~"##dX=XqH"кF+ J[/l#{C5 QF,d1gGIϮ%hM85V1|dP; w@55d:p,(@& ^ >/Ր:1zA89wxaTYvD]Vwud+9|,HM:0wM%!8|/ouB3b:6n ItK^RAHz@`UȂUgqQ08ކm;[,;|W-(܁$wP~-CPS%%7hWʬ9&/x+FrV`աDYkau[Wo!JkTVGyW䞻5Qm~}9}<}F*]U_k.- =?9z ӷ̝v[N@丝!d#ţ8iIБP^Ll1]4.&LpƩ|mZ' ˳cs<&X!h)WWCF"&oJo p<|3E%3[..,c$S,^Y $dq#(ϖxM. \]i`]8&o&{!9+O;дTϹI4ȱ$ Wӟdn3&3&ȁ#rT|e1Ưs B#x,] (a} gbЦ̀ ׽ 9r:V~!;' ҦUlޝ z9[}CT2U5$I+T[85$~i*F| %a m./DHq)pk@0HŞs?>#n&I.Yg/='pi;4@ Lj*֮]k2Nh;&9:2\\zv%E/Nx,|}j9} ߂GvF5xH=:( 4 )| (KZ #8=} J {đ7+J.,3׌c Zm:WoOw3}viބ`-ږ˖;G)0fΒѣǸߛ(7|Yk;y4iPS /ivm;=([6o5"&ܙON#2fʤ{Yĝ_@?u#{1I}{:t4^"3g- ?j,I?"/}X% -EkZmIҿ{dv,οPTj壴^ꌓ*ʌ zA4A|騃ɝMsx<:Z_% ؆ 䢡gϞHJ { qG< :/ KARX<6z$ގڬA5`.rS]0p[ld4NZaLX @9*x 27ܩ@sD_w\ˬg  -[%+pg~r^w}裏 &]J@ޢE/ 䇐?B&@ 4x:7NoB ׭fɯ!uzm_+2Cy."šد5Lּ5^z=aISi%e i|,^/3BNyYba\2Haaf{*??ql.ik.fZ2k ŏ0vҝg$l6v) <2$G \5H#{vqS0˩cG})ϰ@l\b-gch@asEf6Lxۦ̗GFZ `2w?=ZfQmA<RYrOJ/6/uGK6w/\j@3)Ox' v]|H88oGff1H&SHql C `JR0հ Ci>{Pz{D$:"?QdWˉ`:w*Pix͗(<H * B >sJp 6@&(C54J|džAg\t? y+8_sUkIHJà# S I_ FO8gq}1Xlp .FL5kZqNTv],ih8 <:1jyhcKk{6k׽2ڞ_3ξ= , ;ݾ}tpI{-5A8!`Al-Ϟ{dp̆]wKzY_X)VR@S w.0z?'TJhbsLH0C@b 0,y ~ж ѝ\ZIl=srEK>:*L?UUŒ1j?2N@;gqqK"7ʯ5:ze=JV+ u w)NFuwiu\wtȏ./^ysb-blCG2_q%U8"2FO.se?y^63Zj ð~`I 1m9!pD{K pcc322 3llRa{Vpb2gDCŁ{`2a#Be cdK s!GK`<\:Xr0ZI9inmu-]f}RBٳgGF %3h;w5>XrIab_> uX wNY_q5?jo,y}Tu7ȃh1rx]œOAwޓU ߢ=a<?ܳl-OƾiUmP+.?`ver#QEeyM r!TmVTPӵ/ ?&Ի2B8R"$41v 7Uiyl5c*YCel@"Y1[s8B& 腣aÆ9hT!O}6D삠裏vh{ aٶzs!6bx5\RׅDf~ 3{Vەa673{bZ\ va??g 6%}•c`g" dCtbG#qôDC?CE3>/.ߢ'f8~+s<?YG OWRkzNjycwD5p!:7rJŨe(TucղD@81ytJP%ev59 *YYRtTB Bp!l ?蘭TzI$W !w#k8uCȴ.4povÍy!F~[C"u|Oa?h^E䞖-[uY lt횵vO~Z8Mex c/uGRFR9Xp@Ɵ7u(D끗^: e=Q@חքִmA#tF{ĕR߿,3Z >SU(olr-;+'OkXpOis}~&@ğyvȾ[ݢ6Dk dG^Q@spSѾ_~^`OfIjV'v%m(Ş}#DIDT~v<&"M^h$`oc &ghdsK$3 /DÇ;XG uYe龬ډ-wN*=lV>DH '|]c\z6o:uz eObTx ݊6΂xO?6naU;pΚqɇZ["$@{,>=mIJ:Wl;h"]F!I_ֵPE$=)Ҵuާb@E/Ϫ Xq",Ũ~NZ.#vA^›oc|30GuQD骉gv!A ܄rW?'a>P4Cap,4Z>+o` 4Ŷԋ/7WmoJiŘ{ΰ^v&_%Dݑ&4F[߮/C?uy<_bW  hLb[-pmup>5U%O{k}]u:cpxM񧲪s6˒zxusqͺC`j{VWU{ i?:Ad(8q 5CtT)l1+(A-~W  _-v{b,W8 i9@6fشw _@@רF;"҄omsz =^-GՀ@!@ Ĉڊs!/}_zz|tUvEMR8Is}wD:[tX$ˇryݖww#Oۺ=vOtng ] 9ޏs9mξH1 nX&^JuêF$dwɰ^#^ 0W/;hBݛÈ0]ӀΝ;mN ?,?\S_.~Ki_֗G\{\TkLԷz .+VǷJ]ODئ%ݦn^hn;e`=V9.<]|P;ׂhӷƏ ǰa|VR5>@|^/M9 >%m3̳̬P[]kFaRR0$[[]&\;j`/޻ݦŞwN/}wsd_-COk8r4>D_?WRTۯo=F(CbjE`Vش*1]k K&b;]pDxD(,,tHd1)7dھYNhs@L2F:=<6)xU%isO]l<1͚'-7b./Kکk.ʮΖC7:BL2cm.'Dd/{AP!2X8~24%lu.ehg'eˏkšl!F*`F]`9=hl7TyY2<:e$ox =e3gexP#)Q iD#}&zX.c+ҕe1É/T)PW g^{}p(X- rM79$mޠ@:t .p0~lpY)$55;{Lcˣ^|>Ǥ8_iN_״i`vr\5h} g?s:tO=7QI"0XMkߞm]lN]'lyOy$Tʅ¶;ʹK)2VVcڋj,o?{.?] bHK!xDMnQD,ϩg\>[49 H̖% ŭO5<[Ĕ,:UX^=r?|_k{\.~ހ+'l7JĀ S/LG"q9 :C8\K<pAX nATY [w]?JB&e]n=_&k dusu]*,Ė@M^86? .-l ĄMr(z6P bqqL ۔)S@׶ƿ; & bX|/K"W9+pyrdcl `X0&x!pE$h4@TޒU#"+ޡ( 'O+3N$Ǐ~V\Pd@BgF!P)293~@;\}&ʺ?uµƎpM4lRiOisanbm'ʖO% Griw匤GL:qI͛lǾp!0jΎҚa!z:kʴWm/9 ak%[&oO< 1㏖Ec!%_RvWD-ys%Ir[kn/Ab߅ّ!/7Si-~Zg `Z#[-+~&fU>fb8:( ntnRK/Bfd@d]7x鎃\W\g{6_Kws[7glv֒ ȰoZh֖ٓ/~^P 83ԦV6nN] [ɇmw`5QNd8FAP1sLzZWi>@ !ߖtUq[IJ!#Ǭϲsؚ"e"jTZ5묪@ `+l㠝 sY(P=ivA=n0Q8 (k P"wۃ(PV@(xnImO7+#a ޵&nwNk_J Ae}fi1 ,*Ssye9an?nO ^bͥ'003SoEǸ(GSvw=ڦo_1)'R5Fk1mGGypcw(5jO|{mw831pr;"'pF2JbV<Ĺy"gDoǼEscB|hW@?:P JLy3rklc٦-VZn9% 7y 뗉 UxHj RԜ57C%6y/ꫝ>X+EOYq@!1K?>KU`zyھ%{ }^?p; ) &nV}+ d @ɄJ ozry1~p,CZG8|oRO< %|Z{l!vλ:Z̍ۘ]@~.YDDY«fG~蜵Lb mPD7Cnu|eVpQ{4WQZ2:Ա[':.ʦC8p.BX½mG׾X`z _Fݚ!qbKjd7bp,tu 0׃:OH轏Z#."$@M }ρN}={C.;0'қ:QW h{7Oneg5T+KL"xN3<6Md0p\h^NKWD57׹ lO_! aQqe;sEf0sqPK,%D7@"<Vv{կmm#mnkKd,o|UF Cul<5ܹԥ=nOE9 >V٘5kSݍ_[۸^{9Na&͕1{fZ6" p=:5$d1=^vztuxeT0f+ Jw@eUHq)"iY D H%b  >383]};ů*[I\}[|B ~h̚m]׭}m{ɞ@?z5hzm-<}>`-=w ^~Ղk{Yom9>GaI}qk6D෯C=(}bg֫@>r $wgk PZgߟw0ɻ,z)6mZSw5Mtſ:3i@uhlcxh8F}oL-Wε٠ﯻk~ x>W 48&}^|qn('/C99A=G Kfd ˶8ъ3/8t[vϴhJ!\VyQ8%$PٻȶWdz!Z!A}{g@Wyȷ}3J&w1;x܏ɓ@*pA8xH4Xz[7#‚Dq'D BbJ.M1= (_%@pc6jh|n+=mnuPꮯݐionʷRX&Ի]_=[ ޕȦ$\r=]KK`ݠGLޯ'_.̷CZíD=7%'\ fvu"kN;e!?a"G(QǷE>WZ{K*6\#N=aOm8bW]u]qڶSz.ţ쮇gdlTJ(վfJ{O/ecFu$X(o̫OVjGKg,[K :p:`(f I]_4T \\\8 N/Dw'qx}64̝aU`9띺oϺ'v}Džs7lb6 lT{"VcBbgg]%MicF6Xt\n8fbnXν:* Zl4@.j4pB µ+W 6;m,_FcM_7n-; l]g9W)_K!mԀ6`®N:N*R~}kBBe:wذav嗻w#5Xޑ欹R 6曝4>|P=:6wm 3tτ \͍cG* b1  S= TdW! 8Nuv(>mEM>&fd$Iv m bDpZ څJJk8{j0y D=ډccd x)!5 M6nCYyO z`Gk[v_'Nz8Qm i>h]O@>S1s|-V˶ل]O|oBuda=bo۳ʾrJ'QPGlpzf=@Dž0#U\\VC>A2"#ܧη6'W"wZYp`mt٬+s]>h~be6|1V] іDK7Y0S3ua4U3ch" tt@ڈx:$a* {?kl i*='*$2(;R)SRati{a$N_} ח*D7)z<u yhY0j/S=A5ktǘEmf9k!L%"QN4thǜGTk7q钒 V#= @7dHdgdjU}pFF#NK42>q%uth|Algtozdj}y jg 'G:)eV9&ߙv}4Jٗ+\e#e ][kKWA/3AnhGpAh ;Ǽ5iK=z)*z LKmt=;;CYŕ?.kHYyyvSi 2-^cݲkwO_f{*m٪lGʰ˜?%+z=R;l҆\ DrkDt-C4D*9u?Oz,`Vk"Pز_3C]]]Xv:dfk&k-!l\=N켳Ќq'?ZpCR ,H{A؀1E1ڈ>ߋd%4?xR!6$lmvNx]'ei]*~ShF! :Xjh;zl 6Dcn<4%E0T.wAh7sR뮳~h 5*miVO Vni Yk^an&SA`R<Њ8:i|FtcrzI)6 ` _]{u0U5u-l R$e0`KY_re8qv+]07gWk06 ^BJ=0zzw(gL lM"̞_ec}{<,..vsmfyi"G] UGS9#`Oap^y}/Kl*ngGWa#؇sZ.Hr 6{A;ot(2'O$&zx(aK4 ;N[cOL@˧=`"/^n(P-csH>cJ=@SOBfe!?Ng v>KuNN<򿭳ߪsذAvOzo1?\f -3BDC%n/[Yk>'u? 6Xw9h8 <ڠ '5T5üYWm7]b[)~ nIb-[WܫeU]w kv ^1/逢]=%cK%9Pk$p!D% n @V$KO֒6yЗX9k7[n7ঁX~zL{Æv]$bJ^+)n^20e7@%DTV J20yU-'i v{s 8fe2wv M>y`ٔCKdƶ-E#hNUKh#]}f,5[>Mo]=f?\X !H@q{#ڍe ծ6C.ַO_=F-V]';ѺuM)I4]F\+vc)ltkEH ˧t=CEu\]PQ5z8~lt!ձurmR2 Cp{<v:)i8ō2b^~/^Zmw?˕ߔs]hiM q &WzCU^.45ֻgd$W(- $o\oL:GWmĠ"%"iCCX,w~]K>-k/MkE<.ʑAA6$5َ/)aMz$M k† }"&D7kh;Hn1(G[ppO"PB (ڈVK%*k&I,P\j5Y :SjXO=?l6uVr.{{_o@o],b߰DcK>3<`\sGgvaNo;4̓M3ߓ_7 lHjC3zBW[غR<m>;;) vf}OǥRJ?b]vJc|iSĜԅrfqw6WEj9ZߎA266e||hHx6@ uuP`H@%3`TO߇+OZIi" (p05gKB3Cr7p |*[Ya>\me #,6ݼn^zžZ,ɪ|"BS\\p7B- :op@Zl||I\t`.v(^|}ڄ=Cm+jQu%]ґ T9ʲD VƗ$- ^$ }"aNi!z# _\`e]n?sk2JV ,s^sMfWZ씓̾%~f=j BM* $ $ aϼhT Itf`pRszBI-ܟBR t漵Ws~N9>T[e$JWmnuM: lD$BI-g~se70Bz(' 7iBdOmYnc@\H 'ȍW H(8 dyfP9˰cl;m=oC&2]7 @xQwm$?jz\va3|)D% kZx%1 փ6xx;k:5פ MMs@Z@&?<7V{_7܅rwN96߾xTGr?BT{dWNnOfʛU7\}3s}OX]c冰bS̐&~@*H:N;;~6 |kڠ<WM L>{ȐZ&[bkcVk' Ym'mJ!^v^_ %,~SżxBq%NH%拈a(ҡ \i` D} `I`{eYk2C}a}G"SR[w;6K8״])@Et7Z&T?CeN=Ѭ\{o,e;8' k&n^Ky =o?<;wKmmAD)d!}!6Wd;Jj7-̀'B7E>m|X9NܶTnlyӀl~𯚚jqˆy; `%^roF,vTn!CcɳQJ} *YG2{YY~}ig*mp>xE6dTg.7dKWT۰]l-xr5 B '/ G'[T"Za !ٕZ[<[d}C5;K{ۼ%ҨmvN ;B ?H'Re˖{o%BH(}v|i0ЂۼV; .W5EafomO]` p8h-TҌe'•" $EսRT]81]~Oa!JF45%/ُ^(hi@gPbvvMKC4X%x@$<͸q4o\' D@6BfG !wU5P?gcZQcX*41ZRԩS9*pk#fۙ#UڥW?y=8Y 0n׮2^{g etuP>&[Z&<0~Z =O~Osn$x_ADP )&@@/P׌|2w3&lk"A"pLsJeqKdǓh}慹cȚ5k *K\YO6D0pkذaF~5WGN:ɂبf}~vYl(ɲ?c2(~L*&ϲcOV;6u=| Wu~b݂{ rm% EЦ<'N< ,>H~2y= I@$ؑnb'~(6$Xj9jYb!.ryA}pQ~ڷ֕ lXTv~4D߿i|"i@g B\+39lvT L-6ً^k 8 z $^Ӂ:ibkFTpŤjZ:$͎ {Qn mu}$? GU*KlG<࣎G]i$Xon8Ytهѣ \c#{t!EēsmjsR뻎̶,;<;| m𐸷4Cxi k{lCN}MP2K2njar%ג/6PA{ CZ&Z0a vmW`Ƈs̏, w+٪PfE's{NQ1; ܧnmJ;/^}QRZlqK5!9e~lv4_k~R!>3%$HW1]un/"~`;nMr!"p ;T'^U0久9lߏkRG}'H_ZL$rӡU30_٪T(M0Ò4Uب&YsXFSAPUҫBDܦZӵ ϱ翺|8Dw@R?WAA1c]C2KB_eSW'_hKW:C7!6cV͙_t>.!\R{MVZS*r]bߞ96i|S=h! rq6<ڠT 0Ǐsw2m3&3"%155(?߸:8N>!]]&oP\"oKlGlkŊ҄$@IDATK/9@=u7ӂ-) \"kY0N~dAhvY.]EOCf,ɲNі#jvZ">KO@^*$-;m39Cbh Y=9Hh_[1F_oFC ҧXI4ڮ3ȝ(q_ld7{m9MyB@}I }&ig>:i+y7Hχ)oFYq3f&*4D}5uN>e/_<>{{>gwTlZW[!gQ{M>"ߎτP "7'Cj\g!2سGw* .0]`#ͻHJm֧ 7ky݅Y\\츝 -oҹF:R9 ވC{hu$*_{w]/I $,^|F ɲCs2#`Ď i}0'O+"ikLU9@ ͇fEݼ>kӟ'Nj5xwLjdmO4;[~给P؟fjIteˀZ n8#e8')'N3 B8Hp-8 %Cqcmv @qu^OA Uz{,Tt$&Ѧ~&{vY+np!k=7xùka@3E%\jwNOwzTk1@߼ D'G~W5D%@> hߏ?njM6+Xk–6 5x;m2UN>mz8Y-ڵ fk*8R.@sB|X; qB-U5DlL*a;wCP5%AT_fͭr6>Vsڔpts S_gC|_w?R&J4ݥ-[U#v$ 0>WiW\֮B,A3dC\G翙%g AH5:* grm.Ro.ζ_Zfk>mb~Ns(ǁ^e.ʑ4*.X`б5hZ;|&{5iӜzqqq˒W0aE=6% \jk/+ΰ-@R1Y.$dR  ʿZpO-xEZ,_Xp9ts%c -&|܂fY(` h\Pr衇:B&8|5dp ^Z=O .;k7&fKRv߄'B͓@ y~r}p 7ń v.uQ0qؿ@DyR+vpSAUE`![Ha;g-U\D:L 6S.Vi_XZr ˂qH7wHĽB:fGgE2Xe;Ͱ3N*" U@'VKoToY> zG_DmbdBH"l\]Fs)iu)&sdKMe˸l0.cB+mzS3@g@ncN@mg ~!k`s2ouck_K Vl\Jx7t=17AJ?,WHe`#en,;v׻yZT?d-[Y]^[`̾*˜>VʦϬtpfj}I]Xe:#cl(g1ba0B 'Bs+>zXFiThl(Zdɘ~]KuòlR.CjlhytF!^giyT_[>."4W[Zz}-ZUZ`2$ Ƀd)clkw }~I@ph6 Yu̱"|QT)-rRX,iUB[,_~![0lp= >~(i"*)1"vELaL -|3tԼf!9F4: '³z֬ K/}KGj^{OÏ "9C1B 63pzvB  UB# n_Y u2}PHF̉J!؟Sc_?i VOURpp$;o-S)oPchS_קG(؄S Gu.NUk3+Ϻw4JM? 6giBߧ g<#[o>QZ.[ћ 7ܵ@ȼ+x ؼ#7y N볯T`oYTi$'64L%]wyeמ2B@^g uD`)Z\7$f1h<nj,,Q޾}r߻yXm(ޘUбk`N=D`[* B@`<^T R}e|j-K{ #Lk؂{F1;" (=rrD>̱2xΙ)߂w!&= VhF`f 0>з))+`3-zGgHZ{MSk+h#]sf`#`0$J{GC~BeǴHl*[Hn{wŰ~|ן>/4Mh r޹h玭#{:KNɲ#GI}y/v#"#ROІN6~WL_h5؜R;LhHݦ(g)~^[9sث6ϩ@|K"kMd/`\ KA~uAO{u&ݯ9ool]teN\ $}eq 3 9c:$ 9.%Ҹ>kai,B"S vѪjl/id OR H(leH̿RjmB}*yV. LڣTjLFP"]ۃF2d|c_uJvXK_~٭ 0c|q[P_>eKC~<'PJD̾{+G0j˯Y0S*,6d߭6 `s-3tM8 7p#(%&=KqÏh+]g@ߎ{A`Px#=UYCIx]t;4 ?uY_gW K# Oh˹IUƍg{SC!S*r9"\\\8l༗AB+ge wjb"b¥]W!/& rB*cEA&Lp"XZg7 sMǗK l-M1VrAئT;iic}Ə)T>ϐJZ+ ၩ\!-7}w0i;礵'4"wSL b~O:$'>pfobcJ-%f/x"\]+ 6*<3 8b@A~wh 쟒iw)?z dH.Hkzm̘1nmGOV垼>A@=Q[\c38cʪ +7 kP٨uFnjSڃz}ğ|T08`;I ' ow r)h~kB Xl`[ł.Ԗ7_SF| )\bd d>`SAa/ . t !'<ήϴ3ydݥ? H$.fA$JWHiNcPu'x/?v- T৫I0tDƴouD2)R׮O]k'9!J$e}qʶR5s&RKlvPb΀YyF/iT(d0E\_^};TSlM^ZSv;)کA + OhKnfJgem 쐃di6G)) @ $?.<=Yɡ?aous;=zGB:.NS}/ 0@[:l0 on{{Ֆ.E9Z^hUؒ·l=ȳ]t-{,L dб~1ӎ3NB, |_N$)..v)S:hõִXtkl!s_ w= {,j p4Bh/83TddzaͮZ^5K=-ͩfo0 X~Py; ~P@f{ pg $HWCn |d˄'{S`P-+3JV&H<͏Ocy62Aҙ#8Kl }w |k !6t^h!l3dch_ʧG&M| WNe /.myuc׵싊hO % gv:thmC*ˮ]_k[? ǾqJwvgv֗J߿Rxpv!v/V ;+6v׮`I şV@&gWbSvr$@A >c \we/^7cϕ۟n\gzԞion>%+bbT@>U!Mu_zBh g*Gy *uCzu0C!I1UHm޼[Á;}y`,qU[6o_m3[A[oi BāQbWтw?f0d=,8`[Ϙi='&r\ `xA" r!fg:IW$^;Ӗ.M{Li־͏ܻ"U2nl0SC߆H.yJݡw|tn=.t3&I'U۷o {cX Hj2שU*َpreȆsJɩXM8{m;*+Zqklj{Q~̊e3CCLz6a߹D ӁBpmOD;\Sm~zj{MN:D_-zGv.//Yvl3hǁd(d>݆5jm.-\ bH9ҩc՟uiN]TpPamm VE2 ;ڂ 6xXzԂ鯉 y*>dv$ ̐Y_`1Bs<.o ?W$u0K^f_<>,=gذaqq1@GJ䥗^r}5՝Dtխc Hh0tI'T77B?p׫1 !nc)M"|7 { _GSw׉%s&il~MpҡJBHfsbUjGB|^5ߤ`PA\M::ߵ; NqqSUn %@/ \erQPEu+>A- lj{"z?v'k}U KA%m'.8G=b_=ChWfc+Vkޚ٩[մykwD<:#Fpё7<D< ,p鼧Ze57H?CJmu^EvA9}'_./o_?@jxO=6yr8\;t\'˦S"iyl_M|Y$pYbG+ƑL6V3 <U  3 xJ;Wy^A` ۧڼ;B .d4E.Wom"D2&hv G$5j~ tN`޷EX?a>#ҵN#nT |3a۞ 5)|}mG>UO5u+.v<0y !'n٘ :{L Q'.!`]T ѱ]z:>WV\}䣻; 5 W٭ȘTb]J53 Tmilܩob{G aA'f 8d=zm֢U̳O_d&y%ZbA+B5w=w2Ι- d06}T>`q~!SժYe3fA$8]>}AD(Q]$HWzf`" u"ovC&ʯ_s!̯/R3ܹ*qGBTe8GxHOЦ e?6h ;vh|jx;elRHt\zcy_|upJUd-v]J  D:t[lE;`&o~L?Q aAR ZH }Ridi?hR9BdSָ 20~H2`T\-t}4GJjmyN倡?TgN|I3 r. ,_q;֬Yz]TƘa /]n/5T5@gnQs0\$Cg~QX1'+k׺u2 $s slc`G-9Z0փ!Ŷ"Vi|4)I6]&yxF檉\EAoS,Jpr;xȅmſlcJ8uF4fa|k}*[ @ԭk\) 8k<Gtݹ}t\ xGUA{@ʫUB}:/ji VUVlBɴcg[qӟiln*>(j|6P Q0$h)ĀzQ~ ~G귬\- {l W&>k-Gz[_b۫\_p*ߏO><ߞ{e]նh):5Cw*Ve]H>1.~{6y\D޻f6at3 ;SC< |MWzs)0@hMdn^rvL &fۻl cGO .RS$/kP}`\" Lyq0YA~+e7OoGO*Z1ٻ}޲mt 4EEwK&hb]c("( w67w2;3ݷs=-:#-ФΛ dj/ 菃k9pXR_%VTK* Z9l h fuDbEvmwv1q`*7hy+0i$, `5ތ&}D+=vUAҬlR`-`cSJ;G+5ط/ C/;&RʜGjϡ6q_BE٠hZއ[&L'`|PP@W,7̛2"2#3&I擌1ؖ\C= tH"Ӧ3+ɮQOmM?G̺p)L6 {# !s@ Ƞڵdz蔪Oaw0 49ĎJ?e_8a ITt: XФ)NH#[pRVNY%y͙Eb;}޽:1:xOp &w9&`!s ./H \-_ᐚa?< L,߷VAs t\r2do30X ǃEv0\ɛsQWBgs[],}:NS >ھoŵco!ǂgƅF{hb]r1/zﶩmY )Ʊ1Cd7vފ00%HN߽)ҡ2sŵ;G 3㏫?\s+5~'},Z P2ƍ`^D7iL|)&~>شez݃9t hvK9hɛV:jzACZQ!Xt{/ƌG5 _>8 ~ G s}(ѦcZ#ȀQo `3X |_^cW5b~7G2)*7'NxN>w^|TpX+J~_(WGEW2H|9G_XOzPj絡} лv?Dlq\0 T7L"p1}H7"ǁӋ)S+38&ayvtZqs /Z"\: N,9vDsuv}AM<Er O(_>Jd%=rgɛ]qisʼy`m ֶ_#S )##W*w+K>&x -bX]2&ykKG' MJ`R@N:1I8V] C̐!Cd֬YpB%,5CN/~LeضTU.La&* OMC7ב)XV~wߩ裏V 6Cա NH!57i׺w8'~!,i%j^S7< ,:T. ?_ɂ\ U?N˕pKx^)22%t5z7wk˨y@aϖ-[?@ j|։{X,ťbu(b͝)ovvTV_5+C !sD[ N@A@fyf XHj05l |d# :6  ;\ߒ@ 0n̖L8)$SG u j粳&qMh7U mHh br6@xHy̳9'b>5)pƹ!0>ωhy$nܺ-w3y"[6oq5<+$ ]He%@}"R@Fɜ46vSKVUt&Yzvޖf}?G@+j뽠=n g !3O?:]!Ix;(-c9Fs aH;ɸ̄&崣 Ϲ2rFEd#C, ͏s}Qg CFcŚ _ OK3ƧI6R G0@)r z|/~,8/7ss MCX^]bm[wZ` kZ}EO&5c&`0J>\"r8 L޸yYI׈"_٧iψu+4/=.#(0}e.w nA[mB]?"B@أGhK߬JB@\SV'Je?^ #bY̰^T66T\h߉գ;^c"/*փ`n'7c.+sD~y- (Pej턓6ZЧ)6 [A>4WƣFzRgUfJj|Ƭu<Mz y/>^R~7ZhQڷoS0Σ! j3QZaj!5<ނiS YQir"  *)J)IIjh^i݈]rlca׺i5#(]yl$"B)d'2 cFG Hh~lovg &%^M<o_+3۱M/m״D$Į&1CC !flwͨN53uCP/}Sw}.sN5bߌ@$d'Z[*Y*~N\DkDNχp\ZY Of{K!(ȓ=(IFAKT*+;i Lj4jZ]ed(d*g) ڕ?0 xB>&cO`v]g_@K*w*os/CbLAH'aCuG_;ZK!́ lJ{?8 .F[<(4qXOH;NA. 8a JϝM:F^ɧQsykbp:!Xu/[LֽDTgU^3G'Reu:QaD@hZyj~R0 ދ"HKF)g<˹+7x~t1vP<f>ib?nyj2"„6b' ^}бT8 zZ846q^ yD{={pWM崾4 >ZK_`Ўtb"PpγӷzD¼ɾμ(nܰIF'^ɅDMHDAу9zF L(=\ڷ#>BQgt;!k7~-VjVPuZ4tBo#Vבk|~ܽҳ:z0}s8ךP,|lwm `dM3odc_єgL!Mp(s<x{Wt+_kĈ+Kʞ֮6:0)x~-A$HNkdX !|".L, "V\)O=jjqnDѦc4"1Ú%qS޽cT363<'<} $Y5gA) :0ΣɛnCqjjUUz9"-&ἤvQV}HbϙLLsVDl@8TrB?fȢ+fr4d[{Ls4€9i) 1 ur @IDATDn>i 7Hz"*ο3-^Xu=c}&xg:$HiBjNMs&$꿩 Ln[xsGx/`LI`vnƯ@N^ YΧ9 =k0ueeeʬs'5yu}9?O6!l_ɒŹXs&JrR璓W&3OG -f(+Ǧxt3oA_dE H4q?^/U E&A:QO:5k {Ҙ(D p#-xFPvKqGnIe}PY^2gA&9PU`{|tG* j\>\P_zE S> bw"5y3* ۉzt#TZA+Uk" TS]̑4ݕaxj|DPr+t|Cd:n*{QN:In۷o Qϴկkܥ/R]]-+ˋ1u.8,'_>0(^ӿaK|UuBVN~:v^r%2zhY2 6ͶT7͊+T@#TL'Œd QCn2,-YQ,.IF#<*rO.I K-+`FpY׌bk5 }O?Uۄ <w+rEf}%rmwNa?dž$3fnAhm P-q[wq-V#`Pwh^ ĂBZUo^Se>9sFF?DhƵA< I:3MCNH>GuWAѪ\G Zb,3fqYM ;&ϾC1F^OTTPOEѳ\"C̛9rLE'lLcC?A֡?d$ShRS- 'YcrNVGx#R86tN5t2\ _FepRؓۻTG5^ceϥ N\w{",`qr&΀gpRteF4/_~(0Änݺo[e LNsg_WӛO>YA?5n#u*vQ{xߊ!5|l8OI?B#ڳOd7"`} I@Eر g' 9мW_UNSmddGb‘V)퉻A~0T(~ߝ̉^%پsowyz &NιlL1W=EPGN[ %#*`FLo\Ћf" `pBi;,k.C ih"TpWc %%KuJpȑqPwɣ9 7aK Tc༮0w?Krn]|>fd[Zj>t@氏tLwQGz2σj> DAn:T׻@bt-ʤoXDTHIF?I!v9wL.>+UŎ5Jy5Kk,Z 2:Cu>Z\(W"U#ETWk\+ڣ9s窿 2Ԭ̎? ׯW 1chdFpPC_q.}E.X믪~͙" V_Fd_~  Pw9vw5 XR7iF"-"W^"/B o;9_A6m|+P5{Ռ i*W>'5]9#~@.lbAqj1kٯ&γ1FO;\PC6M <}Haև| b3GsNdClN}>I+ϣp#sSK"܉mS׭s@10[;s3oyiPA;X~W&\~ssru7v.9]:%bYv|:o&7I$@-ڨd#Gjz:3f{Op}3N )1rǣ9$FOk^~]TM nZ]rp1N#(G!sQw$P3xylu9 <*Q:T+*[b{A\u q@w#lCLM B:vX8jNJupZy9`U`;u<< x=ZBgK[{b@A:BR&ÏoT? omhmxW^LG3'ۯ]$jseϕ;2^>Hw7-~ؗ@8zjDKZ( ~WV\j=_jT]puBC'9 HxReh(7aIxٿWL b,쫑䃧F_iR~)dݻe?ʩ*wq:K ٠!Oxyv׳d| 3wƉI' h"Fn#AFA;h]\XvO9K2:ǂMRU@/c 1֮]-wlܹsj0d 5,\|%BS ^M]qrl `Rylyd.醈7_BA9"Oйsgw) $OX|r?~ N `I-K1;NhϿ aw (T8|yc@(UߏrXp:] &z"G1{X_xc/-0 &|hCi}Jج?$I5L3:2*2tت'v1vZ4_+ͩDa3ȯ1Q^jP!Hc95H3 d; 2A!"5y5L֩.ie]fX?҈n=uh47 uP (ɨPMݟ. U4Xg#PxgXh?V 9"=VF N`N'ς4)5ɹ2Bih8Eipfu92 Dp4WFƕ;ʾx{ͨ9H [BC3?ⳭE9睒ɻõɽ/arʸds(F4Ҏ4O N:ȠAԓ?׍aJϒkN :ncdhPXwVϺ8vCN[CdS`{7q{"&̿.԰='D(9Nyh#?^>P/G͛73SjSdSmc[{1ax5 8?`3~k|'G#0kuPNpk|-uP50ijU*(z4̇96 @}@ aodG][=b h~D(4y"Wv^p9lc֬S2ԍI` ѩ i6 y y=uʔ0l̙3+ݦM{,zC|0q 8un\P(Knrљ)U;|25_^_| :F WP./'?d`AN0~FFu!4a6 c`U+ڑ)AP:SGsyOmMGE(a9[ ><)2}C^H[- DƝ4m^Y`> f{ }i]`Ea6~[<ɩoʽԶepo ~%4=a& B j\dBTPuPtyhI]AHmύۗ Y~{f8 BEV>Qk<:;Ͻ"LJWh;Q;"-B@w7c2ϗ L׮!6d7E]chY\]ڠ7qߞqroZ߸yHڦ7]=Cڣ3Lw)(4#AlO|2۷Ow=9FqfcS*{/C9veC99aq1I w=`k}߷\  :T.z1( 1e v0L< YGw#qa.;ŵe'+$[ :ño|6+ƿM;qN;o3/(־5p(hpHFW۹ ?(a ?Y5)7\D!BW௸\ P[r";f˅RQ4fͧkȟP#bX`)]m[9މQl0AIH#$&>!XGѾnU j& q˔V#MGFYL(1Ogrt`FF1ɤ4FgscA^Nz;{*Ot8Ǻj q[#s]{?8ED"n3dF#qù'$p1fT/(tV ߵxzZH^y/G&N%cK']N;>EޑSe"\R~mKh2@థTaC2j(S{2duhY`}jg\R>7>Ab]qXc",nC;/7䃷uAGĂVգXCѶg/qmށ%zAd8sĉռ%~>ڴ[_P6@n?Wh.ʰPaFژp^O|ӨE\t>NI{ DKj_6-hפPHB>5̂V<jLn2L<{1#喗)7N#%T摁=H"AH]('MLj*f28gBL3R=S ߏTiP.S8W/rz?c]'^o=Vd:J* KC@_ 'DgamQ7!yljS%mW1Û{c٪"ylo,3{{!^B (L߇Vw@l=z^p;~{V/i+>m'Eֶ ڶzs";xT 됨i2ЛysTgx05rJAlF3R2 h"gPV7"9>Y"ϛ9cW,XrHU1Лy:B nt_~i(?je4oNumMF}R@ˆ!Zj_ږS)㟘`3NS%6eF&} 0M{_˜ohCZVR @ jIXҥCjĻ\ٟj*c$L2hT*R2+[K08fXÇVTÚAb&.:l1/w˜9sTHBwhm4V0K~G;yq)*М}rlr)z6NQ=D.2UžF\o 鐙 a:VC ݸ eSQ'ng')qnòD^5Ey||iV$C D€; 5i$fQ-. ch|^{É-7l@/fbomf* W9=ClDCuj게aÆ.4ݟ`CO! i<4hPgBgV_fkΝ{'SW.P%+ii߯WL9ҔbB>? aDL-):I糄&]kw׵+KA4w>?Q rI_˟ni]4罥2)poJ~=$͉9ȿEEB!C@N-X\24ӠLϤB2Vr麓٧5kT3χUcAXAZ&b>Bnݝ)LP30\)Ah8ѦMgH;WȽRط_'_aPL=#LhE|*+  Ra50:D@8 x; -5չ>gT%w LI7q~Exf}=:o;YUv6iHȄHssg)x䑶P>}ZE-$ (R'uw@BtTW]Z{b1!Ӊݬ_ҢݺuSG$h硄&_͔$) ˰(O7!'`,띏~vNKDsXP&̗,c޹G#Q|*)`^.{9[.6N ׆&WM Nڴi@hŪ0 7k.D^$=s+'$pR'S@d60у t60Qԥy٧;ׁv Xr@0)t0^(=PSO&1>Tݝ}1]7wiNzmAL&-w)`34wfmZJ?Yƿg8?޲DfC r LL nė-<ENw+1$J:ʋ]–ΝJ.ʛ 222y4!gaړGmlx'uڍ"Ģf!KHj%GDN gw߭aI7>Km6i+pnMOz|w0FHB@FoÌoS zU0Qt C χiXjF>/Gޕp4 -10zTB}Tw:7lVIl%DPfc Q $s:;qt j|] |w*&.P4pl4bŅ,]:q;-#F.](nl0Ixa<)6qv54j?vM'%%.y,TI-9d8 \\uX3>9#Z2Is:ats%HI桙 +M& 245uGR!|JqppÂ߲(TZp6RID?ޫo䮆 5@%';9`ma@ 'q[QVy9TDqD̝VE ٞ %prƌ2yd5 ۷o(kоA}mub*ә3eKn>v!e؀ _ft"PSB*$vHaz_w_."Uף4 ÒQn,y.~5!y֜!ʉW( ܉_`T8j^1JuHIG!RWf`}܉4)dk28sSOzJmC6hv|Ke2.S&wźC> \gԁ+nKѦ‘ޯ/oZZK/TDgXv$(Wٸql34$wuցv]݈2Mg?KbUB| vΜ9ŀaZҳu++ChlJU26_/Aۚuҫ-q3cX% K ,5 D nh7f1]ŭ6vmc&}"_eMy]Ai>H )0m49ꨣ䦛n~X؅|0!j%`9`gL6cg@)w]kZZ:΂ h.>Fw a|EjUػv*z,]TL!t+6MA]}#w'_:(Lo:1 '1]zg;+"leku(^5hS*&ɅjW{L;:T#P00DrmKNYE|gAW^Yyt 8} /Mt\UǮt+W-@NtӊpݞHVҰGø |kUCT}#Gw"RhW(c;Sџ@WQPjDsX\Dsj܍tRȁo䥗^'|ɪ2S|y?Yʀ K&:KI ]8Wǹ|q7 `ZR, }6odijj2~5J&MZi  ?q}P@+WT;Y+^ܫ5S/rlz]D~lpX;kCﷲdfr΄0!7K8Gm(8 .@ &f͒իW>> _σ޼O;4u2Xqc[k-?. }Yd@eD҄٘`IKO^s/5ir\p/fƪ^2lư IF5?OPyDr&b؍d1Oo"_%=jZJfΜ)d,(0[#`*;Z D 8@ J2RIJo%R F(e˴n+~s niuW\F [v >?6  ]Sn#Y"[-.繳y'ΝhQt"t!_@'|" [Cˠ!dBF2+2=gO֘}zKD;s* `Ҭ|>(ıfFX%{S*o~#?c;CJݍf:`0u+" ,o3/2|fiNd2Oߛc{',H{! !->(Ar e|y'rvW%ϐ4ӸΓ6m(y?--M58M7B''|0цhb+@?Pp >Ý8y]#XNI )CbP?*xE0)Xa]C]OM^ByUd<X}1@;rZT~ƫCI=v'toTGcFӠ+V#("'ZD?#[:0QP\p !j͹͸+KrΟ#0kժt+G1RS`uHԅSXPAhFzj+p~wZe ;۹ BwL u!rǎx uW4 m]U.w)Dж!]. ޵vCx rn5$wJu/TH4r1wK H>N.>+UzK)ø )[c}fҶ"`˪P,so2 Swu ܱ H`ȼrlS%!޷ z^*$rss)'O$ m&H|q . Ti ./smpy[l#(D 7!^oxCi)l*ز7̮@t䗿tMmԉG)Ԓ'Oδiӄ!߾ sM@{Zk@otWr̝.wLv54A=ehseaWVx81hp;99{h ~i ~?A7: T ш#z_Is=9oy[h`:rӭ/1d4[簇(SG4UfM' ;YpžA_/Qp&vߚ#UZ4]XQqHo#q 4@O>x 9)F}|rġaNؘNKP]'r(ùY Ԧ'N9ů | o`vjt?2lS,P#o!6 { }Yt 6b0})țkztk5W4}̌Yݑ3uTC4&Z 1̺ax0CǨX"rsNJzսΞv^kA[Cz H"h;{Nyi̎k?PFt ɜܻ;셅F/ةcG4Wo O @&f>lنJ:,1bƫg::NV؎TIݳgF?~|z~BOKo 䁧#3XryrpXs 9\Yw)Bn3h exggD{Amyy\D9 6vh D T)ׯ>] egN!.gNBvws5*z. [վIf}FH"^o+ ѵ: ^^dJ)0o<6l\wu㏫t t׾mrcTٰ2?PNKtn;90~to`.%Q'Pˀ: %%K~B_A/2Yv̞=[mU#S ppi&87Nvd>DFȅ1 /R[^+ֿ1W0h#AC|+Α(7o:& "|ԩ_x"0HO6$rW*BlkAkCMd<׼):e n**nB]Du4i]P%AN+1kb@IDAT)rs!füw$"zO?G?vøS~ HFPT'zS0غD25\`XSp~y̏0hFH@UsCɴ"u:NiOC3 їy2;9sy ˈgU$1Rq=P.*ILhk#MInٰaC0}݃#6{JԽ`u2;H+$~@O^I$l&*TN_V%ЩS' 1['7RqF0|rQ=~Reh> m<ìjw7㏧)) C2`SW{ 4noIHH}BI`̘1C,{06ZqHa P _DrmyC1}E2%px7fxj lc~Ґw-|?B.]h uGB0cV@вeˀ=b/[A g89dW4N'fhdpi)rWDwg.(5eX‡Z.VGqqǮR HS.>3m?S ֻlm+@ ;#;uS#+ 󏏎 B*aѹ~J@~+|T76pex ^S(#fP8}ύ-쳊ҩxNc'}1껇FWJ~vuӘjeH ݏ4 )>[N=TGqPopr\q~|>3_- mw=^ڀa&C qm*TdՆbx'$3bح<k|{1^9眣W~  HLӨ px&L($ u 52R¥EB-LKNCk~a=,hXߴV;e+dמRy\ߧ",ahbHӏ=h`M#wMx-bb*6h3JLCC2NZf  e5ȹ|h-nq6*8eM 0_"#'1ADי}7rkm xK4WHܡr`X9:曅[n1C5@vojx{IyV|(C{ VR%:Ц;6; j;_(=qw7 ؞ڵKs*F?^A4ùYO QCvcG b\s2NәcQ҅dߴ(8KQ+3QǬuhX7>b隬lj.iW%SF+{?=zi42rBTs-{g}6zOu/*NX /(y Qף[嬓m'u$fJ͋kF[O 1Bc4)S]ti0ؖ^[(9y咒l8-,nLMn[Jn^嵣3uluNi}D9;Cv/mEz,fM fPPA/ J"SڎJL9JEѓY ND=7km 01`kHVVjc8QkhP/N輖9zv"}7jTm|i(l߉wdCϰس;p'mZYi[^AABѡr:vX=p\w@ѣG }dYߘdeeɺuٸqZi*\q:hU$B#ILW 2͒cP#%[kjjy-/*mx@Hq,iG}DF E0ZJcq4Y'iӗ3IՔa9 EaVOچ:Q&hv#o%>þA<1˄k9g[M3q&^1 s-01NGziRaʕsϕ'xB5B>h=1]ڛwj_I|~8%^KaVPC] ;vA=;YTw5gPue;\ٺuuQRo&HF8ylL.nҩC3ن~9pyY9s{=H,Bt]tjrќ8LqIދrIL}i. &ĝ|X26{h _5 1.r(҆PcJVbbohT*3u.wG`v ןj[35ģh1j5k@ڋ4) )_|Q02l`0!l- !SXBe:)2̕(ݻkؿP@A sRd$icq=6 o{=}\&#Em\h3 @YPaN2 9ȏ3- KƚH?BSWXN,s,L*$=w@r@#oͫ&;B`smg-37:Rng?iRgH8 z!={ 0gnqr΄p~]*?h9}OVzt1Ԏ%aܞSx?}y.EwGNo32ܝFj@Oqy@%i@zz1ϕ{\Fg/]:ɠryiX-r9T5|vĪFǍ7xs OrېnE`f0+0 jFCͮ 7Z`Vg矂{y ɛ#kxӛ+*?;1nVPTA-:*gF=VE"pKfSՉHM ^#}5mܴe3w%Ӈi֔5Ƽde~D;5_9r!e˖)"]t: PuQyͰ+m3G@5Ν:w.0&Ryy,YfO>! iV@zlR20t Q @Q׮rT7e$:yF3gc l]!|63Љ˴ ~ua0B߯aMiaVHw)W8=+$}&1.㹧L;D0=sl{*e:NmYru֢HaB8e#L"&L*бɳ2`#os<1gY'5kʷ77)wh)Gɓo+d;ơ*8&@ռxٸT+-7\]ht67ߩ~06pΕ, wrWA9HL4Q 9a66p}Xdd$9wWawW53;gzg+xUտTzj|%+vdfB9k|ӵU̘{plg9OOkl(~zgPp'fc}]̌9;#ƗߪZW?äL l{Ewsڧ<3&L`p @nm!n@{T!0(X:C`ދ];czwc-f/?)q"Ba^t=:׺:C3e{5ul)@p?;^Y$kջw|'܅9Gw!Chͱ?$72wBo>`?@>(ϸ$`vXmV| &fz4pռ^|4~K0Oי[L1:" [`Gv5(Jg{7=!ߙTܐ9ȋ!C!O1SO=e+t\0]4~ڬSϜ5Ïweykr]~^8`_fE`ac ū(EAUȰ=3%yWbN _9& 08/Yr8F<.Cz3@Kq-%ȧ{?ʶ1h}.>`@N <ʉ@)?[.)2 E).8 D)Zt>= ֛?zK;qż?]xNM_(-WY Yq4c swA1c81]M>%f |?̜~Bzwsk1_dw}xzK?1=ו?bnHW[K̏5zR[7q=?71)%H~ڴim흭J~ n[qҶ7?|:ܑN!+)Re1\E L~L~2 ~ʁ<7W, 6=-`7US ^K!Js)Gp~V-kR`INs_]>߁iVRl|YI~ K _npv:W}&M)LL?h =٘ˁ`X7gK늭L 6i]戃<;g{8zhk0k,kZv@sy[gȶ v }Q3ydsg~I;7 hOZ FBr>4BlыcN)y6C>\(?>lkݤh+ `֓fh ))q?g^L3Xgg3^ ǽ@T_"Z!n7 -+͸q̍7h>Oeuv#'Mѿfhയ|n311hL߁]f2f!KvOL+:\`,23dS^yw0DDE nC5ʠ͛=7oRV"ֺΚ7oY|U;. hNA?uV[#აm͠t"GZK١=Mwt0S'[KD_6?ێ'Ԥ;uc3T)24G3Zq,65Jl<8vjOv;+0@4dN;xOCd$!TEoaN>dsUW뮻coثJ?q&0f}J'A1|<ќqbuiu؊k]f."o[5>*s('ȴAE+wvaÆYe3g]ts%㲀{ϖKϩjwopu1Ӥ4ke(D`TuDwv B?w;yfyQO,BW#q{\O̎BOs2WdtJxR(| Qא[t<0~]9,wf7*@ч U>8BGY{ >Fo/nwúu?J/4(G;Z2Z Ъ{bs/ML߬1MKDcQi6`a']v 2'Y&ugwX97OŐ?g׭[eîGk) .4SN't p9>tZ'pχ?IwD -_BQi#+**cyC@WN5wтNZWp+"W7_duHMmpOr:~Y |7 Hvh -uw5%@ :N# ePgϞ= ;<\NOkn;JsI]% `~v>Ӽsi]s`'ߚ\kyv[1V , >{vl#̹"Hye :{e "}wQ ״Ϟ=~QS,}[n1w_:ۆܔN!+&/n]UjM==}~<]Up()N<=|79%o|%$q&geTZGmڵvVɳ(2u]IH? @|;p֎y]'e.ZϦeeAex{ MlB T p$j;GO>2eamGʿ\7-ՙcs(Ȝzׄ<4>ռ?>9Jsyƞ[Vb@DPa.0+W44ݺ{E2^vev4*8yYF** m-Q>g{8tޞSnsY̿SV:wp򷰣mp\@G_7iyNyx*gH/kTE;e |H,))(w&u$ Z} |h piܹ3a% d*3=RQzdŮSdnf S@XÎ [R9f_-9syK/vavImT:غ,Z{;UYd^&/$I"/LI e(oK|H.vm?/w]]?ZA yC~:yZVU@GɵQ$>$oNs 8:G7o[P괱<2,]έ8cWzɶD@8OuNq#}{m5 f;\]oo7 7cٹpӥv5͔ƑOZ?}#<aC<ǀS/mXW0x@9Mw HU`g _:\- Ɩv6qNl9)t(eV | )l5U$ֽ53)h 1sݵ=ky>oZ0>*UcxH5N%PaΎ q|,ofւWe|\2Y P!j'-^z%;l`{+ bz/8 lm`rM6^7Yd*69~0_ vR; ZЃ?gv*-L?uj٥۵k-?*|A?94u ZQ&@f2[+:8h7 0ߒQPl *,L<> ^_D~H.q)$Zvx([pFpp5#_^s@Fֻג ` XrVl޴6%o/;v>ءc^1<MC \$o'~w̳>kgk)c}*;iϙ%+v%oͺ^?Y[v'UezÙ_m]poכgCYd>YooxylO&HpF3c.3_xl󥋺zp`Fs~) dlgiп3 &tmc﵇?;T@E.|FqDa.(@ 1L^=Nױe[=Z'ۊ{};vd_؜ *\rTRI;8SLM`ժOy|Vz l#^h<ߤ-[Xt$m(<؟zWW>sGRse -ylObsL}Mo{ߵilnd̾f28gz3:hX:Z_GѣGlYk\rݵJ;t]-o3ƍK絸W*i锩"4_i.=%HA{Bpv|>1y￿a]M;liE5tJn;THL9aQ^ o_//v(j 28ҵLQ9hԫܤ]Ϛo6S20}z[s~OO6/Ycn&G_5հJ%w{J(K)EOe^`^or!9Z^HHtΑ毴M}+,րF7pUk2)&ߊݵY>[$˂qϯ/oj7mȗ!@AB ?moXתs Q ߶΍e}Ja|vl_0ݰۼN3~zӫG8蠃Ej&L`Lbq@Bg p 7X'ihQ5 "Y `~'E2 ƏS-zzFm0,ŅyL݇Y)@"jGyRx. F=LM76 ƵI?idI@7/BC<r.d>B }ӟdo41Ҁ\S>3xxym(щJs]vW%A1g-.>L Q gð#4/Y`@g Zg>hC Pl^Κ5z gBN (+O!]?2֥Nh%ɜƦY\z`Vgjr3ys[ɺd,"=n˹b=3\ ?t'd#ۨxGa:;wV/-xsG?Z @ih@P@ }_HW .4W_}U-sQGYX~o*7/}-9X5o`ZO`٪zSS˽YFSQ^l|D 2eݎF`NwgsW{Zg}P@63^|E̙gG?i/ȒJQfHT_RK6:u}DIm\?Gs6^sk2[ @ k-Q>C2n\Ǚ.pمSמ6 9 vJ@,y7d Zx|= _h$TPYj'74/|_ P29*W_۬6G|߽ͯ=q)uff;Ǜ^ ÈbsgAPm*t؉ך_nޟ^gVڭ͓1gï@r{m-ƌcviK3ߗܕKP@i")G()᫺;8ܵ?o2hJ;1LLe*rHN0t Z_~bjyq( Xemn7^wߝ L+D FA= .&{l'(0cXtZ׫W;q˾cjC{c㷙Gng]\QqV]l<]bYǀ%f_ 0x@SeԚa9[],ɶ¶aCJ-+=[nafh"ǧNñ07<ٞnA/ P0}xߏ ZQ׎isxzgFf3ӕ\99yr|.xgKo"^p4]pjVǵZ&\coS%-0'_&!g7An蝝y[ga׫ӛ}bxo-}fz7ocO6G݊M/]j9w3_rgSb6n;tRd>uD9䦳>}Yen63t^k=2I˄ ($hIʐX5CzOxoɁr|'  Ēt>2y:z?j] TpvQ l=:N 8tu7~cYu`8j BO-*4\4};c!\>q޼ykO>do~s1v/|o0Ox#׳;=̈K805ZXry2fWNO0d`p؁z?c0gTm,bo\zSjO;'Ҋ@ g >ͦQOFpgZ+ ੷.{wGBZ}5-%F&BCl;+rJl&:)]Rc& };UI뭷e]f/* =S@;6%+vck5fѲ+1k_)mfЛG䜮S޻,8,EhaBlgZ.pXCfte0NU#`gikFjQ2Rw*.bu+;ds@IDAT&"_ ;\2@x:\=Kfsx Jw?z qym('snUd-%+ @|z} JF+mynok_@Mw`O>,$ t6~2Jȹ xEUW]e;<3zhӫW }\Ze]iaXcv)6>Sj[k =] jq`*+8-3n'bŊt^άJN"5y8g6sw:vams2};A!?mϤ i ᆨZlܸ%ԛR3~33%@S Eu`+S"Q\dhee}L8Lr\b]ii)/K=Z]lFSn6c7'L]JnGye[9NYwܞg͚e/:HKV\?1STRݥ gޏy|x8!`cT1=>6`kk,M`Ȑ!a^D Q1xg@4u齐!v-@j#NiD ZdX˴G wĽi0 r&ː 3f̰NN=Ts嗛;y}ll:cg#,`_;.Ȱk.s[4F^XF*"}@Y:=zצ}q{a3;2@H?@?ז m) Ԅr3仐/4巍m$~ Z/=/p<`WR8:@ pu!ABJyWͤI.yfxt~F5vk@ёUo]l\'1x :|;3eADD4$ƯqM^*6~9-;C6>8>G:mR|kpA=)(5LB}h  d'ӟJ!*|4o}R:(@%w`_3a0g=^<^F&;fbs2K5 \\23E݈zQA,qVQ:"&h/k'XC7ljwg#"iQ2ȱPGӦM3>|Fm*@i-sh;6t;oOoZ-~ݵwiUYE C'Wv~e -NݕfmFhplz֢ `**@@ '䘀w}FE'-.JBxztŽ;-o;RuN|a)`[QwK#ь5Ʈ618 2$XG r;uHZ8o5l۶kͭj^|t>S !b 裏z*N,p {K(:e-(!}wW `b^4"eaG>tэ ܱr1 ! GPE ߁4ٴqTT0^`ˤG* S-Oelhu)[ 9%S?19{z$N7ZVn|+cve  Y& @Gqw~ A1cI}&5V`oRy]c,K'Z,\'>^!@NS^hN8C &ϛ,^8 3_AD bJJ+8u]`_3HL ڛ祷g ERpc7Fhnq9.KVDRt"xQG Mf޽{4f=*gNh,b$Eq\]!\FZzJ('Md."3vX`=Sw@MM̜9s:^ lO ,`[iVtA%=G߶owtym~o*\xm/d?wcs_h/ H!x:b+O5}w ryYںı{R@>HuU9 e 5L2p9. ඁrC} oom36lh>Qp m[rhPR IC^6D$1y,>y8 #SI9 p^&*)rKH_E= \أGzx5 k6%7ȶi 0Ҹc<=k&ދKʔ^K7gg 4>BePpyw5wux'A "@g=xO;+ 'c/ N>a;9r:HwHhs8q-N3{֭[hT7<䓙@ L2D<bo5#}No& pwn6 @ٝyʱߍcԣsr9%E14J H,p +G/8dw7dӸr? NgK}:"i Q 9 r$T?歷޲N:$sGP*ߜ橧2tҘfXߎ2^m{Ii&gj?//з;^q?cZRZi% @Gfc]YYYDGQq[Ӷ >/ W؀2#Cы2p, 3S ?"l G ~30GV8g#nV\gt:T&0 8+uc}F>u@ݱiMl6|c }9;BKs AB 3<*wP/s_Wfƌx%z y  z#VTc_8Mnӹ<%Dԟw[z y6gs-Ȏ/6 @$bv&LbA4'3vSpM)^s鵶MItG?Qeʬ,+-k^X'(Bߐi3 gACB ܳg1pO6 ~ҤIz(7RUD Tcx4Z5<]loewmq7SD ߧ? \Ov10簋 gty!ѣG)5 /3r4l41gC:19sActR4<!a %l ؾR2 m8h #)6o m $\%\DL 8@ v xgBS 3g1#s1sLR¼͜93AMMdb*C2LQ.32ŕqc]%{9q.Uln'*b @+Z5))r Pu3I W4fРA׈څl@];鵰~.k[n 64YXBܾsp "n#]hAɐBZp@p#F(̝m^yLP]w B~ 1S1I ̼ {;z}Fk0cȁ?;X$ԏ ho,k±B TE֭Եk^kZNp}۪BkPNIK 4L]&E6 N8i@vp*#CAB ۥTp>:y +fs馛ŋ3U;|FrL`;*3Cg1x&Mr7x'8xXUHm f炳n?vEEVȟt=% D =] ֭]g֯%T^Z=o`'Ε<1 ME׼syUѮuo|`nF?p˿ d~  @$d^:l}m!vv__|^,Mbڸo?9gAa`AA]r~k.`[=3[$Ӗ9}Z`;@SZP1ͧ5eT݄ ?;b&Ïj"usQ!tw!hHKΝk[cǚ#8 8p։jRt";as 7*2VgDP/zF>l6Gw Cw)LcĎ66_JiưoOT`/g9ԇP %Tr*h8֐~fA= xf ;H;[ja[( Ō&cqE@NWAfC8J=rdHhNTډ 03/b3|p%`fذa!3Yn3ƍ!dY5(u@4"KP:hzu>q}n؎mp)[grkvrYӓ*r9Eڴ8j0 gL|櫔~fJc}Tz]~22r䳐ސ |*x3j(C5W\qv6ݻw.*^^K/.{pxEUq"+*(;DwM*Oƻ{s"}bVÍ2[z&ViC/] h{o`;sG.]dmViDMSa][xI7--o nNܒӵWE ? p`O!B2{v;̜vkXltV/Yg=߄!UE@¹?|^æX2veOcX{5y_{WN{MˌYH󬾾`}ƍiJh?M=+~I=?t: k+**zY f#P;YRRb)>Rh#ϋM1㒜:gffz@lDj. p{|pJPb*.]j>#;#%K%as= C#͛g~_ ?2~ t+(,C:i:jwd1c@@@1G6Uvz:[>nۏ@; ?WmBhR;'G&Г)[OwGbV]+H$mӈ\A@nI됹Bσ\w̞=lb; Њ ֕x2Xx`< I53gδ gC~C|"pjK Ѽ I]+?3{,SR~9?S] +8M y@@ <# ?E]@GC)st! zM(N2/-Ӟc~qMk;8P?裭woփ,6l"ʁ i`wj<" Gk] lCDmPɸ`bDwtW7 }{6g M `;J%-@k Q!OH'_dD^c']#`fvrPvذE`֪&қch .vX'm&eFrw%@KL\9 @3,XZqO:ŘnWBmjO{GN P # h86c_;d0_5^c'%.쪙8LAt̒G_UDP F!7BA"\N@5o/ !g[zAr)kkz)^d[~IKعKvɋJV߁>F<_?]O&)IptVHkImb!`&lLY/l(x*Jl (@; o(ȵ7z7Kϻu%^Y諯R6u}/5b4(5؏y54/rJL)nz +7jz%h76kb)`{/iʻ9yZNR$(M!G@oȽUz+A/ߝ@xcq "!v(WD2alg&E|D ؇[.AtX?[\bŊ쫣\ZkOB <~nËa.4E ڃJ.>B/xF_]hoI8?\:F"S Js{'SbB#@g!/@@Ci9 a3^}퐧!k+@ iQspKBiSZ)zHpbb OL*Mx2)5eݘۂS*~obB~hΤ "XC 0 m8`ZSwt!.E :Vw=!]  E r@zy/߃~7Dk_AA2LS(JN[Fq0^SM2N$*W]$Hɲ+?Vh '.-rk7ߊ,TBV#RїcԱ/.Yd^{5u%@߾}M.Cm1?4ӈ&V^V+磢ʕoK Z~d ȡH.u 6d!DAD /Ur*c4pňXw䝭pO:o-L+e˖B' ܭA@HP _t^e3o#F E#TuH=z0zJUoKŬB; K;]귯^ZYwlKKS^^־ HM`E*@XדqB "`($ʊ:Ir@#B. Q{B ޗYW6&pH5x֮`ӦMfƍh84l\pũ [{CC@ #4)]s]4͛7ӧO;oK~š2-*?KJbp1qޕ}]TƕWnZb1^S|&z?Є)/·9™&.謰y 5Ƞ "!7PY!Qо*h|#%644ڙ{.Eڶևu<\;,X a|+# @}z{Qٳ9 &UWW[k檹zoٲ߬]&% kE1@MMqϋg{IEAN)= t-" $ёSjc t .aZ +Ő::} \ "yF3c<}id$rh-@=sPoׯٺuݻw-8mW]SYYɵ֯_ WC U(@9GWK2gbh.hl_A]v%ݻۆ+ 2q -}]n]ҭכ&nz^*15M qDp7ds:(@5+4sp|BE@/:\ 9|rOm+Vы ܀i?rqBMv{b6K6b4[cChFmfΜmt,ך!uoIm4>Xvܞ+VPEbb{)i*]D@ B B0BS`P: ~ ޺BRm"oCĀ> ?h "-l ̀?&/$`S/Sq %P̛7xԨQUfͲγ v),y@ýzD_!=P(z}|kh/Ϝ1c 0FLE?5aɀ>|AVM(Mѿ_kwK׬z=EwyX;;8D@D\̬lVA8x > gzUGnTqy@3xmhb$<%oKDhvoټeԩS{`y8^ g1p,is19 l#߀Y@Pȑu7 &kFӧO_hݰn߾^Xk5٠}mEs ٳnmA&,-eBt.}snE!&AG2@Jv^8g ыM`KXD@B yɊ}72)R&GN8Q0Dw]>jW0~vΙ3g]?BAD F dP МZCN+Vh׸v[^XRKw\RQ^^OM\q]@} FnF-}< "Ŧi0?uJt瞃.`rh/lũ Hgl8_X;Z 5nFXT:}szk֮7qM;Հ|-%///MSf2GB q !E&5664zUʾdbG࿪gxbsr?TFq -f$p8USG+V"IB6EH6|/U:ySXFئ*XA4·:v!mK,i(.*e5y`=D7o%if%ح[W^]dMMpK(:)Zg9Hw]7m}K(6EKPⶖb:(dzE@D@D@D mF c ^ف S+ҫZe߾}ȑ\ ' @Ƒ%Ғ=ztwTiZh."UK]@_k.k(Q " " " J;t ҙ?h(6Z'&Jb,{ F7`ĉtUPDaY(/B xm ĔCJlcˣ=g\qKX๟'[#W?+B3˳L=JD@D@D@E7l="%xGi(5ؒz7ߍ{׻ vһ<~Ž*>Nv@h~'lBZ \rI)4t*sNk.o~x @DH h8ÇTt*UAX\\V_ZZyǏ\4kZdUsUcq1x6 PTPcK@1O>9#vC'" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "ۡA_# 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0]IDAT` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` ߌIENDB`ic110PNG  IHDR szzsRGBIDATX VkTTS`@ԙ( :@(  AVo!ER&TZ%jXhh@a3< k;{un,>]xΝ=OPv^aGeUUhR9_Յvb@AJը$ҝR…N}T#9?#v-5oEPd,8i sȑ#V#}jh~'ݟg=g\_C {"/ Gϐx/ZpI}}ɃßKc#R ܏m 6 `1h"Ľ\طܺ܌/濑o9֟0n2 &tch/b " *,|-M\n[wի~zScXx}o8X< ]AMJ %5tTX2&ᅦ~aAD,NN!,!akJŁI8y½}tdT%%u޻3zAdc3]BpKGU 8I?$v[ԙ[dIg䃇LF0K_ciB_$wh Bә3+bj*f9@\wZ 990 ʚ%ACUi[Jt>w+M.u۱tޞ+ __41߭mtwm_LLQN$C`H  +rׯ_OCǍGrE/K˗O*='N9> j ?V;n`Q>(O6 =- y]')2b!o[~q9êF&M2%i85juj\Nw3*ܣan7`KԃӢ?lBXFLnafVc\)]z{XB`Ҧh֜inM酇' ?}p Q-zWu] V塏:AܠdX:Yq-67Z@|ɖuɻ]ahh-*3/-[s/UKİF%Q;uXGqgr44 < K,Akk+։'kXZVVwL6oabf+XB؄S6?]bĢ}P2Re`~ ?K:*n߾LfN N JI0{J4>+7o>nkC\\Гe&.S̶g44'a +1k b-`N=k:m95xCaSuXo{GGX &gI$< e#R=Agg L1Q‚" !R*[h}_kSeU_TXxzFa F&HLL) ࡇ.G:'g>_]`>:݌1"??,j=qq Z=&y%8_0 kމE~{Xv ^%eR->m$ #Ijʱ43OE³Upt!BgM+?xvj5X!HglkL0ܷyu{Ev-.D-{`xΖ[>~D'ҒՕsH/S!#}#D1gِR'?om.{OghT:g G?𿚁)>么IENDB`info bplist00X$versionX$objectsY$archiverT$topU$null WNS.keysZNS.objectsV$class TnameTiconZ$classnameX$classes\NSDictionaryXNSObject_NSKeyedArchiverTroot#-27=CJR]dfhjlnsx}klog-0.9.8.1/setuppagemisc.h0000644000175000017500000001057513532572307014644 0ustar develdevel#ifndef SETUPPAGEMISC_H #define SETUPPAGEMISC_H /*************************************************************************** setuppagemisc.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include "utilities.h" class SetupPageMisc : public QWidget { Q_OBJECT public: SetupPageMisc(QWidget *parent=0); ~SetupPageMisc(); QString getRealTime(); void setRealTime(const QString t); QString getUTCTime(); void setUTCTime(const QString t); QString getAlwaysADIF(); void setAlwaysADIF(const QString t); QString getDefaultFileName(); void setUseDefaultName(const QString t); QString getDefaultDBPath(); void setUseDefaultDBPath(const QString t); QString getUseDefaultName(); void setDefaultFileName(const QString t); //QString getInMemory(); //void setInMemory(const QString t); QString getImperial(); void setImperial(const QString t); QString getSendQSLWhenRec(); void setSendQSLWhenRec(const QString t); QString getShowStationCallSignInSearch(); void setShowStationCallSignInSearch(const QString t); QString getKeepMyData(); void setKeepMyData(const QString t); QString getCompleteWithPrevious(); void setCompleteWithPrevious(const QString t); QString getCheckNewVersions(); void setCheckNewVersions(const QString t); QString getReportInfo(); void setReportInfo(const QString t); QString getDXMarathon(); void setDXMarathon(const QString t); bool areDBPathChangesApplied(); private slots: void slotOpenFileButtonClicked(); void slotUseDefaultButtonStateChanged(int state); //void slotdefaultFileNameChanged(); void slotDefaultFileNameLineEditChanged(); void slotcheckNewVersionCheckBoxClicked(); void slotDBButtonClicked(); void slotDBLineEditChanged(); void slotMoveDBButtonClicked(); //void slotUDPServerCheckBoxClicked(); private: void createActions(); void createUI(); Utilities *util; QCheckBox *realTimeCheckbox, *UTCCheckbox, *alwaysADIFCheckBox, *useDefaultName, *completeWithPreviousCheckBox; QCheckBox *imperialCheckBox, *sendQSLWhenRecCheckBox, *showStationCallWhenSearchCheckBox, *keepMyDataCheckBox; QCheckBox *checkNewVersionCheckBox, *provideCallCheckBox, *useDxMarathonCheckBox; QString defaultFileName; QLineEdit *defaultFileNameLineEdit, *dbPathLineEdit; QPushButton *fileNameButton, *dbPushButton, *moveDBPushButton; QString klogDir, dbDirNew, dbDirCurrent; //TODO: To be removed when the defaultDir is saved in the config file QPalette palRight, palWrong; // To paint Text in red or black(normal) bool dbPathApplied; //QWidget *bandsWidget; }; #endif // SETUPPAGEMISC_H klog-0.9.8.1/contest.h0000644000175000017500000000466613532572307013456 0ustar develdevel#ifndef CONTEST_H #define CONTEST_H /*************************************************************************** contest.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include class Contest : public QObject { Q_OBJECT public: Contest(); Contest(const QStringList _qs); ~Contest(); virtual bool isMultiplier(const QStringList _qs); virtual int getQSOPoints(const QStringList _qs); virtual bool saveFileToSend(const QString& _fileName); virtual int getTotalScore(); virtual int getMultipliers(); virtual int getPoints(); private: int points; int multipliers; int constrid; // Just an id for the constructor to check who is being executed at one specific time }; #endif // CONTEST_H klog-0.9.8.1/showerrordialog.h0000644000175000017500000000424713532572307015204 0ustar develdevel#ifndef SHOWERRORDIALOG_H #define SHOWERRORDIALOG_H /*************************************************************************** showerrordialog.h - description ------------------- begin : oct 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include class ShowErrorDialog: public QDialog { Q_OBJECT public: ShowErrorDialog(); ~ShowErrorDialog(); void setText(const QString txt); private slots: void slotAcceptButtonClicked(); private: void keyPressEvent(QKeyEvent *event); QTextBrowser *textBrowser; QString text; QLabel *txtLabel; }; #endif // SHOWERRORDIALOG_H klog-0.9.8.1/setuppagesatsnew.cpp0000644000175000017500000003371413532572307015730 0ustar develdevel/*************************************************************************** SetupPageSatsNew.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new log // #include "setuppagesatsnew.h" SetupPageSatsNew::SetupPageSatsNew(DataProxy *dp, QWidget *parent) { //qDebug() << "SetupPageSatsNew::SetupPageSatsNew" << endl; dataProxy = dp; editing = false; //checking = false; shortNameLineEdit = new QLineEdit(); nameLineEdit = new QLineEdit(); uplinkLineEdit = new QLineEdit(); downlinkLineEdit = new QLineEdit(); modesLineEdit = new QLineEdit(); shortNameLabel = new QLabel(tr("Short name")); nameLabel = new QLabel(tr("Sat name")); uplinkLabel = new QLabel(tr("UpLink")); downlinkLabel = new QLabel(tr("DownLink")); modesLabel = new QLabel(tr("Modes")); clear(); //satData.clear(); okButton = new QPushButton(tr("&Ok"), this); cancelButton = new QPushButton(tr("&Cancel"), this); createUI(); okButton->setEnabled(true); //qDebug() << "SetupPageSatsNew::SetupPageSatsNew - END" << endl; } void SetupPageSatsNew::clear() { shortName = QString(); name = QString(); uplink = QString(); downlink = QString(); modes = QString(); hasShortName = false; hasName = false; hasUplink = false; hasDownlink = false; hasModes = false; shortNameLineEdit->clear(); nameLineEdit->clear(); uplinkLineEdit->clear(); downlinkLineEdit->clear(); modesLineEdit->clear(); } void SetupPageSatsNew::createUI() { //qDebug() << "SetupPageSatsNew::createWidget" << endl; shortNameLabel->setWordWrap(true); nameLabel->setWordWrap(true); uplinkLabel->setWordWrap(true); downlinkLabel->setWordWrap(true); modesLabel->setWordWrap(true); shortNameLabel->setBuddy(shortNameLineEdit); nameLabel->setBuddy(nameLineEdit); uplinkLabel->setBuddy(uplinkLineEdit); downlinkLabel->setBuddy(downlinkLineEdit); modesLabel->setBuddy(modesLineEdit); shortNameLineEdit->setToolTip(tr("Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards.")); nameLineEdit->setToolTip(tr("Enter the name of the satellite.")); uplinkLineEdit->setToolTip(tr("Enter the uplink frequencies in this format: 144.300")); downlinkLineEdit->setToolTip(tr("Enter the downlink frequencies in this format: 144.300")); modesLineEdit->setToolTip(tr("Enter the modes in this format: USB")); connect(shortNameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotShortNameTextChanged() ) ); connect(nameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotNameTextChanged() ) ); connect(uplinkLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotUpLinkTextChanged() ) ); connect(downlinkLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotDownLinkTextChanged() ) ); connect(modesLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotModesTextChanged() ) ); connect(okButton,SIGNAL(clicked()), this, SLOT(slotOKButtonClicked() ) ); connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelButtonClicked() ) ); QGridLayout *dataLayout = new QGridLayout; // Widget, row, column dataLayout->addWidget(shortNameLabel, 0, 0); dataLayout->addWidget(shortNameLineEdit, 0, 1); dataLayout->addWidget(nameLabel, 1, 0); dataLayout->addWidget(nameLineEdit, 1, 1); dataLayout->addWidget(uplinkLabel, 2, 0); dataLayout->addWidget(uplinkLineEdit, 2, 1); dataLayout->addWidget(downlinkLabel, 3, 0); dataLayout->addWidget(downlinkLineEdit, 3, 1); dataLayout->addWidget(modesLabel, 4, 0); dataLayout->addWidget(modesLineEdit, 4, 1); QHBoxLayout *buttonsLayout = new QHBoxLayout; //buttonsLayout->addWidget(validCats); buttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(cancelButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(dataLayout); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); clear(); } void SetupPageSatsNew::slotShortNameTextChanged() { int cursorP = shortNameLineEdit->cursorPosition(); shortNameLineEdit->setText((shortNameLineEdit->text()).toUpper()); if ((shortNameLineEdit->text()).length()>2) { hasShortName = true; } else { hasShortName = false; } shortNameLineEdit->setCursorPosition(cursorP); } void SetupPageSatsNew::slotNameTextChanged() { int cursorP = nameLineEdit->cursorPosition(); nameLineEdit->setText((nameLineEdit->text()).toUpper()); if ((nameLineEdit->text()).length()>2) { hasName = true; } else { hasName = false; } nameLineEdit->setCursorPosition(cursorP); } void SetupPageSatsNew::slotUpLinkTextChanged() { /* Format: Single freq: 145.600 Range: 145.600-145.700 Two freqs or ranges: 145.600,145.650 or 145.600,145.600-145.700 */ //qDebug() << "SetupPageSatsNew::slotUpLinkTextChanged:" << uplinkLineEdit->text() << endl; if ((uplinkLineEdit->text()).length()<2) { return; } QStringList freqs; freqs.clear(); QString aux = uplinkLineEdit->text(); // QString str = QString(); freqs << aux.split(','); hasUplink = true; foreach (aux, freqs) { if (aux.contains('-')) { // It is a range //qDebug() << "SetupPageSatsNew::slotUpLinkTextChanged: It is a range: " << aux << endl; } else { //It is just one freq if (isItAFreq(aux)) { } else { hasUplink = false; } } } } bool SetupPageSatsNew::isItAFreq(const QString _st) { //qDebug() << "SetupPageSatsNew::isItAFreq: It is one freq: " << _st << endl; bool ok = false; double freq = 0.0; freq = _st.toDouble(&ok); return ok; } void SetupPageSatsNew::slotDownLinkTextChanged() { /* Format: Single freq: 145.600 Range: 145.600-145.700 Two freqs or ranges: 145.600,145.650 or 145.600,145.600-145.700 */ if ((downlinkLineEdit->text()).length()<2) { return; } QStringList freqs; freqs.clear(); QString aux = downlinkLineEdit->text(); // QString str = QString(); freqs << aux.split(','); hasDownlink = true; foreach (aux, freqs) { if (aux.contains('-')) { // It is a range //qDebug() << "SetupPageSatsNew::slotUpLinkTextChanged: It is a range: " << aux << endl; } else { //It is just one freq if (isItAFreq(aux)) { } else { hasDownlink = false; } } } } void SetupPageSatsNew::slotModesTextChanged() { /* Format: Single mode: USB Two modes: USB,LSB One mode per up/down USB/LSB */ //qDebug() << "SetupPageSatsNew::slotModesTextChanged: " << modesLineEdit->text() << endl; int cursorP = modesLineEdit->cursorPosition(); modesLineEdit->setText((modesLineEdit->text()).toUpper()); QString aux = QString(); QString aux2 = QString(); hasModes = false; if ((modesLineEdit->text()).length()<2) { return; } //qDebug() << "SetupPageSatsNew::slotModesTextChanged: length >=2" << endl; QStringList _modes; _modes.clear(); _modes << (modesLineEdit->text()).split(','); //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Starting to process the list" << endl; foreach (aux, _modes) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Processing: " << aux << endl; if (aux.contains('/')) {// It s a pair of modes (up and down link) QStringList _pair; _pair.clear(); _pair << aux.split('/'); foreach (aux2, _pair) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Processing aux2: " << aux2 << endl; if (dataProxy->getIdFromModeName(aux2)>0) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking2: true: " << aux2 << endl; hasModes = true; } else { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking2: false: " << aux2 << endl; hasModes = false; } } } else { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking: " << aux << endl; if (dataProxy->getSubModeIdFromSubMode(aux)>0) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking: true: " << aux << endl; hasModes = true; } else { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking: false: " << aux << endl; hasModes = false; } } } modesLineEdit->setCursorPosition(cursorP); } void SetupPageSatsNew::setShortName(const QString st) { shortNameLineEdit->setText(st.toUpper()); } void SetupPageSatsNew::setName(const QString st) { nameLineEdit->setText(st.toUpper()); } void SetupPageSatsNew::setUpLink(const QString st) { uplinkLineEdit->setText(st); } void SetupPageSatsNew::setDownLink(const QString st) { downlinkLineEdit->setText(st); } void SetupPageSatsNew::setModes(const QString st) { modesLineEdit->setText(st.toUpper()); } void SetupPageSatsNew::slotOKButtonClicked() { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked" << endl; shortName = shortNameLineEdit->text(); name = nameLineEdit->text(); uplink = uplinkLineEdit->text(); downlink = downlinkLineEdit->text(); modes = modesLineEdit->text(); if (hasShortName && hasName && (hasUplink || hasDownlink) && hasModes) { gatherAndSend(); editing = false; close(); } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Some of the data you have entered is not correct, the satellite can't be added.")); msgBox.exec(); if (!hasShortName) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasShortName is FALSE" << endl; } else if (!hasName) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasName is FALSE" << endl; } else if (!hasUplink) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasUpLink is FALSE" << endl; } else if (!hasDownlink) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasDownLink is FALSE" << endl; } else if (!hasModes) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasModes is FALSE" << endl; } } //close(); } void SetupPageSatsNew::gatherAndSend() { //qDebug() << "SetupPageSatsNew::gatherAndSend: " << endl; // The previous lines will be removed once more contest types have been added satData.clear(); satData << shortNameLineEdit->text() << nameLineEdit->text() << downlinkLineEdit->text() << uplinkLineEdit->text() << modesLineEdit->text(); int satId = dataProxy->getDBSatId(shortNameLineEdit->text()); //qDebug() << "SetupPageSatsNew::gatherAndSend: satId: " << QString::number(satId) << endl; if ((editing) && (satId>0)) { satData << "1"; editing = false; dataProxy->addSatellite(shortNameLineEdit->text(), nameLineEdit->text(), downlinkLineEdit->text(), uplinkLineEdit->text(), modesLineEdit->text(), satId); } else { satData << "0"; dataProxy->addSatellite(shortNameLineEdit->text(), nameLineEdit->text(), downlinkLineEdit->text(), uplinkLineEdit->text(), modesLineEdit->text()); } //qDebug() << "SetupPageSatsNew::gatherAndSend: EMITED" << endl; emit newSatData(satData); } void SetupPageSatsNew::slotCancelButtonClicked() { //qDebug() << "SetupPageSatsNew::slotCancelButtonClicked" << endl; satData.clear(); clear(); emit cancelled(true); close(); } void SetupPageSatsNew::setEditing(const bool b) { editing = b; if (!editing) { clear(); } } klog-0.9.8.1/setuppagemisc.cpp0000644000175000017500000004773113532572307015203 0ustar develdevel/*************************************************************************** setuppagemisc.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppagemisc.h" //TODO: The defaultFileName QString can be removed and used the content of defaultFileNameLineEdit // instead. It is easy to change but the code would not be so clear... Think about this. :-) SetupPageMisc::SetupPageMisc(QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageMisc::SetupPageMisc" << endl; util = new Utilities; imperialCheckBox = new QCheckBox(tr("&Imperial system"), this); realTimeCheckbox = new QCheckBox(tr("&Log in real time"), this); UTCCheckbox = new QCheckBox(tr("&Time in UTC"), this); alwaysADIFCheckBox = new QCheckBox(tr("&Save ADIF on exit"), this); useDefaultName = new QCheckBox(tr("Use this &default filename"), this); sendQSLWhenRecCheckBox = new QCheckBox(tr("Mark &QSO to send QSL when QSL is received"), this); completeWithPreviousCheckBox = new QCheckBox(tr("Complete QSO with previous data")); showStationCallWhenSearchCheckBox = new QCheckBox(tr("Show the Station &Callsign used in the search box"), this); keepMyDataCheckBox = new QCheckBox(tr("&Reset to My Data for all QSOs"), this); checkNewVersionCheckBox = new QCheckBox(tr("&Check for new versions automatically"), this); provideCallCheckBox = new QCheckBox(tr("&Provide Info for statistics"), this); useDxMarathonCheckBox = new QCheckBox(tr("Manage DX-Marathon"), this); defaultFileNameLineEdit = new QLineEdit; dbPathLineEdit = new QLineEdit; fileNameButton = new QPushButton (tr("Browse")); dbPushButton = new QPushButton (tr("Browse")); moveDBPushButton = new QPushButton(tr("Move DB")); dbPathApplied = true; createUI(); createActions(); if (areDBPathChangesApplied()) { moveDBPushButton->setEnabled(false); } else { moveDBPushButton->setEnabled(true); } //qDebug() << "SetupPageMisc::SetupPageMisc - END" << endl; } SetupPageMisc::~SetupPageMisc(){ //qDebug() << "SetupPageMisc::~SetupPageMisc" << endl; } void SetupPageMisc::createUI() { palWrong.setColor(QPalette::Text, Qt::red); palRight.setColor(QPalette::Text, Qt::black); //TODO: To be removed when the defaultDir is saved in the config file #ifdef Q_OS_WIN //qDebug() << "WINDOWS DETECTED!" << endl; klogDir = util->getHomeDir(); // We create the \klog for the logs and data defaultFileName = klogDir+"/klog.adi"; #else //qDebug() << "NO WINDOWS DETECTED!" << endl; klogDir = util->getHomeDir(); // We create the ~/.klog for the logs and data defaultFileName = klogDir+"/klog.adi"; #endif dbDirNew = klogDir; // The new path where the DB is to be moved dbDirCurrent = dbDirNew; // The path where the DB is hosted defaultFileNameLineEdit->setReadOnly(false); defaultFileNameLineEdit->setText(defaultFileName); defaultFileNameLineEdit->setEnabled(false); dbPathLineEdit->setReadOnly(false); dbPathLineEdit->setText(dbDirCurrent); dbPathLineEdit->setEnabled(true); //UDPServerCheckBox->setChecked(true); //UDPServerPortSpinBox->setEnabled(true); //UDPServerCheckBox->setEnabled(false); //UDPServerPortSpinBox->setEnabled(false); useDefaultName->setChecked(true); alwaysADIFCheckBox->setChecked(true); showStationCallWhenSearchCheckBox->setChecked(true); keepMyDataCheckBox->setChecked(true); completeWithPreviousCheckBox->setChecked(false); sendQSLWhenRecCheckBox->setToolTip(tr("QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours.")); showStationCallWhenSearchCheckBox->setToolTip(tr("The search box will show also the callsign on the air to do the QSO.")); keepMyDataCheckBox->setToolTip(tr("All the data from the My Data tab will be used or data from the previous QSO will be maintained.")); checkNewVersionCheckBox->setToolTip(tr("Check if there is a new release of KLog available every time you start KLog.")); provideCallCheckBox->setToolTip(tr("If new version checking is selected, KLog will send the developer your callsign, KLog version & Operating system to help in improving KLog.")); imperialCheckBox ->setToolTip(tr("Check it for Imperial system (Miles instead of Kilometers).")); realTimeCheckbox->setToolTip(tr("Select to use real time.")); UTCCheckbox->setToolTip(tr("Select to use UTC time.")); alwaysADIFCheckBox->setToolTip(tr("Select if you want to save to ADIF on exit.")); useDefaultName->setToolTip(tr("Select to use the following name for the logfile without being asked for it again.")); completeWithPreviousCheckBox->setToolTip(tr("Complete the current QSO with previous QSO data.")); useDxMarathonCheckBox->setToolTip(tr("Select if you want to manage DX-Marathon.")); defaultFileNameLineEdit->setToolTip(tr("This is the default file where ADIF data will be saved.")); dbPathLineEdit->setToolTip(tr("This is the directory where the database (logbook.dat) will be saved.")); fileNameButton->setToolTip(tr("Click to change the default ADIF file.")); dbPushButton->setToolTip(tr("Click to change the path of the database.")); moveDBPushButton->setToolTip(tr("Click to move the DB to the new directory.")); QHBoxLayout *fileLayout = new QHBoxLayout; fileLayout->addWidget(useDefaultName); fileLayout->addWidget(defaultFileNameLineEdit); fileLayout->addWidget(fileNameButton); defaultFileNameLineEdit->setEnabled(true); fileNameButton->setEnabled(true); QHBoxLayout *dbLayout = new QHBoxLayout; dbLayout->addWidget(dbPathLineEdit); dbLayout->addWidget(dbPushButton); dbLayout->addWidget(moveDBPushButton); UTCCheckbox->setChecked(true); realTimeCheckbox->setChecked(true); QGridLayout *mainLayou1 = new QGridLayout; mainLayou1->addLayout(fileLayout, 0, 0, 1, -1); mainLayou1->addLayout(dbLayout, 1, 0, 1, -1); mainLayou1->addWidget(alwaysADIFCheckBox, 2, 0, 1, 1); //mainLayou1->addLayout(UDPLayout, 2, 1, 1, 1); mainLayou1->addWidget(UTCCheckbox, 3, 0, 1, 1); mainLayou1->addWidget(realTimeCheckbox, 3, 1, 1, 1); mainLayou1->addWidget(imperialCheckBox, 4, 0, 1, 1); mainLayou1->addWidget(useDxMarathonCheckBox, 4, 1, 1, 1); mainLayou1->addWidget(keepMyDataCheckBox, 5, 0, 1, 1); mainLayou1->addWidget(completeWithPreviousCheckBox, 5, 1, 1, 1); mainLayou1->addWidget(sendQSLWhenRecCheckBox,6, 0, 1, 1); mainLayou1->addWidget(showStationCallWhenSearchCheckBox, 6, 1, 1, 1); mainLayou1->addWidget(checkNewVersionCheckBox, 7, 0, 1, 1); mainLayou1->addWidget(provideCallCheckBox, 7, 1, 1, 1); setLayout(mainLayou1); } void SetupPageMisc::createActions(){ //void itemDoubleClicked ( QListWidgetItem * item ) connect(fileNameButton, SIGNAL(clicked () ), this, SLOT(slotOpenFileButtonClicked() ) ); connect(useDefaultName, SIGNAL(stateChanged (int) ), this, SLOT(slotUseDefaultButtonStateChanged(int) ) ); connect(defaultFileNameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotDefaultFileNameLineEditChanged() ) ); connect(checkNewVersionCheckBox, SIGNAL(clicked () ), this, SLOT(slotcheckNewVersionCheckBoxClicked() ) ); connect(dbPushButton, SIGNAL(clicked () ), this, SLOT(slotDBButtonClicked() ) ); connect(dbPathLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotDBLineEditChanged() ) ); connect(moveDBPushButton, SIGNAL(clicked () ), this, SLOT(slotMoveDBButtonClicked() ) ); //connect(UDPServerCheckBox, SIGNAL(clicked () ), this, SLOT(slotUDPServerCheckBoxClicked() ) ); } QString SetupPageMisc::getRealTime(){ if (realTimeCheckbox->isChecked()) { return "True"; } else { return "False"; } } void SetupPageMisc::setRealTime(const QString t){ //QString st = t; if ( (t.toUpper()) == "FALSE") { realTimeCheckbox->setChecked(false); } else { realTimeCheckbox->setChecked(true); } } QString SetupPageMisc::getUTCTime(){ if (UTCCheckbox->isChecked()) { return "True"; } else { return "False"; } } void SetupPageMisc::setUTCTime(const QString t){ if ( (t.toUpper()) == "FALSE") { UTCCheckbox->setChecked(false); } else { UTCCheckbox->setChecked(true); } } QString SetupPageMisc::getAlwaysADIF() { if (alwaysADIFCheckBox->isChecked()) { return "True"; } else { return "False"; } } void SetupPageMisc::setAlwaysADIF(const QString t) { // Defaul value is false if ( (t.toUpper()) == "TRUE") { alwaysADIFCheckBox->setChecked(true); } else { alwaysADIFCheckBox->setChecked(false); } } QString SetupPageMisc::getDefaultFileName() { return defaultFileName; } void SetupPageMisc::setDefaultFileName(const QString t) { //qDebug() << "SetupPageMisc::setDefaultFileName: " << t << endl; defaultFileName = t; defaultFileNameLineEdit->setText(defaultFileName); } void SetupPageMisc::slotOpenFileButtonClicked() { defaultFileName = QFileDialog::getOpenFileName(this, tr("Open File"), klogDir, "ADIF (*.adi)"); defaultFileNameLineEdit->setText(defaultFileName); } void SetupPageMisc::slotDefaultFileNameLineEditChanged() { //setDefaultFileName(); defaultFileName = defaultFileNameLineEdit->text(); } /* QString SetupPageMisc::getInMemory() { if (dbInMemory->isChecked()) { return "True"; } else { return "False"; } } void SetupPageMisc::setInMemory(const QString t) { if ( (t.toUpper()) == "FALSE") { dbInMemory->setChecked(false); } else { dbInMemory->setChecked(true); } } */ QString SetupPageMisc::getUseDefaultName() { if (useDefaultName->isChecked()) { return "True"; } else { return "False"; } } void SetupPageMisc::setUseDefaultName(const QString t) { if ( (t.toUpper()) == "FALSE") { useDefaultName->setChecked(false); } else { useDefaultName->setChecked(true); } } QString SetupPageMisc::getImperial() { if (imperialCheckBox->isChecked()) { return "True"; } else { return "False"; } } void SetupPageMisc::setImperial(const QString t) { if ( (t.toUpper()) == "FALSE") { imperialCheckBox->setChecked(false); } else { imperialCheckBox->setChecked(true); } } void SetupPageMisc::slotUseDefaultButtonStateChanged(int state) { //qDebug() << "SetupPageMisc::slotUseDefaultButtonStateChanged" << endl; if (state) { defaultFileNameLineEdit->setEnabled(true); moveDBPushButton->setEnabled(true); } else { defaultFileNameLineEdit->setEnabled(false); moveDBPushButton->setEnabled(false); } } QString SetupPageMisc::getSendQSLWhenRec(){ if (sendQSLWhenRecCheckBox->isChecked()) { return "True"; } else { return "False"; } } void SetupPageMisc::setSendQSLWhenRec(const QString t){ if ( (t.toUpper()) == "FALSE") { sendQSLWhenRecCheckBox->setChecked(false); } else { sendQSLWhenRecCheckBox->setChecked(true); } } QString SetupPageMisc::getShowStationCallSignInSearch() { if (showStationCallWhenSearchCheckBox->isChecked()) { return "True"; } else { return "False"; } } void SetupPageMisc::setShowStationCallSignInSearch(const QString t) { if ( (t.toUpper()) == "FALSE") { showStationCallWhenSearchCheckBox->setChecked(false); } else { showStationCallWhenSearchCheckBox->setChecked(true); } } QString SetupPageMisc::getKeepMyData() { if (keepMyDataCheckBox->isChecked()) { return "True"; } else { return "False"; } } void SetupPageMisc::setKeepMyData(const QString t) { if ( (t.toUpper()) == "FALSE") { keepMyDataCheckBox->setChecked(false); } else { keepMyDataCheckBox->setChecked(true); } } QString SetupPageMisc::getCompleteWithPrevious() { if (completeWithPreviousCheckBox->isChecked()) { return "True"; } else { return "False"; } } void SetupPageMisc::setCompleteWithPrevious(const QString t) { if ( (t.toUpper()) == "FALSE") { completeWithPreviousCheckBox->setChecked(false); } else { completeWithPreviousCheckBox->setChecked(true); } } void SetupPageMisc::slotcheckNewVersionCheckBoxClicked() { if (checkNewVersionCheckBox->isChecked()) { provideCallCheckBox->setEnabled(true); } else { provideCallCheckBox->setEnabled(false); provideCallCheckBox->setChecked(false); } } QString SetupPageMisc::getCheckNewVersions() { if (checkNewVersionCheckBox->isChecked()) { return "True"; } else { return "False"; } } void SetupPageMisc::setCheckNewVersions(const QString t) { if ( (t.toUpper()) == "FALSE") { checkNewVersionCheckBox->setChecked(false); } else { checkNewVersionCheckBox->setChecked(true); } } QString SetupPageMisc::getReportInfo() { if (checkNewVersionCheckBox->isChecked()) { if (provideCallCheckBox->isChecked()) { return "True"; } else { return "False"; } } else { return "False"; } } void SetupPageMisc::setReportInfo(const QString t) { if ( (t.toUpper()) == "FALSE") { provideCallCheckBox->setChecked(false); } else { provideCallCheckBox->setChecked(true); } } QString SetupPageMisc::getDefaultDBPath() { return dbDirCurrent; } void SetupPageMisc::setUseDefaultDBPath(const QString t) { dbDirCurrent = t; dbPathLineEdit->setText(dbDirCurrent); } QString SetupPageMisc::getDXMarathon(){ if (useDxMarathonCheckBox->isChecked()) { return "True"; } else { return "False"; } } void SetupPageMisc::setDXMarathon(const QString t){ //QString st = t; if ( (t.toUpper()) == "FALSE") { useDxMarathonCheckBox->setChecked(false); } else { useDxMarathonCheckBox->setChecked(true); } } void SetupPageMisc::slotDBButtonClicked() { // QString dbDirBack = dbDir; QString dir = QFileDialog::getExistingDirectory(this, tr("Select Directory"), dbDirCurrent, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (dir.length()>=1) { dbDirNew = dir; } dbPathLineEdit->setText(dbDirNew); if (dbDirCurrent == dbDirNew) { dbPathApplied = true; } else { dbPathApplied = false; moveDBPushButton->setEnabled(true); } //setUseDefaultDBPath(dbDirNew); } void SetupPageMisc::slotDBLineEditChanged() { //qDebug() << "SetupPageMisc::slotDBLineEditChanged: " << dbPathLineEdit->text() << endl; QString aux; aux = dbPathLineEdit->text(); if ( QFile::exists(aux) ) { dbPathLineEdit->setToolTip(tr("This is the directory where DB (logbook.dat) will be saved.")); dbPathLineEdit->setPalette(palRight); dbDirNew = dbPathLineEdit->text(); } else { dbPathLineEdit->setToolTip(tr("Please specify an existing directory where the database (logbook.dat) will be saved.")); dbPathLineEdit->setPalette(palWrong); } if (dbDirCurrent == dbDirNew) { dbPathApplied = true; moveDBPushButton->setEnabled(false); } else { dbPathApplied = false; moveDBPushButton->setEnabled(true); } } void SetupPageMisc::slotMoveDBButtonClicked() { QString source = dbDirCurrent + "/logbook.dat"; QString target = dbDirNew + "/logbook.dat"; QMessageBox msgBox; //qDebug() << "SetupPageMisc::slotMoveDBButtonClicked (source): " << source << endl; //qDebug() << "SetupPageMisc::slotMoveDBButtonClicked (target): " << target << endl; if ( QFile::exists(dbDirNew) ) { //dbDirCurrent //dbDir if (QFile::copy(source, target)) { dbDirCurrent = dbDirNew; if (QFile::remove(source)) { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("File moved")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); dbPathApplied = true; } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("File copied")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); dbPathApplied = true; } } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("File NOT copied")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); dbPathApplied = false; moveDBPushButton->setEnabled(true); } } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("The target directory does not exist. Please select an existing directory.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); dbPathApplied = false; moveDBPushButton->setEnabled(true); } } bool SetupPageMisc::areDBPathChangesApplied() { return dbPathApplied; } klog-0.9.8.1/klog.10000644000175000017500000000275013532572307012634 0ustar develdevel.TH KLog 1 "version 0.9.8" "Jaime Robles, EA4TV" "Hamradio" .SH "NAME" klog \- The Ham Radio Logging program .SH SYNOPSIS \fBklog\fR \fI[option]\fR .SH OPTIONS A summary of options is included below. .TP \fB\-\-help\fR Show summary of options. .TP \fB\-\-version\fR Output version information and exit. .SH DESCRIPTION \fBklog\fR is a ham radio logging program for Linux, macOS and Windows. With KLog you can log your QSOs and save it in ADIF format. KLog helps you to manage DXCC, WAZ and IOTA award. .SH USAGE Enter you QSO data in the top left box while entity data, direction and other usefull information will be shown in the top right box. .P Previous QSOs are shown in the botton box where you can click to edit them. .P Here is a list of keys that can be used to navigate through klog: .TP \fIControl a\fR: Add a QSO. .TP \fIControl d\fR: Delete a selected QSO. .SH PRINTING KLog has a very basic printing feature implemented. .SH PREFERENCES You can edit the ~/.klog/klogrc file to setup you call and locator. .P All the data files are saved in the KLog home directory (~/.klog) by default. .SH FILES \fI/usr/share/klog/cty.csv\fR contains the DXCC entries read by KLog. \fI~/.klog/logbook.dat.\fR contains all the logbook and information of KLog. .SH AUTHORS KLog was written by Jaime Robles, EA4TV aka Download the last version from: https://www.klog.xyz Calculation of heading and distance was taken from Loccalc code by Marco Bersani, IK2PIH. klog-0.9.8.1/setuppageclublog.cpp0000644000175000017500000001773513532572307015700 0ustar develdevel/*************************************************************************** setuppageclublog.cpp - description ------------------- begin : apt 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppageclublog.h" SetupPageClubLog::SetupPageClubLog(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageClubLog::SetupPageClubLog" << endl; clubLogActive = false; call = QString(); email = QString(); pass = QString(); emailLineEdit = new QLineEdit; callLineEdit = new QLineEdit; passwordLineEdit = new QLineEdit; callLabel = new QLabel(tr("&Callsign")); passwordLabel = new QLabel(tr("ClubLog &password")); emailLabel = new QLabel(tr("ClubLog &email")); callLabel->setBuddy(callLineEdit); passwordLabel->setBuddy(passwordLineEdit); emailLabel->setBuddy(emailLineEdit); emailLineEdit->setToolTip(tr("Enter the email you used to register in ClubLog.")); callLineEdit->setToolTip(tr("Enter the callsign you used to register in ClubLog.")); passwordLineEdit->setToolTip(tr("Enter your password in ClubLog.")); //passwordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); sendInRealTimeCheckBox = new QCheckBox(tr("&Send QSOs in real time"), this); clubLogActiveCheckBox = new QCheckBox(tr("&Activate ClubLog"), this); useQSOStationCallCheckBox = new QCheckBox(tr("Use QSO Station &Callsign"), this); sendInRealTimeCheckBox->setToolTip(tr("Send each QSO to ClubLog in real time, as they are added (or modified) in KLog.")); clubLogActiveCheckBox->setToolTip(tr("Starts the ClubLog support in KLog.")); useQSOStationCallCheckBox->setToolTip(tr("Use the Station Callsign defined in each QSO instead of the one defined here.")); QHBoxLayout *callSLayout = new QHBoxLayout; callSLayout->addWidget(callLineEdit); callSLayout->addWidget(useQSOStationCallCheckBox); QGridLayout *glayout = new QGridLayout; glayout->addWidget(callLabel, 0, 0); glayout->addWidget(emailLabel, 1, 0); glayout->addWidget(passwordLabel, 2, 0); glayout->addLayout(callSLayout, 0, 1); //glayout->addWidget(callLineEdit, 0, 1); glayout->addWidget(emailLineEdit, 1, 1); glayout->addWidget(passwordLineEdit, 2, 1); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(clubLogActiveCheckBox); layout->addLayout(glayout); layout->addWidget(sendInRealTimeCheckBox); setLayout(layout); //connect(newOneColorButton, SIGNAL(clicked()), this, SLOT(slotNewOneColorButtonClicked()) ); connect(clubLogActiveCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotClubLogActive(bool))); connect(useQSOStationCallCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotUseStationCall(bool))); //connect(sendInRealTimeCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotClubLogActive(bool))); slotClubLogActive(clubLogActive); //qDebug() << "SetupPageClubLog::SetupPageClubLog - END" << endl; } SetupPageClubLog::~SetupPageClubLog() { } void SetupPageClubLog::setEmail(const QString c) { emailLineEdit->setText(c); } void SetupPageClubLog::setPassword(const QString c) { passwordLineEdit->setText(c); } void SetupPageClubLog::setCallsign(const QString c) { callLineEdit->setText(c.toUpper()); } QString SetupPageClubLog::getEmail() { return (emailLineEdit->text()); } QString SetupPageClubLog::getPassword() { return passwordLineEdit->text(); } QString SetupPageClubLog::getCallsign() { return (callLineEdit->text()).toUpper(); } QString SetupPageClubLog::getUseQSOStationCallsign() { if (useQSOStationCallCheckBox->isChecked() ) { return "True"; } else { return "False"; } } void SetupPageClubLog::setUseStationCall(const QString _s) { if ( (_s.toUpper()) == "FALSE") { useQSOStationCallCheckBox->setChecked(false); } else { useQSOStationCallCheckBox->setChecked(true); } } QString SetupPageClubLog::getClubLog() { if (clubLogActiveCheckBox->isChecked() ) { return "True"; } else { return "False"; } } void SetupPageClubLog::setClubLog(const QString _s) { if ( (_s.toUpper()) == "FALSE") { clubLogActive = false; clubLogActiveCheckBox->setChecked(false); } else { clubLogActive = true; clubLogActiveCheckBox->setChecked(true); } } void SetupPageClubLog::slotUseStationCall(bool _s) { //qDebug() << "SetupPageClubLog::slotUseStationCall" << endl; if (useQSOStationCallCheckBox->isChecked()) { callLineEdit->setEnabled(false); callLabel->setEnabled(false); } else { callLineEdit->setEnabled(true); callLabel->setEnabled(true); } } void SetupPageClubLog::slotClubLogActive(bool _s) { //qDebug() << "SetupPageClubLog::slotClubLogActive" << endl; if (_s) { //qDebug() << "SetupPageClubLog::slotClubLogActive TRUE" << endl; callLabel->setEnabled(true); emailLabel->setEnabled(true); passwordLabel->setEnabled(true); callLineEdit->setEnabled(true); emailLineEdit->setEnabled(true); passwordLineEdit->setEnabled(true); sendInRealTimeCheckBox->setEnabled(true); useQSOStationCallCheckBox->setEnabled(true); clubLogActive = true; } else { //qDebug() << "SetupPageClubLog::slotClubLogActive FALSE" << endl; callLabel->setEnabled(false); emailLabel->setEnabled(false); passwordLabel->setEnabled(false); callLineEdit->setEnabled(false); emailLineEdit->setEnabled(false); passwordLineEdit->setEnabled(false); sendInRealTimeCheckBox->setEnabled(false); useQSOStationCallCheckBox->setEnabled(false); clubLogActive = false; } } void SetupPageClubLog::setClubLogRealTime(const QString _s) { if ( (_s.toUpper()) == "FALSE") { sendInRealTimeCheckBox->setChecked(false); } else { sendInRealTimeCheckBox->setChecked(true); } } QString SetupPageClubLog::getClubLogRealTime() { if (sendInRealTimeCheckBox->isChecked()) { return "True"; } else { return "False"; } //return sendInRealTimeCheckBox->isChecked(); }