summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/wellenreiter/gui/configbase.ui143
-rw-r--r--noncore/net/wellenreiter/gui/gui.pro2
-rw-r--r--noncore/net/wellenreiter/gui/mainwindow.cpp12
-rw-r--r--noncore/net/wellenreiter/gui/manufacturers.cpp60
-rw-r--r--noncore/net/wellenreiter/gui/manufacturers.h36
-rw-r--r--noncore/net/wellenreiter/gui/scanlist.cpp59
-rw-r--r--noncore/net/wellenreiter/gui/scanlist.h24
-rw-r--r--noncore/net/wellenreiter/gui/wellenreiter.cpp74
-rw-r--r--noncore/net/wellenreiter/gui/wellenreiter.h4
-rw-r--r--noncore/net/wellenreiter/gui/wellenreitertemplate.ui605
10 files changed, 199 insertions, 820 deletions
diff --git a/noncore/net/wellenreiter/gui/configbase.ui b/noncore/net/wellenreiter/gui/configbase.ui
index 590ca92..554fc29 100644
--- a/noncore/net/wellenreiter/gui/configbase.ui
+++ b/noncore/net/wellenreiter/gui/configbase.ui
@@ -10,10 +10,10 @@
10 <name>geometry</name> 10 <name>geometry</name>
11 <rect> 11 <rect>
12 <x>0</x> 12 <x>0</x>
13 <y>0</y> 13 <y>0</y>
14 <width>261</width> 14 <width>230</width>
15 <height>280</height> 15 <height>287</height>
16 </rect> 16 </rect>
17 </property> 17 </property>
18 <property stdset="1"> 18 <property stdset="1">
19 <name>caption</name> 19 <name>caption</name>
@@ -620,8 +620,147 @@
620 <cstring>tab</cstring> 620 <cstring>tab</cstring>
621 </property> 621 </property>
622 <attribute> 622 <attribute>
623 <name>title</name> 623 <name>title</name>
624 <string>UI</string>
625 </attribute>
626 <grid>
627 <property stdset="1">
628 <name>margin</name>
629 <number>11</number>
630 </property>
631 <property stdset="1">
632 <name>spacing</name>
633 <number>6</number>
634 </property>
635 <widget row="3" column="0" >
636 <class>QGroupBox</class>
637 <property stdset="1">
638 <name>name</name>
639 <cstring>GroupBox4_2</cstring>
640 </property>
641 <property stdset="1">
642 <name>title</name>
643 <string>Action On Detecting</string>
644 </property>
645 <grid>
646 <property stdset="1">
647 <name>margin</name>
648 <number>11</number>
649 </property>
650 <property stdset="1">
651 <name>spacing</name>
652 <number>6</number>
653 </property>
654 <widget row="1" column="0" >
655 <class>QLabel</class>
656 <property stdset="1">
657 <name>name</name>
658 <cstring>TextLabel2</cstring>
659 </property>
660 <property stdset="1">
661 <name>text</name>
662 <string>New Wireless Station</string>
663 </property>
664 </widget>
665 <widget row="0" column="0" >
666 <class>QLabel</class>
667 <property stdset="1">
668 <name>name</name>
669 <cstring>TextLabel1_3</cstring>
670 </property>
671 <property stdset="1">
672 <name>text</name>
673 <string>New Network</string>
674 </property>
675 </widget>
676 <widget row="0" column="1" >
677 <class>QComboBox</class>
678 <property stdset="1">
679 <name>name</name>
680 <cstring>newNetwork</cstring>
681 </property>
682 </widget>
683 <widget row="1" column="1" >
684 <class>QComboBox</class>
685 <property stdset="1">
686 <name>name</name>
687 <cstring>newWirelessStation</cstring>
688 </property>
689 </widget>
690 <widget row="2" column="1" >
691 <class>QComboBox</class>
692 <property stdset="1">
693 <name>name</name>
694 <cstring>newStation</cstring>
695 </property>
696 </widget>
697 <widget row="2" column="0" >
698 <class>QLabel</class>
699 <property stdset="1">
700 <name>name</name>
701 <cstring>TextLabel3</cstring>
702 </property>
703 <property stdset="1">
704 <name>text</name>
705 <string>New Station</string>
706 </property>
707 </widget>
708 </grid>
709 </widget>
710 <spacer row="2" column="0" >
711 <property>
712 <name>name</name>
713 <cstring>Spacer3</cstring>
714 </property>
715 <property stdset="1">
716 <name>orientation</name>
717 <enum>Vertical</enum>
718 </property>
719 <property stdset="1">
720 <name>sizeType</name>
721 <enum>Expanding</enum>
722 </property>
723 <property>
724 <name>sizeHint</name>
725 <size>
726 <width>20</width>
727 <height>20</height>
728 </size>
729 </property>
730 </spacer>
731 <widget row="0" column="0" >
732 <class>QCheckBox</class>
733 <property stdset="1">
734 <name>name</name>
735 <cstring>lookupVendor</cstring>
736 </property>
737 <property stdset="1">
738 <name>text</name>
739 <string>Lookup MAC vendor names</string>
740 </property>
741 </widget>
742 <widget row="1" column="0" >
743 <class>QCheckBox</class>
744 <property stdset="1">
745 <name>name</name>
746 <cstring>openTree</cstring>
747 </property>
748 <property stdset="1">
749 <name>text</name>
750 <string>Open Tree On New Station</string>
751 </property>
752 </widget>
753 </grid>
754 </widget>
755 <widget>
756 <class>QWidget</class>
757 <property stdset="1">
758 <name>name</name>
759 <cstring>tab</cstring>
760 </property>
761 <attribute>
762 <name>title</name>
624 <string>Intrusion</string> 763 <string>Intrusion</string>
625 </attribute> 764 </attribute>
626 <grid> 765 <grid>
627 <property stdset="1"> 766 <property stdset="1">
diff --git a/noncore/net/wellenreiter/gui/gui.pro b/noncore/net/wellenreiter/gui/gui.pro
index 2c4c6c3..ee239a3 100644
--- a/noncore/net/wellenreiter/gui/gui.pro
+++ b/noncore/net/wellenreiter/gui/gui.pro
@@ -11,9 +11,8 @@ HEADERS = wellenreiterbase.h \
11 logwindow.h \ 11 logwindow.h \
12 hexwindow.h \ 12 hexwindow.h \
13 statwindow.h \ 13 statwindow.h \
14 configwindow.h \ 14 configwindow.h \
15 manufacturers.h \
16 graphwindow.h \ 15 graphwindow.h \
17 protolistview.h 16 protolistview.h
18 17
19SOURCES = main.cpp \ 18SOURCES = main.cpp \
@@ -24,9 +23,8 @@ SOURCES = main.cpp \
24 logwindow.cpp \ 23 logwindow.cpp \
25 hexwindow.cpp \ 24 hexwindow.cpp \
26 statwindow.cpp \ 25 statwindow.cpp \
27 configwindow.cpp \ 26 configwindow.cpp \
28 manufacturers.cpp \
29 graphwindow.cpp \ 27 graphwindow.cpp \
30 protolistview.cpp 28 protolistview.cpp
31 29
32INCLUDEPATH += $(OPIEDIR)/include 30INCLUDEPATH += $(OPIEDIR)/include
diff --git a/noncore/net/wellenreiter/gui/mainwindow.cpp b/noncore/net/wellenreiter/gui/mainwindow.cpp
index 3e36f5b..27ecae3 100644
--- a/noncore/net/wellenreiter/gui/mainwindow.cpp
+++ b/noncore/net/wellenreiter/gui/mainwindow.cpp
@@ -215,15 +215,15 @@ WellenreiterMainWindow::~WellenreiterMainWindow()
215}; 215};
216 216
217void WellenreiterMainWindow::demoAddStations() 217void WellenreiterMainWindow::demoAddStations()
218{ 218{
219 mw = 0; 219 //mw = 0; // test SIGSGV handling
220 220
221 mw->netView()->addNewItem( "managed", "Vanille", "00:00:20:EF:A6:43", true, 6, 80 ); 221 mw->netView()->addNewItem( "managed", "Vanille", OMacAddress::fromString("00:00:20:EF:A6:43"), true, 6, 80 );
222 mw->netView()->addNewItem( "managed", "Vanille", "00:30:6D:EF:A6:23", true, 11, 10 ); 222 mw->netView()->addNewItem( "managed", "Vanille", OMacAddress::fromString("00:30:6D:EF:A6:23"), true, 11, 10 );
223 mw->netView()->addNewItem( "adhoc", "ELAN", "00:A0:F8:E7:16:22", false, 3, 10 ); 223 mw->netView()->addNewItem( "adhoc", "ELAN", OMacAddress::fromString("00:A0:F8:E7:16:22"), false, 3, 10 );
224 mw->netView()->addNewItem( "adhoc", "ELAN", "00:AA:01:E7:56:62", false, 3, 15 ); 224 mw->netView()->addNewItem( "adhoc", "ELAN", OMacAddress::fromString("00:AA:01:E7:56:62"), false, 3, 15 );
225 mw->netView()->addNewItem( "adhoc", "ELAN", "00:B0:8E:E7:56:E2", false, 3, 20 ); 225 mw->netView()->addNewItem( "adhoc", "ELAN", OMacAddress::fromString("00:B0:8E:E7:56:E2"), false, 3, 20 );
226} 226}
227 227
228 228
229QString WellenreiterMainWindow::getFileName( bool save ) 229QString WellenreiterMainWindow::getFileName( bool save )
diff --git a/noncore/net/wellenreiter/gui/manufacturers.cpp b/noncore/net/wellenreiter/gui/manufacturers.cpp
deleted file mode 100644
index f9f8967..0000000
--- a/noncore/net/wellenreiter/gui/manufacturers.cpp
+++ b/dev/null
@@ -1,60 +0,0 @@
1/**********************************************************************
2** Copyright (C) 2002 Michael 'Mickey' Lauer. All rights reserved.
3**
4** This file is part of Opie Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14**********************************************************************/
15
16#include "manufacturers.h"
17
18// Qt
19#include <qstring.h>
20#include <qfile.h>
21#include <qtextstream.h>
22
23ManufacturerDB::ManufacturerDB( const QString& filename )
24{
25 QFile file( filename );
26 bool hasFile = file.open( IO_ReadOnly );
27 if (!hasFile)
28 {
29 qDebug( "ManufacturerDB: D'oh! Manufacturer list '%s' not found!", (const char*) filename );
30 }
31 else
32 {
33 qDebug( "ManufacturerDB: reading manufacturer list from '%s'...", (const char*) filename );
34 QTextStream s( &file );
35 QString addr;
36 QString manu;
37
38 while (!s.atEnd())
39 {
40 s >> addr;
41 s.skipWhiteSpace();
42 manu = s.readLine();
43 #ifdef DEBUG
44 //qDebug( "ManufacturerDB: read pair %s, %s", (const char*) addr, (const char*) manu );
45 #endif
46 manufacturers.insert( addr, manu );
47
48 }
49 }
50
51}
52
53ManufacturerDB::~ManufacturerDB()
54{
55}
56
57const QString& ManufacturerDB::lookup( const QString& macaddr ) const
58{
59 return manufacturers[macaddr.upper().left(8)];
60}
diff --git a/noncore/net/wellenreiter/gui/manufacturers.h b/noncore/net/wellenreiter/gui/manufacturers.h
deleted file mode 100644
index 75728b1..0000000
--- a/noncore/net/wellenreiter/gui/manufacturers.h
+++ b/dev/null
@@ -1,36 +0,0 @@
1/**********************************************************************
2** Copyright (C) 2002 Michael 'Mickey' Lauer. All rights reserved.
3**
4** This file is part of Opie Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14**********************************************************************/
15
16#ifndef MANUFACTURERS_H
17#define MANUFACTURERS_H
18
19#include <qmap.h>
20
21class ManufacturerDB
22{
23 public:
24
25 ManufacturerDB( const QString& filename );
26 virtual ~ManufacturerDB();
27 const QString& lookup( const QString& macaddr ) const;
28
29 private:
30
31 QMap<QString, QString> manufacturers;
32
33};
34
35#endif
36
diff --git a/noncore/net/wellenreiter/gui/scanlist.cpp b/noncore/net/wellenreiter/gui/scanlist.cpp
index d5665b4..809d0bd 100644
--- a/noncore/net/wellenreiter/gui/scanlist.cpp
+++ b/noncore/net/wellenreiter/gui/scanlist.cpp
@@ -17,9 +17,8 @@
17#include "configwindow.h" 17#include "configwindow.h"
18#include "logwindow.h" 18#include "logwindow.h"
19 19
20#include <assert.h> 20#include <assert.h>
21#include "manufacturers.h"
22#include <qdatetime.h> 21#include <qdatetime.h>
23#include <qtextstream.h> 22#include <qtextstream.h>
24 23
25#ifdef QWS 24#ifdef QWS
@@ -46,9 +45,9 @@ const int col_manuf = 7;
46const int col_firstseen = 8; 45const int col_firstseen = 8;
47const int col_lastseen = 9; 46const int col_lastseen = 9;
48 47
49MScanListView::MScanListView( QWidget* parent, const char* name ) 48MScanListView::MScanListView( QWidget* parent, const char* name )
50 :OListView( parent, name ), _manufacturerdb( 0 ) 49 :OListView( parent, name )
51{ 50{
52 51
53 setFrameShape( QListView::StyledPanel ); 52 setFrameShape( QListView::StyledPanel );
54 setFrameShadow( QListView::Sunken ); 53 setFrameShadow( QListView::Sunken );
@@ -76,37 +75,37 @@ MScanListView::MScanListView( QWidget* parent, const char* name )
76 setRootIsDecorated( true ); 75 setRootIsDecorated( true );
77 setAllColumnsShowFocus( true ); 76 setAllColumnsShowFocus( true );
78}; 77};
79 78
79
80MScanListView::~MScanListView() 80MScanListView::~MScanListView()
81{ 81{
82}; 82};
83 83
84
84OListViewItem* MScanListView::childFactory() 85OListViewItem* MScanListView::childFactory()
85{ 86{
86 return new MScanListItem( this ); 87 return new MScanListItem( this );
87} 88}
88 89
90
89void MScanListView::serializeTo( QDataStream& s) const 91void MScanListView::serializeTo( QDataStream& s) const
90{ 92{
91 qDebug( "serializing MScanListView" ); 93 qDebug( "serializing MScanListView" );
92 OListView::serializeTo( s ); 94 OListView::serializeTo( s );
93} 95}
94 96
97
95void MScanListView::serializeFrom( QDataStream& s) 98void MScanListView::serializeFrom( QDataStream& s)
96{ 99{
97 qDebug( "serializing MScanListView" ); 100 qDebug( "serializing MScanListView" );
98 OListView::serializeFrom( s ); 101 OListView::serializeFrom( s );
99} 102}
100 103
101void MScanListView::setManufacturerDB( ManufacturerDB* manufacturerdb )
102{
103 _manufacturerdb = manufacturerdb;
104}
105 104
106void MScanListView::addNewItem( QString type, QString essid, QString macaddr, bool wep, int channel, int signal ) 105void MScanListView::addNewItem( const QString& type, const QString& essid, const OMacAddress& mac, bool wep, int channel, int signal )
107{ 106{
108 // FIXME: scanlistitem needs a proper encapsulation and not such a damn dealing with text(...) 107 QString macaddr = mac.toString(true);
109 108
110 #ifdef DEBUG 109 #ifdef DEBUG
111 qDebug( "MScanList::addNewItem( %s / %s / %s [%d]", (const char*) type, 110 qDebug( "MScanList::addNewItem( %s / %s / %s [%d]", (const char*) type,
112 (const char*) essid, (const char*) macaddr, channel ); 111 (const char*) essid, (const char*) macaddr, channel );
@@ -167,10 +166,9 @@ void MScanListView::addNewItem( QString type, QString essid, QString macaddr, bo
167 qDebug( "inserting new station %s", (const char*) macaddr ); 166 qDebug( "inserting new station %s", (const char*) macaddr );
168 #endif 167 #endif
169 168
170 MScanListItem* station = new MScanListItem( network, type, "", macaddr, wep, channel, signal ); 169 MScanListItem* station = new MScanListItem( network, type, "", macaddr, wep, channel, signal );
171 if ( _manufacturerdb ) 170 station->setManufacturer( mac.manufacturer() );
172 station->setManufacturer( _manufacturerdb->lookup( macaddr ) );
173 171
174 if ( type == "managed" ) 172 if ( type == "managed" )
175 { 173 {
176 s.sprintf( "(i) New Access Point in '%s' [%d]", (const char*) essid, channel ); 174 s.sprintf( "(i) New Access Point in '%s' [%d]", (const char*) essid, channel );
@@ -183,13 +181,13 @@ void MScanListView::addNewItem( QString type, QString essid, QString macaddr, bo
183 181
184} 182}
185 183
186 184
187void MScanListView::addIfNotExisting( MScanListItem* network, QString addr, const QString& type ) 185void MScanListView::addIfNotExisting( MScanListItem* network, const OMacAddress& addr, const QString& type )
188{ 186{
189 MScanListItem* subitem = static_cast<MScanListItem*>( network->firstChild() ); 187 MScanListItem* subitem = static_cast<MScanListItem*>( network->firstChild() );
190 188
191 while ( subitem && ( subitem->text( col_ap ) != addr ) ) 189 while ( subitem && ( subitem->text( col_ap ) != addr.toString(true) ) )
192 { 190 {
193 #ifdef DEBUG 191 #ifdef DEBUG
194 qDebug( "subitemtext: %s", (const char*) subitem->text( col_ap ) ); 192 qDebug( "subitemtext: %s", (const char*) subitem->text( col_ap ) );
195 #endif 193 #endif
@@ -199,18 +197,17 @@ void MScanListView::addIfNotExisting( MScanListItem* network, QString addr, cons
199 if ( subitem ) 197 if ( subitem )
200 { 198 {
201 // we have already seen this item, it's a dupe 199 // we have already seen this item, it's a dupe
202 #ifdef DEBUG 200 #ifdef DEBUG
203 qDebug( "%s is a dupe - ignoring...", (const char*) addr ); 201 qDebug( "%s is a dupe - ignoring...", (const char*) addr.toString(true) );
204 #endif 202 #endif
205 subitem->receivedBeacon(); //FIXME: sent data bit 203 subitem->receivedBeacon(); //FIXME: sent data bit
206 return; 204 return;
207 } 205 }
208 206
209 // Hey, it seems to be a new item :-D 207 // Hey, it seems to be a new item :-D
210 MScanListItem* station = new MScanListItem( network, type, /* network->text( col_essid ) */ "", addr, false, -1, -1 ); 208 MScanListItem* station = new MScanListItem( network, type, /* network->text( col_essid ) */ "", addr.toString(true), false, -1, -1 );
211 if ( _manufacturerdb ) 209 station->setManufacturer( addr.manufacturer() );
212 station->setManufacturer( _manufacturerdb->lookup( addr ) );
213 210
214 QString s; 211 QString s;
215 if ( type == "station" ) 212 if ( type == "station" )
216 { 213 {
@@ -223,17 +220,17 @@ void MScanListView::addIfNotExisting( MScanListItem* network, QString addr, cons
223 MLogWindow::logwindow()->log( s ); 220 MLogWindow::logwindow()->log( s );
224} 221}
225 222
226 223
227void MScanListView::WDStraffic( QString from, QString to, QString viaFrom, QString viaTo ) 224void MScanListView::WDStraffic( const OMacAddress& from, const OMacAddress& to, const OMacAddress& viaFrom, const OMacAddress& viaTo )
228{ 225{
229 QString s; 226 QString s;
230 MScanListItem* network; 227 MScanListItem* network;
231 228
232 QListViewItemIterator it( this ); 229 QListViewItemIterator it( this );
233 while ( it.current() && 230 while ( it.current() &&
234 it.current()->text( col_ap ) != viaFrom && 231 it.current()->text( col_ap ) != viaFrom.toString(true) &&
235 it.current()->text( col_ap ) != viaTo ) ++it; 232 it.current()->text( col_ap ) != viaTo.toString(true) ) ++it;
236 233
237 MScanListItem* item = static_cast<MScanListItem*>( it.current() ); 234 MScanListItem* item = static_cast<MScanListItem*>( it.current() );
238 235
239 if ( item ) // Either viaFrom or viaTo AP has shown up yet, so just add our two new stations 236 if ( item ) // Either viaFrom or viaTo AP has shown up yet, so just add our two new stations
@@ -248,15 +245,15 @@ void MScanListView::WDStraffic( QString from, QString to, QString viaFrom, QStri
248 } 245 }
249} 246}
250 247
251 248
252void MScanListView::toDStraffic( QString from, QString to, QString via ) 249void MScanListView::toDStraffic( const OMacAddress& from, const OMacAddress& to, const OMacAddress& via )
253{ 250{
254 QString s; 251 QString s;
255 MScanListItem* network; 252 MScanListItem* network;
256 253
257 QListViewItemIterator it( this ); 254 QListViewItemIterator it( this );
258 while ( it.current() && it.current()->text( col_ap ) != via ) ++it; 255 while ( it.current() && it.current()->text( col_ap ) != via.toString(true) ) ++it;
259 256
260 MScanListItem* item = static_cast<MScanListItem*>( it.current() ); 257 MScanListItem* item = static_cast<MScanListItem*>( it.current() );
261 258
262 if ( item ) // AP has shown up yet, so just add our new "from" - station 259 if ( item ) // AP has shown up yet, so just add our new "from" - station
@@ -271,15 +268,15 @@ void MScanListView::toDStraffic( QString from, QString to, QString via )
271 } 268 }
272} 269}
273 270
274 271
275void MScanListView::fromDStraffic( QString from, QString to, QString via ) 272void MScanListView::fromDStraffic( const OMacAddress& from, const OMacAddress& to, const OMacAddress& via )
276{ 273{
277 QString s; 274 QString s;
278 MScanListItem* network; 275 MScanListItem* network;
279 276
280 QListViewItemIterator it( this ); 277 QListViewItemIterator it( this );
281 while ( it.current() && it.current()->text( col_ap ) != via ) ++it; 278 while ( it.current() && it.current()->text( col_ap ) != via.toString(true) ) ++it;
282 279
283 MScanListItem* item = static_cast<MScanListItem*>( it.current() ); 280 MScanListItem* item = static_cast<MScanListItem*>( it.current() );
284 281
285 if ( item ) // AP has shown up yet, so just add our new "from" - station 282 if ( item ) // AP has shown up yet, so just add our new "from" - station
@@ -293,31 +290,31 @@ void MScanListView::fromDStraffic( QString from, QString to, QString via )
293 } 290 }
294} 291}
295 292
296 293
297void MScanListView::IBSStraffic( QString from, QString to, QString via ) 294void MScanListView::IBSStraffic( const OMacAddress& from, const OMacAddress& to, const OMacAddress& via )
298{ 295{
299 qWarning( "D'oh! Not yet implemented..." ); 296 qWarning( "D'oh! Not yet implemented..." );
300 MLogWindow::logwindow()->log( "WARNING: Unhandled IBSS traffic!" ); 297 MLogWindow::logwindow()->log( "WARNING: Unhandled IBSS traffic!" );
301} 298}
302 299
303 300
304void MScanListView::identify( const QString& macaddr, const QString& ip ) 301void MScanListView::identify( const OMacAddress& macaddr, const QString& ip )
305{ 302{
306 qDebug( "identify %s = %s", (const char*) macaddr, (const char*) ip ); 303 qDebug( "identify %s = %s", (const char*) macaddr.toString(), (const char*) ip );
307 304
308 QListViewItemIterator it( this ); 305 QListViewItemIterator it( this );
309 for ( ; it.current(); ++it ) 306 for ( ; it.current(); ++it )
310 { 307 {
311 if ( it.current()->text( col_ap ) == macaddr ) 308 if ( it.current()->text( col_ap ) == macaddr.toString(true) )
312 { 309 {
313 it.current()->setText( col_ip, ip ); 310 it.current()->setText( col_ip, ip );
314 return; 311 return;
315 } 312 }
316 } 313 }
317 qDebug( "D'oh! Received identification, but item not yet in list... ==> Handle this!" ); 314 qDebug( "D'oh! Received identification, but item not yet in list... ==> Handle this!" );
318 MLogWindow::logwindow()->log( QString().sprintf( "WARNING: Unhandled identification %s = %s!", 315 MLogWindow::logwindow()->log( QString().sprintf( "WARNING: Unhandled identification %s = %s!",
319 (const char*) macaddr, (const char*) ip ) ); 316 (const char*) macaddr.toString(), (const char*) ip ) );
320} 317}
321 318
322 319
323//============================================================ 320//============================================================
@@ -449,8 +446,10 @@ void MScanListItem::receivedBeacon()
449 qDebug( "MScanListItem %s: received beacon #%d", (const char*) _macaddr, _beacons ); 446 qDebug( "MScanListItem %s: received beacon #%d", (const char*) _macaddr, _beacons );
450 #endif 447 #endif
451 setText( col_sig, QString::number( _beacons ) ); 448 setText( col_sig, QString::number( _beacons ) );
452 setText( col_lastseen, QTime::currentTime().toString() ); 449 setText( col_lastseen, QTime::currentTime().toString() );
453 if ( WellenreiterConfigWindow::instance() ) 450
454 playSound( WellenreiterConfigWindow::instance()->soundOnBeacon() ); 451 MScanListItem* p = (MScanListItem*) parent();
452 if ( p ) p->receivedBeacon();
453
455} 454}
456 455
diff --git a/noncore/net/wellenreiter/gui/scanlist.h b/noncore/net/wellenreiter/gui/scanlist.h
index 4cb9216..253c166 100644
--- a/noncore/net/wellenreiter/gui/scanlist.h
+++ b/noncore/net/wellenreiter/gui/scanlist.h
@@ -15,15 +15,16 @@
15 15
16#ifndef SCANLIST_H 16#ifndef SCANLIST_H
17#define SCANLIST_H 17#define SCANLIST_H
18 18
19/* OPIE */
19#include <opie2/olistview.h> 20#include <opie2/olistview.h>
21#include <opie2/onetutils.h>
20 22
23/* QT */
21#include <qtextstream.h> 24#include <qtextstream.h>
22 25
23class QString; 26class QString;
24class ManufacturerDB;
25
26class MScanListItem; 27class MScanListItem;
27 28
28class MScanListView: public OListView 29class MScanListView: public OListView
29{ 30{
@@ -32,28 +33,23 @@ class MScanListView: public OListView
32 public: 33 public:
33 MScanListView( QWidget* parent = 0, const char* name = 0 ); 34 MScanListView( QWidget* parent = 0, const char* name = 0 );
34 virtual ~MScanListView(); 35 virtual ~MScanListView();
35 36
36 void setManufacturerDB( ManufacturerDB* manufacturerdb );
37
38 virtual OListViewItem* childFactory(); 37 virtual OListViewItem* childFactory();
39 virtual void serializeTo( QDataStream& s ) const; 38 virtual void serializeTo( QDataStream& s ) const;
40 virtual void serializeFrom( QDataStream& s ); 39 virtual void serializeFrom( QDataStream& s );
41 40
42 public slots: 41 public slots:
43 void addNewItem( QString type, QString essid, QString macaddr, bool wep, int channel, int signal ); 42 void addNewItem( const QString& type, const QString& essid, const OMacAddress& macaddr, bool wep, int channel, int signal );
44 void fromDStraffic( QString from, QString to, QString via ); // NYI 43 void fromDStraffic( const OMacAddress& from, const OMacAddress& to, const OMacAddress& via );
45 void toDStraffic( QString from, QString to, QString via ); 44 void toDStraffic( const OMacAddress& from, const OMacAddress& to, const OMacAddress& via );
46 void WDStraffic( QString from, QString to, QString viaFrom, QString viaTo ); 45 void WDStraffic( const OMacAddress& from, const OMacAddress& to, const OMacAddress& viaFrom, const OMacAddress& viaTo );
47 void IBSStraffic( QString from, QString to, QString via ); // NYI 46 void IBSStraffic( const OMacAddress& from, const OMacAddress& to, const OMacAddress& via );
48 47
49 void identify( const QString& macaddr, const QString& ipaddr ); 48 void identify( const OMacAddress&, const QString& ipaddr );
50 49
51 protected: 50 protected:
52 void addIfNotExisting( MScanListItem* parent, QString addr, const QString& type = "station" ); 51 void addIfNotExisting( MScanListItem* parent, const OMacAddress& addr, const QString& type = "station" );
53
54 private:
55 ManufacturerDB* _manufacturerdb;
56 52
57}; 53};
58 54
59//****************************** MScanListItem **************************************************************** 55//****************************** MScanListItem ****************************************************************
diff --git a/noncore/net/wellenreiter/gui/wellenreiter.cpp b/noncore/net/wellenreiter/gui/wellenreiter.cpp
index 4257be1..2f26702 100644
--- a/noncore/net/wellenreiter/gui/wellenreiter.cpp
+++ b/noncore/net/wellenreiter/gui/wellenreiter.cpp
@@ -21,9 +21,8 @@
21#include "hexwindow.h" 21#include "hexwindow.h"
22#include "configwindow.h" 22#include "configwindow.h"
23#include "statwindow.h" 23#include "statwindow.h"
24#include "graphwindow.h" 24#include "graphwindow.h"
25#include "manufacturers.h"
26#include "protolistview.h" 25#include "protolistview.h"
27 26
28// Opie 27// Opie
29 28
@@ -64,23 +63,11 @@ using namespace Opie;
64#include <stdlib.h> 63#include <stdlib.h>
65 64
66Wellenreiter::Wellenreiter( QWidget* parent ) 65Wellenreiter::Wellenreiter( QWidget* parent )
67 : WellenreiterBase( parent, 0, 0 ), 66 : WellenreiterBase( parent, 0, 0 ),
68 sniffing( false ), iface( 0 ), manufacturerdb( 0 ), configwindow( 0 ) 67 sniffing( false ), iface( 0 ), configwindow( 0 )
69{ 68{
70 69
71 //
72 // construct manufacturer database
73 //
74
75 QString manufile;
76 #ifdef QWS
77 manufile.sprintf( "%s/share/wellenreiter/manufacturers.dat", (const char*) QPEApplication::qpeDir() );
78 #else
79 manufile.sprintf( "/usr/local/share/wellenreiter/manufacturers.dat" );
80 #endif
81 manufacturerdb = new ManufacturerDB( manufile );
82
83 logwindow->log( "(i) Wellenreiter has been started." ); 70 logwindow->log( "(i) Wellenreiter has been started." );
84 71
85 // 72 //
86 // detect operating system 73 // detect operating system
@@ -92,24 +79,15 @@ Wellenreiter::Wellenreiter( QWidget* parent )
92 _system = ODevice::inst()->system(); 79 _system = ODevice::inst()->system();
93 logwindow->log( sys ); 80 logwindow->log( sys );
94 #endif 81 #endif
95 82
96 // setup GUI
97 netview->setColumnWidthMode( 1, QListView::Manual ); 83 netview->setColumnWidthMode( 1, QListView::Manual );
98
99 if ( manufacturerdb )
100 netview->setManufacturerDB( manufacturerdb );
101
102 pcap = new OPacketCapturer(); 84 pcap = new OPacketCapturer();
103
104} 85}
105 86
106 87
107Wellenreiter::~Wellenreiter() 88Wellenreiter::~Wellenreiter()
108{ 89{
109 // no need to delete child widgets, Qt does it all for us
110
111 delete manufacturerdb;
112 delete pcap; 90 delete pcap;
113} 91}
114 92
115 93
@@ -185,9 +163,9 @@ void Wellenreiter::handleBeacon( OPacket* p, OWaveLanManagementPacket* beacon )
185 OWaveLanManagementDS* ds = static_cast<OWaveLanManagementDS*>( p->child( "802.11 DS" ) ); 163 OWaveLanManagementDS* ds = static_cast<OWaveLanManagementDS*>( p->child( "802.11 DS" ) );
186 int channel = ds ? ds->channel() : -1; 164 int channel = ds ? ds->channel() : -1;
187 165
188 OWaveLanPacket* header = static_cast<OWaveLanPacket*>( p->child( "802.11" ) ); 166 OWaveLanPacket* header = static_cast<OWaveLanPacket*>( p->child( "802.11" ) );
189 netView()->addNewItem( type, essid, header->macAddress2().toString(), beacon->canPrivacy(), channel, 0 ); 167 netView()->addNewItem( type, essid, header->macAddress2(), beacon->canPrivacy(), channel, 0 );
190 168
191 // update graph window 169 // update graph window
192 if ( ds ) 170 if ( ds )
193 { 171 {
@@ -204,63 +182,35 @@ void Wellenreiter::handleData( OPacket* p, OWaveLanDataPacket* data )
204{ 182{
205 OWaveLanPacket* wlan = (OWaveLanPacket*) p->child( "802.11" ); 183 OWaveLanPacket* wlan = (OWaveLanPacket*) p->child( "802.11" );
206 if ( wlan->fromDS() && !wlan->toDS() ) 184 if ( wlan->fromDS() && !wlan->toDS() )
207 { 185 {
208 qDebug( "FromDS traffic: '%s' -> '%s' via '%s'", 186 netView()->fromDStraffic( wlan->macAddress3(), wlan->macAddress1(), wlan->macAddress2() );
209 (const char*) wlan->macAddress3().toString(true),
210 (const char*) wlan->macAddress1().toString(true),
211 (const char*) wlan->macAddress2().toString(true) );
212 netView()->fromDStraffic( wlan->macAddress3().toString(),
213 wlan->macAddress1().toString(),
214 wlan->macAddress2().toString() );
215 } 187 }
216 else 188 else if ( !wlan->fromDS() && wlan->toDS() )
217 if ( !wlan->fromDS() && wlan->toDS() )
218 { 189 {
219 qDebug( "ToDS traffic: '%s' -> '%s' via '%s'", 190 netView()->toDStraffic( wlan->macAddress2(), wlan->macAddress3(), wlan->macAddress1() );
220 (const char*) wlan->macAddress2().toString(true),
221 (const char*) wlan->macAddress3().toString(true),
222 (const char*) wlan->macAddress1().toString(true) );
223 netView()->toDStraffic( wlan->macAddress2().toString(),
224 wlan->macAddress3().toString(),
225 wlan->macAddress1().toString() );
226 } 191 }
227 else 192 else if ( wlan->fromDS() && wlan->toDS() )
228 if ( wlan->fromDS() && wlan->toDS() )
229 { 193 {
230 qDebug( "WDS(bridge) traffic: '%s' -> '%s' via '%s' and '%s'", 194 netView()->WDStraffic( wlan->macAddress4(), wlan->macAddress3(), wlan->macAddress1(), wlan->macAddress2() );
231 (const char*) wlan->macAddress4().toString(true),
232 (const char*) wlan->macAddress3().toString(true),
233 (const char*) wlan->macAddress1().toString(true),
234 (const char*) wlan->macAddress2().toString(true) );
235 netView()->WDStraffic( wlan->macAddress4().toString(),
236 wlan->macAddress3().toString(),
237 wlan->macAddress1().toString(),
238 wlan->macAddress2().toString() );
239 } 195 }
240 else 196 else
241 { 197 {
242 qDebug( "IBSS(AdHoc) traffic: '%s' -> '%s' (Cell: '%s')'", 198 netView()->IBSStraffic( wlan->macAddress2(), wlan->macAddress1(), wlan->macAddress3() );
243 (const char*) wlan->macAddress2().toString(true),
244 (const char*) wlan->macAddress1().toString(true),
245 (const char*) wlan->macAddress3().toString(true) );
246 netView()->IBSStraffic( wlan->macAddress2().toString(),
247 wlan->macAddress1().toString(),
248 wlan->macAddress3().toString() );
249 } 199 }
250 200
251 OARPPacket* arp = (OARPPacket*) p->child( "ARP" ); 201 OARPPacket* arp = (OARPPacket*) p->child( "ARP" );
252 if ( arp ) 202 if ( arp )
253 { 203 {
254 qDebug( "Received ARP traffic (type '%s'): ", (const char*) arp->type() ); 204 qDebug( "Received ARP traffic (type '%s'): ", (const char*) arp->type() );
255 if ( arp->type() == "REQUEST" ) 205 if ( arp->type() == "REQUEST" )
256 { 206 {
257 netView()->identify( arp->senderMacAddress().toString(), arp->senderIPV4Address().toString() ); 207 netView()->identify( arp->senderMacAddress(), arp->senderIPV4Address().toString() );
258 } 208 }
259 else if ( arp->type() == "REPLY" ) 209 else if ( arp->type() == "REPLY" )
260 { 210 {
261 netView()->identify( arp->senderMacAddress().toString(), arp->senderIPV4Address().toString() ); 211 netView()->identify( arp->senderMacAddress(), arp->senderIPV4Address().toString() );
262 netView()->identify( arp->targetMacAddress().toString(), arp->targetIPV4Address().toString() ); 212 netView()->identify( arp->targetMacAddress(), arp->targetIPV4Address().toString() );
263 } 213 }
264 } 214 }
265 215
266 OIPPacket* ip = (OIPPacket*) p->child( "IP" ); 216 OIPPacket* ip = (OIPPacket*) p->child( "IP" );
@@ -436,9 +386,9 @@ void Wellenreiter::startClicked()
436 iface->setMonitorMode( true ); 386 iface->setMonitorMode( true );
437 if ( !iface->monitorMode() ) 387 if ( !iface->monitorMode() )
438 { 388 {
439 QMessageBox::warning( this, "Wellenreiter II", 389 QMessageBox::warning( this, "Wellenreiter II",
440 tr( "Can't set interface '%1' into monitor mode:\n" ).arg( iface->name() ) + strerror( errno ) ); 390 tr( "Can't set interface '%1'\ninto monitor mode:\n" ).arg( iface->name() ) + strerror( errno ) );
441 return; 391 return;
442 } 392 }
443 } 393 }
444 394
diff --git a/noncore/net/wellenreiter/gui/wellenreiter.h b/noncore/net/wellenreiter/gui/wellenreiter.h
index d776492..f23ca4d 100644
--- a/noncore/net/wellenreiter/gui/wellenreiter.h
+++ b/noncore/net/wellenreiter/gui/wellenreiter.h
@@ -29,9 +29,8 @@ class OPacket;
29class OWaveLanManagementPacket; 29class OWaveLanManagementPacket;
30class OWaveLanDataPacket; 30class OWaveLanDataPacket;
31class OPacketCapturer; 31class OPacketCapturer;
32class OWirelessNetworkInterface; 32class OWirelessNetworkInterface;
33class ManufacturerDB;
34class WellenreiterConfigWindow; 33class WellenreiterConfigWindow;
35class MLogWindow; 34class MLogWindow;
36class MHexWindow; 35class MHexWindow;
37 36
@@ -70,17 +69,16 @@ class Wellenreiter : public WellenreiterBase {
70 void handleNotification( OPacket* p ); 69 void handleNotification( OPacket* p );
71 void doAction( const QString& action, const QString& protocol, OPacket* p ); 70 void doAction( const QString& action, const QString& protocol, OPacket* p );
72 QObject* childIfToParse( OPacket* p, const QString& protocol ); 71 QObject* childIfToParse( OPacket* p, const QString& protocol );
73 bool checkDumpPacket( OPacket* p ); 72 bool checkDumpPacket( OPacket* p );
74 73
75 private: 74 private:
76 #ifdef QWS 75 #ifdef QWS
77 OSystem _system; // Opie Operating System identifier 76 OSystem _system; // Opie Operating System identifier
78 #endif 77 #endif
79 78
80 OWirelessNetworkInterface* iface; 79 OWirelessNetworkInterface* iface;
81 OPacketCapturer* pcap; 80 OPacketCapturer* pcap;
82 ManufacturerDB* manufacturerdb;
83 WellenreiterConfigWindow* configwindow; 81 WellenreiterConfigWindow* configwindow;
84 82
85 //void readConfig(); 83 //void readConfig();
86 //void writeConfig(); 84 //void writeConfig();
diff --git a/noncore/net/wellenreiter/gui/wellenreitertemplate.ui b/noncore/net/wellenreiter/gui/wellenreitertemplate.ui
deleted file mode 100644
index 63c14d1..0000000
--- a/noncore/net/wellenreiter/gui/wellenreitertemplate.ui
+++ b/dev/null
@@ -1,605 +0,0 @@
1<!DOCTYPE UI><UI>
2<class>WellenreiterTemplate</class>
3<widget>
4 <class>QWidget</class>
5 <property stdset="1">
6 <name>name</name>
7 <cstring>WellenreiterTemplate</cstring>
8 </property>
9 <property stdset="1">
10 <name>geometry</name>
11 <rect>
12 <x>0</x>
13 <y>0</y>
14 <width>188</width>
15 <height>294</height>
16 </rect>
17 </property>
18 <property stdset="1">
19 <name>caption</name>
20 <string>Wellenreiter</string>
21 </property>
22 <property>
23 <name>layoutMargin</name>
24 </property>
25 <property>
26 <name>layoutSpacing</name>
27 </property>
28 <vbox>
29 <property stdset="1">
30 <name>margin</name>
31 <number>0</number>
32 </property>
33 <property stdset="1">
34 <name>spacing</name>
35 <number>2</number>
36 </property>
37 <widget>
38 <class>QTabWidget</class>
39 <property stdset="1">
40 <name>name</name>
41 <cstring>TabWidget</cstring>
42 </property>
43 <property>
44 <name>layoutMargin</name>
45 </property>
46 <property>
47 <name>layoutSpacing</name>
48 </property>
49 <widget>
50 <class>QWidget</class>
51 <property stdset="1">
52 <name>name</name>
53 <cstring>ap</cstring>
54 </property>
55 <attribute>
56 <name>title</name>
57 <string>Networks</string>
58 </attribute>
59 <vbox>
60 <property stdset="1">
61 <name>margin</name>
62 <number>2</number>
63 </property>
64 <property stdset="1">
65 <name>spacing</name>
66 <number>2</number>
67 </property>
68 <widget>
69 <class>QListView</class>
70 <column>
71 <property>
72 <name>text</name>
73 <string>SSID</string>
74 </property>
75 <property>
76 <name>clickable</name>
77 <bool>true</bool>
78 </property>
79 <property>
80 <name>resizeable</name>
81 <bool>true</bool>
82 </property>
83 </column>
84 <column>
85 <property>
86 <name>text</name>
87 <string>Sig</string>
88 </property>
89 <property>
90 <name>clickable</name>
91 <bool>true</bool>
92 </property>
93 <property>
94 <name>resizeable</name>
95 <bool>true</bool>
96 </property>
97 </column>
98 <column>
99 <property>
100 <name>text</name>
101 <string>AP</string>
102 </property>
103 <property>
104 <name>clickable</name>
105 <bool>true</bool>
106 </property>
107 <property>
108 <name>resizeable</name>
109 <bool>true</bool>
110 </property>
111 </column>
112 <column>
113 <property>
114 <name>text</name>
115 <string>Chn</string>
116 </property>
117 <property>
118 <name>clickable</name>
119 <bool>true</bool>
120 </property>
121 <property>
122 <name>resizeable</name>
123 <bool>true</bool>
124 </property>
125 </column>
126 <column>
127 <property>
128 <name>text</name>
129 <string>W</string>
130 </property>
131 <property>
132 <name>clickable</name>
133 <bool>true</bool>
134 </property>
135 <property>
136 <name>resizeable</name>
137 <bool>true</bool>
138 </property>
139 </column>
140 <column>
141 <property>
142 <name>text</name>
143 <string>T</string>
144 </property>
145 <property>
146 <name>clickable</name>
147 <bool>true</bool>
148 </property>
149 <property>
150 <name>resizeable</name>
151 <bool>true</bool>
152 </property>
153 </column>
154 <property stdset="1">
155 <name>name</name>
156 <cstring>netview</cstring>
157 </property>
158 <property stdset="1">
159 <name>frameShape</name>
160 <enum>StyledPanel</enum>
161 </property>
162 <property stdset="1">
163 <name>frameShadow</name>
164 <enum>Sunken</enum>
165 </property>
166 <property stdset="1">
167 <name>rootIsDecorated</name>
168 <bool>true</bool>
169 </property>
170 </widget>
171 </vbox>
172 </widget>
173 <widget>
174 <class>QWidget</class>
175 <property stdset="1">
176 <name>name</name>
177 <cstring>Log</cstring>
178 </property>
179 <attribute>
180 <name>title</name>
181 <string>Log</string>
182 </attribute>
183 <vbox>
184 <property stdset="1">
185 <name>margin</name>
186 <number>2</number>
187 </property>
188 <property stdset="1">
189 <name>spacing</name>
190 <number>2</number>
191 </property>
192 <widget>
193 <class>QMultiLineEdit</class>
194 <property stdset="1">
195 <name>name</name>
196 <cstring>Log</cstring>
197 </property>
198 <property stdset="1">
199 <name>text</name>
200 <string>11/18 18:15 - log started
20111/19 20:13 - new net : "ELAN"
20211/19 20:15 - new station : "pegasus"</string>
203 </property>
204 </widget>
205 </vbox>
206 </widget>
207 <widget>
208 <class>QWidget</class>
209 <property stdset="1">
210 <name>name</name>
211 <cstring>tab</cstring>
212 </property>
213 <attribute>
214 <name>title</name>
215 <string>Hex</string>
216 </attribute>
217 <grid>
218 <property stdset="1">
219 <name>margin</name>
220 <number>2</number>
221 </property>
222 <property stdset="1">
223 <name>spacing</name>
224 <number>2</number>
225 </property>
226 <widget row="0" column="0" >
227 <class>QMultiLineEdit</class>
228 <property stdset="1">
229 <name>name</name>
230 <cstring>Log_2</cstring>
231 </property>
232 <property stdset="1">
233 <name>palette</name>
234 <palette>
235 <active>
236 <color>
237 <red>255</red>
238 <green>255</green>
239 <blue>255</blue>
240 </color>
241 <color>
242 <red>192</red>
243 <green>192</green>
244 <blue>192</blue>
245 </color>
246 <color>
247 <red>255</red>
248 <green>255</green>
249 <blue>255</blue>
250 </color>
251 <color>
252 <red>223</red>
253 <green>223</green>
254 <blue>223</blue>
255 </color>
256 <color>
257 <red>96</red>
258 <green>96</green>
259 <blue>96</blue>
260 </color>
261 <color>
262 <red>128</red>
263 <green>128</green>
264 <blue>128</blue>
265 </color>
266 <color>
267 <red>255</red>
268 <green>255</green>
269 <blue>255</blue>
270 </color>
271 <color>
272 <red>255</red>
273 <green>255</green>
274 <blue>255</blue>
275 </color>
276 <color>
277 <red>255</red>
278 <green>255</green>
279 <blue>255</blue>
280 </color>
281 <color>
282 <red>0</red>
283 <green>0</green>
284 <blue>0</blue>
285 </color>
286 <color>
287 <red>0</red>
288 <green>0</green>
289 <blue>0</blue>
290 </color>
291 <color>
292 <red>0</red>
293 <green>0</green>
294 <blue>0</blue>
295 </color>
296 <color>
297 <red>0</red>
298 <green>0</green>
299 <blue>128</blue>
300 </color>
301 <color>
302 <red>255</red>
303 <green>255</green>
304 <blue>255</blue>
305 </color>
306 </active>
307 <disabled>
308 <color>
309 <red>128</red>
310 <green>128</green>
311 <blue>128</blue>
312 </color>
313 <color>
314 <red>192</red>
315 <green>192</green>
316 <blue>192</blue>
317 </color>
318 <color>
319 <red>255</red>
320 <green>255</green>
321 <blue>255</blue>
322 </color>
323 <color>
324 <red>220</red>
325 <green>220</green>
326 <blue>220</blue>
327 </color>
328 <color>
329 <red>96</red>
330 <green>96</green>
331 <blue>96</blue>
332 </color>
333 <color>
334 <red>128</red>
335 <green>128</green>
336 <blue>128</blue>
337 </color>
338 <color>
339 <red>128</red>
340 <green>128</green>
341 <blue>128</blue>
342 </color>
343 <color>
344 <red>255</red>
345 <green>255</green>
346 <blue>255</blue>
347 </color>
348 <color>
349 <red>128</red>
350 <green>128</green>
351 <blue>128</blue>
352 </color>
353 <color>
354 <red>0</red>
355 <green>0</green>
356 <blue>0</blue>
357 </color>
358 <color>
359 <red>0</red>
360 <green>0</green>
361 <blue>0</blue>
362 </color>
363 <color>
364 <red>0</red>
365 <green>0</green>
366 <blue>0</blue>
367 </color>
368 <color>
369 <red>0</red>
370 <green>0</green>
371 <blue>128</blue>
372 </color>
373 <color>
374 <red>255</red>
375 <green>255</green>
376 <blue>255</blue>
377 </color>
378 </disabled>
379 <inactive>
380 <color>
381 <red>255</red>
382 <green>255</green>
383 <blue>255</blue>
384 </color>
385 <color>
386 <red>192</red>
387 <green>192</green>
388 <blue>192</blue>
389 </color>
390 <color>
391 <red>255</red>
392 <green>255</green>
393 <blue>255</blue>
394 </color>
395 <color>
396 <red>220</red>
397 <green>220</green>
398 <blue>220</blue>
399 </color>
400 <color>
401 <red>96</red>
402 <green>96</green>
403 <blue>96</blue>
404 </color>
405 <color>
406 <red>128</red>
407 <green>128</green>
408 <blue>128</blue>
409 </color>
410 <color>
411 <red>255</red>
412 <green>255</green>
413 <blue>255</blue>
414 </color>
415 <color>
416 <red>255</red>
417 <green>255</green>
418 <blue>255</blue>
419 </color>
420 <color>
421 <red>255</red>
422 <green>255</green>
423 <blue>255</blue>
424 </color>
425 <color>
426 <red>0</red>
427 <green>0</green>
428 <blue>0</blue>
429 </color>
430 <color>
431 <red>0</red>
432 <green>0</green>
433 <blue>0</blue>
434 </color>
435 <color>
436 <red>0</red>
437 <green>0</green>
438 <blue>0</blue>
439 </color>
440 <color>
441 <red>0</red>
442 <green>0</green>
443 <blue>128</blue>
444 </color>
445 <color>
446 <red>255</red>
447 <green>255</green>
448 <blue>255</blue>
449 </color>
450 </inactive>
451 </palette>
452 </property>
453 <property stdset="1">
454 <name>font</name>
455 <font>
456 <family>adobe-courier</family>
457 <pointsize>8</pointsize>
458 </font>
459 </property>
460 <property stdset="1">
461 <name>text</name>
462 <string>00 0a 20 00 a8 00 e2 00 ...ESD..
46300 0a 20 00 a8 00 e2 00 .*&amp;23...
46400 0a 20 00 a8 00 e2 00 ........
46500 0a 20 00 a8 00 e2 00 ........
46600 0a 20 00 a8 00 e2 00 ........
46700 0a 20 00 a8 00 e2 00 ...BRA22</string>
468 </property>
469 </widget>
470 </grid>
471 </widget>
472 <widget>
473 <class>QWidget</class>
474 <property stdset="1">
475 <name>name</name>
476 <cstring>about</cstring>
477 </property>
478 <attribute>
479 <name>title</name>
480 <string>About</string>
481 </attribute>
482 <grid>
483 <property stdset="1">
484 <name>margin</name>
485 <number>11</number>
486 </property>
487 <property stdset="1">
488 <name>spacing</name>
489 <number>6</number>
490 </property>
491 <widget row="0" column="0" >
492 <class>QLabel</class>
493 <property stdset="1">
494 <name>name</name>
495 <cstring>PixmapLabel1_3_2</cstring>
496 </property>
497 <property stdset="1">
498 <name>sizePolicy</name>
499 <sizepolicy>
500 <hsizetype>0</hsizetype>
501 <vsizetype>0</vsizetype>
502 </sizepolicy>
503 </property>
504 <property stdset="1">
505 <name>frameShape</name>
506 <enum>Panel</enum>
507 </property>
508 <property stdset="1">
509 <name>frameShadow</name>
510 <enum>Sunken</enum>
511 </property>
512 <property stdset="1">
513 <name>lineWidth</name>
514 <number>2</number>
515 </property>
516 <property stdset="1">
517 <name>margin</name>
518 <number>0</number>
519 </property>
520 <property stdset="1">
521 <name>midLineWidth</name>
522 <number>0</number>
523 </property>
524 <property stdset="1">
525 <name>pixmap</name>
526 <pixmap>image0</pixmap>
527 </property>
528 <property stdset="1">
529 <name>scaledContents</name>
530 <bool>true</bool>
531 </property>
532 <property stdset="1">
533 <name>alignment</name>
534 <set>AlignCenter</set>
535 </property>
536 <property>
537 <name>hAlign</name>
538 </property>
539 </widget>
540 <widget row="1" column="0" >
541 <class>QLabel</class>
542 <property stdset="1">
543 <name>name</name>
544 <cstring>TextLabel1_4_2</cstring>
545 </property>
546 <property stdset="1">
547 <name>font</name>
548 <font>
549 <family>adobe-helvetica</family>
550 <pointsize>10</pointsize>
551 </font>
552 </property>
553 <property stdset="1">
554 <name>text</name>
555 <string>&lt;p align=center&gt;
556&lt;hr&gt;
557Max Moser&lt;br&gt;
558Martin J. Muench&lt;br&gt;
559Michael Lauer&lt;br&gt;&lt;hr&gt;
560&lt;b&gt;www.remote-exploit.org&lt;/b&gt;
561&lt;/p&gt;</string>
562 </property>
563 <property stdset="1">
564 <name>alignment</name>
565 <set>AlignCenter</set>
566 </property>
567 <property>
568 <name>hAlign</name>
569 </property>
570 </widget>
571 </grid>
572 </widget>
573 </widget>
574 <widget>
575 <class>QPushButton</class>
576 <property stdset="1">
577 <name>name</name>
578 <cstring>button</cstring>
579 </property>
580 <property stdset="1">
581 <name>sizePolicy</name>
582 <sizepolicy>
583 <hsizetype>1</hsizetype>
584 <vsizetype>0</vsizetype>
585 </sizepolicy>
586 </property>
587 <property stdset="1">
588 <name>text</name>
589 <string>Start Scanning</string>
590 </property>
591 </widget>
592 </vbox>
593</widget>
594<images>
595 <image>
596 <name>image0</name>
597 <data format="XPM.GZ" length="46755">789ced9dd95323bbd2e0dfef5f71e2eaed8b097dd8d8c68e8979c080590d665f26e6414b95548b3198d54cccff3e2965a6306eba4ff7e985be117d2ab8cdcf52a9a454662a952a73fffbbffeba180dfffaaffffed7ddbdba2fcc5fc6abe95fff651fc6e3d9fffe3fffebfffeebdf8df6d25f8da5f65fbd66ebafe6bfffc7bffeedf6fe327f89a5f85fe483c4ddc843e2169617bb89b17c3f7297eff7e3c4b1dc57c474bf1b25c6fbb97e97b82636c8e5327303db6f056ea4fe56cfc4d49e2f89a9bebb460e57e0da11b7a8bdabc8a9ff4549ccfd9d2043fdd87e7542dca5f6abc4587e4f6c90cb6de4e612729d056ea6fe978698fa5f2ae47047ecdf26b1412e1c72b862b9206e21d70f917bdc7efd98189f7f8e0cf57bb1ff257117b928880db28ff3b1dc48bcc2bcdc88f77790979790c7f7c42de4ea2972ea4f6590a11c9fdf26ee527d9d3896570fc406d9477d6835b8bdb1435e362dec4f81dc5a42f603e21672759158458ef3d75249ff0f91b9bc98127791c70fc406b98cfd6d3793be4b642ef78ab91dedcdf791db4bc8b54a8cf56f88db585e5c4656c0d89f3be21eb2f3c496ca6f03779a69fe5bc86ddbc1e7af21771ac8f52e719bca1b91933c0a66b287f20e19eae3f37bc43de4fa82d822fb38bf2bcbcdd6ca72e45be22e72758edcb1c86e0779a5815c9f11b7896d649dfab79918ed4f2237cd8a8ef59790979790ab1e72c7a2fd9654bed2c3f2b2496ca9fe69e0ee72d2df7562f6877bc8cbad2e8eef9ab88b5c17c89d1ed6573d628b9caf2546fb94ccd83f7385bcd2c0faa64a1cebe737cce4dfcac4587ec64cfee33931da534edcc6faf68819eb973631daab6426fbbf481ccbf38cb847f66c13c7f2ba4b6c513e053dbfdb4079bb1b662cafc6c46daa8fe34ff33f36c8cba68bf7ef22833b8dacf0799ae55dfbc471bc6a849ce4bb9a18e55730a37cc580b84df36912637b8fcc547f2b31cab762267fbd9a38ca276b1393be889bc4b83e3c3063fb5a258ee57a9919dbcf5f12e37c0f99713e8a0366f48f65496c697d394e1cebeb0e33ce6f5627c6feaf33637bd96962f44f1ab9cbfab7ca4ced0d12a3ff5f6126ff3e4b1cdbb3a93efacb92fadb657fc9e56dd4077f49dc237d69115b627e9eedb5e2fcc4f5ab07cb01f2b820ee124f880d72364466fdc87613a37eac3253fc714a4cf39d9d27c6f9e4fb79beaf13c77273c94cf6cdf7937e0bc94cf79f25c6fe3498e9fe63e42ee9bb5a4b1cebcb4b66ac2fae12a37edc30e37c8a7662f40f4fcca46f67cc387ff93231d987de4e1cef37a7ccd8be7d65d43fc58cede7adc4511f7497199f677788c91eac67c6fbf53471bc3fbf67c6fb2b9718cb67ccb89ebab3c4b13ceb105bbcdfec24c672961fad9f35cf07eb23e95baf41eb6bc64cebab4b8cfa3e65a6fbe9f9bd36b28feb5fcff07a36467d31a0cf2696637dd35e421ea37ccc4a0fb93c2426fdca4e90595fec0b33ce67b69c18e5dd2066ffa899b1bedc4f1ceb8b0933e9d76162d4af2933ce57362226fb308f89b1bd3b666c4f6e24c6fe3d33a33e88f3c418ff79669acf7b62f28ff622313eef9819db535562d49f2d66b2870766d42741fdef91ff335d66aa3f66c6fa663931facb544ef1d63631c757e3c4517fec0a33aebfe53533ce7f4df3d3eb51f99499f483fb4bfeb56e33637911fd876aa5f5fc0979a5a7505f1bc416b99a21771bc8fe22716ccfec12d3fcea3e33ad2f1531ad672a63a678c626c6f5e708b947fecc6d26467fb3cd8cf3291f134779cb1e33f91b9918f71f87c4a4bfa2c34ceb679638d65757ccd89ef089b1bd1633ceb716c4a49f6a3f31f66f8519f5256f33e3fceb9298fc937960c6f6f38a19f547dd27c6fb7366d40fbb9c389617fc7cf26f19cd9722ff95f598e9fee3c418af6f30937f1b25467f75cb8cfa625789391eb867267d5e66267d2b13c7f20ae599fc65759638faaff13532eb63f5424cf7176bc8497f26c434dfa64e8cfe65444cfe466c30e37cca49629c8f548ef3633262f22fee8419efcff612a3be3c30a33e640789f1f9383f46917f912789519fbacca80f994c8cf395eec7f9b2f43c45faaa3433de6f979829fedf4f1cdbcb537d6c2f3f4c8cf3af9851fee52ab122fdbb60c6fb4d2731eac38019f5a1bc4f8cf39b1367e4af9e13e37cc7f55c27ffe60be46e4f63fd2b628b9cdd212bf217663f31c6b38619e5af4f12a3fc2b6692df5e621cef2331f90b3b64a6f9be4f8ced9d32937ddf24c6f9ac8915ad37cdc4d87ec68cf7cba3c4f17eb9cd8cf36b0e13a3ffe0fe64585f94cc64ff3933cddf2b47f9e73c3e9e9f3a31ea47aa8ff2b7f43cdd247f344d1cebdb2d666ccf6d248ee52e67c6f6f4317107cb6bbebf83e57e8758691b19e56753be652731eeff1ac81d8bf56b94a7ed3590c796b88d6c5ac83c3f4e25467b5f27ce900b2ecf70be4c2a47f9ab9a19e72b3f4a8cfba71764dd247dd9498cf3ed98f17eb9ca4cfee08099ec8dfaaf3b34ff3d667c9ebc60a6f93f4f8cf3bfc48cede951629caf8c99e6a39b38caaf5a26267fa03c33b6a74e13e3f3f699b13dd74f1cdbcb3689339a9f21b369c7fb49fea649fa40e3311d2cafa3fd4338cef92845cceb4f8dbcd2c6fa4593b8873c16c83de2fa94d852b946560de46a880cf247ffdb4e8cf1e10633e5bb66c464df769319cb85498cf3b9c48cf3a764e2284fb14e4cf66cee9849de5c9fec57b6900dd9abb4cc385f4624467bbe614679e723661c7ff6484cfae0ae98b1dc8c12a3beac122be402c76753beff2631daf32d31d97b8dfdb39c9f32286fcbf9a8aacb8cfba571496cf179ce21771bc87e9db86d511fb07fe02f287f799218f38ff7c494bf288f88297e2e511faca2f6c7341ed5a6f1ef206bf207b96326ff89f303fa4df6ba9518edeb9819e72bdb498cebed1531d9bb1f2546fdb866c6fbc57e62d4873133f9e7d41eceaf3c23e6f5bdc94cebf34b62b4df27661c7f7dc88cf2360362b26f3d4b8cfe608399e627f6cf26fb2eb689793dd84b8cfa3145e6fca63e45e67ca63a498ce7139699f2df1d66da8fb78939bf39498cfa77cd4cf9249318cfef3431e5abca7366d41f4fe3e17c619d23777b387e5d21b37eea2131f547ef27c6f1ef31d379db1a33e58f489e3dcaafb9d3c498df9d30d379de5a6294578f99f2b52fcce80f75414cf69a1d3153bee120318ef78e19e551f7136339cd27ef77ea3566d47747ed2bd2af728b98f4a7a2f67513593591d93e0a1a8f21ff9a0f98697f74963896eb4d665a1f7789299e521789d17e5339d9c70933ad47cb89d17f3c3293bd1c235b8a9f549918fddb1d33b6a79e13c7726d99b1bd7a337116eb93be5bf2d7629719eb7b9338d62fbbcc791ee7778958617981f69025ff3e21267bcdb13f593a5fb820267dce4f12a33e1f31933e3e1093feeacbc4981f3e67a6f38646626c6f8999ce73f8f97cfe71c74cf6fc9818db97cc749e2098517ff31d64ceefa9c3c4b8bfed3293fd6f25c6f3a46566ca0717c4940fd11bcc585e578931dfd161c6fd925b4d8cfbdf6762da2f173231ee9773668c8fcb3133eac378466c71be1d8da7d74036dbc4349fd624c6f5b4c94cfa3720e6f3c0a5c4e83f0a663affdb488cf3714b4cfe5ecc12e37c3a669acfa3c4d83e8d57d17a201c333def25313e2f9553beff9499f29b2366f487658f19d77f4bfaa2c83f0b6e9ffcb35589515fb69871fed53233fac3ec8299e245ae4ff1a42d99293e7864467f9593bdf27ea59a3263fd729018f76bb7cc787f719a18e3838c19fd5549fac5fb97bac78cf3efc93f68f22fc53db2a57824bf4c8cf18866a6f82131ea677e9038b6a749dfacc2faf23931fabb544eebc351e2787ff6c09c7562799b98fcb53c64267f3d4b8ce3a3fe644dbcbf8efdcd3a1cef163bc4fc7e4d0399fd8fb9414efe649818e3933b62d21f354e8cfa72cb8cfa692689d1df3c13933fd42b89f1fe3d663a5fd861a6f7493433fa0b7540cce7a1dc1ee5f7c56662ccbf3599d11fe9b5c4b8ff9e31533e762f31e653e87eceef972bcc647fa7c494af293c33ce475513f790f33e31bf7fc0ed592c2fa85cf179a54f8ce7811d663a2f7e2056f4fec133339de71c2746ff3e61a67c954d8cf6ec9829ffb79118cb7789339aaf2c716c5f6e31537e89db237bcf7c62dc9f507f7493ce0f6f99c9fe5f12a37fb861a6fdc13531d973bd9e18f7075c4efb879ccbc95e8b2133cdd72371863ca6e71bb22f43f3c5f6ae487fd85ec52533ad675366bc5f0f1247fbcd0d7246f1947c60c6fbe53031fa9b2766d2a7edc4b1dc92fc32f2576aca8cf55d2ac7fa15f527a3f1dbcbc4d8bf0be61ccbd17eb274de933153fcd026e6f3b82b668a1770bc19e7e3ed2333d9ef38319e273698299f764f4cfea5bc64a6f39be7c4983fbf65a6f7155e98b1bdaa9d18cf7f87cc946fe0fb397ed965a6fa7bcc644febcc747e326346fd2b3266da4f38627e1f8be541e735639687c5f9a871bed37aefa6cca81ff50133cea7df481ccbc715719be6ff9838a3f880dba77c6485fe08d653f2b78299ce4f0c33e59b0e12633e6285b843e779c7cc54ff2931e6175f98c95fd8c4b8dfc999e93cf28899f20b3d628e3fee9829dfbc4f4cf144a699299ee0f1913d576bccb4fea3ffcd0cd96bbdc14cf69e31d37c9d1093bd8da93f86ecab247d4df6bfc68cf369bbc464cf559118e3db6b666aef8919ed55d07c66146f889a19f5432c2746fff2c28cf76764bf19f92f2912c7fab2c18cf5fd73e2b87fcbe9febc49edcd12c7f222f6377f5dcf9bc8ec0fec9498ecdb9e27c67cfa3333bdcfb947ccef57cd12a33f7962a6f35cc14ceb7b454cf143e599e97dd2a7c4787e9698cee7ae1263ff5699299fbec28cfe405c20a7f3a42566ca773412e3f9e90b33bdaf3761c6f929e9f91cbf3bc18cfa93ad2546ff7ece4cfe623f31eaef2533ce5f7184ac15bdffd160a6f72b1433e51bd712e379e03a31ef0746ccb4bf48e5944fbe63267bee22733e337f64a6fce53e33f9db7566cacf9e3193ff3d498cf220fde37ca61933e3fda660267f40fac1f9c7ea3631da6f8798ecc75d2646f9ee30a37c15cd47b2b76662b4df6b66acef9e12477bb27de49ce203dd4a8cf6bacb4cfe619a18ed91e493933f91b7cc54bf9b38d61734dfb9422eb1fd3c9d976c24c6fdc88498dfe7ad1363f916317d3fa140f9e56caf8520a678bf6c23f3f9ad5b4a8cf6beca4ceff3b488f9bc758f99cecf53399d976866dadf1d24c6f58199cefbf29298cff364623c5ff5cca4ffa8afb96ed27ea366c6fbc53333ada7341e3e0f329699d6d36162f41787ccb47fbe61a6f8f99819e7af2279f0f951d14d8cebf30e33da9fbc67a6f3be83c4b8be96ccf8bc318f87f4a5ba242679881366f21f9a99ecfb9699d66b961feb3f8d97fd83ae13e3f956c14cf1c35d62cccfa6fad4bf6d628a47dc7962ccd7ee3153ff4c62f45fdc1ec9db0d98c91f5f32d3f31ac4e42fdd3a33e57f8bc478fea298297ffb9218fd559f99ce3b7bcce44f569969bd267d3019eab37d4a8cf63466a6e7737b341f629418e39936333e5f5489d13f5b66caff6e32933fdc481cfb67d03fe596ec430e98697f7acd4cfd2b99293e5c4a8cfd2b98c9be478931bfbdc34cfe7d3331e66f0e9969fd9c25c6f5e49419c723537f48dedc1ed9739931537f0f13c7fe28cb4cfb4f9118c773ce4ce73b5b89315e4ccfa3f5e12e31e6571bccd4df5962b42f9a6f4bfe415f24c6f75d587efc7ec50933c9374f8cfd5d66a6fdea656294af63a6fd37f79fe253719418d7af0762ca3fd893c428df0366925f2b71ec8fe5fe51bc2fb3c4b81e3e3153beee2c31e6ab59dea4bf22b547e719549fe3fd6a9799c6ff9018e76b8599e2f5fbc468bf6bccf43c9b18e541fac3fb055b30537cb19e18c777c34cf36f12a3fdd1fa95f60f6789b1bf7d66baff95d1bf91fd717c231e12e3fddbcc74ff66621c0fcd17c733d51633d55789313e21ffccf18b9c268ee592fc45cefdf58963f921c93bfc87fce7fadaeb8fbcbeedfa23af6fbbfec8ebdbae3ff2fab6eb8fbcbeedfa23af6fbb7e777949f1d13d787bfdeef20289a98feec1fcf5bbcb4bea8feec1dbebb7979792e6a3fb307ffdf6f2b21fdd83b7d76f2faf4ce61fdd87f9ebb7979793fea3fb307ffdf6f22a64f9d17d98bf7e7b79557fe289afbfa497b51c7f742fe6afdf495ef2fa9dcf26f2e693cf6e3fae8fbf93bc4012d305f6f24e2ed6f950ffff3bc94b3ebcf3d9a37cfae4b3e78febe3ef242f90c46c81a7f245ae2e7cd6ff480dfb48792d8e5baec9f54fea6cc8c1c227d38fdc537eac7ec9cd05760bace496dc5ef86ce7e3fafbf1fa35bf26ca5db927870b75f6e5c1db7be4481e7e548f3f5cbf16fdd5d1db15526eca6379b250e77481fbbfb2c71fedefe5d91b3a97170be597f26adecfc907b9241b73dc5c8c417eeef5c1fad597cb6fa4d192ed85f28e5c79f38992dd37ec1775f4e75ebf5a5e9fac896f3c3cac7dbdb7e5420a21d47c7da1e7db10bf389bf8ebf5eb6dbe54aecf5ba0b02213f97c5de1c41b098b42cce52b645f548b6beccfbd3ec21e453d37622dc6626e8d1493b7e31737e256cc79287127e64b1f16a38d9f7d7d807ef51724f2f8eab1e5543c89b9dd8ec8c54c3ccedd6bc48b988bf7455facbd69fba7e77e3e44bfde44f1e08f8ee668438837fe6920365fd74390e7d66ba9d8163b6277aeeedefb398eff7479c1a8e7a252b12f0e5e354e8cc45c342a8e40bf8ee7f8449c8a740222cec4f99b76fdcfcfc5fe2a79cde7acc4b5b81097737cf56a476249344473ae6c003ab49ca825e6e20dd1112b622eba100b6beb7faebc823ce6ad4c4995cef9e55429a55f6b2af3ba822a0bfa35a76f2a5339cb5658e5d47c9b857c9a8f5d7f4e16e357e9975ab01455cdfd5eabb122bf230fd544a58c2a58ee40dd2a9282a8d59d7abdeb41cdaf14d7ea49cdad14ea2745b1bfce7fbd8d4cd58b4a5185f46a55a55da05a53eb2c07b5a106e26aee2ea35e3d5d476dcd69e2f6fc3e401cfdac1cd92f94d754cd6562d4aeda4b7ab3ac866a9f6aedaa835709c94d3552878ad64f75ac4e14edb6c525c86eae7571a7d24e549dcbf3579ff79f22af4f763e53d0a9f958fe5c259faff6619f48baa2ae9493b4ee897db5a45234a104f836f25e608da3d79d806aaae5396aa99f9681fd99faa5da0bdc81583d59a1ba7cd523b5a2ba7c0e245aaac7b213676aa425c7585a68a56965101d6d344516f256677a7e17f513d7c99f6b8fa258909816a35466b5d3a407e248179a5604e974c51e5fd77aacaf5153a5d2137d93eebdd5c9d78b0788625f23923b7db7d88f1fb7c7fcd9fe4b2ff28d4a3b3efda0c6ec67c4b17ed4f12448aeab9e7ec6b82a581d7c4e6b5d88f5f54bfc7c05eaacb2c5ebbe5ec3cfe1f775bda11732fefa07eec87fb6bca47a9b0fd55b7afbb50cfc119d96e91db648598a19d711460df42eea8eded343ce558035ee6bca53c3e7fb9ab4561fea237dfcb6078b33f69bcbcbeb1d7df2ca6219e2758a1dc4548c25ad8b7a539f6a8a61f5993e579df8db05e8d7a58e7e4e2f814e35824ee9267c467946ddd26ddda16735f58aeebe7d3eac243f345ffde3e5b5f83ea0eceb9e91af6c847286bc8dd17accbb6f7d263b616f28378d5123d43563f51874308ed8647a68a2578775b26b1c7deae1f70265674a5389376f8b99da8c7f6ccee267e89759c81188a699cce74165cfdc70eca51ae8c32054b885582bc6505a9829e62c4032a05fe62ec6657b1041c415d1dceb534367e1e6516c19f47b1eeaaea9b9679bcc3c9bb9385fb77e4f79c5739e371190be322f7a2f954ecdaaa4b8c2f45517338062a88732e6bac40874662dc4f8661de22f83392ebd6b36cc0073166a64a20f375b66db50146c76cd9e99cb7b987d736046737dda94ebdfbf4efe2cffa5f6d5c3bccccca13932e48945572e81c5453b31276a2237508a62a0cf436e42f4401e71953067aa0bfa05d1ab39361726c6b7ca9a2bb314d64c79ab0e40b2319e354dd0b9b998deb4c2df479ee31571a17ec07b173fcfdf9baee9cde70bacb442d0ce4684ef0253e4291fad09719adcb4162c1264a2fa62605e82c7b719f8b741d833da5c75ad0bf6a83235b071266ca146b60c1ecbf4e0b3b94cbeadf5d0cebd3766afedc47ef25ed447cacbbef34e969edae97cae5eb4ed1d9f5fdb7b186bf44112bcbb7d0c397cfda04f4376506a7d09b156a8f5043e6b104e38cc3ed47ac6b5117e9b05ddb52ffad4aec2bf7dbba67a769df3fc76033e9f8bc1eca69676eb478cf247ead7ab7f7abdcca9dd1629db0cbbe747f1c4ebbbdd01ddd90feba7dd05bdeac74875a45ca82fa41e5b68cf0e41f7067a27e6c8ba765f4e21aa18a9257b1072ad7a0851c534445d5036e2bcbe3d14337bf4ba4a83aeeddbe34ffb26fed19bea3fd21ee5913d91cd379f787b2a1af68c496d821e9c631db106231f8775521ec1782fc23a0a71d7486fd94bf87c64af6403f6922373619760d40d75124e6aad36175a81dc5a7a05ea34834e81060e2cf92edbb26d53d90e7b02f0fa53bbf2b69fb66b7bfff42dcf1febbf329909b39019cc941e1bde19ab4cab5e66e29b269b99553d8cc4f4ae1e8711c80dd039582333f05b212f61870a64016be84696ab51e64c4fccc420f3b20f71d7282b32785656a94156e3da928dc3da995db3766513bd9f2df82dd5942fd93f7ea3f347fbfb6caa0eb337fb5de9455b9f665cfe2076544fc608337b84f570203745377b52ddec399b890af4eb5c5f05bdd297d94bb61af40b66c181555eaa538834c09f65fd1077c16fedb05f042d1d656be10c5c5da83bf87d3ddb20c964a05b83b7918dc9b241f61d51c58f5f1fc56ab625244413afb9620f3a36cc684fa836b4836822da8fecc23a063be56c472d65b04f3483a01fb22db7416776f556b607ff0eb3fdec00f691d766331b05fd1256acab8132d9a13c8bfab6157c9e9c9917f8fd288bbe4a4e33f06fd9e96b740fbd38cbceb38becf2dbc6f3e3e4a5202ecaae3efd3c5bca1a6075cdd7f700831f3353de4567d3e0713003adaf51f7c012e3fe315bb66db991b5b2b6b9902b02a209d0af4eb60292e8663dd0b9a196b9d46d31c845ae741bb46b92c37372037b869132e8c7c443769edb3c9bcb57cfecb9eae539ebdefcf52def5b7f9f7e4923d773f74e2eb59ffbbc10b33cf932d431d0bb28b3bcd263bd1bd7b61db0ab99ac33d039e1f25adec57fa31fcaafed733ec96ff2db7c9a4f7437bf53460ff3fb0c620b35c81ff247b0d2dbfc29f4237f861958cae3eec7e6f0fb207f1139f72b5fcdfbf95abe2edef92e92ba90d3af7f27ea7bed518215e51bd96abe90738218dee88e3e556bb6107b2831fb0cf1d520df0ca3c8b7402e52fa7cdb4c60f47bea340f92bbb54bead11ee5bbf938dfcb877233df075940f4908fc00f36459e1f021fe98dac069f75056be1aa69c80788bf825f5b873dc25e7e0c923e81364e318706bbaf477d9a9fe5e7f9c2bb65f9a57d12b076e4efd8c8cf92173d79496dc9b0037a930b90d3fc5e0fa1f70dd5c24f3205fbc151de940a628b06e800584f761b7c90ee59a9f7f316ac9aa5eccfe73842d41ece7bc2d935e62f300712b4226fe71d59e61059e85bb105dabe9977c3efea318f7b0bf0883db0e0b193e2cd9b8b20d707ddcf8e4216fbdb4e927e94bfcf1e9cd0cbe6c62d644ff2b6d3e60ad6adb82b0e7ecc82cf710674c52a88ec9d05bd81b50eee6db8ecf53e973be7bc2b5ce92a57bb315dd76e029f145072238e1cf91db0ee4e5eb8a9bb73b06b700f66d53d3ab0d27ce09e21466bbb9934f352712ff079cfadba7f9019fb71eb23ccb707e9ac29234edcdc1b256e0362ef81d9b63af8aee0c7606d1be5cf46b8e0f5076ed36db96df03571fe65dfedb85d90cb1e5cc3f8bf7b6e1f7e0ee067449f1cd0cfc41dbaa3b0f386bb37417ec7b03bbf058b8f790877a296c4c09dbab35759d96b770e7b87ca5db8cb5f13df87f75fbe94477257b6692af05b997ae0bd633ed21b71451cb925097146a6cc058ca461975cd35cb9653ee7712dd726097deeeab815d7753d0f4a09d2c3cfc65ec952ee82346eccb37af4da1be385847575e8ad279dcdae6ce136cd85eafadcbb10f3fd33adf876fd929be041afd5f6e7de1b85726376f43ef4cceb75f40f2287b8de805f19796fac34e25ccc20ae2af2b669c4fcc2932f7c1946ef2b5f83deecf9f13bd2029df2d7bc1f95a59ff81bb0d658e66f7df457f0f499bf433d33079efaa4d7fd43d0f1fcc63f66efec25dff4ff8bf9d87f628f2196ce5e2016bff24f76037ce73beff8e963f36caab06ad9f3b076fa673fd3cb2ef4fac2dcfb17bfaa0dee5464dff7c9ce2abf968ffcfadfe858e5e6d633b1ec37fcc047a9f94dd70d7a66ee3cacbe7edb83cff4bb7e2f6836fc4cfcd0effb83f7c7146cc68fd48a8235fb4bf1d83ff75f611efca13ff2c7e6c56dfa93c57da3347e96d5ee14acf0147c574b805e05dfe54f436ceecffc79d03b7f41fab1e963dc2d72901dfbad037fe5977cc337fdb26f91cf025fe6db8bbe47acfa0eb5b3e2bba1157d97ef2b6b1b217f16d65fdf032b9c7e1227fa90f5f727a263c3ff19471162ff2faf97dfebeff50b58675e487b047e5e16a250626f3ee7a5f342873d20fcdc14a6b01ad67b7b546421675fe4c1f2dc5ee10acfe79045c17a54944555d4c5187eae8b497153dc92c4c2f5ce9864bf98e22a51d0fe15221488f7dc437ef3762d0c1229ee8b87e2b178cacecd6af15ccc20d6f3f3eff5ff2c79510f36a3d45ef2b30276c845bf58d34b8ede8190b3623d7f09fbc0a05bc5865d86da5e1c816486d106e7f673c580d7c5621364b415a535819fedf8ef8edb2f76b1c6fba764ae5fa09fab8a98972cf6b3a3e2203fe578ae18158776581c15c7b07fe8162720a9538880a75f9fd7ff1a7915675f77b6622f215ed4058415107175735b9cdba97b914a75446e960d44aab62a20c6f607ae1765352c2ed5d1ebfd72d7951c41145720a12590d152fa77027ad6483af6997724a4289a10af05fd9c86bd62b12ca76a56b48a76d1811df825443221eb3dcacfdc6ab102d1cbdfec1dc54216f4ebf44b1ca96db12eb3a25b1c163dd08e10177f66cf05d1b92a2e4a09de1d7c17ec1907deab4cdee5b3522818819f962acaca2dea08f41e63aefd52934ed524b10959e6a4341c597cdecfc8a91fc4b5b47418252badc23e43df6643775a5aff0892329ffbbb29c12f9759d1325baaaf8ac5f5f26bed31c42baa23fb655ebad2974559c27e2f2babb22e1e6c4bece926e62b7814fe192cb4037ee105fc1aac89f95a61bd29c71037f13a77ed163279e53597959320adf206a555decee9d82dd5a9bfdcdf725ab8b83ad4e55d09fba8fcbe7cb0955b2d1f610c73dfd80d6b61f90cbbb366f1605ae54cdca9c34c952fe5aa8cefff8885e8e21fc45fd0829e89bcec67d7d97ab9a67a61eea26fea9bc772dd8475a90551461ef77da6dc2807f953091eaedc022bd99d8bcff7caedf98c813ba235ae55ee80947659a7a2e450c726254b7b94ff8dc4e079437ade751879b92ffb71ff0976511e80fe58d32b4776bb3c0c7121ec5dd7caa3f2b83c81fdebf4f37fb3e77bfc7dd8d7671b307787e56979569ee72103d53553d50dd17c7921a47b76b6bcb4cfe555888bcaa577a2a951d9e0bff1553693f78afaf5896e859f8aeffcfbfd0cec1762d45b2ea33f2f5b65db6dea95e23c9c3fc11e249c735665273b2d57f24301fa8f76f4a5eb07ad8f61cebad2e4c3bc037eaa079a7f1a742eec0f43fc033117ecabc1afdc78f6e807afff56127525e81fcaab12694d4489d1bfe56ea558cefa8b6ff4cacd4ae36ea9320eb45cec99476b429f4097c6e6caf72a5b6576591c85b709befe1d8b1f9d8f0ef3e38dec57b95daf9c5bb6957a0c3902d5ab7c05deb32afde01d2d1b97e0ffcafbe4bf6ec183cdaf8df8efb89854ac5f5ffc1e475597cbb1565985539487708e19aeeada1eb95976534d7c57fabf5b1b7f85bc5e2fdc374a55dd54b76ebb9ae62fba17564469aabbea3eee0f31e74032aa1eaa478c04dcb07a7aab5bb456d6c54df54cf5773ffb5c53cd48b35eaad5b0d655fdfca6ec55ae5a73218ff1cd39af9f2daf785ac63fd7e1bd2c5821603764b7c09336e3f75638169fb74c1861da09ed55ebe0db6fc90a6f836e551bc5d82fa7f2cf9c1fba3eec22e39ec175abf0764a5d6dfab03f0a6bdd0ff826eea7f28af9cc3c9c1acb6936aeb6f28178a8b68bc36aa7daadf6ca836a588caafd32d3eba6ac0eb2b11daac2eceb3d77a2eb72548db249b95e1d164755c847c1dc82dfd8ce46d5b1d5f933c4d5ced01b72d5b83a71af39aef92bec115bd529ad91c98f5567a946f5fe68aaf3e8e187d505ec567d8c1b0b732f9eb2893d2c477a2fbb73b07ec3a80e4ca9d7f5615e2a5bb4615c9730beab6aa96a142dbf2bf6ecb5f4c588f2b89b5f9257fc8ed783f45553de54cb6ad32ee946d5aada66a7ea542b7ebbb4a5cdcfaa6ed5ab65be560b5863e08235b1a7ba1059c4354775f529fa8b90e70a79a89097c09facad46721f63dd6cb356ef482b5dd553ad6b83eb646deb0c2519aefa9d730bbf819a55bb7229c455d5563609f13c3c7388fd004f8ffd8afdad7d5dc47ef7c0d0058ca5cc618df7c31a5c64d5ce2b58d357e58dda7dfb7dcdcfdb63b4a629ae1d9c338fb63f93533d839d4f0debe1be38aa6b3fcb0fab5b7b9c77ea717d5d4fea9b7c56dfda417691add7d33cabef6ce57b3e776b79914f94a9ef4166456cbb5f3dfa9577758c2e7f553fd48f313b81f92fd09feae5132bcc3dc5baf553fd7c785fcfec36ee2ddca959756b3eaf5fead5ba9fd5f59a1dc09e7156afdb71bd618f6da71ec8198cc3c27854b4da30c63e8dfb130bfe11fe8bbd67581bc37b3621d7906f877348e9eb4df0f8abb29f819fadb74ca31ef8fd72a3de2e73be17d6a91d572dc8e9e0f3122ceede7cd76db7de49be7058ef8677f5d571bd6796eb61bd5f1fd4a3fc541f0b6b60875e1f86f328ec1bbf4ffdad9efffbe4e578d45339d3df900f5fec6576591f55f79f97d19c9fabeae3fa04f6a05bd5b9ef80577fcdc38eeb9487785f37621e65c679e1f0dbb7bf0bfc3df27239f41277b4e039fc77fd1d20790bf37f569f7f51665f92e4b81afffddf0296106978fa06737d01d6fbcdef067c8fbcc2d3eb981bce218af2837fdaceeba56d31f4fdb853febb6b84bebd5eaa43edaa187e4d0e4bcfea8627bd733d888bbf39c2589497eb1777f928f805e74b6035f56bafadd63b357ceefb757c83ab86d8b18e7163ccc41c4a8a21ebe5f2aeb82b2e5d2b96410b75abb8ab5b61dd9abfea7631a83b9f6689cd53bde27a7ef0c6dadeae02a52b8bbb72095a0dd22a65197c9abcadbbced7ad7af775bf5c3f2ff4455571b5abc6615660afe4712f2477eba6f330b61b3c4f71797107b4e61724ba28afb087ab7ba83b611d92b0e28f258e682ca29770eebac6a79749bfea57fd0af306e3aca05623f890b18ada30893b47fe66811f6b8ae5e11a9bf7de9991069e9d43cc7f33b6e55df5e27cf552de8d2d7056420c37ce5dccb58edd9c74823dd7f0b46b94427d169f5df912faa268c71523e9b18f25b5ab82564805e20bb330812b8ead3e8da318b9e1db595e945735c6d839e84ec8839ba790a98cfd0fd14d592f832e5da1c77eab5fc534e897bb82e78afad25dc93ee64ee177280336d503d48fef288f69d70dfba29b72299c637fe99dacd06ef04df187d6c67229ca7f04ab65da2babeb020400ebe51d3ca713ac2f6425c755e80b7ec7addec15145bb813e8f6b7c77df75631f731c5bfc046ad667e3a0df859cdb7b7d628f4760d55ba85fe36bd2af49d0932049589d9ea0dda2182ce857f25f7e12a4e0606b0c3f37689d8ece274037f6c6f1fc1475abd2f5164a3e1f8dc5d7ae5572b3eee15a8a91e9fce5370bd036e87b599f408f1f438fe7fb12f48b4f43e6fd97bf81d6cea1de21c66f684be30c7464b778f3f6dfe7f42bae7d7e5ebf8a909d9a78e105f4a11764fe897ec1dcbbf06407dec5c1987cd2af3b9eb3d0c31af7cce372eeb9f5276764ef5f94370d57395ec82f88e5f054d4c11003c619beaecfe18e8afab2f32aaf12b4107d19ec7da6f1440fc606bdeeb225071d1d4fdf463f8bf20afa519f7ee2bfc228db6e549918c178f418eff9aff15d38830efe4824ef1fac86f5ab7ac4b643ff16f4e66ff44b6e16c3d7d336dfc9479fd609faf59ab10dd2a94ca8c731d7bc7e0579a1af229febf16f3d613f827e558f9f3e61515ef908fcc2182c2ef46ce20ec7f7ac5f305fe07f8a62fce00adcbf85a7937e9920afa0736a1af3749d60b5759c29f01fd4c718f184397b8cbee7fa5b225c580b5fa38cca39f34eb6505dfbcdea0dbbe0c5578aa91f94cd45fdf297718445dcfbf441af86950ebdc6bff911f46b716d7c4f5e50f3b83285f36dd8d795f15f31b6fc0d577fe36f8376b39440aad1a76b5b2ff1095776397e0a77baaa7a09be78fcec4af4331eac197b031e7e84ebf0df5fd09e9ddb2f8d6044b3cfe5437d1f82d6b959183f8ec91eb12fd96625d9e7095bbd8005b6d15f81ce17a12658257a9f617dfede5f4b792f5e0ddf73d52023fe5173725647e133da8ddf067dc2cfc37cb39d073d13bb50ef89ef79fd9c63f0a0bfb5fbb2cf12bbe31968ebdc6e1c7ce717bed5124ff717ffc2df425fe6cbb16cfe79d233cff7f5efe4f52b2e918735ae76e397f774a5dc774760fd63379f1f9bf8e2fbde6dfe11d7c7fd3d3e59a29581cef4fc86cb455e3f17215751d49fec877c09bbd3d9cffa9b12ff19f28a3aa6bf629f58d58dfa3790d4c7cb2b5c65f30b3989ba7aa8cf84fd1df48aaf8f96578c888ffc00a4761ddf4f1d81d79a407cfee476ea9d5ffbb72fbfe6fa7879e1a567e2a85ef61be3db7ac777a5523fe02ce7675cbf8bbcfe53ae3ff2fab6eb8fbcbeedfa23af6fbbfec8ebdbae3ff2fab6eb8fbcbeedfaf7fffb9ffffaff245f9a02</data>
598 </image>
599</images>
600<tabstops>
601 <tabstop>button</tabstop>
602 <tabstop>netview</tabstop>
603 <tabstop>TabWidget</tabstop>
604</tabstops>
605</UI>