summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/settings/citytime/.cvsignore2
-rw-r--r--core/settings/citytime/TODO2
-rw-r--r--core/settings/citytime/citytime.cpp18
-rw-r--r--core/settings/citytime/citytime.h6
-rw-r--r--core/settings/citytime/citytime.pro10
-rw-r--r--core/settings/citytime/citytimebase.cpp414
-rw-r--r--core/settings/citytime/citytimebase.h60
-rw-r--r--core/settings/citytime/citytimebase.ui1199
-rw-r--r--core/settings/citytime/light.pngbin223 -> 0 bytes
-rw-r--r--core/settings/citytime/mag.pngbin193 -> 0 bytes
-rw-r--r--core/settings/citytime/opie-citytime.control6
-rw-r--r--core/settings/citytime/zonemap.cpp67
-rw-r--r--core/settings/citytime/zonemap.h18
13 files changed, 579 insertions, 1223 deletions
diff --git a/core/settings/citytime/.cvsignore b/core/settings/citytime/.cvsignore
index f4f5e13..2c33e73 100644
--- a/core/settings/citytime/.cvsignore
+++ b/core/settings/citytime/.cvsignore
@@ -1,5 +1,3 @@
1moc_* 1moc_*
2*.moc 2*.moc
3Makefile* 3Makefile*
4citytimebase.cpp
5citytimebase.h
diff --git a/core/settings/citytime/TODO b/core/settings/citytime/TODO
new file mode 100644
index 0000000..0511b63
--- a/dev/null
+++ b/core/settings/citytime/TODO
@@ -0,0 +1,2 @@
1- when button is pressed the set city should be shown.
2- better date/ time format \ No newline at end of file
diff --git a/core/settings/citytime/citytime.cpp b/core/settings/citytime/citytime.cpp
index b2f9f14..f33b19f 100644
--- a/core/settings/citytime/citytime.cpp
+++ b/core/settings/citytime/citytime.cpp
@@ -1,272 +1,282 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 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 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 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 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. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21// changes by Maximilian Reiss <harlekin@handhelds.org>
22
21#include "zonemap.h" 23#include "zonemap.h"
22#include "citytime.h" 24#include "citytime.h"
23 25
24#include <qpe/qpeapplication.h> 26#include <qpe/qpeapplication.h>
25#include <qpe/config.h> 27#include <qpe/config.h>
26#include <qpe/timestring.h> 28#include <qpe/timestring.h>
27#include <qpe/tzselect.h> 29#include <qpe/tzselect.h>
28#if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP) 30#if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP)
29#include <qpe/qcopenvelope_qws.h> 31#include <qpe/qcopenvelope_qws.h>
30#endif 32#endif
31 33
32
33#include <qdir.h> 34#include <qdir.h>
34#include <qfile.h> 35#include <qfile.h>
35#include <qlabel.h> 36#include <qlabel.h>
36#include <qmessagebox.h> 37#include <qmessagebox.h>
37#include <qregexp.h> 38#include <qregexp.h>
38#include <qtextstream.h> 39#include <qtextstream.h>
39#include <qtoolbutton.h> 40#include <qtoolbutton.h>
41#include <qlayout.h>
40 42
41#include <stdlib.h> 43#include <stdlib.h>
42 44
43CityTime::CityTime( QWidget *parent, const char* name, 45CityTime::CityTime( QWidget *parent, const char* name,
44 WFlags fl ) 46 WFlags fl )
45 : CityTimeBase( parent, name, fl ), 47 : CityTimeBase( parent, name, fl ),
46 strRealTz(0), 48 strRealTz(0),
47 bAdded(false) 49 bAdded(false)
48{ 50{
49 Config config( "qpe" ); 51 Config config( "qpe" );
50 bWhichClock = config.readBoolEntry( "AMPM", TRUE ); 52 bWhichClock = config.readBoolEntry( "AMPM", TRUE );
51 frmMap->changeClock( bWhichClock ); 53 frmMap->changeClock( bWhichClock );
52 54
53 char *pEnv; 55 char *pEnv;
54 pEnv = NULL; 56 pEnv = NULL;
55 pEnv = getenv("TZ"); 57 pEnv = getenv("TZ");
56 if ( pEnv ) 58 if ( pEnv )
57 strRealTz = pEnv; 59 strRealTz = pEnv;
58 pEnv = NULL; 60 pEnv = NULL;
59 pEnv = getenv("HOME"); 61 pEnv = getenv("HOME");
60 if ( pEnv ) 62 if ( pEnv )
61 strHome = pEnv; 63 strHome = pEnv;
62 // append the labels to their respective lists... 64 // append the labels to their respective lists...
63 listCities.setAutoDelete( true ); 65 listCities.setAutoDelete( true );
64 listTimes.setAutoDelete( true ); 66 listTimes.setAutoDelete( true );
65 67
66 listCities.append( cmdCity1 ); 68 listCities.append( cmdCity1 );
67 listCities.append( cmdCity2 ); 69 listCities.append( cmdCity2 );
68 listCities.append( cmdCity3 ); 70 listCities.append( cmdCity3 );
69 71
70 listTimes.append( lblCTime1 ); 72 listTimes.append( lblCTime1 );
71 listTimes.append( lblCTime2 ); 73 listTimes.append( lblCTime2 );
72 listTimes.append( lblCTime3 ); 74 listTimes.append( lblCTime3 );
73 75
74 76
75 // kludgy way of getting the screen size so we don't have to depend 77 // kludgy way of getting the screen size so we don't have to depend
76 // on a resize event... 78 // on a resize event...
77 QWidget *d = QApplication::desktop(); 79 QWidget *d = QApplication::desktop();
78 if ( d->width() < d->height() ) { 80 if ( d->width() < d->height() ) {
79 // append for that 4 down look 81 // append for that 4 down look
80
81 listCities.append( cmdCity4 ); 82 listCities.append( cmdCity4 );
82 listCities.append( cmdCity5 ); 83 listCities.append( cmdCity5 );
83 listCities.append( cmdCity6 ); 84 listCities.append( cmdCity6 );
84 listTimes.append( lblCTime4 ); 85 listTimes.append( lblCTime4 );
85 listTimes.append( lblCTime5 ); 86 listTimes.append( lblCTime5 );
86 listTimes.append( lblCTime6 ); 87 listTimes.append( lblCTime6 );
87 lblCTime7->hide(); 88 lblCTime7->hide();
88 lblCTime8->hide(); 89 lblCTime8->hide();
89 lblCTime9->hide(); 90 lblCTime9->hide();
90 cmdCity7->hide(); 91 cmdCity7->hide();
91 cmdCity8->hide(); 92 cmdCity8->hide();
92 cmdCity9->hide(); 93 cmdCity9->hide();
93 } else { 94 } else {
94 listCities.append( cmdCity7 ); 95 listCities.append( cmdCity7 );
95 listCities.append( cmdCity8 ); 96 listCities.append( cmdCity8 );
96 listCities.append( cmdCity9 ); 97 listCities.append( cmdCity9 );
97 listTimes.append( lblCTime7 ); 98 listTimes.append( lblCTime7 );
98 listTimes.append( lblCTime8 ); 99 listTimes.append( lblCTime8 );
99 listTimes.append( lblCTime9 ); 100 listTimes.append( lblCTime9 );
100 lblCTime4->hide(); 101 lblCTime4->hide();
101 lblCTime5->hide(); 102 lblCTime5->hide();
102 lblCTime6->hide(); 103 lblCTime6->hide();
103 cmdCity4->hide(); 104 cmdCity4->hide();
104 cmdCity5->hide(); 105 cmdCity5->hide();
105 cmdCity6->hide(); 106 cmdCity6->hide();
106 } 107 }
108
109 selWidget = frmMap->selectionWidget( this );
110 selWidget->hide();
111 CityTimeBaseLayout->addWidget( selWidget );
107 bAdded = true; 112 bAdded = true;
108 readInTimes(); 113 readInTimes();
109 changed = FALSE; 114 changed = FALSE;
110 QObject::connect( qApp, SIGNAL( clockChanged(bool) ), 115 QObject::connect( qApp, SIGNAL( clockChanged( bool ) ),
111 this, SLOT( changeClock(bool) ) ); 116 this, SLOT( changeClock( bool ) ) );
112 // now start the timer so we can update the time quickly every second 117 // now start the timer so we can update the time quickly every second
113 timerEvent( 0 ); 118 timerEvent( 0 );
114} 119}
115 120
116CityTime::~CityTime() 121CityTime::~CityTime()
117{ 122{
118 if ( changed ) { 123 if ( changed ) {
119 Config cfg("CityTime"); 124 Config cfg("CityTime");
120 cfg.setGroup("TimeZones"); 125 cfg.setGroup("TimeZones");
121 QListIterator<QToolButton> itCity( listCities ); 126 QListIterator<QToolButton> itCity( listCities );
122 int i; 127 int i;
123 bool realTzWritten = FALSE; 128 bool realTzWritten = FALSE;
124 for ( i = 0, itCity.toFirst(); i < CITIES; i++, ++itCity ) { 129 for ( i = 0, itCity.toFirst(); i < CITIES; i++, ++itCity ) {
125 if ( !strCityTz[i].isNull() ) { 130 if ( !strCityTz[i].isNull() ) {
126 cfg.writeEntry("Zone"+QString::number(i), strCityTz[i]); 131 cfg.writeEntry("Zone"+QString::number(i), strCityTz[i]);
127 cfg.writeEntry("ZoneName"+QString::number(i), itCity.current()->text()); 132 cfg.writeEntry("ZoneName"+QString::number(i), itCity.current()->text());
128 if ( strCityTz[i] == strRealTz ) 133 if ( strCityTz[i] == strRealTz )
129 realTzWritten = TRUE; 134 realTzWritten = TRUE;
130 } 135 }
131 } 136 }
132 if ( realTzWritten ) { 137 if ( realTzWritten ) {
133 cfg.removeEntry("Zone"+QString::number(CITIES)); 138 cfg.removeEntry("Zone"+QString::number(CITIES));
134 cfg.removeEntry("ZoneName"+QString::number(CITIES)); 139 cfg.removeEntry("ZoneName"+QString::number(CITIES));
135 } else { 140 } else {
136 cfg.writeEntry("Zone"+QString::number(CITIES), strRealTz); 141 cfg.writeEntry("Zone"+QString::number(CITIES), strRealTz);
137 if ( nameRealTz.isEmpty() ) { 142 if ( nameRealTz.isEmpty() ) {
138 int i = strRealTz.find( '/' ); 143 int i = strRealTz.find( '/' );
139 nameRealTz = strRealTz.mid( i+1 ); 144 nameRealTz = strRealTz.mid( i+1 );
140 } 145 }
141 cfg.writeEntry("ZoneName"+QString::number(CITIES), nameRealTz); 146 cfg.writeEntry("ZoneName"+QString::number(CITIES), nameRealTz);
142 } 147 }
143 QCopEnvelope ( "QPE/System", "timeZoneListChange()" ); 148 QCopEnvelope ( "QPE/System", "timeZoneListChange()" );
144 149
145 changed = FALSE; 150 changed = FALSE;
146 } 151 }
147 // restore the timezone, just in case we messed with it and 152 // restore the timezone, just in case we messed with it and
148 // are destroyed at an inoppurtune moment 153 // are destroyed at an inoppurtune moment
149 if ( !strRealTz.isNull() ) { 154 if ( !strRealTz.isNull() ) {
150 // this should be checked, but there is not much that can done at this 155 // this should be checked, but there is not much that can done at this
151 //point if it fails 156 //point if it fails
152 setenv( "TZ", strRealTz, true ); 157 setenv( "TZ", strRealTz, true );
153 } 158 }
154} 159}
155 160
156void CityTime::timerEvent( QTimerEvent *e ) 161void CityTime::timerEvent( QTimerEvent *e )
157{ 162{
158 if ( e ) 163 if ( e )
159 killTimer( timerId ); 164 killTimer( timerId );
160 // change the time again!! 165 // change the time again!!
161 showTime(); 166 showTime();
162 int ms = 1000 - QTime::currentTime().msec(); 167 int ms = 1000 - QTime::currentTime().msec();
163 timerId = startTimer( ms ); 168 timerId = startTimer( ms );
164} 169}
165 170
166void CityTime::mousePressEvent( QMouseEvent * ) 171void CityTime::mousePressEvent( QMouseEvent * )
167{ 172{
168 // DEBUG enable this to get a look at the zone information DEBUG 173 // DEBUG enable this to get a look at the zone information DEBUG
169// frmMap->showZones(); 174// frmMap->showZones();
170} 175}
171 176
172void CityTime::showTime( void ) 177void CityTime::showTime( void )
173{ 178{
174 int i; 179 int i;
175 QListIterator<QLabel> itTime(listTimes); 180 QListIterator<QLabel> itTime(listTimes);
176 181
177 // traverse the list... 182 // traverse the list...
178 for ( i = 0, itTime.toFirst(); i < CITIES; i++, ++itTime) { 183 for ( i = 0, itTime.toFirst(); i < CITIES; i++, ++itTime) {
179 if ( !strCityTz[i].isNull() ) { 184 if ( !strCityTz[i].isNull() ) {
180 if ( setenv( "TZ", strCityTz[i], true ) == 0 ) { 185 if ( setenv( "TZ", strCityTz[i], true ) == 0 ) {
181 itTime.current()->setText( TimeString::shortTime(bWhichClock) ); 186 itTime.current()->setText( TimeString::shortTime(bWhichClock) );
182 } else { 187 } else {
183 QMessageBox::critical( this, tr( "Time Changing" ), 188 QMessageBox::critical( this, tr( "Time Changing" ),
184 tr( "There was a problem setting timezone %1" ) 189 tr( "There was a problem setting timezone %1" )
185 .arg( QString::number( i + 1 ) ) ); 190 .arg( QString::number( i + 1 ) ) );
186 } 191 }
187 } 192 }
188 } 193 }
189 // done playing around... put it all back 194 // done playing around... put it all back
190 unsetenv( "TZ" ); 195 unsetenv( "TZ" );
191 if ( !strRealTz.isNull() ) { 196 if ( !strRealTz.isNull() ) {
192 if ( setenv( "TZ", strRealTz, true ) != 0 ) { 197 if ( setenv( "TZ", strRealTz, true ) != 0 ) {
193 QMessageBox::critical( this, tr( "Restore Time Zone" ), 198 QMessageBox::critical( this, tr( "Restore Time Zone" ),
194 tr( "There was a problem setting your timezone." 199 tr( "There was a problem setting your timezone."
195 "Your time may be wrong now..." ) ); 200 "Your time may be wrong now..." ) );
196 } 201 }
197 } 202 }
198} 203}
199 204
200void CityTime::beginNewTz() 205void CityTime::beginNewTz()
201{ 206{
207 buttonWidget->hide();
202 frmMap->setFocus(); 208 frmMap->setFocus();
209 selWidget->show();
210 // CityTimeBaseLayout->addWidget( selWidget );
203} 211}
204 212
205void CityTime::slotNewTz( const QString & strNewCountry, 213void CityTime::slotNewTz( const QString & strNewCountry,
206 const QString & strNewCity ) 214 const QString & strNewCity )
207{ 215{
208 // determine what to do based on what putton is pressed... 216 // determine what to do based on what putton is pressed...
209 QListIterator<QToolButton> itCity(listCities); 217 QListIterator<QToolButton> itCity(listCities);
210 int i; 218 int i;
211 // go through the list and make adjustments based on which button is on 219 // go through the list and make adjustments based on which button is on
212 for ( i = 0, itCity.toFirst(); itCity.current(), i < CITIES; i++, ++itCity ) { 220 for ( i = 0, itCity.toFirst(); itCity.current(), i < CITIES; i++, ++itCity ) {
213 QToolButton *cmdTmp = itCity.current(); 221 QToolButton *cmdTmp = itCity.current();
214 if ( cmdTmp->isOn() ) { 222 if ( cmdTmp->isOn() ) {
215 strCityTz[i] = strNewCountry + strNewCity; 223 strCityTz[i] = strNewCountry + strNewCity;
216 QString s = strNewCity; 224 QString s = strNewCity;
217 cmdTmp->setText( s.replace( QRegExp("_"), " " ) ); 225 cmdTmp->setText( s.replace( QRegExp("_"), " " ) );
218 cmdTmp->toggle(); 226 cmdTmp->toggle();
219 // we can actually break, since there is only one button 227 // we can actually break, since there is only one button
220 // that is ever pressed! 228 // that is ever pressed!
221 changed = TRUE; 229 changed = TRUE;
222 break; 230 break;
223 } 231 }
224 } 232 }
225 showTime(); 233 showTime();
234 buttonWidget->show();
235 selWidget->hide();
226} 236}
227 237
228void CityTime::readInTimes( void ) 238void CityTime::readInTimes( void )
229{ 239{
230 Config cfg("CityTime"); 240 Config cfg("CityTime");
231 cfg.setGroup("TimeZones"); 241 cfg.setGroup("TimeZones");
232 QListIterator<QToolButton> itCity( listCities ); 242 QListIterator<QToolButton> itCity( listCities );
233 int i=0; 243 int i=0;
234 nameRealTz = QString::null; 244 nameRealTz = QString::null;
235 QString zn; 245 QString zn;
236 for ( ; i < CITIES ; i++ ) { 246 for ( ; i < CITIES ; i++ ) {
237 zn = cfg.readEntry("Zone"+QString::number(i), QString::null); 247 zn = cfg.readEntry("Zone"+QString::number(i), QString::null);
238 if ( zn.isNull() ) 248 if ( zn.isNull() )
239 break; 249 break;
240 QString nm = cfg.readEntry("ZoneName"+QString::number(i)); 250 QString nm = cfg.readEntry("ZoneName"+QString::number(i));
241 strCityTz[i] = zn; 251 strCityTz[i] = zn;
242 itCity.current()->setText(nm); 252 itCity.current()->setText(nm);
243 if ( zn == strRealTz ) 253 if ( zn == strRealTz )
244 nameRealTz = nm; 254 nameRealTz = nm;
245 ++itCity; 255 ++itCity;
246 } 256 }
247 if ( i == 0 ) { 257 if ( i == 0 ) {
248 // write in our own in a shameless self promotion and some humor 258 // write in our own in a shameless self promotion and some humor
249 QStringList list = timezoneDefaults(); 259 QStringList list = timezoneDefaults();
250 int i; 260 int i;
251 QStringList::Iterator it = list.begin(); 261 QStringList::Iterator it = list.begin();
252 for ( i = 0, itCity.toFirst(); i < CITIES && itCity.current(); 262 for ( i = 0, itCity.toFirst(); i < CITIES && itCity.current();
253 i++, ++itCity ) { 263 i++, ++itCity ) {
254 strCityTz[i] = *it++; 264 strCityTz[i] = *it++;
255 itCity.current()->setText( *it++ ); 265 itCity.current()->setText( *it++ );
256 } 266 }
257 } 267 }
258 if ( nameRealTz.isEmpty() ) { 268 if ( nameRealTz.isEmpty() ) {
259 //remember the current time zone even if we don't have room 269 //remember the current time zone even if we don't have room
260 //to show it. 270 //to show it.
261 zn = cfg.readEntry("Zone"+QString::number(CITIES), QString::null); 271 zn = cfg.readEntry("Zone"+QString::number(CITIES), QString::null);
262 if ( zn == strRealTz ) 272 if ( zn == strRealTz )
263 nameRealTz = cfg.readEntry("ZoneName"+QString::number(CITIES)); 273 nameRealTz = cfg.readEntry("ZoneName"+QString::number(CITIES));
264 i++; 274 i++;
265 } 275 }
266} 276}
267 277
268void CityTime::changeClock( bool newClock ) 278void CityTime::changeClock( bool newClock )
269{ 279{
270 bWhichClock = newClock; 280 bWhichClock = newClock;
271 showTime(); 281 showTime();
272} 282}
diff --git a/core/settings/citytime/citytime.h b/core/settings/citytime/citytime.h
index 5a2c4d8..63e3102 100644
--- a/core/settings/citytime/citytime.h
+++ b/core/settings/citytime/citytime.h
@@ -1,66 +1,68 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 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 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 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 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. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#ifndef TIMEWIDGETIMPL_H 21#ifndef TIMEWIDGETIMPL_H
22#define TIMEWIDGETIMPL_H 22#define TIMEWIDGETIMPL_H
23 23
24#include <qlist.h> 24#include <qlist.h>
25#include <qwidget.h> 25#include <qwidget.h>
26 26
27#include "citytimebase.h" 27#include "citytimebase.h"
28 28
29const int CITIES = 6; // the number of cities... 29const int CITIES = 6; // the number of cities...
30 30
31class ZoneMap; 31class ZoneMap;
32 32
33class CityTime : public CityTimeBase 33class CityTime : public CityTimeBase
34{ 34{
35 Q_OBJECT 35 Q_OBJECT
36public: 36public:
37 CityTime(QWidget* parent = 0, const char *name = 0, WFlags fl = 0); 37 CityTime(QWidget* parent = 0, const char *name = 0, WFlags fl = 0);
38 ~CityTime(); 38 ~CityTime();
39 39
40public slots: 40public slots:
41 void beginNewTz(); 41 void beginNewTz();
42 void slotNewTz( const QString& strNewCountry, const QString& strNewCity ); 42 void slotNewTz( const QString& strNewCountry, const QString& strNewCity );
43 void changeClock( bool newClock ); 43 void changeClock( bool newClock );
44 44
45protected: 45protected:
46 void timerEvent( QTimerEvent* ); 46 void timerEvent( QTimerEvent* );
47 void mousePressEvent( QMouseEvent* event ); 47 void mousePressEvent( QMouseEvent* event );
48 48
49private: 49private:
50 void showTime( void ); // get and show the time for various places... 50 void showTime( void ); // get and show the time for various places...
51 void readInTimes( void ); // a method to get information from the config 51 void readInTimes( void ); // a method to get information from the config
52 QString strRealTz; // save the TZ var 52 QString strRealTz; // save the TZ var
53 QString nameRealTz; // and what it is called 53 QString nameRealTz; // and what it is called
54 QString strHome; // the home variable... 54 QString strHome; // the home variable...
55 bool bAdded; // a flag to indicate things have been added... 55 bool bAdded; // a flag to indicate things have been added...
56 bool bWhichClock; 56 bool bWhichClock;
57 int timerId; 57 int timerId;
58 58
59
60 QWidget* selWidget;
59 // a spot to hold the time zone for each city 61 // a spot to hold the time zone for each city
60 QString strCityTz[CITIES]; 62 QString strCityTz[CITIES];
61 QList<QToolButton> listCities; 63 QList<QToolButton> listCities;
62 QList<QLabel> listTimes; 64 QList<QLabel> listTimes;
63 bool changed; 65 bool changed;
64}; 66};
65 67
66#endif 68#endif
diff --git a/core/settings/citytime/citytime.pro b/core/settings/citytime/citytime.pro
index 4b0b3ff..52ba3b6 100644
--- a/core/settings/citytime/citytime.pro
+++ b/core/settings/citytime/citytime.pro
@@ -1,26 +1,26 @@
1# $Id$ 1#CONFIG += qt warn_on release
2CONFIG += qt warn_on release 2CONFIG += qt warn_on debug
3TEMPLATE = app 3TEMPLATE = app
4DESTDIR = $(OPIEDIR)/bin 4DESTDIR = $(OPIEDIR)/bin
5INTERFACES = citytimebase.ui 5#INTERFACES = citytimebase.ui
6HEADERS = citytime.h zonemap.h sun.h stylusnormalizer.h 6HEADERS = citytime.h citytimebase.h zonemap.h sun.h stylusnormalizer.h
7SOURCES = citytime.cpp zonemap.cpp main.cpp sun.c stylusnormalizer.cpp 7SOURCES = citytime.cpp citytimebase.cpp zonemap.cpp main.cpp sun.c stylusnormalizer.cpp
8TARGET = citytime 8TARGET = citytime
9INCLUDEPATH += $(OPIEDIR)/include 9INCLUDEPATH += $(OPIEDIR)/include
10DEPENDPATH += $(OPIEDIR)/include 10DEPENDPATH += $(OPIEDIR)/include
11LIBS += -lqpe 11LIBS += -lqpe
12 12
13TRANSLATIONS = ../../../i18n/de/citytime.ts \ 13TRANSLATIONS = ../../../i18n/de/citytime.ts \
14 ../../../i18n/en/citytime.ts \ 14 ../../../i18n/en/citytime.ts \
15 ../../../i18n/es/citytime.ts \ 15 ../../../i18n/es/citytime.ts \
16 ../../../i18n/fr/citytime.ts \ 16 ../../../i18n/fr/citytime.ts \
17 ../../../i18n/hu/citytime.ts \ 17 ../../../i18n/hu/citytime.ts \
18 ../../../i18n/ja/citytime.ts \ 18 ../../../i18n/ja/citytime.ts \
19 ../../../i18n/ko/citytime.ts \ 19 ../../../i18n/ko/citytime.ts \
20 ../../../i18n/no/citytime.ts \ 20 ../../../i18n/no/citytime.ts \
21 ../../../i18n/pl/citytime.ts \ 21 ../../../i18n/pl/citytime.ts \
22 ../../../i18n/pt/citytime.ts \ 22 ../../../i18n/pt/citytime.ts \
23 ../../../i18n/pt_BR/citytime.ts \ 23 ../../../i18n/pt_BR/citytime.ts \
24 ../../../i18n/sl/citytime.ts \ 24 ../../../i18n/sl/citytime.ts \
25 ../../../i18n/zh_CN/citytime.ts \ 25 ../../../i18n/zh_CN/citytime.ts \
26 ../../../i18n/zh_TW/citytime.ts 26 ../../../i18n/zh_TW/citytime.ts
diff --git a/core/settings/citytime/citytimebase.cpp b/core/settings/citytime/citytimebase.cpp
new file mode 100644
index 0000000..d734cf3
--- a/dev/null
+++ b/core/settings/citytime/citytimebase.cpp
@@ -0,0 +1,414 @@
1
2
3// changes by Maximilian Reiss <harlekin@handhelds.org>
4
5#include "citytimebase.h"
6
7#include <qlabel.h>
8#include <qpushbutton.h>
9#include <qtoolbutton.h>
10#include "zonemap.h"
11#include <qlayout.h>
12#include <qvariant.h>
13#include <qtooltip.h>
14#include <qwhatsthis.h>
15
16
17/*
18 * Constructs a CityTimeBase which is a child of 'parent', with the
19 * name 'name' and widget flags set to 'f'
20 */
21CityTimeBase::CityTimeBase( QWidget* parent, const char* name, WFlags )
22 : QWidget( parent, name, WStyle_ContextHelp )
23{
24 if ( !name )
25 setName( "CityTimeBase" );
26 setCaption( tr( "City Time" ) );
27 CityTimeBaseLayout = new QVBoxLayout( this );
28 CityTimeBaseLayout->setSpacing( 3 );
29 CityTimeBaseLayout->setMargin( 0 );
30
31 frmMap = new ZoneMap( this, "frmMap" );
32 frmMap->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, frmMap->sizePolicy().hasHeightForWidth() ) );
33 CityTimeBaseLayout->addWidget( frmMap );
34
35 buttonWidget = new QWidget( this );
36 QWhatsThis::add( buttonWidget, tr( "Click on one of the set cities to replace it" ) );
37 Layout2 = new QGridLayout( buttonWidget );
38 Layout2->setSpacing( 3 );
39 Layout2->setMargin( 4 );
40
41 cmdCity7 = new QToolButton( buttonWidget, "cmdCity7" );
42 cmdCity7->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity7->sizePolicy().hasHeightForWidth() ) );
43 QFont cmdCity7_font( cmdCity7->font() );
44 cmdCity7_font.setBold( TRUE );
45 cmdCity7->setFont( cmdCity7_font );
46 cmdCity7->setFocusPolicy( QToolButton::TabFocus );
47 cmdCity7->setText( tr( "" ) );
48 cmdCity7->setToggleButton( TRUE );
49 cmdCity7->setToggleButton( TRUE );
50
51 Layout2->addWidget( cmdCity7, 0, 2 );
52
53 lblCTime9 = new QLabel( buttonWidget, "lblCTime9" );
54 lblCTime9->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, lblCTime9->sizePolicy().hasHeightForWidth() ) );
55 QFont lblCTime9_font( lblCTime9->font() );
56 lblCTime9_font.setPointSize( 10 );
57 lblCTime9->setFont( lblCTime9_font );
58 lblCTime9->setText( tr( "" ) );
59 lblCTime9->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
60
61 Layout2->addWidget( lblCTime9, 2, 3 );
62
63 cmdCity8 = new QToolButton( buttonWidget, "cmdCity8" );
64 cmdCity8->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity8->sizePolicy().hasHeightForWidth() ) );
65 QFont cmdCity8_font( cmdCity8->font() );
66 cmdCity8_font.setBold( TRUE );
67 cmdCity8->setFont( cmdCity8_font );
68 cmdCity8->setFocusPolicy( QToolButton::TabFocus );
69 cmdCity8->setText( tr( "" ) );
70 cmdCity8->setToggleButton( TRUE );
71 cmdCity8->setToggleButton( TRUE );
72
73 Layout2->addWidget( cmdCity8, 1, 2 );
74
75 cmdCity2 = new QToolButton( buttonWidget, "cmdCity2" );
76 QFont cmdCity2_font( cmdCity2->font() );
77 cmdCity2_font.setBold( TRUE );
78 cmdCity2->setFont( cmdCity2_font );
79 cmdCity2->setFocusPolicy( QToolButton::TabFocus );
80 cmdCity2->setText( tr( "" ) );
81 cmdCity2->setToggleButton( TRUE );
82 cmdCity2->setToggleButton( TRUE );
83
84 Layout2->addWidget( cmdCity2, 1, 0 );
85
86 lblCTime6 = new QLabel( buttonWidget, "lblCTime6" );
87 QFont lblCTime6_font( lblCTime6->font() );
88 lblCTime6_font.setPointSize( 10 );
89 lblCTime6->setFont( lblCTime6_font );
90 lblCTime6->setText( tr( "" ) );
91 lblCTime6->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
92
93 Layout2->addWidget( lblCTime6, 5, 1 );
94
95 cmdCity6 = new QToolButton( buttonWidget, "cmdCity6" );
96 cmdCity6->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity6->sizePolicy().hasHeightForWidth() ) );
97 QFont cmdCity6_font( cmdCity6->font() );
98 cmdCity6_font.setBold( TRUE );
99 cmdCity6->setFont( cmdCity6_font );
100 cmdCity6->setFocusPolicy( QToolButton::TabFocus );
101 cmdCity6->setText( tr( "" ) );
102 cmdCity6->setToggleButton( TRUE );
103 cmdCity6->setToggleButton( TRUE );
104
105 Layout2->addWidget( cmdCity6, 5, 0 );
106
107 cmdCity4 = new QToolButton( buttonWidget, "cmdCity4" );
108 cmdCity4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity4->sizePolicy().hasHeightForWidth() ) );
109 QFont cmdCity4_font( cmdCity4->font() );
110 cmdCity4_font.setBold( TRUE );
111 cmdCity4->setFont( cmdCity4_font );
112 cmdCity4->setFocusPolicy( QToolButton::TabFocus );
113 cmdCity4->setText( tr( "" ) );
114 cmdCity4->setToggleButton( TRUE );
115 cmdCity4->setToggleButton( TRUE );
116
117 Layout2->addWidget( cmdCity4, 3, 0 );
118
119 lblCTime5 = new QLabel( buttonWidget, "lblCTime5" );
120 QFont lblCTime5_font( lblCTime5->font() );
121 lblCTime5_font.setPointSize( 10 );
122 lblCTime5->setFont( lblCTime5_font );
123 lblCTime5->setText( tr( "" ) );
124 lblCTime5->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
125
126 Layout2->addWidget( lblCTime5, 4, 1 );
127
128 lblCTime2 = new QLabel( buttonWidget, "lblCTime2" );
129 lblCTime2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)1, lblCTime2->sizePolicy().hasHeightForWidth() ) );
130 QFont lblCTime2_font( lblCTime2->font() );
131 lblCTime2_font.setPointSize( 10 );
132 lblCTime2->setFont( lblCTime2_font );
133 lblCTime2->setText( tr( "" ) );
134 lblCTime2->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
135
136 Layout2->addWidget( lblCTime2, 1, 1 );
137
138 lblCTime1 = new QLabel( buttonWidget, "lblCTime1" );
139 lblCTime1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)1, lblCTime1->sizePolicy().hasHeightForWidth() ) );
140 QFont lblCTime1_font( lblCTime1->font() );
141 lblCTime1_font.setPointSize( 10 );
142 lblCTime1->setFont( lblCTime1_font );
143 lblCTime1->setText( tr( "" ) );
144 lblCTime1->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
145
146 Layout2->addWidget( lblCTime1, 0, 1 );
147
148 cmdCity3 = new QToolButton( buttonWidget, "cmdCity3" );
149 cmdCity3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity3->sizePolicy().hasHeightForWidth() ) );
150 QFont cmdCity3_font( cmdCity3->font() );
151 cmdCity3_font.setBold( TRUE );
152 cmdCity3->setFont( cmdCity3_font );
153 cmdCity3->setFocusPolicy( QToolButton::TabFocus );
154 cmdCity3->setText( tr( "" ) );
155 cmdCity3->setToggleButton( TRUE );
156 cmdCity3->setToggleButton( TRUE );
157
158 Layout2->addWidget( cmdCity3, 2, 0 );
159
160 lblCTime8 = new QLabel( buttonWidget, "lblCTime8" );
161 lblCTime8->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, lblCTime8->sizePolicy().hasHeightForWidth() ) );
162 QFont lblCTime8_font( lblCTime8->font() );
163 lblCTime8_font.setPointSize( 10 );
164 lblCTime8->setFont( lblCTime8_font );
165 lblCTime8->setText( tr( "" ) );
166 lblCTime8->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
167
168 Layout2->addWidget( lblCTime8, 1, 3 );
169
170 cmdCity1 = new QToolButton( buttonWidget, "cmdCity1" );
171 cmdCity1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity1->sizePolicy().hasHeightForWidth() ) );
172 QFont cmdCity1_font( cmdCity1->font() );
173 cmdCity1_font.setBold( TRUE );
174 cmdCity1->setFont( cmdCity1_font );
175 cmdCity1->setFocusPolicy( QToolButton::TabFocus );
176 cmdCity1->setText( tr( "" ) );
177 cmdCity1->setToggleButton( TRUE );
178 cmdCity1->setToggleButton( TRUE );
179
180 Layout2->addWidget( cmdCity1, 0, 0 );
181
182 lblCTime7 = new QLabel( buttonWidget, "lblCTime7" );
183 lblCTime7->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, lblCTime7->sizePolicy().hasHeightForWidth() ) );
184 QFont lblCTime7_font( lblCTime7->font() );
185 lblCTime7_font.setPointSize( 10 );
186 lblCTime7->setFont( lblCTime7_font );
187 lblCTime7->setText( tr( "" ) );
188 lblCTime7->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
189
190 Layout2->addWidget( lblCTime7, 0, 3 );
191
192 lblCTime4 = new QLabel( buttonWidget, "lblCTime4" );
193 QFont lblCTime4_font( lblCTime4->font() );
194 lblCTime4_font.setPointSize( 10 );
195 lblCTime4->setFont( lblCTime4_font );
196 lblCTime4->setText( tr( "" ) );
197 lblCTime4->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
198
199 Layout2->addWidget( lblCTime4, 3, 1 );
200
201 cmdCity5 = new QToolButton( buttonWidget, "cmdCity5" );
202 cmdCity5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity5->sizePolicy().hasHeightForWidth() ) );
203 QFont cmdCity5_font( cmdCity5->font() );
204 cmdCity5_font.setBold( TRUE );
205 cmdCity5->setFont( cmdCity5_font );
206 cmdCity5->setFocusPolicy( QToolButton::TabFocus );
207 cmdCity5->setText( tr( "" ) );
208 cmdCity5->setToggleButton( TRUE );
209 cmdCity5->setToggleButton( TRUE );
210
211 Layout2->addWidget( cmdCity5, 4, 0 );
212
213 lblCTime3 = new QLabel( buttonWidget, "lblCTime3" );
214 QFont lblCTime3_font( lblCTime3->font() );
215 lblCTime3_font.setPointSize( 10 );
216 lblCTime3->setFont( lblCTime3_font );
217 lblCTime3->setText( tr( "" ) );
218 lblCTime3->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
219
220 Layout2->addWidget( lblCTime3, 2, 1 );
221
222 cmdCity9 = new QToolButton( buttonWidget, "cmdCity9" );
223 cmdCity9->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity9->sizePolicy().hasHeightForWidth() ) );
224 QFont cmdCity9_font( cmdCity9->font() );
225 cmdCity9_font.setBold( TRUE );
226 cmdCity9->setFont( cmdCity9_font );
227 cmdCity9->setFocusPolicy( QToolButton::TabFocus );
228 cmdCity9->setText( tr( "" ) );
229 cmdCity9->setToggleButton( TRUE );
230 cmdCity9->setToggleButton( TRUE );
231
232 Layout2->addWidget( cmdCity9, 2, 2 );
233 CityTimeBaseLayout->addWidget( buttonWidget );
234
235 // signals and slots connections
236 connect( frmMap, SIGNAL( signalTz(const QString &, const QString &) ), this, SLOT( slotNewTz(const QString &, const QString &) ) );
237 connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) );
238 connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) );
239 connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) );
240 connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) );
241 connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) );
242 connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) );
243 connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) );
244 connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) );
245 connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) );
246 connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) );
247 connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) );
248 connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) );
249 connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) );
250 connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) );
251 connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) );
252 connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) );
253 connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) );
254 connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) );
255 connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) );
256 connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) );
257 connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) );
258 connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) );
259 connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) );
260 connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) );
261 connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) );
262 connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) );
263 connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) );
264 connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) );
265 connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) );
266 connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) );
267 connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) );
268 connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) );
269 connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) );
270 connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) );
271 connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) );
272 connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) );
273 connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) );
274 connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) );
275 connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) );
276 connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) );
277 connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) );
278 connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) );
279 connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) );
280 connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) );
281 connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) );
282 connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) );
283 connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) );
284 connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) );
285 connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) );
286 connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) );
287 connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) );
288 connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) );
289 connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) );
290 connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) );
291 connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) );
292 connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) );
293 connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) );
294 connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) );
295 connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) );
296 connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) );
297 connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) );
298 connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) );
299 connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) );
300 connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) );
301 connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) );
302 connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) );
303 connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) );
304 connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) );
305 connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) );
306 connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) );
307 connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) );
308 connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) );
309 connect( cmdCity1, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) );
310 connect( cmdCity2, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) );
311 connect( cmdCity7, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) );
312 connect( cmdCity3, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) );
313 connect( cmdCity4, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) );
314 connect( cmdCity5, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) );
315 connect( cmdCity6, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) );
316 connect( cmdCity8, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) );
317 connect( cmdCity9, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) );
318
319 // tab order
320 setTabOrder( cmdCity1, cmdCity2 );
321 setTabOrder( cmdCity2, cmdCity3 );
322 setTabOrder( cmdCity3, cmdCity4 );
323 setTabOrder( cmdCity4, cmdCity5 );
324 setTabOrder( cmdCity5, cmdCity6 );
325 setTabOrder( cmdCity6, cmdCity7 );
326 setTabOrder( cmdCity7, cmdCity8 );
327 setTabOrder( cmdCity8, cmdCity9 );
328 setTabOrder( cmdCity9, frmMap );
329}
330
331/*
332 * Destroys the object and frees any allocated resources
333 */
334CityTimeBase::~CityTimeBase()
335{
336 // no need to delete child widgets, Qt does it all for us
337}
338
339/*
340 * Main event handler. Reimplemented to handle application
341 * font changes
342 */
343bool CityTimeBase::event( QEvent* ev )
344{
345 bool ret = QWidget::event( ev );
346 if ( ev->type() == QEvent::ApplicationFontChange ) {
347 QFont cmdCity7_font( cmdCity7->font() );
348 cmdCity7_font.setBold( TRUE );
349 cmdCity7->setFont( cmdCity7_font );
350 QFont lblCTime9_font( lblCTime9->font() );
351 lblCTime9_font.setPointSize( 10 );
352 lblCTime9->setFont( lblCTime9_font );
353 QFont cmdCity8_font( cmdCity8->font() );
354 cmdCity8_font.setBold( TRUE );
355 cmdCity8->setFont( cmdCity8_font );
356 QFont cmdCity2_font( cmdCity2->font() );
357 cmdCity2_font.setBold( TRUE );
358 cmdCity2->setFont( cmdCity2_font );
359 QFont lblCTime6_font( lblCTime6->font() );
360 lblCTime6_font.setPointSize( 10 );
361 lblCTime6->setFont( lblCTime6_font );
362 QFont cmdCity6_font( cmdCity6->font() );
363 cmdCity6_font.setBold( TRUE );
364 cmdCity6->setFont( cmdCity6_font );
365 QFont cmdCity4_font( cmdCity4->font() );
366 cmdCity4_font.setBold( TRUE );
367 cmdCity4->setFont( cmdCity4_font );
368 QFont lblCTime5_font( lblCTime5->font() );
369 lblCTime5_font.setPointSize( 10 );
370 lblCTime5->setFont( lblCTime5_font );
371 QFont lblCTime2_font( lblCTime2->font() );
372 lblCTime2_font.setPointSize( 10 );
373 lblCTime2->setFont( lblCTime2_font );
374 QFont lblCTime1_font( lblCTime1->font() );
375 lblCTime1_font.setPointSize( 10 );
376 lblCTime1->setFont( lblCTime1_font );
377 QFont cmdCity3_font( cmdCity3->font() );
378 cmdCity3_font.setBold( TRUE );
379 cmdCity3->setFont( cmdCity3_font );
380 QFont lblCTime8_font( lblCTime8->font() );
381 lblCTime8_font.setPointSize( 10 );
382 lblCTime8->setFont( lblCTime8_font );
383 QFont cmdCity1_font( cmdCity1->font() );
384 cmdCity1_font.setBold( TRUE );
385 cmdCity1->setFont( cmdCity1_font );
386 QFont lblCTime7_font( lblCTime7->font() );
387 lblCTime7_font.setPointSize( 10 );
388 lblCTime7->setFont( lblCTime7_font );
389 QFont lblCTime4_font( lblCTime4->font() );
390 lblCTime4_font.setPointSize( 10 );
391 lblCTime4->setFont( lblCTime4_font );
392 QFont cmdCity5_font( cmdCity5->font() );
393 cmdCity5_font.setBold( TRUE );
394 cmdCity5->setFont( cmdCity5_font );
395 QFont lblCTime3_font( lblCTime3->font() );
396 lblCTime3_font.setPointSize( 10 );
397 lblCTime3->setFont( lblCTime3_font );
398 QFont cmdCity9_font( cmdCity9->font() );
399 cmdCity9_font.setBold( TRUE );
400 cmdCity9->setFont( cmdCity9_font );
401 }
402 return ret;
403}
404
405void CityTimeBase::beginNewTz()
406{
407 qWarning( "CityTimeBase::beginNewTz(): Not implemented yet!" );
408}
409
410void CityTimeBase::slotNewTz(const QString &, const QString &)
411{
412 qWarning( "CityTimeBase::slotNewTz(const QString &, const QString &): Not implemented yet!" );
413}
414
diff --git a/core/settings/citytime/citytimebase.h b/core/settings/citytime/citytimebase.h
new file mode 100644
index 0000000..56606ee
--- a/dev/null
+++ b/core/settings/citytime/citytimebase.h
@@ -0,0 +1,60 @@
1/****************************************************************************
2** Form interface generated from reading ui file 'citytimebase.ui'
3**
4** Created: Sat Oct 12 11:23:02 2002
5** by: The User Interface Compiler (uic)
6**
7** WARNING! All changes made in this file will be lost!
8****************************************************************************/
9#ifndef CITYTIMEBASE_H
10#define CITYTIMEBASE_H
11
12#include <qvariant.h>
13#include <qwidget.h>
14class QVBoxLayout;
15class QHBoxLayout;
16class QGridLayout;
17class QLabel;
18class QToolButton;
19class ZoneMap;
20
21class CityTimeBase : public QWidget
22{
23 Q_OBJECT
24
25public:
26 CityTimeBase( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
27 ~CityTimeBase();
28
29 ZoneMap* frmMap;
30 QToolButton* cmdCity7;
31 QLabel* lblCTime9;
32 QToolButton* cmdCity8;
33 QToolButton* cmdCity2;
34 QLabel* lblCTime6;
35 QToolButton* cmdCity6;
36 QToolButton* cmdCity4;
37 QLabel* lblCTime5;
38 QLabel* lblCTime2;
39 QLabel* lblCTime1;
40 QToolButton* cmdCity3;
41 QLabel* lblCTime8;
42 QToolButton* cmdCity1;
43 QLabel* lblCTime7;
44 QLabel* lblCTime4;
45 QToolButton* cmdCity5;
46 QLabel* lblCTime3;
47 QToolButton* cmdCity9;
48
49public slots:
50 virtual void beginNewTz();
51 virtual void slotNewTz(const QString &, const QString &);
52
53protected:
54 QVBoxLayout* CityTimeBaseLayout;
55 QGridLayout* Layout2;
56 bool event( QEvent* );
57 QWidget* buttonWidget;
58};
59
60#endif // CITYTIMEBASE_H
diff --git a/core/settings/citytime/citytimebase.ui b/core/settings/citytime/citytimebase.ui
deleted file mode 100644
index a17b92e..0000000
--- a/core/settings/citytime/citytimebase.ui
+++ b/dev/null
@@ -1,1199 +0,0 @@
1<!DOCTYPE UI><UI>
2<class>CityTimeBase</class>
3<comment>*********************************************************************
4** Copyright (C) 2001 Trolltech AS. All rights reserved.
5**
6** This file is part of Qtopia Environment.
7**
8** This file may be distributed and/or modified under the terms of the
9** GNU General Public License version 2 as published by the Free Software
10** Foundation and appearing in the file LICENSE.GPL included in the
11** packaging of this file.
12**
13** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
14** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
15**
16** See http://www.trolltech.com/gpl/ for GPL licensing information.
17**
18** Contact info@trolltech.com if any conditions of this licensing are
19** not clear to you.
20**
21** $Id$
22**
23*********************************************************************</comment>
24<author>Trenton Schulz</author>
25<widget>
26 <class>QWidget</class>
27 <property stdset="1">
28 <name>name</name>
29 <cstring>CityTimeBase</cstring>
30 </property>
31 <property stdset="1">
32 <name>geometry</name>
33 <rect>
34 <x>0</x>
35 <y>0</y>
36 <width>285</width>
37 <height>359</height>
38 </rect>
39 </property>
40 <property stdset="1">
41 <name>caption</name>
42 <string>City Time</string>
43 </property>
44 <property>
45 <name>layoutMargin</name>
46 </property>
47 <property>
48 <name>layoutSpacing</name>
49 </property>
50 <vbox>
51 <property stdset="1">
52 <name>margin</name>
53 <number>0</number>
54 </property>
55 <property stdset="1">
56 <name>spacing</name>
57 <number>3</number>
58 </property>
59 <widget>
60 <class>ZoneMap</class>
61 <property stdset="1">
62 <name>name</name>
63 <cstring>frmMap</cstring>
64 </property>
65 <property stdset="1">
66 <name>sizePolicy</name>
67 <sizepolicy>
68 <hsizetype>7</hsizetype>
69 <vsizetype>7</vsizetype>
70 </sizepolicy>
71 </property>
72 </widget>
73 <widget>
74 <class>QLayoutWidget</class>
75 <property stdset="1">
76 <name>name</name>
77 <cstring>Layout2</cstring>
78 </property>
79 <property>
80 <name>layoutMargin</name>
81 </property>
82 <property>
83 <name>layoutSpacing</name>
84 </property>
85 <grid>
86 <property stdset="1">
87 <name>margin</name>
88 <number>4</number>
89 </property>
90 <property stdset="1">
91 <name>spacing</name>
92 <number>3</number>
93 </property>
94 <widget row="0" column="2" >
95 <class>QToolButton</class>
96 <property stdset="1">
97 <name>name</name>
98 <cstring>cmdCity7</cstring>
99 </property>
100 <property stdset="1">
101 <name>sizePolicy</name>
102 <sizepolicy>
103 <hsizetype>5</hsizetype>
104 <vsizetype>1</vsizetype>
105 </sizepolicy>
106 </property>
107 <property stdset="1">
108 <name>font</name>
109 <font>
110 <bold>1</bold>
111 </font>
112 </property>
113 <property stdset="1">
114 <name>focusPolicy</name>
115 <enum>TabFocus</enum>
116 </property>
117 <property stdset="1">
118 <name>text</name>
119 <string></string>
120 </property>
121 <property stdset="1">
122 <name>toggleButton</name>
123 <bool>true</bool>
124 </property>
125 <property stdset="1">
126 <name>toggleButton</name>
127 <bool>true</bool>
128 </property>
129 </widget>
130 <widget row="2" column="3" >
131 <class>QLabel</class>
132 <property stdset="1">
133 <name>name</name>
134 <cstring>lblCTime9</cstring>
135 </property>
136 <property stdset="1">
137 <name>sizePolicy</name>
138 <sizepolicy>
139 <hsizetype>5</hsizetype>
140 <vsizetype>1</vsizetype>
141 </sizepolicy>
142 </property>
143 <property stdset="1">
144 <name>font</name>
145 <font>
146 <pointsize>10</pointsize>
147 </font>
148 </property>
149 <property stdset="1">
150 <name>text</name>
151 <string></string>
152 </property>
153 <property stdset="1">
154 <name>alignment</name>
155 <set>AlignVCenter|AlignRight</set>
156 </property>
157 <property>
158 <name>hAlign</name>
159 </property>
160 </widget>
161 <widget row="1" column="2" >
162 <class>QToolButton</class>
163 <property stdset="1">
164 <name>name</name>
165 <cstring>cmdCity8</cstring>
166 </property>
167 <property stdset="1">
168 <name>sizePolicy</name>
169 <sizepolicy>
170 <hsizetype>5</hsizetype>
171 <vsizetype>1</vsizetype>
172 </sizepolicy>
173 </property>
174 <property stdset="1">
175 <name>font</name>
176 <font>
177 <bold>1</bold>
178 </font>
179 </property>
180 <property stdset="1">
181 <name>focusPolicy</name>
182 <enum>TabFocus</enum>
183 </property>
184 <property stdset="1">
185 <name>text</name>
186 <string></string>
187 </property>
188 <property stdset="1">
189 <name>toggleButton</name>
190 <bool>true</bool>
191 </property>
192 <property stdset="1">
193 <name>toggleButton</name>
194 <bool>true</bool>
195 </property>
196 </widget>
197 <widget row="1" column="0" >
198 <class>QToolButton</class>
199 <property stdset="1">
200 <name>name</name>
201 <cstring>cmdCity2</cstring>
202 </property>
203 <property stdset="1">
204 <name>font</name>
205 <font>
206 <bold>1</bold>
207 </font>
208 </property>
209 <property stdset="1">
210 <name>focusPolicy</name>
211 <enum>TabFocus</enum>
212 </property>
213 <property stdset="1">
214 <name>text</name>
215 <string></string>
216 </property>
217 <property stdset="1">
218 <name>toggleButton</name>
219 <bool>true</bool>
220 </property>
221 <property stdset="1">
222 <name>toggleButton</name>
223 <bool>true</bool>
224 </property>
225 </widget>
226 <widget row="5" column="1" >
227 <class>QLabel</class>
228 <property stdset="1">
229 <name>name</name>
230 <cstring>lblCTime6</cstring>
231 </property>
232 <property stdset="1">
233 <name>font</name>
234 <font>
235 <pointsize>10</pointsize>
236 </font>
237 </property>
238 <property stdset="1">
239 <name>text</name>
240 <string></string>
241 </property>
242 <property stdset="1">
243 <name>alignment</name>
244 <set>AlignVCenter|AlignRight</set>
245 </property>
246 <property>
247 <name>hAlign</name>
248 </property>
249 </widget>
250 <widget row="5" column="0" >
251 <class>QToolButton</class>
252 <property stdset="1">
253 <name>name</name>
254 <cstring>cmdCity6</cstring>
255 </property>
256 <property stdset="1">
257 <name>sizePolicy</name>
258 <sizepolicy>
259 <hsizetype>5</hsizetype>
260 <vsizetype>1</vsizetype>
261 </sizepolicy>
262 </property>
263 <property stdset="1">
264 <name>font</name>
265 <font>
266 <bold>1</bold>
267 </font>
268 </property>
269 <property stdset="1">
270 <name>focusPolicy</name>
271 <enum>TabFocus</enum>
272 </property>
273 <property stdset="1">
274 <name>text</name>
275 <string></string>
276 </property>
277 <property stdset="1">
278 <name>toggleButton</name>
279 <bool>true</bool>
280 </property>
281 <property stdset="1">
282 <name>toggleButton</name>
283 <bool>true</bool>
284 </property>
285 </widget>
286 <widget row="3" column="0" >
287 <class>QToolButton</class>
288 <property stdset="1">
289 <name>name</name>
290 <cstring>cmdCity4</cstring>
291 </property>
292 <property stdset="1">
293 <name>sizePolicy</name>
294 <sizepolicy>
295 <hsizetype>5</hsizetype>
296 <vsizetype>1</vsizetype>
297 </sizepolicy>
298 </property>
299 <property stdset="1">
300 <name>font</name>
301 <font>
302 <bold>1</bold>
303 </font>
304 </property>
305 <property stdset="1">
306 <name>focusPolicy</name>
307 <enum>TabFocus</enum>
308 </property>
309 <property stdset="1">
310 <name>text</name>
311 <string></string>
312 </property>
313 <property stdset="1">
314 <name>toggleButton</name>
315 <bool>true</bool>
316 </property>
317 <property stdset="1">
318 <name>toggleButton</name>
319 <bool>true</bool>
320 </property>
321 </widget>
322 <widget row="4" column="1" >
323 <class>QLabel</class>
324 <property stdset="1">
325 <name>name</name>
326 <cstring>lblCTime5</cstring>
327 </property>
328 <property stdset="1">
329 <name>font</name>
330 <font>
331 <pointsize>10</pointsize>
332 </font>
333 </property>
334 <property stdset="1">
335 <name>text</name>
336 <string></string>
337 </property>
338 <property stdset="1">
339 <name>alignment</name>
340 <set>AlignVCenter|AlignRight</set>
341 </property>
342 <property>
343 <name>hAlign</name>
344 </property>
345 </widget>
346 <widget row="1" column="1" >
347 <class>QLabel</class>
348 <property stdset="1">
349 <name>name</name>
350 <cstring>lblCTime2</cstring>
351 </property>
352 <property stdset="1">
353 <name>sizePolicy</name>
354 <sizepolicy>
355 <hsizetype>1</hsizetype>
356 <vsizetype>1</vsizetype>
357 </sizepolicy>
358 </property>
359 <property stdset="1">
360 <name>font</name>
361 <font>
362 <pointsize>10</pointsize>
363 </font>
364 </property>
365 <property stdset="1">
366 <name>text</name>
367 <string></string>
368 </property>
369 <property stdset="1">
370 <name>alignment</name>
371 <set>AlignVCenter|AlignRight</set>
372 </property>
373 <property>
374 <name>hAlign</name>
375 </property>
376 </widget>
377 <widget row="0" column="1" >
378 <class>QLabel</class>
379 <property stdset="1">
380 <name>name</name>
381 <cstring>lblCTime1</cstring>
382 </property>
383 <property stdset="1">
384 <name>sizePolicy</name>
385 <sizepolicy>
386 <hsizetype>1</hsizetype>
387 <vsizetype>1</vsizetype>
388 </sizepolicy>
389 </property>
390 <property stdset="1">
391 <name>font</name>
392 <font>
393 <pointsize>10</pointsize>
394 </font>
395 </property>
396 <property stdset="1">
397 <name>text</name>
398 <string></string>
399 </property>
400 <property stdset="1">
401 <name>alignment</name>
402 <set>AlignVCenter|AlignRight</set>
403 </property>
404 <property>
405 <name>hAlign</name>
406 </property>
407 </widget>
408 <widget row="2" column="0" >
409 <class>QToolButton</class>
410 <property stdset="1">
411 <name>name</name>
412 <cstring>cmdCity3</cstring>
413 </property>
414 <property stdset="1">
415 <name>sizePolicy</name>
416 <sizepolicy>
417 <hsizetype>5</hsizetype>
418 <vsizetype>1</vsizetype>
419 </sizepolicy>
420 </property>
421 <property stdset="1">
422 <name>font</name>
423 <font>
424 <bold>1</bold>
425 </font>
426 </property>
427 <property stdset="1">
428 <name>focusPolicy</name>
429 <enum>TabFocus</enum>
430 </property>
431 <property stdset="1">
432 <name>text</name>
433 <string></string>
434 </property>
435 <property stdset="1">
436 <name>toggleButton</name>
437 <bool>true</bool>
438 </property>
439 <property stdset="1">
440 <name>toggleButton</name>
441 <bool>true</bool>
442 </property>
443 </widget>
444 <widget row="1" column="3" >
445 <class>QLabel</class>
446 <property stdset="1">
447 <name>name</name>
448 <cstring>lblCTime8</cstring>
449 </property>
450 <property stdset="1">
451 <name>sizePolicy</name>
452 <sizepolicy>
453 <hsizetype>5</hsizetype>
454 <vsizetype>1</vsizetype>
455 </sizepolicy>
456 </property>
457 <property stdset="1">
458 <name>font</name>
459 <font>
460 <pointsize>10</pointsize>
461 </font>
462 </property>
463 <property stdset="1">
464 <name>text</name>
465 <string></string>
466 </property>
467 <property stdset="1">
468 <name>alignment</name>
469 <set>AlignVCenter|AlignRight</set>
470 </property>
471 <property>
472 <name>hAlign</name>
473 </property>
474 </widget>
475 <widget row="0" column="0" >
476 <class>QToolButton</class>
477 <property stdset="1">
478 <name>name</name>
479 <cstring>cmdCity1</cstring>
480 </property>
481 <property stdset="1">
482 <name>sizePolicy</name>
483 <sizepolicy>
484 <hsizetype>5</hsizetype>
485 <vsizetype>1</vsizetype>
486 </sizepolicy>
487 </property>
488 <property stdset="1">
489 <name>font</name>
490 <font>
491 <bold>1</bold>
492 </font>
493 </property>
494 <property stdset="1">
495 <name>focusPolicy</name>
496 <enum>TabFocus</enum>
497 </property>
498 <property stdset="1">
499 <name>text</name>
500 <string> </string>
501 </property>
502 <property stdset="1">
503 <name>toggleButton</name>
504 <bool>true</bool>
505 </property>
506 <property stdset="1">
507 <name>toggleButton</name>
508 <bool>true</bool>
509 </property>
510 </widget>
511 <widget row="0" column="3" >
512 <class>QLabel</class>
513 <property stdset="1">
514 <name>name</name>
515 <cstring>lblCTime7</cstring>
516 </property>
517 <property stdset="1">
518 <name>sizePolicy</name>
519 <sizepolicy>
520 <hsizetype>5</hsizetype>
521 <vsizetype>1</vsizetype>
522 </sizepolicy>
523 </property>
524 <property stdset="1">
525 <name>font</name>
526 <font>
527 <pointsize>10</pointsize>
528 </font>
529 </property>
530 <property stdset="1">
531 <name>text</name>
532 <string></string>
533 </property>
534 <property stdset="1">
535 <name>alignment</name>
536 <set>AlignVCenter|AlignRight</set>
537 </property>
538 <property>
539 <name>hAlign</name>
540 </property>
541 </widget>
542 <widget row="3" column="1" >
543 <class>QLabel</class>
544 <property stdset="1">
545 <name>name</name>
546 <cstring>lblCTime4</cstring>
547 </property>
548 <property stdset="1">
549 <name>font</name>
550 <font>
551 <pointsize>10</pointsize>
552 </font>
553 </property>
554 <property stdset="1">
555 <name>text</name>
556 <string></string>
557 </property>
558 <property stdset="1">
559 <name>alignment</name>
560 <set>AlignVCenter|AlignRight</set>
561 </property>
562 <property>
563 <name>hAlign</name>
564 </property>
565 </widget>
566 <widget row="4" column="0" >
567 <class>QToolButton</class>
568 <property stdset="1">
569 <name>name</name>
570 <cstring>cmdCity5</cstring>
571 </property>
572 <property stdset="1">
573 <name>sizePolicy</name>
574 <sizepolicy>
575 <hsizetype>5</hsizetype>
576 <vsizetype>1</vsizetype>
577 </sizepolicy>
578 </property>
579 <property stdset="1">
580 <name>font</name>
581 <font>
582 <bold>1</bold>
583 </font>
584 </property>
585 <property stdset="1">
586 <name>focusPolicy</name>
587 <enum>TabFocus</enum>
588 </property>
589 <property stdset="1">
590 <name>text</name>
591 <string></string>
592 </property>
593 <property stdset="1">
594 <name>toggleButton</name>
595 <bool>true</bool>
596 </property>
597 <property stdset="1">
598 <name>toggleButton</name>
599 <bool>true</bool>
600 </property>
601 </widget>
602 <widget row="2" column="1" >
603 <class>QLabel</class>
604 <property stdset="1">
605 <name>name</name>
606 <cstring>lblCTime3</cstring>
607 </property>
608 <property stdset="1">
609 <name>font</name>
610 <font>
611 <pointsize>10</pointsize>
612 </font>
613 </property>
614 <property stdset="1">
615 <name>text</name>
616 <string></string>
617 </property>
618 <property stdset="1">
619 <name>alignment</name>
620 <set>AlignVCenter|AlignRight</set>
621 </property>
622 <property>
623 <name>hAlign</name>
624 </property>
625 </widget>
626 <widget row="2" column="2" >
627 <class>QToolButton</class>
628 <property stdset="1">
629 <name>name</name>
630 <cstring>cmdCity9</cstring>
631 </property>
632 <property stdset="1">
633 <name>sizePolicy</name>
634 <sizepolicy>
635 <hsizetype>5</hsizetype>
636 <vsizetype>1</vsizetype>
637 </sizepolicy>
638 </property>
639 <property stdset="1">
640 <name>font</name>
641 <font>
642 <bold>1</bold>
643 </font>
644 </property>
645 <property stdset="1">
646 <name>focusPolicy</name>
647 <enum>TabFocus</enum>
648 </property>
649 <property stdset="1">
650 <name>text</name>
651 <string></string>
652 </property>
653 <property stdset="1">
654 <name>toggleButton</name>
655 <bool>true</bool>
656 </property>
657 <property stdset="1">
658 <name>toggleButton</name>
659 <bool>true</bool>
660 </property>
661 </widget>
662 </grid>
663 </widget>
664 </vbox>
665</widget>
666<customwidgets>
667 <customwidget>
668 <class>ZoneMap</class>
669 <header location="local">zonemap.h</header>
670 <sizehint>
671 <width>200</width>
672 <height>400</height>
673 </sizehint>
674 <container>0</container>
675 <sizepolicy>
676 <hordata>7</hordata>
677 <verdata>7</verdata>
678 </sizepolicy>
679 <pixmap>image0</pixmap>
680 <signal>signalTz(const QString &amp;, const QString &amp;)</signal>
681 <slot access="public">slotIllum(bool)</slot>
682 <slot access="public">slotZoom(bool)</slot>
683 </customwidget>
684</customwidgets>
685<images>
686 <image>
687 <name>image0</name>
688 <data format="XPM.GZ" length="197524">789cc4bdd772e34ab6ae7bbf9ea263e16ec5096c7973712e442f2fca5066c7be8025e8404f82da2f7f3273fcff20c45255cd9ea64f7760b23e024c9fc36526f4bffee75f6f0fb7fffa9ffff55ff345b0e845ff8ab260f6afff8997a3d1e67fff9ffff7fffed77f1fededfdebc05e07e707ff3af8efffe7bffe3b4aff15fdcbdb33ffdb3fb39c2ec887fb96e3087cb4bf67793c201f9c5b0e1ec1677bee7ed822cbf3c944d9a53f69930fdcfda8098ee4f7d991b27b3ede9025bd75872cf9373fc887529e27e1fd3d492f682bbbf4bc2a59ca138cc9529ec903f9c8d57fd8051fa17e4db2fcdeab91e5f7f1a7b22b4f780d46fbaca660d47790081fa0bc9f6764f9fde6068cfc0728cf01d2f39ec892ffec108cf4d7f8fde19eb45f9a3b36bd23fddbe8928f02777f4e3e76e363d604b33e9760f4e7ea992cf7177b64e98f690f8cfecb1764793e2f844dfd5c7af33159ee8ff03cebbb7e5576cf0f62b294675903a3feab1659f29f3c29bbe73f376469bfd695f021c6c700ed7188feaef7c128cf12e53f42ffad0330faabf96ed98eb63475edb10023bff12959fa231b9065fccd2ac21c0fe10559da773e25cbf3f13518e3d1e3efcf24fd8b5b30f20f5fc8727f3e5496fc9ec952fe7e57f810e5f944fdd83e9f8764493fe7f3ecaf09599eaf8ec892de2a07a3bffaa9f011e6e7ba0d46fbe7efca2ebd9a3c6f66c3e9a14b9f7c24e37b5a05637c0613b2dccfdec1189fe32159daa7be4796f6a8497f9af122ed9f57c018bffd108cfa0d911feb37dd234bfdfad764997f952559f29b838fd0fee34730e64f2f26a3fd5fc148bf3e5696fe43fb1c433e3402f0b1b46ffd982cf7ab48eff85ceea72e3d333ad1bec3028cf64c783f121e84e41357bfe041f810fd9be56469efe0932ceddb7c261fbbf4ba2bb2b44fbc00531eef9125bde246d9d5bf9290a5bd7bfb60c8d3f4912cbfcf3764298fd75076e5194dc9529ee0058cf65f307d8ca7f5a9b28cff0959d25f5f90a57cc5bb30e743109025bd694bd9a5d778214b79d2148cf1d9bb214bf93fd11f47d0df692c7c8cfc8673f0b1ccdf06ca777c8ef183f63f8ee57ed7c97f636ea03d920e18f5a92f850fa17fa615b28c8f469f7c1abaf6be071f49fb2443b28c87ca2df9c4716345167910cfc1d45763b2b4d7724096f4e76f6429afa7bf97fc965764296ff64a96fa2e593ef46fb343c6f8699225fdd654d9a5df3f163ec2fc5c4cc8f2fbe593b28c3f94ef08f65ad12523ff6bb2fcbef1a42cf9dd90a53eb31a18f2ba774686feb852167db422cb78acf695657cdf9225bf794696fa2f781ff269b8244b7a9348d9ddaf2664496f21f3e99ce375ec298bbc8cc892deb04686bd575576e9e523f031e4694a96df8f7df039e4d70559ee2f36e018f213e3e9e45ce475712e7cba0ff93d134e53e1aeebbfc3fd038c87e642f8d09820aeff7a60f457f3802ce33d3922cb78ec6560b47fccdf9fc9fc5adc81393f6365994f73b2e4e7cd94ddfdc93359f2ef2564c97fd817e678adf864c9ef739f8cf46a60c86faf4e467b5c9131ff3c30c65fda5076fd9f1d93213f06ca529e53b294273d5076f7eb73b2d4a7f108e6780dc892df22254b7e41ae2cf9b13e68ef0998e377345376e9ad33b2a47fd1274bfa953d6599cf9a1ef41bea67c6b3fbfdac4796f45a3764c8939c8cfe417b1f9fcbfd469b2ced93a3fec7b1a47f714686be8dc852de02e3f3641ff3e95d599eef8031ffe647cad21e0f60e89f5ea82cfaa94ac6fc7d5376bfaf3f81313febe7caeef7eb3a19f6d38bf0e9bedc1fd7c89087b7c2692adc75f2ffd0e803990ff501f9cccdb7f10959c653510163fe345265f7bcbf20cbfcf77365b93f23c31e92f960f403f469a6ecfaabda214b7ed95059d28bc8925ffd5159f4f10359f28b0a30f489774896fc2f5acaee7e5127e3f70918f3353a26cbf84a3fc992defc4359c6fb9c2cf52998df9994bfb55076e59f0664c827b60fe667d6274bfee303b2e4df3f54167b94e9a1ff9257b2a4df45ff72be365f9545de5d9165be6dfaca222f5ec8927f0fe5e1fc1d256449ef624096f2ccf6c0e7f2fca64186ffd2264bfea39ab2f4e70519f56f29bbfb338c17cefff11d19f6fc5059fcaf902cf9d76e94c51eec90e10f15cae24fe8f3529e96a687f120f3f99cf265305576f90f32b2e43fa82b4b7f60bc51fe2c7d65b117f97bd80353f4c709da735e5116fb84e9419e64ca529e19fad7c813493f06c3de6ebd9111af5a2b8b3cc4f3690a7b2d22c37eba5096fafb64296fd821cb78f5ddf83b52fded4f8439ff570559eed7d760d81f9b800cf9b15276bfafb7c9f2fb0519f3797c44167994be9191de81b2cce70bf2f991931f6764497f7d09c67cee75c9327e8a3b65773f9c9325bd6241867f5711e67c0d2e94c53ea99125fd68ac2cfed63359d20b1be063e98ff11919f6415559e6db3b19f6fa8c2ced5f63798e215fd17f9cdff3736597de8af9637e7fde288b7ec778e07ccde7ca321f3d32cadb5196f938254bfae395b2d8a34b61ced7a44f96fcb25365f77ce09125bfe158d9ddaf1d91211f6aca521ffe1ef2334dc892dfa2af2cf2e8810c7ffc4559ee0fc8925f88f63b813f508c945d7e454496fcaa17caa2efeec8925fb65096faf5c0901f0b65941ff99fa23d1b7764dc477a942721ef439ed53d32e4f3abb2f8bf28ff29ecab75830cfbee130c79d77a5516fbeb830cf98cf97c06f9d728c8682ff4ff19e4dde6168cf6ad67c2947f2b9f0cfff3932ce51b6dc8323f2ea4fd02da0fdd3e18fabc9b9345fea4cf64f8fb32bf8263d853e92b599e8ffbca4e5ec55db2c897fe800c797a0fc678eb0f95c57e3b204b7e8b4765977ed5274bfaa9fe5ed2ff9c81319e3653b2cc0faf45467d06ca2efda5fe5eeab7395476f7d72cffb9e41fb3bc9017930a59eab79a298bfdb221cb7caa9c2bcbfcd7fb90779a3ee2455764c86bf417e5c5c5882ce9e72d65d13f7db2a49f2f955dfa952332ec79948ff2242ec8f0bfb62cf3774e96fc070fca62efb13ce8df55872cf569be80212f862bb2e4d77d55167d744b96fc96e7caa20ff5bee4d7bf5276f59b37c0e8afe05559d23f25e3f7b7caeef7b9d80701e55174a1ecda6b724b863d365616fdb44f86bff948867fd3204bfe6106a67df44696fc860b32fcdd2332c6c7842ce94f1230fcc70ad3873c9f9c9225bdd93119f67b0886bcfb8cc9f2fce6832ccf17d7c26768af39e6f319e4f30afd734679ef7e7f7c40f9d198828fcf23371e7db2dccfc660daef2119f264a0ecfa2f699065be2f4e9445deec9131df47ca2eff5a420edcfd614e86fd47c6fc4eeec8884f0dc9927f559f477e3159d2abd684399fd73919f6e4922ce9559e9445be8dc958bfcbc098bf69932ce363b165e94ffe1ef3f7f34859f2bf2023ff4f32e2f57530e6737caa2cfaf78d0cf91129cbf89990a1bf9ec9925f7eaf2cf26c4396f66c0dc8909f7c1ef37fd65296f9f94e86bd7ba52cfe34f3877c182d955dfe337d5ecab7667ba07f9be764f4475ff814f27c3e5296fe3921233e9829cb7c5f91a53cd33765579ecd0359daa77946c6fa1fc623e547af4586bc3f5716793f204b79aa7a1ff36f4996f2788fcae26f8dc9982f183fb4b7364b65f15f5ec9529eda87b2e85f9607e3e7e25459fab34746fbec2b4b7bd4c9d23e39e637e5d9f89a8c78c6bdb2c4ff597e8c9751ac2ce3fb4098f65f744b467b42be511e7ebe29cbfa668d2ce5a956c8529efc058cf6fa44f9cf604fafe764c8f38ef039ca5393f632f64de0e45b3d25433fdf8363699f2823cb785ee8fde8d8f11319f25bca63ec0bf89ff7ca2ebfe69a2cf2343e2363bded018cf157dc92a53fd71365917715b2ccbfd11559f2af8d94459ec764c9bf182bbbfb594a0e63371ffb64c427f7c1187f714886bdc1fa425e5d44cae2efcfc952beea89b2cb7f7c48c6fa47074cff735f59fc4fb60fe4d35cef4b79c6ac1fe453b05696fb6c4ff4efe7b5b22bcfe0890cf92ee353ed99784286fddd264b79962365975fff8e2ce5496e95ddfd6e932ce5493e955d79d26b32fae3088cf991f9ca323f981fe4d7aaa22cf6679d2ce51d9e2a4b79591f8eaf1b65b11f94a5bcf90319f27e09c67cdd4464c46753b2946f5a288bfed7df637dca53167dccfc31ded62d6577bfc7fad35ec17ca33c9b4ec9f0ff1f9525fec1f6c4f80ab62cfa86ed83f155cf95a57d1a64699f19cb83f19443bea8bfac0cfd744c96fe1d0764c47b06cae27fbd91a5bc83a5b22bcf28224b799ba8ff19e3057b64c85b5f59f4cb0119f6f5bbb2c4933664c9af1882195f6d91e11f27cad2dfb764d8479fcaa27faa60f4d76757f81cf37189fccf519f02f3f71cfaa1e1daeb44edcd2e98f6e5a2410e45debf2b3b79d8d4fb22ffe77a1ff27f0386bc5d4ec990f7e7caeefea24a96fc92bab2cb2f5c9325bfe69db2bbefcfc918df2330edfd0765d1ff4db28cc75eaaeccab362f961efa7beb2bbef6bfa689f58d99567119151de7d65773fbe27c39f617a984f9f4f64297ff74c59e2032159ca3f59288bbfc4f689a5fcd3a6b2e8fb822ce5f79f9545dfb1bd313ee24361cafbfa0319f18c2a19f19696b2f85f4f64e89f4259ea9392a53e5e57d995b7abbf97fa7c2e94dd7d2f21c3be45ff51be476b32ca575516f9f84a96f279c7ca222ff479f817a9b2cb3fbf234bf95667caee7e634c96f6f65664ec8f63f930ffb31e19fe4740863dbb5176e50b876429ffa0adecee5fccc9d0efbeb22b5fa2e9617ebe91111f3c01435f041d32f4c54059fc17f61ff4457aa5ecca93bd90a5bcfd4cd9dd1f3c92115fbc57167b44d3837db4274cfd30ed92a57c9b2b65f11feec8586f4d94653c7e92a1ef7d6569cf942ce51b5c2bcb789890614fe760fa5727ca629f0fc8f0f72265f1173a64e8ff6b65d1bf0b32e2bbb7caee7eed812ce56d7864d827187fd43f459f8cf5ea6b65f13f0332e27b4365591fbb20c3bf7a22a3bfa03fce389e6232f469ae2cfaac49867ff9ac2cfe25db13e3677a4f46fb63fe9d233e57bf5116fb4b19ebc785b2dc0fc9d0b71565b137347dac5723ff73ee4f6992e14f8e94459e7e92b11f0aed7f8ef8dc6c4ac6fafe868c78df5259ec872119e31ff2ec1ceddd833c08b85e74a5eceeb7d0bee101f6fbc87c54ff6e5113a63db0e890e10fd6c1d0dff1982cf7fd776577bfd620c7723f234b7e5e0f0c79b578258bbcaa2e94453f4fc9d06f89b2d80b2959cae3dd2acbfd980c7fb405863caa9d28bbfca29c2ce5f1c7ca529e908cf204ca2ebf19eb0f7fba3e5596f27864acf748ffa8ffe46564ac1ff7945dfed543b2946f73a12cfee63119e57b50167baf4a46ff0dc9529ecd040c79345c9361bf7c288b7c8dc9b05f96caa28f4ec852de40ef4b79bb7a1ffa342263bfff080cf914337fe8c7d99bb294e7920cfb63a9ecf26bb17e186f599d2cf9a70519fdc3f683fc5a35c9588fd9b2c42f72b2946fd85396f5b657b2942f7c5276e59b6dc852bee64c59eca30519f6bed8dfea1fcd2e9545ffde93e14f46cae26f1e92a19f17ca2ebf8b0a59ca53cb9525bed225a3bf8ec0908fd1a1b2c8bb3732f6ef1c288b3f3423233eeb298b3ed0fbd0e70365f1cf347da9cf455d59e2452c2fc6e3469f97f95163fbd19e9b83e9df2764ac575d90a5bc514b59eccd2119f37bad2ce395fd87f1ba0a945d79e737649407e353f52dfb13e3336a90113f4a95c53ede90a53c134f59f4ef0719f379cbae3c9fec2fea0f945ff5e9a9b2ec476b91a53ce38eb28ccf828cf97ca32cf6c73559ca9355c8680ff417f5ef608f8cf5d40365b1770ec9d81f74a22cf615cb8bf17571ac2cf18f902cf9afd0bed4e7d11d19fb95efc9386f72a82cf1a39c2ce5b9785196f6d907237ebd7e57167b93ed037b6b33579678d83319e977c9904f6db2d46782f60c604f557232f253c6fa41a12cf61dc67710c03e86fe0b12c4cbf07c7880fdbc536591aff764ec97417b8427d80fff41c67905e8b33080bd83f998a6287f4c867de6c6ffe9e1c939ec932e19f6491f0cf9bb08c9d0a797caa2cf0764d84bcf64a4df23c35e06535f0f876449af1f90613fe87d496f9190b17f6209867cebc664493fb9244bf9c38db2d87b6f64c92fce94a57e1764d807cc1fe3b3fa4286ff14288bbc5d93a53dbb756589ff3e91a17f3d6597fff2992ce54b6764ec4f5980195f7953167f7a4c96f275dbca22cf5a64295f63a62ce55b91a57c9f7bcaae7c05cb87fecf3a64d89b5361eadfc140d9956ff242c6faf1908c78cf4859e26f0bb29467d55676e519b6c8b05fd0fed4a7d14a59ec910a19f6c93b59cab33c5596f1744396f2f59764ec1fac8121efd6a9b2c4ef1b64d8733332f4e389b2c4cfcec9d08fb1b22bcf94e5c3f81a4f95a5ff8ec8d8dfcefb5c0f7e24637f7ca82ceb056332faef4c59e21f4f6429df66a62cf67a44863d3750967852872ce59ba17ef4579b2b32ca1b92117fd1e7a57cabb5b2bbdfa893d19ffbca127fd1f4a57cad3bb28ca7cd1319faf6100c7d9ab6c988cfaf95453eb4c8d03737ca626f7864d89f97ca62affb64c4e34ec9523eaf20437fb13e187f514d59f407eb8ff1377a5616fbe89e8cfd1d81b2c48b347dc49bc9184f3dd61fe36978a22ce399e9613c5d1c294b7c654cc678bf264bfdd790bfd4c7618f8c784b5759f4ed862ce5697acae2dfbd93610f1e80113fc823b2e8dbf05e59e26f2959f2af79ca627f3c90913fe445007d1db23eb017ea1d65b127987e80fd627c1ef6c46245c6f9bdb5b2d8eb4f649407cc78c8649f8cdf1f2bcb7ada1159f2af8f94253e73053e91f84bf4a82ce59b91b15fada52cfdf349463c13fd4f7b66caf2a27d366b6591a7e88f10edf13927e3f92365292fca43fb68b626a3fe736529ff1119e759dfc9d89f25fa23a43d525d81313fbb1118fa7cea93e3c4c98f7732d6a32760c8c7e48a2cfaae3b5276e97d5e92612f1d2abbfbf92d59d21fa1bcf46f932659e657724d96fcf20b6597dee88d2cf9452764e8bf1c0cf9d57f2763fde94559e46f9f2cf9d526ca22dfeec892fee0030c79145f91213ff53eecaf4f32e21d7a5ff2afec9325ffca48d9e53f1892a5be3dd61ffdf5790c867c4b2fc9224f6a2fcaa24ff7c858ffdf90b15e31509678c7940cff3c224b793ed97ee8df3eea437f336f90a53cd1a5b2ec975892a5fd46afca92ff2959ca57a9298bfed6f4a4fd96b7cad27ee764d8631918f2721393b1be169011df4895c55e9c93b1feaee94979d75532ecc7576529ef1119e57d274bf95a981fd4876bd617fab03f5196fd1d2f64294fe54e59daef8c8c78cbb3b294674496f6aa0ec9d84fd003733fdfa7b2aca7b0bda06f972b65991f6c0feee7f395459f2fc88817bd2bcbfce4f8c1785ced91e17f883c0da98fb31332ec812619eb67a7caa2ef5764f82f1d6569df828cfd455565579e4d9d0cffe58a0c79fa00c6781b3595257ed423633dea52d9e51f307d8cc7eabbb2b41febcf785b9b8cf982f6a57e5f1c92717e305796f274c9d89fb2a72cf613db23c07eff9ab2ec77c07ca63dd08a94c59e66fd12e8f389b2c4abf43eec43d63fc17ed567658917a1feb4278a1519f652a42cf65448c679af4765193ff764d88f7a1ff14f8c2fda13cb5059c6db822ce90f67caa2cfafc992fe04ed4bfb6271a92cf649858cf35dac1ffa6780fe547b03f23742fd2ece95a57d30de687f4c4664d84797ca62afdd91b1bfb950167b668f8cf5cb6332cedb7e2a4bfbb9fe3e53ffba9b91451ed6bb6489b75c3c91b11f810cfd3cf5c8a28fba21599eaff03ee45da28c78cc4cd9a5179d9325bdea3559ca130764c4936a60c8abfa1919f6c64859fc65a60f7baaea298b7edd274bfe69870c799708533ff61fc9b02fce95451f55c888575495653dea842cf6daf2958cfddea81ff561ff4959e2c3fb64913fd3908cfaeb7dc44fcec8883765ca2eff16eb87fe5cadc838bf3805433f161f64ec7f7c54167b88e5817eecce945d7946ef64c8cb0b65590f5a90a5bc9b336529ef2559cadbd4fca43d9b5db28c9f44d387bd8ef940fd387f5496fd552d32eccb95b2e8f70d19e729f69565ff04db8bf6fb5ad995af32264bf9f32119fb95303ea84fa31919ef0b682bcbfee63a19fb93de95c59eb923e33cdab1b2b4f72d19feb6de97fa046f64c41bd01fd4a70b8f2ce5aba4ca128fec93a57cbda1b2c41f3ec958efa892d1be15b2e43fc6f8537dd9571679774d86fe3a5616ff7f8f8cf8edadb2c45f3232e2e1e84feacf755f59e4fb920cfd79ab2cf67641c67993a6b2c48bd89f09f6678d9565bf00ca437db9689161ff7595c55ef8244b7ed32b6577bf35244b7ef51e18fa74fe42c67ac4a3b2c4173664bc2fe34c59e60fd33f813e823ca53e0d4ec8d0a735b23cbf84bc0fd19e4bd4274279466d32f6933d83a18f43c803f5e7bb64f847556589c7f5c9189f0fca325e3ec838cf2eed13aafebb2763ff68050c7934fd24239eb80786bc985c9325bd7a5559f4d3922cf26c7d424e4edcfc1f91b19e83f4e9df855332fc8f2519eb0d2f64c97f38529678c30759e217b52a3911be22a7ae3cb34459e4ed06ccf59a1a19f6c85859f67ff2f7d057515f59f6e3a464e8eb9eb2bb9f9c92a5bd86976429af7744c67ac51c0c7d54c4ca529e0e59cad31c298bbfabf7a53cb5736559dff2c8529e4a43d995a7d1244bf93e5764ec7760ff41fff4d85fd03fb3bab2d85b8764296f7fa62cfa4759cadb8a95ddfdc60159ca9b56c8d84f89fea0fe594564c4132664eccfc9c8b0bf1e94255e35234b79066fcad27e4db29467d35176ed35d1f2c05e5980a18fb203658937b4c988d7acc8d2bec323b2947f744d46f93f95653d8ce5c378ac687e684fd617e3b1b1afecca3ff4c868df4730f455fd990cfdd4204bff8fee9425fea58cf973ad2cf3794896fc830118faa9c6e7a18f2a5b96f4efc9583fa92b4b7f633c515ff54664e8837b65f127dfc9d87f7345c67ee99c2ce51fa3bda97ffa1764e88f076549ff8c8cfa1c2bbbfc8a13b2e47781fe08e97fd7c958afd823e37c18fa23843d50f92043ffb7c9586f785396f39fac2fdabb1991218fd03ff427375d32f66ff860e8c7f10519fb1f301e23d46701a67f99e764ec9f8994657f6e8f0cfb527f2fe5dfbc90e1ffb9fadad747897ebaa881795e600286fe5a56c988272f858d7e71f7c385b21baf714e167d130d94455e3e80313f9367b2ccbfd92759d2f7af945dfad1902ce98785b2e8d77d30f48577a02ce397cf435f5c74c8220faafa7b294f375176f9872bb2942f592abbfb498d2ce5f38f94c55f6d81a10f821959e45372ae2ce725a664294f76a3ecf21bb0fdd05f4955d9dd9f4fc8529ede4059e2f73d61ea832c214bfb142959cad77f5376e5ebf964f873156597ff6c4ec6783a5276f72ff4f752beee9db2ecef60fe5cffdf23a37c3365d1f7af6429efa8a52cfa2a274b790797caae3c59832ce54d0332e22dac3fe47d764646fbed93b13f235216f9c8fc02295f3653167d744a867de42bbbf2f51ec952bec689b2bb5f1c93e1af9221efc22a59e4c5e79a8cf3496c3fe88b569f2cf5199e2bbbf2663532ec83a6b2bbbfee9211bfca955d79bbecdf04fb0d503eeaa3bcae2cfb0b6ec9d0b73d32e21567ca32dfa76429ffbcab2cfaf6950cfbfa4259ee9f90a5fca33119eb3bbc0ffd56657ed05fe32bb2946ffeaa2cf12a65d80337ca321ef43eda93f99f487922b617e3cf0365b1ff6a64c44bd6ca120f3b224b79aafa7b29cf7aa12cf1408c67fa7f8d0f65d177ec2ffad37d32fcd92b65592fb826c35e867e88d0ffcb0b65d9bf7a4c863e0e94e5fcf7848cfdfb4d65d9bfba0143ff6e86ca52fe3e19f1a71365b10794e1bf613c517f176b32eca95c59e23d900f11ec91568b8cf7e7bc9271de15fd17239e30817c8ae1ef579fc8386f84f68d196f91f112a9bf7a284c7d9d7f9245fe0e07caa24f8760c8cfe61159e4cfea5c59e453950cfdf7aa2ce97960e8d35a850c7dbfafeceefb7532d26b2b8b3db107e67eb71659e647fd5559ec934732f2d3e791df0d19f93595c51f15f91251ff250b32e2e16d65b1074664e477af2cf9adc9c8afaa2cf6d82518fa2cbb5696fc5764e88b86b2ec67f8204bfede5859fced9c8cfc5f94a5be2c2fe441ab20c3bfdf5396fd012c1ff5d781b2e437214b79bac7cae22f866494e74c59fcaf0e18fa69c5e7a99f9acab2dfe3882ce55d2e95657fe22159cabbbc5316ffef930c7bf952d9ddefb3bd1394f75459f623a03d19cf9b1f90b1ffae5096f8cb928cf589b9b2c4d7db64a9cf7aa52cfae2980c7fd65796f8c5882cf5691e2a4b7d1ec8187fbc0ff9b7627d20ffaa4b6589570764c8df2b65a91feb037d37b95776e59fe8efa57e17b1b2d4ef8d8cf17546c67e06f417f561dc5216ff8aed017db80894c5dfd4fb58bfbe5696fdb95532e6c35c59ec2165297fe3990cf983f94efd387e25e3fd0e97ca521e8f0c7f3b5416fb82e5c1f8dfe8efb13f08fd4dfd39fd204b7e6bbd2ff9550ec9f08fb62cfb2f3330f4e3e8932ce98dbbcad25e6332e25f3d30faa772af2cf1ef1919e59982d15e2d9697f18f7765d1efe2bf44d497f30e19f93d90719e0df9c7d0ffb3828cf533cc57ead3cf5b32ec2df44f0c7ba82ff64594c0ffbf70e32b50fff4e2044c7df6a62cf1b15330f493e72b8bbed823e3f73565895fdf0a53ff783764e89f4f65496f49467a1565594fe2efa16f8a07b2a4ef9f9391fe9db2dcdf9091feb5b2e8ef7730e64b75ae2cf91d90a15f5f94653eb13cd427fa3ce2114f64e47fa22cfe78138cf935e07de8871edb03fa21592b8b7ecfc9927ffcac2cfa83f5877e882f9445be5e09539e77f7c9925f912b8b7f3a254b7e595359e2012f64c96fd55596f58f1618f3b15e21633df45059fc697d1ef1990b65a97f4196f2543f94ddfdd12519e313fd45f91ab33e90a7d51e59dabfb2224bfed51919faf851d9e5573d2643ffb6c19097d32159f21bb1bdd0df9b7332ec1fcc4fcacb6843c6f9c36365592fcac09087ab4459d677f6c858ef3927239e3157167d1781210fe757648cd791b2f83ffc3de395a9b2946f46863fda5416ffaf4b867d119271be0cfd4f793a8cc890ff6b65896fed93b1ffef4559f417e415e56db1a72cfbbd1232ec8db1b2e8871b32fcc71365a90fcb03791d85cab2bebd24637de4942ce94d30be13d477b352167fb44146ff4ec028ef27da37c17aea6ca22cebcb4764fcfd12942f813ed9ec29cb7ac30919ed75a92cfa1ded9142ffb4d6643c8ff19b32febca72ce5b923e3f94259ce6f407fa4287f6b45c6f9815730e2d3d35b32fe3e83c817f5dfa63918faacdb50167921e5d9fa471fcae24f8ec0d4378f64c8bb180cf9d0ef9125bd60a12cef733806437ecf07643c3f5596f8a9e82fb5cfe70bb2c8a77ca02cf9f7c9a8cfb1b2c4e7f93ce4e9f2902ccfd72f95a5bc4f60e8c3594a46fdc53e30f61bf69b77c0f87de3168cf13ead29cb7a92de17f93446fb45186fc52119fb839ec9d80f22f233e2fcaf5c2a4bfcae4b86bf93298b3c7e24633d3400637e5d3494259ef64cc6fadb81b2c88353b2e4377b5596785f878cf833c61fe5c3f05659e41bcb8bf69b1f2b8b7cab90e19fde8369ff6f59e2435332d6afdaca12aff3c8927e21f222a27c5a3f2a4bff74c888ffc5caa22f3232fa674dc67903fe9ef1af2e19fec3b5b2accfeaf3925edd5796f640ff50de8581b2f89798cf946f832365799f418b8cfebf27233fa497c2fe8fde9465bd6f4ec6fee64f65592f3b25e3bc39fa93f232ae2bcb7af53e19fe42aa2cf24f19fa6002863e481265492f2323bdaeb2f8276764b4ff81b2c443d0ffdc8fba6279b17ed88f9465fffe1119f1f65365293feb9f227e112bbbfc7c977fa8fec7c5b5b0c68f8ec19047bd3e18f2a1910b53fead6ec0987fb5028cdf77ab60fcfe2211a67c4b6660cce7cd3b19fb39eb60ccc78b1b65896fbe91112f1d9345beae9fc992df300463fc5d0cc9f8fda330e5df305596fd9fd764f8efafcaeef7171f64496fd40363be4ddfc9b09f6332f6bb64ca120f5b90b15fea098cf1b4ba5316fb6a42463ce45059ca7f4f463cc45316ff8df5817fd75a92a11fd0ff31daafd75616f97441c67ee837658917a17d29efd60519e75146ca223fd7649cffa82acbf98a3b32d68b4ec1b43f1f9545df54c8d0370fcad23f3119f27f0ac67caebc9125fde05459ecfd1e19fbb1ae9445ff34c8d21e6bf40fe567f55e59dedf9092b1bff25859eaf342c6786e2a8b7c3922a3bf1f94e57d43283fe5eff45259f6675c91b1df62a32cf6784086fc8d95257eb447c6f95b4d1ff1b90b32c6cb2d18f27b5e5396fdb9af64f8077bcab25eba4f46ff687a58df6b90b1df06f389f27d5c5796fc5ec8d07fe7cae2efb07de88fec2b8b7d3526435f431e51de4f2664e4c7f240be47efca72ff838cf63e5496f1c7f2a788e70ac711e39b4365d9ff7749867d2af339a63c5bde80299f0fc890574d65777ff506467d9b9f60c63f5b64e9efc65a59e2070119fbb9a5ff63ceefd6b5b27bbefe4e86be40f939df7b8764bc6fa0a62ce393bfc77c0f3e9465bd81f9a13f93900cfd9028cb7e822519f18a3365d99f7744c6fa06f3c37c1fbf90b15e992abbf4c30732ecff3b65912fc764d88387ca32dffb64c97f8efae8fc1e2acb78f3c888173c28cbfac0868cfd3b6fcab2bfbf43c6fb5c3f94c5fffa24a33d301e39bf477bca32bf591eaee71e298b3dfb4ac679923b65699f2619fb4fd17f9cefeb3332ecd985b2ccf76b32f23f5096fe6179e99f1d2a8b7ed1fcb05e3f5096f9c3e7290f9ec990070fcad21ea76494c75716fd5090616f1f29cbfc70f2263ae6fccef6c8886f2fc15c9fb8204b7ff5de95c51eab90b1df2116e6fc9df494a5ff03b2a4378d94451e0cc9581f6e80d19fa33e19fee84259ca7b4e96f427beb2ccef2b32f68f7964f1e7d72c2fd79bf6c9381f74a62cf6c82919efa3fb501679552763fee5ca623f56c9a8ef1d18f3bffa4c863ceb284b7b303fceff1b65b127597ff45ff75659da9bf9a3ff5a1b61cefff999b29ccfb926a33dce95ddfdf49e0c7998294b7d4332f4c99665fdf4968cf5842618f33d7c27431e1f2bcb7c4fc992ffa0a22cfdff46c67ac6a5b29c37780463fe8f3fc9b02fce9565be55c9781f40a42cf2e9858cf6385196f1caf6c2f898b0be900715961ff2205b298bbce89011fff695a53d6ec8789fe299b2ecbfda27e37ca1e417737ef79ec988ef4b7faafebdb820cbfd6943d9f963cd4730da7bd95096fd767b64aca754c9f03f6fc068cfde0719f1a1aeb2f81be764f4e71919fb078ec1982fab0765b1cf9b64d82327ca22ef7c32e6abf4b7eabfa84296f47b47ca22ff9ec8d82ff2a02cfaba4d46fbf5c890cf0760cc87fc9c0cfbfa912cf94febcad29f5764ecbf5c2b4bf9fa64ac27697ef0f7311e38ded7e7ca220f7332ea5f5796f68bc992ff67a62cf547fb6a7c6345c6f9b6b5b2ccbf4f32fcd389b2d82b1764f4f74059fcff1a59ca131c294bbcd1b57f6cf585f4c70d19f6f30318e36bbd1166ffc62b30fae3d32323fed026e37c46138cf6a89e91a15ff7c1a8efec4959d68f5ec9902f7a1fe7a39cbeb2e623f6433bf994a687fc7b9e9f60fc7dd3e61e187f8f74b60fc6df0f1c8f848ff0f7bfa32e19f1a04730d2db8460a417d6c1fcfba4488f7f0f6c81f2f17d7bfe1318f12cff5698ef93497c30d7af4fc17c5f5f00e679af8130cf6b072b30cfef1e81f1fb10e5e37efb654f98efdb0a2764a43707f3fd8f4b30de2fe577c8c88fcfe37d157e838cfaa27c5c5f096330deb73454c6fb8f3c6549af20a33f5ac2f407ab684fae0f143561c6bfd2088cf1df457d192faaa0fc317e1fdf0827905f33b427fdb5f1828cf5894732f46548c678dc80217f669eb2c4bbe664e8ff0b32e2917760f85ba34765c97f4896f4c3b6b2f837ef64a43f23a3fe180ff4afe6cfca12ef0fc888f79f298b3dd725239e74a32ce5fb20c3de7c21633f08fa93fed3e4848cfd4b67ca223f4fc9a8ef87b2d4f7958cfa56c9e8ff6b30fca7f14c59fc15e647ffe95859f425db03fd19be294b7ca34d86be3f2763fc62bef3efd7171764fcfdda3365f73ef5b94796f76fad3f94e5fd59cc0fef97984c95e57d1b0519e77f626589e73f91b17ea0f7f17e943b32fc3bcd0fef676a90d15e27ca62ff1e92a1efc6caee7e5c234b7bb5176469aff6c2f7cc15fcc39f21ae089ff6fbd85c49e9b9f89bdfa5f87ef7332971b7f43d7f97949e0b713fc3bf7b7edf1f80839df492d2efbf2b97fdfdb0549fd1ceef83d2bddd72ecd637ff4d7b8d4b57f84dfdbd523ebf6affdd76297f4e7ed35f7f24fdf137ed1deee4bf5bff292ef79c3f73cfcd7ff1fc3f3d3eede7e2bbfc9d8e5cfa2b7f6dae7feeb370d7c6fcfbd3bf3057612eb95fc1fddde7d7ee372bbf8aefed674d9fdf5ef6fbbadf70df37bffc5eeed7c072bfe1b75c190affd27dd7f8925605d715d2bb362db4c13337e6f3c6a56feb51987f4b7d58cea596bfd06bb9736f7b15a61cf6f7b7fe1d9e633ae5fadb72dee3b35cc6efdae177fd50be6a680f9bcf9de98f1fdb7fa5e5bfff52aeef3e0bedcf8abfedcffb9dfefbd5657fffe09e6ffce4996d7b7efff9d7c66745fb93fdf1257fe891ca7fe86a62ced6c0b5d2bfffc8f5b367af77f2a8eedcaf969ebb0657f16c7327fd72d9da25661e6d5cfcee71a75cb5f61faf57f0933afebbd75fe913ef37f9fed17ef9ee77fcf76e7fec3ecb3e68fe0df5f92bd777fd51717a84f3ff9fba6aa57f37fda7bf31ed0232a0e1744913df55dd2532ac82cfaa2f7aa6897f3f9b675ebe2927afb6fbae81ef1b861bf8ae70f71ffd8eff6a3edfcc67ed17e97cdf1e52eea5b131a8e37ef6fb1af2fff1bb5fe7f1abab59fab72dc3aff3fe23fddbf8f2ecee6fd91f3faba7fd77fab78d893f333e7fd91fd0237f4676fdd9ebfd1f9493d4212fedadae28eb107e36db5f75c9ae6c2beb865a296d7bb54bdf7ffc442efe4e27f07ef69be7fe48fdff6c3f5066277f639a3f6b8bea6f2eb66dadbdd5ddffc9eb97fdf11fd32394174d3ffed3f2ef67d79e91637bf02f6efcd50f3a64cf5f397bd97eb69ddc6f38b9b5814ff1639a0dc89595bfef6ceb95b3af37ed057c11eb03d9fc3a4eb7ecca5dfa5fbb32767b15f88c55a6ffba3d98def6f3cfb4ffae6e123dd22b95f7df4bf7bbfeddcd8f3e5455afe287ebab1ef9b1bd7e97f7dfa147e492fed8c9ff3fa447ca7333fe66feeecaca5fc9e3b2cce17560ae433cfbf84dde1fa5ebed9b72354b97956b47f83c36d789b94ecd75d6deea277e5fd6477f468fa43fa9ff77bfffbb64fd6e9af1df90f6aecefe553b7ca747fea89cff27dae067fdf1558f70eefc539fb4e1a94776e76a59e6574abf235316d397a8224d2bdbcffdc2f3cde57981177a91177b89979acf2eaecc5c3dbfebf5bd813734cf8ddcf32b3f94dfbadfe7a56bdc5e78137fe54dbd9937f716ded25b796baff0367ec3fbf42ebc8a57f56a5edd6b784df3df9677e95d79c67af3c6b0b96d393f4d3a37285fb5549ff225df79dfd67fb71dfeeae7aff4c89ee98fea5f4c9ffaa11c8b2cc7debeaf7bd94f6c78b7ae8f79fd7a7cfcddedb4db1fdfeb91ff44ccc0cadc6bccd51afe6d3f1f71bf1c43aa959ea7bfc0989491dfde9db94c3adebdf7e099df798fde93f76c3e8d9cf73ae67a3597d1179ef17d3ca33bbc3d73ed9bcbe81bcfe81bcfe8096f692ea30f3c9b9ed1139ed113de797b11f8e6f2822008cd67642e23670363b30726bfa06b2e63b3063d73f5cd3530d730180579300e269089a68cc1d45c3329abd6f3bbeb3b195e29d5b91c437bdcf9aeec5ffdaeed77f32dfb54ec8f721ffd913477cb5bee2ffebb9cd775a9dcd7edaf7dfb3bbdb0fb1c7ffff8cdbd3f73edf6c7171de3f4c83fa943c4de6e409758fbddf3afcdbfad1ddfb69fc1dc7f7431a9225848ecc87c16fabb1b534a895d17c1325805eba00836c16770115402332203634706c637081ae6dfa6b5825670195c994f3b52cd6f83dbe02eb80f1e8276f0183c05cfc14bd0098c7f11bc066f819941819941819941c17e701098d91398d91398991398d11d9899139899139899139a99137ae60ac2308cc2384c82bbd08caeb01b6661cf2fc27e380887e128ccbdbb701c4ec2a9df0967de4338f77fee13548c0ca74d5c928da6fe2bdb53a1fdb4b2f9daef04263d7f6dbe3333db5fba36e9189f6865effd2159fa35dfad5e5ea20c4d97966977d31f6dedb7af9f3f4bbf8998a2ad832de3ca94ef0e7aaa5daabfa953b030e98b0e93b860536c8c70fd93b2d65cb9b6e5603bd577e28c7f872eb1fdf18ddefb0fe991b2dd9795e40bf548bbf4ec6be99e19e96161ae4df8195e984f3b72cccc086b613d34b3226c86adf032bc0aed7337e16d68f44b786fae0773b545ee8726fdf0297c0e5fc24e68d20e8d7e09cdec08cdec08cdec088d7e098d7e09cd0c09cd0c098f65768566968466968467f8343325f2f1bc2ff723336ba2c05c46e74446e744460e4549308ad2a81bd97abefc42265386574a6dc38bb19e13a461ca1419dd15f5457f064bd155d4597fa8fd77ffbdeb8f40fe078bf6575df22b7f0097fb4d490f79617bebbb510f3c4a5f6adf7e7cd3f7bf1a3be5f8e39fd1757fa48d921d76ff767ae477f6de5ffdac610d416455ec6228120f6a4403730f32221afa76dda1509961d7246c4bdc44a3288fc6d1249a46b3681e991e89cc288956d13a2afc4eb4893e2333832253a3c8f44a548bea51236a46ade832323a2532694466d447b7d15d646650f410b523db63e7e6f3c9f0737017991e8d3af61eeedb7f9b1915991915bd476d37433ee4d3ce98684f668ad359360f33732233d3a2c3e8283a8e4ea253532fab03ef4b7eca5759bed523cd925c371c4ca3b3e83cf6632f0e82c28be2303a8ea33836e98ee32498c7c6df8abb81e890aaae0bfdaafdbf5e5cfbb1f1b94f5706892d5de39ee885dfa7cb4fd797ed459cc5bdb86fca672cd078e83762bb4ba7093db8b0fd6cbecfdd772ba343cc1808276e969872c463f4fb777a64bb9e23b1cbb69653c6c85f1f9fdbfe28ef65f8cfea9157c80cfb196ce58dde6feec8a2d7d2bfabb8674671b0095bb1b1fb63233b6363efc77373997bb19931b1d1f0b1d1f471116fe24ff37921f22c36e9c46ee698cf9ae8023baaed088f8c3e71b3c4c8b2b86e3e5fe43ba7233ea03b0cc70dcc0c7c67d93dc719637f6f4740cb702e7575656eb77f6e2f7f67ffe25e6446577c692e53ced8b4536c665b7cdb16bd62afa31df9fdefe891529bbbcf698929a37f27dbbf4b9fbec6d894f54e2ea74b76d7aa76d7ab5e7f925e6de7df657d52f647fe2e7db2eb1f7ed523ffa40ed9ca50d109e7f17dfce017b19103b1d119f1139ebb31f2c78c56b73fcaca302bd3f6cdfd67fcfecafcdbb476dcf18ee3d7f82d7e8f3fe2bd783f3e880f633362e2e3f8c4ea97f834fef0baf1997f629e3f4ffcc4f35749e0744b3b31332689e40a5a32e2a3a7244e9292ee30233f31d64cd28585e59bef5f4497b819f581d9716ad8e89c24333ae8499e4d7a493f1924c3c4ca4f2b23696fffce1fd9b58fcd8c48f23848c6c9246c25d36416cc93b95f24a67ec912a3b12d723ebef8c3edbf2b9b1bceff58fa17c67790f59f3be7f7358c0fd4713e611b72fa77b1a50fd809f6593b3b6cbb188995185f2a29bc45b289df92cfe422290c9b5197548dff68fcabc4cd2cf12792fa2ff54849af99df583b847e2af7eafdf5f1f9ffb33fa232d5c890c4c8e0c4c882a4158c12c8416b532797edafeb0d8861254696fa47613d319cd8d1736b678af934bd9118cb29b13d62d24e8c4c49ec2ce3da85e5e7e425e924af817dde584d8919ddf6ff8919e9c9de5627b811de9519c04fce06ea0bab2bdc73fba27b924c2c33ea94e440625dc9617264edeee4785be76fe3f1657f64477e3abbddd6d7d42336333c3915bda87e0af5d31fb5cb7f96bf4dc3b6fd19fac0d43335fa35e51eae3f2aa3e95742c7d919929a72a7462aa54622a5463ea7499aa656f20ccdbfe9abedda13df95b5561a43e5d859f527bfffb33a64d73ffc1ad7fa2ece5cf9328fff48eceac7b9f94536fa45da4bfbe9201d867974928e924e9aa7e37412ac8caf318adbde209da6337f1cdfbb98c8951fa7f374911ab999ae8c9c794ed7c9495aa41b634135d3cff4c24be2abb49256fd4e5a4beb69236dc6af693f5ce9da77c7c5cb6c9438f6ee5263a3a597f12cbd4aafd39bf43635dfa7f7f0ba3f4a3ae2cbec303a82b3e4743b2becf7cec27a828e319f96d387b49d3e7a51928b6c8cec0efafa4f657943f5c8fa9bf6bf36f74facae35695066deb876e47356ee769c9efa5d7fec7ecf7d6be7d1287d4a9fd397b4939c4747e96bfa16e5a61f56e9bbff893c7fb65ee16258a64f4d5ba546daa4fbde223df0eae9a1b7f2ced3a3f4383d496d9b9c491bdbd8606aaeae99815dc3ddc05b191ba1e31f3bbdf5d51fd9d52715897bfafbddb01b794137f687c9953f4f9ffc6137f9859efef7d7f1e2efc6ef377aa46cf7bde1bbf29e9ab25dc939cd58f80f73b0bdb5534d6b7553c87ac35d2353ba59b7d735b2b73b08465d2b5fcc68ec8eb6b2b26b6cfbee586493935155db1be63be393748ddceb1a9fa46b7c92ae9131dd6577e59edbcdbfb4aee264d789c8b8aef15dba465e7737a223e8777c99254f72515794f54af7b3e4a79851d23572be5b11d9ff4b3f8097ade377eb23bb6bbff40fcaedcc7581ddb6a77d5f96b52fdb7434ae64f5b8ed0373bf6b7edb35be983b07c3be2eade9741b320ed4f7a96dd3ed9a74bac66aed1a1ba07b25eb523602af31c363699feeb544cebb66b6778d1de0594967fbefaebdd5b3d55299cb3e11cb603f8d54eb3e881dd16d771fa39352993e76ca5cfb26dddd314a3dcf768edb5ff7856ffd9135e6625bd631e2dcad5548bcc9edec40cca9a2f128c6401a883388bde82279760fae6d517cef4683bfea3e759fbbb6553bdd57efc41b74dfa293ae1d6de3ee47f72df1bb7b626f77f74dba77f8cd81b90ecd7766e4778fe3b3ee49f7b47b963c45c7c12a9e76cf333ff3b220bdcac2709245599c257ec3d8b90ddff48edb6765cb7a02996dcbdc7231161b07696476b6165937cb24f21b3d88cea067be9d25e2776c67c856e7d83518f7db7bd149592feb67836ce8cea8883c6afc726dba525a9bd8c66e28ebb76b0e4eca5839eaafb0d7b8e12ec48cd41778f465cde91ab134f96cb8357049af80cfe785b3d8cb46599e56b3b1f5f3cc771da77b4dbf1a5decf6a6651397a6cdcbf88666541b1d60d73f3233ba33239db279b6c896887e7c9422e4e576329f99b1bcb2b58d966445b6c93eb38bac92991198d56c1f58cbcc5f6566cc640d632f98f1923583b9675764efe16bbca1ff96a6dfcc8ccc2efd2233333233ed9fdda0af1f55df75dc5eec57b70e5394da53c681f3afcc3df39d95182ece76adb1d427d74edbbd64653d529643e5f317afa57b8feded5a2fe354bbeb1be57808f58779c6d5ccc88fcc8cfecc8e2633eab276f09499df664fd0d6b6759ecd657bcce89cac93bd2603f3f996bdc7a6b533d30bd99ee880ccf45866466776981d65465665469e64a68732fbbb73b187bfd8abe57a94d67d7ba6777b9eac8b385df1b0f53bbee88ea7af7ac47af77634f44c597a612fea19f993f57b49ef3bffe25736309fdf3d5fc1fb6599d6fe2ad7bfac3197754f796f32ebcb34b0c7acd78dbabd4cf602f47af25cafdfdeeaa0335c94d3d0e3bd81e8f19ed1f93da3777a6684f5c6a5f6faf851e7daef7a66c4f7a6bd59cfe8fc9e91843d33b37aa68f7a6b8939f68ab09e9a51df3333b367f473cfe8e4f4103e18751ad78b6c392a320e740fdd0bcad8de8e4bb76ec431588e2d725da63cde311ee231ee97dbf5edcb7e2dccb7de40e48fd384b6542d27676c9ca9e164999d9f1f7ea357d539d930f2ad83348a2f766fd5fd2eebd564fda257ef357acd5eab67b473ef4a767af4ae7b37bddbde5defbef7d0b33b4b4ccbf51ebd453c882b3d333a7bcff16def257eeb75e249efd5c892ebde5bcfb47eefa3b7d7dbef1df44c6bf68e7ac7bd93de69efac77def7b3671ba3ef5bcfb30af9f1a8b6b52d67a31f98729b1e493fc2513f8cda6ea7c9b5917daf5bffe38b2e29f57a3f4a622b1bed6a623fee27fdb4dfed67e1c8cae37e0feb0ef4397e661f97d74776fd9536e467a5a40faeb1cfb8069dcd337856de5d8713e955e8f526f63534b9d66d65b25da337f5eef7077d33c2fb2323b3ed9af7c69f3b7f67cfc95fd746fd3cadf4c7feaa3fe94ffb6616f5cdc8f6ae4d3b2dfacbfe2a98f7d7a237dd4aeb81c40177a31c655dd237f2babf81d5f5299f56baf43f6535d7b67ddfcc06ab93fa668cf4cdace99bf1d2af9b7218dd62758af57bec67dfd4b3dfea67d98b29df65ffaa7fddbfe9dff6effaf7d151d6747be41a3646978cfc8ed531f1f3ce9eb93db173421701c0de8e6b9c43b47ba0df5c3b6ccf0d192ee911dab727327ffb0fb8da223fdcfac4b4342f2193dcdea469e9f74d99d31a87c1f37d3377fb66c4db1eb271ffc0e88cbebd5e24d6e4ec58e3a3f48d8cee9b91da37b2b26f5bd8b44edfe88fbe1d9176bf9549af7f287aa47fd43fee9b72f44fd1b267e219f6cf07fec0cc9041792da6acfb6adb38c920345734880789f9b4bdfdbcf54fb4d7777c94e04ed659ba9783eec0c8e3be9931835ed4fd72f6e177bae43b7fe43b5f8ecfc29f7292eb4cdac1b6b14ab2a31d7959b2b9a3c136ad415ffcb9c140facdbb6d7fb1fd07a67f0646470c72f135acef30180f2603f3ec6026f27f309791ed2cabce763d4975c8ce6cb1cfd978a08b099674b59d29b61d6dbfb9bd0fc626182ce0e799e70666d60c6c7e66560ecc4c1bd8b298993530f51ed8ba983e1fd4c40f1a98913f30bf1bd83630690f5a251d53dedb56d64b65bb89fe48a9fd9dce3ec47e2db776696dd5f4c32f069783abc1f5e06670ebaf06a607fa937032b81f3c64cfe9f5a0ed1d0f1e074f7d33576d29ac5d6af7c95a39357836cf9b12d9f5816c6aee9bd61bbc7a496c46dde04d2ca4c17bd6e9be8793e062f031580ff606fb83838119f103d3c3836319a5bd23f3db7ba32b52230f8cac1c9c04f3c8f6aaadf9d9e07ce81b7bf469e80d03bf188632ab6c8f0da3616c771f0e13d159c374d81d66c3deb0df3d8ddde8f53bc381e892e1d06fb8fdbfa6d587a361debf1b8e87268fe1d4c8bee71ddd51eef1a7e0ceaea7d81e1ece86f3e162b81cae329bcf7a5804723eb1565aa3fe598ca5ec8fecae236d7d94865848a6bcb69c9fd1d1f062686cf9617558cbb2613d9c78a7de62d8b07d66f71e436fca6f3bd8cb447f7145ff6cd8343afa63d88afb26bdcb7466d7a8ba07b6ff6cbf99ba5c89c4195a6b7433bcb1ed3ebc1dde0def65440f1f86ede1a3e804bbbee45652cf77db6aeb8fb0ed5c5cb0f4bdfd4d706574b8c967f824fe9df30bb1de64a3294353a6e18bfcdbce8aa1e9ebe1abe870f7fc9e3c1b98993e34636cf83efc181a5dd1bb0fdefa2bd36efb224d860732b6ed65748cacd318bf7b68a56d43ee9b761cbab3f5b592ce39f41b3bfe8829cdf04876fad91884b5d3ed7ea4e1b170af2e7b696d69ec5c76a5323264685bd1c882a1a9f5c8b4a2675a6f64e4f8c8fc766446f12832572cf26094c83af928953db9a3ae4406ede7c8b4e2c8d8c7a3bef8155c2b1819993732f26d6466dfc8c8b7d15874dc68329a8e66a3f9c8c89e915d6bb7cf19b9335a4b7ab6dca362b419f6c3ba4dc7e98e725ca814fbeabd8e3623c4aa18cffa4e26bafbbee82e2b6b6d7b8c4c5b8c767db63f1293dff55f76e38ad00f23336247e6bb9169ff5143765adad8d1a829bab55f17d9396ab5b77b8d21235d9de9ef5445f7f01a999935ba1a6dac1f30b4699bdf8d4c3f5bc96875c3c88cbc91f9f7c8cc8ed183c878ab03466decc079927d6edffa21a54bd79c76fc14ee7be3a74bf343dad7e992fdd2beb96399096e5f1dd6abd84fce320e64f6d87eb156e0c8f4c3c8dc1bd9991f8b056fd766ac5d3432e37c64ed95898c2b7b6f647e1bbfc2662aad6975dd1c71b11023ff466fc3d6c8f6b86dfd3dd18a2a1f5eb0f3023bfa46a54f37b20fccdcbd1c1d8e6c8f1ecb9c77dad88e64dbdaa7b29f76647a7774de1b8e9e8379eee75e6e74411ee65118e5719ee4e9609c77f32cefe57d6f959cfbab7c900ea3ab7c387830cf8df2dca6958ff3493e0d27b9d161f95c6654be103d68f79ce6cbec395fc97aba6dbd7c9d17b91905f18b5ff4447e77faa645f34fa75bdc1ed4fc222df24a5e7591e0779165db19b28d6d59fbdb3e637da9dcb4605ef71b79236fda588b3beb58c3fea16a49377cb75eb4eb8f509fd4109b32be9e975b9fca1be466e4e7976295bad1749ac4b63cb92d8319d5f98d8d88983a4d928b78667444eacb7b4e5af96d37f657d696b7fb15864646e677d1517e9f3f74d7f15b7a93bd644f793bb7918b439158f963fe943fe72f79473cedf4d6f4d36bfe96bbba4b8ccaad15591f22dac6f8649c7cf5dbbeec4d285bada54fb79fc1e49f9776feb87d713656d6d9d1e99a8ee91fbb729cc867b90c6eb6bcc8f74e3fd95913cb18756b336696e57bf97e7e2063d4fa55b9a97b6ec66d7e9ccf4783e8e8cb79a0bd2feb23d72287f313d8e5af28356a9397a3a23b570e7bd2ce61ce65b797f60c330d9ad1ed36ef8a5d9b9bb4c7fed81b9bd13ab6bac6c8f971243ecad8d46a9cc8bc1f9bb2d81a0d17928fdb4962eee5fb2203aca535ee8a1c55dd603ec71974a1d167e39ec4bdc67d919fba5716f67a7e3b1e8c87e3d138472ba3bedc9162659a2dbfad979de53d5b56a3cbc613898d7d91dde5787cb5f4fdaffc91b27d5cd2e9e369bcb13bf86d3dacdd3f9e89ac1dcfc56fb2ed6b63855697f54c2f8f6dccc8f4c778d956bfd2ee574bcce7d88ceec0e88ab19199e342f61cd874c71b91c1e34fc860d3dee30bb49bf9ed187edeb826e3a2bc5feda73360f7fa6175f6ebe5f4c7eef3dfc51477d6adf45efbebf7e33a74cf09a4f9a1440e9c0ef2f179b0d54de38648beb11d37769792b9c697f4a99d1eb16bc1c7c62635a98dafc6d7e39b30b6769eec6d2dd9955f6a58fafe4166829b05d7b42bf1bdb1dfb95b707c9bc7e3224dc6a657c766fe8e1f249661479d3d11356e8f1f6d34d1dac256ffd8796fe7b9b598c6b6e6cf18c176b4d8f4ece76b5e1ddbdf4eddb98b8eff61e4e5c0d8999bb43286b7e89eb523676fbc3f3e181f8e8f82f9d8ee14e17edbd6f8647c3a3e1bdb673fa55e3a43ce45f3dbb32256bf4efc8937b17e903d1d7cefd6c20b5ddf30ad6ced5c3b6bac7f3009fd55b2fcc9f98eb23fd246eca92d7b63fd4a30ef9b5eebdd4e221bef91f59ba86d2d9d492c52683c175d674757de99249374d29d642863cf5a1493bef515f355af3919e44fe32bb13cec3a85b5446c3ab61d27c3c9c8f517fad1adf9d8f21f06977938d89be4a343d71f1e2cbcfd926edd9d21dfe9909f7d3e61cf3574c464fc8be7bfe4f1f5775f74bdf97e32810d60eedbfecb758f369e7fd8de57fd732ad7f86132b5d6b3f5bf26b3f071328f8e260bf5474ccf4ecc68cd8c3c9f187933312d39294a73f41732e08b9dfed1fe71addab680193d93cfc9c5c4e6539dd4267599e3d65a703626ce6d4c1ab043fdd2dc3f43cf99cf8919411333c727978885999e9b9834268c55d833ed66c64ccc28b0114a966762f29898993931336ef2108cf4bc3ad61fa27cd2eed911f3d8fe21a6e564911d794f62abdb9892d3453bebce13338327d61a32bab8d7125bd77a84dfae7decfa23dcc3cab508db4bb63caf6d8d01d9a8c6e4cd8e7a911cbaf7f84474c0c4b6f387ac37f57d597718ec61cdfb1db123e8442743f785277bdb76d2fbf67b737f7280f58f7db4cb838cb8727fff6a4ce8f58c586059e697f636a86efa6e9cd9b63ffcfe7bdee3de6b8da361557372d4d6b89a1b0747dfe826db6e76ec99769c9c8a9f6dfdd9891d6fe677a377f7ae56dfef4cbd69303533646a2c99a991315363cd4c53a4465fe414adf4bed511ce5e7cdf99d3bb357d109d31ed4eb3683ded656df1d2b315f63d754446aa6c413af969d47672e045f64345cf62878726bfa037ed4f07dee774181d4d47c1dc9e699fe6e61a1b9e0c5be955300fb013c2eaa1e9d46f4c67c3d674ee776cfcc61ff16c8aefde8fe285d3c57419dc59399b64c8d794636a46e4743d2da6e6997e6ef7ddfa6e5fae7ba760056b45cde9e7f4625a999a5139adc91ea5a99102d346ba9c364be7477ee68f5cfb1db78f016bbcc3cf7c386dd97247ede9655b6247a6d7a7575123b575b91e35eda89f9a724cedec37b3717a37bd8f6e8cdf76ddbbebbf4e1fac8fc23394d1de56d7dbe82bfb523ea7a5fdccd28ff61939cb69f27fa45d602d18ec8d2efb077f4467bcc3aff826d6c534a64f18edfe8ff7b73364e7f71867eea4c3e9f679ab3f5c9460c7af9c1c71dc96c699cdfb59c6d7f465da99bec66fd3b7c1d9d47eff31dd9b6ed2027a04711ecfa43c352d3435f263caf8c1c376aebbb9fab295294e363cff4686d83db2b1ac1859bb797a84124fe49ec6c3fdb6da93b655a6c75b1fc8f90376449c88976acf91db75d8a9add919d67e2193edbaf1d4f6fe93f83d3393eecce89b5910d6273ccbd0dcea107796cf9461164e7b337b96b08328a52fb265168bde98e18c9aee61e685b5e9280f4633538659576279339346daf983fe082fbc8365d64384f344dad77ecefab2463033759f0da57c6c5feba7cc6ccccfea1a339367795bf70ed8116ffd17ee5956d90a9d61a3ae724a602beb13f81d2eff0efafbb9247f9fb63ae00fe9919ff8b1e5516efb7c3696cfefd6eabff821fcbebd538e529a3a6bec787d954f893e976297e6f733330e67c63fcd53ec3fbb9335fcbe797666df49f022eb23c1dcc8b162665a72b6982d474170385b41239f5306e10c1e668df3376cab3dff5e86b8d960e7aa8d5216b3b5fddec5441e3012f6709d62ae97f4508efdb6f6deacb0dab0f7305cd998b7bf1abdf9c3feaa3feecec2d16c9375669f7ec3c670ecfeaed985bfca3e6695998d9af666b5dec5e07e564fd799db371bcc67b69506d005764da365be6bce5a36fee156baacaeb2d1eebdf4313987cee1790a9ecf6ffbb23fd75ed69a5c78c17433bb1c9c798bd915f6122d4b670c7fe68fdc886eb265ef2f8c061cceaec70fdc851fb5ad3799af6637b3dbd9dde8507ca3e07c766f634fd65ab5bacffa0c363a3b7b907fd39f747b92cfd15f7654f8c19d9b254fd415939193d3c62610a9b56d7ff73b9c207067354b52affcdcaffbff2733636706508ffc546794fd90a7d2f7bb7e09d3a66f75007f8efef5f95642b8fba762b9ceda76b5c11f3adfbc62df8fe3d652acbf097f84e7fcac2d3b333a65f62473afbc6f89ba64774df5a7fb744a25b73ac2ca325b2aab0b6c69ad7d3c3072636666dacce43deb94ece1f36d4da9b3acbf327b95f799fc70de9b7124bcdbc4c6c4dc1e2f93dfec4de23c767d99e7aa7f5807c73e9f99f9cdec43f2b3f190d9de6cdfed2f58949ee31edcf2faec6be91ecae1cab59bd72fd647ac1eec87a26bdddb244e4477da585eb496b58cd981b0b37eee6687b9a9e7ec4874c6ec78b4999d88df36434cc7ed12c18850195cf6037cf4c747c926f8101daea3ed05ed6f75d9d93723fcaf5ed023badeb1bbc7e1573aa9a4d3766788f581edeae3ec5c2242737feed9757db7de728ed8d6838cf7818d0f5a3b81fbb55ecb673c759dfd462c977920a74ee761dbc50068eb59af6d901a7533c3cec43bd101aa070eca312d5c28f93c46e9edccf89c4c6d8c649e6445af314fe7dd7916199b7adec37cf7b7739c7e8ff50fec77f3fef4cded566c39d9ecf62ff57bee2c5ae1bfca9af4e0117132bbc6f3ee453d2313b24b2ba3bba7767d55cf2b4f455e58fd29a3dfefcc077e311fce47d68fb196e63c9f8f23b7e30fe7b1edefaeb67b4983a9d3017226aeb4dfcdea88f9c4c5d91aba67b5bce65ed9f147cc6f527f3e9dcfe6732b9dac0f61dbd5591fa62e79c3946be1af86175e61e380b66dec3ad17c395fcdd7f3626e46c3fc737e31afccab56ffcc6ba23be675aea770b41b9d7eb4d501f2b68b69fb4b9f7deccaf3ed2cb3ebea368af2a3eed819c13f7cfeda5fb5d268326e8bae7a6eff38e277d21b718dfde3eb38d3f7e1d815e16534cf0fbaad79c36fcc9bbde6bc35bfb433c6452faaa23be657f96a7e3dbfb1fb8fed2ec9f9ad1fcfef5c9fc978c27ebbd2fa886d75fb4bdbca762e7b628f3bbbd7ae619a916cdf3735b77b75cdc899cfe49cf5fc49f6cd58cfd8c640ecefe6cfd064c7d2132e467d20f1f7f98ba437efc8de9fe98becb7b1eb1ebaae7252d229bec8469bbf3b63585ec7663c8bfb3d4f249ee5f6efd85a5b3b74d2d6bdca2a1b1ebfc6b5beece5b1ab9c83782fb3657cfb853ff1ef5c4c03ef88b4e5b0d7fcbdadfbd9e61f7256d2ad539c49d4c4c6fc9c0cdc43ffec4b64d2bef325ec87f5b969abb99dcd66e4cf4ddbcc4f4aedc775809db56ceed6b47d62dbdbeec3d5b5ec93ef9fffb7beffc9735627da7eb775b29fa1bf8da169bf63f4ff90ce213cf363c43a312e2d5ba960ef5b8b746ec797952a75ecd732ff9e9fcb5e8485dd4563f4eac28ccf45207b00adae777b13d0f7a661bfe93ff737cf22df5bc48b647c1c9fa5cbfe7291e673bb00b7c8f2380f8777a19911a629fbf1647ce8d58d933df482eed962b4c887fdc57831091f2783d151d8b76b10612fcf17d3ac981c8461f438991a07671eb426d3a035bccbc3ac08a3c562b1342ed22ab85cacb362fcb4b0ebec7178bfd82c3e179b301ade4d4fa6d6951a3957cafcdefc7b3a7f595c04d5eea91f2c2ab3869f2daa8ba41ff8f1a2e67717f5c45f34fc9ed10dc345737ebd6865c5e27271b5b0b5be59dccede7c2f3ef72f1677899f98e7ba9191dfd12259dcdb7a1b1b34f13df35bcf7cc67e6ad2ac9aef1fccd0795c3c2597e63bf3bd79eecf7f06fe6d5237ff7e5ebc2c3aa6ecafe6df6fe67a5f7c24f545129f9b7a8d177b0b334216d9e2607118dd2dae17478be3ac085a8b22baec0f1627be973e79c9629285836e783d3b5c9c2ece06e3fef9e27ce92fbdec7e512c0353ef6369efc5ccb4ef8c9fb61d83cb65b8e5e9937dcef6c732faf1f9bff773fa346df7a692ff647f7867f3b5ef41b3e5306364b434e362190fefecfde9097f67fb1fe99876983e4d4683c3697b99ccd661649e4f4d7dbb66865f0607cbcce8d9ebd960b6b7ec1953bc1f1f2c07c9c9e2697cec45f1ebe42a3e35be696f395c8e867dafbdccf3e672bc9cc4f7fe831f2fa78bc4f6bfe91fd3ffe313d3573a0edca7b9a047da5bf966e7ce7226bec9c2ccc1e55cd615acafbfc4bb97dc5e5ff830f65ada9540231317669e2e57d82181f5e0d1fe560658bbd9dabf5cefe09ecfe57a592c3722d3969f78fe4c3e9d0e32d7f2c25cb66c90ffee4c1ded7d9c5b737b90c2b6eef7b1bb2996b5b033b3ebcb368dba9c0fd773118c2fedfa09e5fda07f5587301686f7c24c3f652dcadde3be64d32e0b53a6a5f5e9ccb56c623dc393b3318b91d4d1be5f725a601f5a5764a75dffb03a98eb18aeedcedb5fd695d89edcfbc0371e595e865fdbfb9ff8a4ce608c943606cbc7f53167fd95bee773cb96fc6e79293ac4ead28ce7208dcd927c8ace585e0523bb57245dc9194bbbd76269d2581a1d66638edcbf4e7f56639495527f7cab4710a759b9f32078efd2b0216ff7b42b56de59d65d1a0dd94dfced3bf35edd730dbb47ca1bfb8da5dd1f3c4b8bfedde06a1289d7e96261a75b7bd4d5d82bd9bfafb2e7b3070decae9bf63672076fdfc6badddaf04c76cbd87304f6ddbc7ab6ac16ccdd7b3ceefc6264f7397590beb1bb6dec67791f35968697a635968fcba791f16796cfcee694f7bf6fdf27dcc03ed9c29d25dcb833f11d5d47ffb357db97f70adade7af1926567f96adf0b63f2f0dc1eaf7b777eb2331e2f5f97f60dac67cb77279d6c9cab63ca6afdb85e30f7726fb1dc1f27cb03b1c8ec0cb23e1ecf71587fc1ed5279d8c622759fd9e9d7cbd9efd7b2b6bc7bef9fb86c19ecfa8addefa55104f43323398c33fd701d6037a5ddf36ba473af9dc56e1ce4a66d8c95b5b4abae2f720e24be30fd65f7661c64ddde265fd975a2e5f1f26479eaaf701e7385f39bfc1b02d24775e75b7aa5f7057c779efda3bd3ddf762db6fff24cbc603b07ddde95f2bed4d299697db71fce372ccfc54e2cefcdd418d82362253ca7f1b0f5d0ac5dc958cc17cfad2d2dd8bd59f97607caca937dbf2a03dee40a9c11077bf541e498f37e63d8af764dbadb7d747bbb8ee4375fce3e972ffa38dfddfb77ae4aa99ca6ad56466eaf2279d789f547d447aa8aae5ec5b2877a9588ae18f36d412772767f95a23daeb03b1df6b89d2d5ff62c97d63bd4f33efb9117b39fc48ffee68b33c5bda969c7b3576f9bfbb6be598b9fd7646f85dd3fb6eab6bfbe0f8c3e26fc6aab435699c400edba9cf59bf55c3fe3a0b415cafe6679ff9c5ed8f72b73aa22670b8d4cbe3576dad370d43db57b8fe2e770e4f6415a79e57a14ef1eb1f3f245ce27381df4e8ce4337ecfc5ef5567dbb276b5edbc62a9cccb89a8c54b7b855a9ed3972591bfd3e4ee25ad64687cd4858d9d3417babe1788a73662d1b430ae656060c2e8337ebb9329e6e5b7d35dab28d68aff2d5d8ee4674e7dbdfbe795779c59eeb737127fb1ec9bfe77db24647d9bd5ce9663559deaca62bab13dbbee7cacd5350ebb65bf99ccda2a3d57cd25f2d56cbf9e36a65f732dbb321f68480b562ed6871eb45ce5a95bd073666e5eaf7107dddcff4f0e3bebaf2a8b5eb23ba77e2fd1ffa7c91f2d112dcddefe5d6b8b9c3fd071d289fb6ced6c24c6f930b6f62fae4c897773dd660ff3c3a9deff674db3dcf2bbb13c993347b8746077767896de7a4865824dfb552515d62d3f2be7bc717f4c8754987bcae0a1b275e6ddadbb8cf71fbebbed4f219876bd141ee3c34623856ef0c1e569fab8b922e799788a2935b5ca17ad9eea329bffbf0073df28e5d14a7b0bbb18fa86766e1aa22efc0b5f9aeacfcc0085ad5657f17d3ed47c8d76af56ee84ef3ba3abc96e4fd6e1caaf9cdbd3f19d7b2b670909b72d9f298b65d35e59d62e5772d5a89349ac8c9b5fe427c3c2b33ed2e98d160d5b2fbc6ec3b469cc582758cf27ad20fe7f079710de1e12bbbd179f20feb9027e46b75a4a9ef4a67c9b68fe93ffd4a07d933aaab6b9c6367ffd4da5fde87a2b149c4feac54b57b2decb990d54dfbebfe8aefde359cb6bfb105709ebdc1f55ecf3732d4beb74fdedd27fe4705fb519b784f0663fc559fef8eed94cecf35ecbed5c4dc5b19ff62654feb9c96de25723599aa2cd15520deffeabf3042b9badf6a61b787ec436425cf72ac1ef26152f18b553beb8eec68f1a3b65d9b5f3dae9e448789aeb272977b95c6e1aab27a1e1fb97a528f94ff766dbbf4fddff04ef260393e58d9f3eed9aab37a9d4e57f694dabd17b9fce55d2dee9d20ab77a3bb5ac3faf0349cac3e96efe673b4f2567babfdd54170ccf527539f52fb717789db69f1cbf5891ff73b85fb76bfd63fa843ec2c3f0cee6c5fad8e56c733ec3891dd2fdbb57ab73ef25ed21d5fd231f535f6c3bcba3a599d7aab95dd55daee9eaecef1b708f8774b5acea628ecb99b35def3bff6fccef4d43b72ef9face26fc2ac314eb7efb497bf6375e3fec65af1133df22b19f8dd7b06cbb676f9bd45e5eb45cea2db13508c83db91ce5d073fdb95409de1e48791716b2337d621e2ea3bfb765cfc7ccf7ae26d17d758476d7de73b9f2bef76e33b3c86d375bc36d6dbda9ef01db575bf9abe0b70f74cfa5fbc6c2ccbae3bd9bf8fb236f2706d46f3ba676422d768ae65af5c62da6add97b5e1a9912e8b965818367665576ddd3beacba3ffbbb5687c9f60ad9e7b6275bf5d593effa7fc11eb3fd97707d8ba0fd03fa5f5f16057b7ec5cd6afb2d19bf5d05c23899daef36fc622c6a3f589ed2ab2dda7b71e97c6e977e3b96c1b95f7cf699afa5e14bec384b1229ead586bdce7abddfe5dfc06efeee3fbc7e327bfb19ecc47eba9d4d0eeee0efdf5eceb5aebcefe1b6ad653d129c1d57abe5e64954477aa71ef265aef4ad6a5d7c6b35dafc2d17a2d79592bc48d127fbbb7d8ae3e592fd7cae2856d651b45ad1b59be11dd27ebe8edc5173952fe7b7e7ff6d3f86b9e19216ba3f3d626fff5859cfb9b75b3deba9275d28f60beaeae6b569ad835605b1fbb93c24519ec0aeec356a7feb8ef69a7fdd84ed81deedeb4906ddb7577368507b27fee9fd325b20a3048d7f57543fe8252e8f6917ddd933b7d6aff5ce7b1af717a3c6e66857d0bfac4ee86cd313e9bbefc1d4a77fed39ebc36eddc5cf4d72d7eb7f37e94f2beb9edfe875fbd37befceec5f299b8eaee9cfac9557e3738edf9b6c8e5f5254e4dd93d40a675d6bb67ce4ab246f77de19c82931d26adf5cd8e5ff1c4198359627588ddd1725192511fa2d519e3b2e9db91e7fc9fa1d8a96b236ff2bbf6d73592f64fe4d35fb8522feadaf7c2d873e9eb7bc9d7e69f9e88bf61cff8bbbf8be26d756e794dfc877dafa5ef5cec6ae75c9eeae1b27f421f7067264df64bdffd039f36fff5c3babd7e94f8627eb6ed0fc6366d1ffeeafc885e0fb2c7796deab97ec6787bfd46475ccb7b78ac3fe7d6c276f7e77dd74ff6fbeffec6f0f67dbf3fd30be573d9dc67b4867cc5fcd4b3bf120b92b505fbfc87df59bfac3bebd7f5dbfa1d27801fd61fdbbd9a3fd121e7d21a7cbbcc285befadb10796e717f8b73f68b5857e1edb78967db70acf0dac0f204fed4cc30e36fb66212bc3e7d7e1647d349dad8fa3a3c4daaf27a57750eeeaccbffaee7c93763e307ab56d63fad1d1f4757dda1f87a3a8919df6fdde9d3d412be7692279bf17ac511be7d35341eff6344112bbbdb93a024bb141b6236357d8e75696c9e5b50abe85c1eed7fadb7729ee5c6ee592fb6e6dfecf3887cef347653df24d5974ffd84b70b7b6d2f0bcd728fc609e3ac9fc839e70ef2788edbb80cd9871ef862bbfff7857e794fffec8f2b77f7fa4baf3f99d5ff2b3fb5c2b29bd6784ffb67f03a4b0ab5d46c61701f448fb272d5a6e219e5b3123bc3069d8d9411d63cf22ba1de367a5a8b12feb097a26cdfa22fbb2d66ecf5b1411dec93894f559bb37c0fed585d5aebedc5d13f93b7c92135c6d792f7b11cbf99785edf1f5f6bd5eceee2ef94f5fecf69fe9de87afeda97e072d52eca5559d827387dcfbf08ffb231f523f1b81b7f9db98dcee99c41fa238edafbf9fe02c93fdbdddbf56d81380a1585be5b527ed43c6afaeb12f63d7efd8d51ffcfcb93fb2fb1ea8257cfff2f7d59dabf9e5f9ed1af5f6ddb5f29e40630f16693829ba8bb3c29d5c2a7a7ae670c76efd628fbe94ec6b9ea5e0fabb7d2bd1a8e8dbb314fdaaf82dd6e6b6766f8473cb3c87626749312886c5689e8e7c6f51189d61f7061463efaeb032392ea6bd97c5937feee3ef33aafef8d1fffab39f128bef488bdb732d5e50cc96effdf5bc657bdcc5d9e618cd9de8cb79fa7e54d211e591573e476175ee39628290d5c93e58d7494ae7f53012650d7b32fafa4e93bfdf1f717b256cffbdd8185712ef9eff70e78618ebfa690c0ef5347d5fcc83f9f8322dfaefc5a29b489b96fa49faed3a98f7faf6fda1edc5b76740b7efd4dff671f9efc1fca8477e36bf7855bfb9be7b8edff19db3909fd6e68e27abcfc2c8ee62d5feb2b6fe831dbb73b175dd0e6aab7103796792db0360d22a8c1c2e70f67e803dacc546648e5d632d3e8b8bf1ad3de1da767fa9c1b59ab90a53cec2d4a330e59efeec7dbb7fa71e698b4c8b0645dd9e99b67b538b86c8723b1b66d0893c7bc9730ee57d4e3ff826ef5f6386fa9eaa9b9d75a6f7ad0ed9dd37f59f5a67b752cc5ebbef7274e5b82af9a13b6bec22f1a0535f25565598f155b4b6edbadb4fba3faed296d5d9dff9d4eceb74876baa476a5fe6d28fefaaddd521bbbaa42c73656e16f6fc967946f63a195db23cf31b53e327b8774f2cb0ff665777bc977400d78c3f648dbdb8945dd1c555713dbe995f67cf9e7bf7888d83db952917f37910bde17ac3edf18ada83c3f587953d767d7a9da595f8c597f7ef5d7a83ec7af696568b9be2b6b82b8c27adefe9dd95257f7d8d5dce1a9a116adfd9523c743fec0ecbf4dcc870affd250ea556d67efbcbd90f3d53f325962511e1a22d116267853c6645017fad2ccbdd1b9d2af36892664518b4d59a0dffbff6feaba975a6690385cff7cff87cae2287da474eb2c12c4004033e9373c63955edfffecd35dd2d8dc632782d8c59ef7aeea2a684654b1a4de8dc579fa8cf27e27fb2f3412a9bb1707ee7c85824c8bf0f2aec59947128f37d1fd30fc977014e8ee2f7e30662f61295c513e7e8986b1532cd92e59902afc5a9a187989898d17a91ee167ce4335af8510c6c1ccd357e8f38aac53369d49aab8abcfc1b7448f39037d200174a37598017bcf6960b756ea1467071e045722485b6ea95a068f4e290f25e16475eb46e4a9afc171bfd3cbb6812fb8556223ad7be250b34fa1b6097b13f07b61b5d67eb35e4b9813e51220a000c29e45d003f0b188b8b63c2235c481ebb7814d92f84d8ed851aff05f8938c25f0017cf23b74388337d083f8fb052c27c3c5c5e272e92c13c4d7b7ce63ffacc94ee12c3dd19bfa6c5de8b1cd0d9fc11bb52df090e66de92fcbbf53fbf7d3b6a91eccdeeab337477307e8669d93d19cf808db64b6a1518f5e94c69e93269e58f5ef97956575a9f8ccb23e6b2f1b1c497f497e10587ae14f81cd68d95cb6de6bd5c2b23daa2d14bd98209251c70f3096bc67d4aad8fdfbd351f54363ef979c62e23d315b76140d7708070ab8b7da1a5125bd6ad95df6967dfaacf5068769ec2b4965c02c435cf0f21df8ef4e77a9c66339acbc2f4794a3283a9ad6ce6f96e379be9b47ccd760bad49899824db09cce52c0c7edea982a8e4e31a24a97b3515147ae3bb63eb343bd45cdef72ce91ef97225d553ce4516a4c173def4a2648719538259754fa8df258d7aff7266bfaf19f1c6dfc65e3fb3dd5d53d23bc278cf47211b53d6d6d7934e457ecaea5da01d343f25d036d1bf6a9b1da19cb154b2997cc4380b7d5210c62d439590a3696992762d3935dbf7f9a79c905f154f88181bbb14c31ed649eb14cd37b21a374a9fab7645e11f010c648111ffad2a5b1c5fbf4789c13eab7cb1cf38a22496dc04a411f205122bf46d36cec9e33c26a7e2f1bfa80a1f3e0b9c8dd08f485831df2106b6e75ae6121aaaf80ca013d095455e7aa1e7b81beb1440c02e7deec648e4c7d649d8f7c270fc1d1234ba7ceaa74285e8b109545defd84d698181c684ffe2d667e79354800cb6a79ddb900aaf1b2d0a9751acb9be52f8eb057cf5bde2eef902dd61f9507d349bda8b115b34eb13ce7ba1305434e95bae5bb7e7fc4626512fefbb073bdbc6fddf66eea374b0ffac164ac33559f5b33ec8ce5c3f271895da07dc4eaf368f93ceb3a3354b4d1e8e48c638b6be0efe91d4ddf9645f8a38065ac66f392b058eacbcec5f285f53158314e66a7cb57fdbec9e51bc54d97d987ff5e6c679725cedb61fc32338e4eb00c44178afaea77c34b96a05c1213ac737f28be4e57d3cb912ef9de18df00715dcfd7d4197731df47b5e4f2b83c88c52ffb135ebf7d3dc4ef68698a9f815d627962c46b3d867ac6474ddbd38d5d82cf4b255b2fcfc87685bc3d60d4c3ba0c9abc64da8bb8a7ce0bd1ef20af50f20c4c3bfa77f00eb3a915bcbce0fea4280f025968c80104dac5529d5f395c4b04f9fdeabd5609ca1d0122c1caa75805e820e227420635f24cf06e01d63937c4c6aeca8ccf7b4ef8043206c0b2ed30ee098ed89de803ee8b710d10dc04a3e4c0f0fd5f7ab1715f3be123871c8123b6ad22f18ec198ea290798caf06d9d53cdb2c685b7bbfaec3fab8f649cc5aad24f2302a47c3e196357686d2ce21dfb441f1169ab441207fc09ab2afcd3156f555bd5578dce01b0a5a07b089efd0a28701d67ac6d6ca81b78c678178aa656951c1fd40b2c04b904dfa38f00e3319758e8b85d96e99b73e849fd2a6aa5b41f1c5763b69ce95ccf05ea406277ac5a4e717abe6a43425c75bc008b173c45e754e21dbbcbe74aa1d9981e7613ef437fdc551463d553ad3fcdc1d6a5fd4c6ad7adde576dbc6fe2bd9e6c56bca00640e7543df28068f76a60485b8fe4d30f72012f19a76bc73c44e675350ceb8ae8f97ea5a84e50166da73ae0f951e3d9bc5c8d9a17f03381a2a879fdbfaf8fb07fa5dc261feb6a6c44177ce443dea08fe8e32bfb012ed80fc2b8c0d062250f1a3c66257e5889eb113fbaf4ebc40bea7105b4e43b6c5b881fba32e4fa22c50abc97016ac1cf2dd16f578c1fb6526335032598132fd43c48f185d582ea05a296e44ad1dd15764592f432e0e7c3b3ba4a91ed0f7c4747afa89db5e218e3a17ad62a435a3f227de01f814d0b3c44f252223e988390b60791423be421180fd4245e2122e7d40b700e747d15f4f995c7c6f3024cb595cb3c7797fcff67f5911745bf141d874fbcf232d458ba2461d9f15a9fe8236f952836a068e625b291ad72b4fa707e8c4caf31e705487e0cfaf2ea90ce5177c87e6ed6fe306d50bb7cff0cdebf3cd031afbcc27484feafa50b1ea173da291f72b1523b67754578f489413db5423dc066f50e1e536042b56bab6be82cd581e3f64f156daff378700428fc2d628732636bf1bb95e223e545b9b7ba616fabb68e0f757ea01e4fe8230635828f5f7203bfd3170fc48afa2dea62a20688dab58a2aac7e398b9ef6fe490d4b6fa2733fd26a8c6e413d1c8d03b053dbe3cfe9232cf72f5ec94ebfba33f88191a3f861f32c3e1213d723b69ff7e7d5fdf2da5baf5bbea9ed08fbe4c3f7874ee1197e07b512560f5c433865e073e4289e2bd0934033d5f880f7c1ea091cb3f63bb005564fab67aad514c465199896413c94c4f71e537ea6e00dac8a5e50836a22988cb6446b8fbf35de5f694229305fa889857168962a8d9e9ab715f34c5493d53c5efc4aa24f9e13cfac5d1abc6517f3f4b3fa08f2889504d1bd812fd8bfd29afa1acafd16726b44ea121e13ad65e41756afabb7c42471c31889052b579d730d2755c6c8d8854de4b363c959546bf5c6b84d7e0ed890743df76ae7b18b7ac573d44d7774adc27ac999d52069951295d541a2b33a74ba9573e004a8f7bb5e1dad8e9b6dd4f15b9dac4ea758dd8ee030abf100ef28fab73348b28390e76a1de864d0688e094364a5f4b3f2015dd75e4cc66b3ef6dff27f6c3b7feb47eab7d283cecb3d5f499035e4fecc1227ab0baa2ab8c22eb87538f6cf9b24755d17ff155562e715eddb5aec4c7ffc79ff08fbb351776a5a67b99769df6f638fcbce92cf06fd83269f4c948b0db52b93c87b169cc5b8380013a3f1bbf9488972eea12321de2c59c68a57c70ad1f6a4a25f0df57d7f48fc7606daaa5649b266f43f4d3913d55b3a57cf53cda5c931e7e778acf5428ae5bc8cc06608cc6275af649d9e9384dd8af50c78ef62c7f99338ba2f37e649d085928a472694c4976cd17b26db54636bc6b10f62b74b760863b1c9586a71b15a5f9aa79fd347ce880e366f56ed6417b6f85a9530d195bc1b892bfae4c833a76b15bd195a3fc7b66aba8891ec35ca24c3aa4658bc6b31bc08400ef8c837bfbf46273a70dc641f96d6f9db2a937c4f2a4d3a396c7b8b57a7981c55d3dd036736ee038316d246b301fb542f5ff59b3784673c85fdedae511e6a0fa83f56fca6981cb7a7c9c9f2daaff8478de270f85e4e4e7525bc02f9e47b8c92f19e55e37c4975ff9233d49e657f8bd633cc7cf6981db16b9fba79e4ba32b07726e7cdf7245005a7cea2d64f2e93eafd93c9baae9f8ef880ce93b348aa159b04a56df7ddee1161d770bcd6ff757d24cd7b3e47347338e2bcf24b2fb0956c4d7b36f091aaa03f9f5175cd0886a39d9f6ee64a9a9fbf918f24990fa01eb0f616de914f074873c8fc820d071e565d4f12f43e4b988c669d45adb31878c1824f0fad1f7e02f09f2478b2e345b0f6033d459d4fe6a8495d113d070f31e31bc7bbbfa9e95dcc7100627bac7609b312b63d8de17c403a0be2a5e11d85bfc48ceddd49fb597da44098ebc052ac979279d4e61bd66c4be216b4c78a7995cfa4dbf8b788e15a1cf7f3fd5bf23d3b73c69db4e54e9b8f7c872dcb3cbed0739257ce0c7891a8d6895a6189d7c110fa8348435211c06f3b45d4c0d5381f197f5c5e906daee1328e5446e34b516c755ee353fe9a2ae92a790d6b6e74bc0413b37cae9ef362f8b21fc5f7311f7dcc33ecb66b9e823e8cfaa8680a0cff6441bfe3b8dea927910557adb75e6be3c46cfada4d246f92bf2a57e56eb5a3784d86b17abc1dcdd3cfeb239253fc4a769b59977cbf5ae2facc5662d332b171f175413cf019c5bd6a7a74e685787ca5284f8bd4bbdd873ec2ef8f98db1ec75b95196fcacf7b816d4f7cd9c95bb25c6b4cb314f7ff998e5a6a135fc1b317e6e0e588a7203a3e620394f112de227aca8077a3993f62da0a9fc2f1dd877e92bca33833bc8f7e479639c04f92f78b4943ad9d86e820cf216f951a62bbe2f73fa88f3cb33ea038662bedfc028e54d2a3e8ef966ff1880db486242c432f613c5fec101d497dc43b64091a83d154cf7be6e78b8c69b49deb2331726c7054b431f930be4185212de1307e607be15f493d10a92e878c567cdfbdf167c3f3fabcd6776609d5e01ba80f928f4920402b9a8b9abd1ae7f610df118e63f2d9a22c26cf7d032a1ffb4b9e041b13b6b079697d9c0dcc925889eb776d5bf6f7eb54b0fb40f5265be9a01e8c1ab7fa6406fe591ad592451d7fe06abb24f827a4f485e6a5bbb14dfeb83e12c9cda8d3671dc50d146ca9d964626398f9d86fb40b922f5e185587ef5fbca01a19ae4bbe7a512cd7cff2f277d5ec5c4da16f465c31f2301bbfd8e6f4e80558eab134fc5e902e285f2239241e51bf21bf00ea6724d56f3b39c23c06a22b7854e28978aa543ba54cdd90475165662f92b7833c95ca43f85cc17c8cf857e27887e52f096c93717e9452f87d80e152328e6f145f37169c33c15be498de72ff9bd7672a9ca71fd447d2c65e05f6c403f0e65bafc992a211c5f7026c3158e9c98330bb26a8b7c83b04f416769ae421d964e697e4634870551b1f35c995bcae694bcaa8659b661bba997b9633fc23bb78bf57c60094f7541a37d7d573b5def04c56ef8a6065f10ad69824360f7d249b9460c2248f66ed41a9dc4b1e0ffafe39dd03e3957c4e9e244ffb8f0de4663a8e8b5c1344e6086a50404d044fd9f1b8dab441e3f5b9d15cae099017c45668c63698fd7b8bfb2cef56f136d65a7e0cfd36da3669dc77f100cb83e2b767141301ab8b3f699c4f406da6dfbc3eff0e7dc4a4dd4ddab3902d81833e2c1818f3a5b04268a42e3c327cce8916ebaac06d5878d996734e1ea7ee8917e6697c17cfd8f63d25ef9065e8f98c6c571144eab3183e62d166c4a1758b8882279f3a2a616b5be009c5c40209097e11d8b3e04f08fc4e252fa2b7e9dd8638b66668d3125d2e796949556f5ebcff294e4f8ce1156bfa6529e65efc596751bd918fa4794eb6aa24c7170432c12e6d579fc9033fa78f44f386b15717a81fd229d64f666aa6fb1215fd2678bf5eb4e202bc4ce5fa6d62d57ceee79d623d9f725209a577f494ac3e2044b7943fbea9698e19e42f7fd8af401fd9c5fb092693f025fdd91f63d43b4fce6c3e6b15dee1a97be69ab6fc9ec0488ccdc7901ac60e614beadc0ecd83484f10cc626db342e4e27daaac63c17c8af1b525198c654af19ee67836d7190ad821cf749fd17baada3f17dba0ec10b6b5993cc5ec9fadc56fd322fa66b84345b71ca8d599aa19750881cba3debb76ba23ffc7dfad8f98f415da34f057b95689c628545248aace91df975e68cf971d7240b517bbc75ee82f60dfb3b6915f504edffbd48be71bdf95a31ef78e668e0aeb28a8f38b3fedd736e2d3b0ca0543df5e5192f3a7a51fbe4eefaa63635ccec3959e6a2c2e524d8edf7ab276c913f95d509765a6f8cc50d1ee548baf3fa0bcd088de21f15e81c7d6e225256ff32eb1be0b788b956d6d361d818fac00a9b322f56fa47671e91be62aaefdac3e920bf6a6abf988d21f46aa3937f5362c7a58ddcb29cbcce7511c58b4543b314b753cc2ad3f74dcd9a5b67f503c96e72caa4f959314761a72300a8a7e4f1d3396773d3674d7fac8d4d04570843ee251dc958ed69b7a84fb751f62ef6a9d43e923211f09696c8df58620e3f829f4920a7ea3605196594749f5fb69e03dc247a457de09dfef897dee77dd9b146a9838957c6a40b919a921e212fc2becc45a43e2bb2a9e19ff16d8b81e6378c8267f4a64f754d6f00822bc6450ab2282bf7e5e3fa99734be599122e0039d7277b1bd7fb73e62d62e697a614df333aab70e6c8ff28317d49a8a70639f703f02fa2c58c2432fd03d528a1ea7c66c3f8fab3d95f2d663b67665578fe3976c93e978c443748d261383916d4db17ca464f09267e221c038c6ce81e4a56ba73f7a119b95c6cecfd18eac303290fe9de807f7d40fe434a2ce3baaf8614cfb6aac53132fac712be36ff272e103a67e68f779139f8991ac8218b25278dfe16d6aaa6b8b717ecfa8e685d859af7be2233fab8f888c2efa08fecf3a8b4a87b0e5db6ff562f7b872023aa871612d5ffaf47e5e699c3a33aeb73573729c874e7bbf086c8cde4ba2d3293ab3c0af6ec668c5f4a73cdfa13e227428cc45d1b50f51ef1e5a75ff9a6c3da0ed417c1a249a82e823eb34582a18e96cac01e90b7d41a853b49d2420cebf68e878ea4a6a564fbd5f53bc167608f40ceccec109e917a9796a915a92d4da2ba456a964e26c591d4e7b2bb21136aefce3d61557713071ae1eadfe99e71f0d5ef3813f44766c903764dc171ed53976c81d8f9dce0c6019c0fb067c81bf531f3163fcdfd6693c7802ea64cf1256fc9647752b74ed43e12322f35f78a17e82bc88acc51f5eaccf19ebf85d3c44def79c6a12a752965f40e8e77d0c46a24d83e3f26b0c1e625ed77e22fd2e95269e20985de03d03ceba828518f919ad2ed59b45de7be28ab0f353cc63e66a1e126f948515f157193c0ea880d8a5ba021ff33a7db4fbea197d36721951b94df2f231bf293577cd4b6f3dae6e5fbaa4ccd9cfeb23c44b9a4e2642eb67e34ecd5926fbbf526ac45239b6d73c8672f120a1eb2ec25e855a8d849b7b81ba8b1ee18203170412499bea14b55b1c0f0a9e73eb8478c4b9108f38e023bb9467a5a955d81ca6f2a92bac04aea5c5fe8640d208f4910df2fc47fe88185b135674fbdd292e2f12f37695fd20ea77ef6e883f0ffb58eaba750f5f12fc4ba942e52471fe7eace3e928be0df6c659e2bc59d1281007d68e957e615e04fbfd852ccb8873d07a4d33be7fc88fd73ad5395da36b9029c93875537e482a99e2bd8d8ad1467dc2f91e78c7dfa58f98f4a0697dce103fa8bf11ed7d5fb08471c23852afcc33525e807368c61237949490faa5665d7d9f2c72ccafe5e78ee567dfc54b32d4b785c3166d436a34f160027d24d64aba81bf6cb02b699b9792661acf941f823c12cdbb9ee8bcd8c0407dda9c2f0ecc7d581312522f596a624247b9a53c1f6d53cc5acf171ec67160c0e44fdd91ff475ba96ddec73638ade71c501e3f3218fa88439e908ca0ebe40a768de90fd9271ff9797d24e3881fa11ad89a0487556b6744eb13057f9cbaa719951a4e88c3d276b003a631409e035a99d265525eeaa176552fa61e139d55dee9f693e50163de2f347dc4a8df18b827361fd9350f21dc587704fb5542560bd1d27087304ed691ad8f7c9c3723ff23de20a869c5e720bd8037203265c63c20f554ab06188fcf610cb0e46d68cf6c29f55c7d207ba11e9f5767068caed602f926a962eac57c16f3887bea7f4aeda8d45ba7d93caf9f75e64eb171ed31ae89a19f887e75483111a91222e197add4417980aae6ad073d3f337fda38af6a0b8c3f8ee803732366e2dfd6474c39b3eeadf311c9272b501c52f9358c9cd7d5a6abf4bdce2df4087faac7f7e976bc20ff1bf96a5db542526a46827adc39eb59dfc54b4c1f10aab95d87345e6c422269691bd711c7fdda3ce3a3c6f789d513ee498f48a9fba68e69d7d4180955c765dd132d1f9cb275f9887f7fe2456d81291ac71eea144b751d8b8f006d15d2584add0bc870e003a809d2612cce40ffe27ee3b929cc19acd4e7e4a7d115d964ee24deedc48bea8f19631ebfbbfd34be56a07b301f89e66db057b0da87be91a8a52ea41e15afa8ba3f6e6b3c13f5bb2c67691d53a68d8e132d710daa3367562da62edb0fc97cdaa9f4aab78df374826ba9160cfd63d7fa8859eb8bce2d066345ab356268c55b93e72577e36030d4df7fc443626c4411694ce2aa9efd5be8246958ca1dc71d8c189bff9178089e07dc43f1d5e3ffee73ba9cae242ace9cb16332acc321c3ebdd59805a4177d1fcc7789ef6f1ab96ae564ef46f864e11b5c0d2358ecebff7a2befa279c4f3cadd42e49a6d2f5fa23fbd3319f88cf52d74cd28849f0265cc7395c2f6983fffffbfa88f00ec9f130692ff6f00bd333752edd20da03bb098e405383dc5a874f84e3b3505f35a0419e17d45f94baaab0d9a49b54174feb28dfe10fb17988bceb05c55811b2911746d698f2bcbf051fd932e2437855bf48fa08de7f7a67acee472fc0d417fd007a4953f5a17ae985f52c3146252fc8cb48b7587fb17819763fb023b54f43f418758f749b7cfa66ccb6b6ad614e3b1cff3cf002ff7992d745200b3c7bd1f562d7baf9ee35fa73fa88d005a2b909ad2f987e697058e80b0f4a16559cbd964a77577ebf8a382d689fa087abace3b69dd9bc3d705cec984e2add43fd11e786b11605af575b86d5b9fb64bea1deb0fde8cfd2fdca99fe9dc89db63e62d62f8c9353b7d547425bcc62557116e8bb44aa07bc80fd09c44708eff7539fb57d3ea861252b5e7ce16a25be1356632fef8f5ba26db38d0978591a6bf91745914ed5ca1eff727e4d4fd86e9866db9fc7b56aef9c597a605686667f869aa3f410baa347b506091b6c36bd2584229d2bff64f41f1ecea4bad7c899f5d26a3e808d5562dd12e3fbe22cd2132751ed266e03bf888ceb2e6d8f7fbf3e22ffc7ed55db270e8c73252da4a7145f54e61cbb3647f2c186b2945cbc82417f0ad173dae67e66d1235b3f31e995f9bbdfa55f663dbe53a04dafd76c8ad06227f4b307da7c1c9ff80c7fcce035da2f7243f4fdbd49bc2ab8fe91f4044d75801cb120be9b9e6da6d7d0abc6cc8350d141f75bddab31f2a2b93a1c5305de8ddfa7e7ebfa481abcdcc4e735e75cdd37bd54f3fb66ad955de29e7cd67e5e1f31f76a6e7daf1ab23c8e1afbb676e98fdfa735bf754248d21aade092626287d7cbe777c5476a0b67361a63c65827a17b1731e3880b0eb01873461fd4736a59431f09ebb22e029e60f6eb335e22d7482cc183534cafc8feafe3aa6c1ec0f92195d2308a87cfbfa3efe8983cb0f5918f790d284843edcee9eda00dc4d3ca0bf398fb5a1591f5a8b43aae371bf5a61e2fe08e28de6df1443d4e7afcdcc1335974a56a27f84f0fba0470c104673fa5b15b8ac00f4857d46a4fa65390fa827eb1b499567c0a71d04e1803c13a90fa2ed37e4c67cb039d9fffc2f734e6eb7f441f91ff63f76acc9e16f9946356d38a46a6735c8f43ed9a96a255e93c69f011de60e81d01968879df38da6fe72efe290fe17705fdedb0ef23883af7425a2e345fd7f432f985f81dd89614e8335bdabdb092313eb0310d946ed0bbe0e73d132f4e5f514c17f4151def86f71e7ff05ed031c43e77463b10b15e7a5e245f90710a344f820e03a4d4297b169d9097226619a814c1b5a6dc80eb9404d8bcb2d6cc77ea90716bf4e7fd23b2576d395f68356328d2aaa59827e46a8f045fb0b77c84dd0631abc8f0d508ca3a5b95ed311ef3204fe935ea1e65f8e44b4e202f9bbc2ad047a4a6b7cd137ec796928edc47f5bb72561d92669bbef5421b8fe4e8dd73fe083049ccfaea461e39f2da41bf71fcd47f22d7956815d72f17edc5ab3faeff22c92a7d47f158a39bfe207d4fb9efce893f460e8feaf3630caf9fe9f85bf0e249b9071ba3aee7f248be975943d3faa2e29733e730a8e1a27d50b04d35ddde0d50f6a8de8c17581550050395bf2336c034cdf7ead11f6bac46c5bb462bae0d83f9bcf99ff28fc8ff9bf411fbb3994fc858533adfa4a3661d362cb522d20f6a54cbf49d796d402353065ea31daf25b8281217b449eedd96a798f779a65a5288ba087884914fa1d145c12b1e0cfe61c46069f9fd51b26bb7e0212646cc3df9d061f71b5e1325692bcd7bfa8b69b89983835d90fdf8bd10c7a591390e884705310fc29f390e5b68bef6ad287e907e22ec1bc16186e505f92dc1f5c6b8c1ee987eae34d24a42832ea7e78f6380f7c64bfe767d44fcee54175e8f0ac77c2a5aa27d2039c51b8018ad565a1395237f0d8b7d356b3dd53a18f5bc13faed5ff8f39953d4715b05b6d384f5e3173a7f646ef4c36c66fdee6d6898fc2ec7bc042bebd2af94ef0d9b9365bbd2188ac867bf37f2330c5b15be4fbfa45fdf9fb6c0a9628c18b9bfaea800d49dc47b21fd9658f43ace225d7216e301c563693eebe97a5e88bbee46f006e8bdc5b6a5f135617d004f9b239bed6e35734e823973b56f25c57825391aeb9ae2e5a87132698f5ad32453844bca241e61a7aed56756d46f099e5573d207f5515abd7b4d6a54ee5bc6f93bf591381aee7d702fb659a186d3f894ea7547eceacc77342d83b473ec85b67fd173e4735c3fcdbefca95ec2b1ac5a6bb77cec92d787cf917c76c3d398e67ae4a63cbfa905750c4d0dfe95f48fde096143a64f897ea7b976a2b64389bc5f8d197f23d60dba55fa9cee87bc791d2797611c2c5327111f17d70841dd4550b3f69c7810785b5a741973bc247ff3848e13b7d12ab3cd6da7f859dbacd1bf571f31f5019c175fabc77e0fa91fe209eea2da1d6aa57593e94b20ecf460edbc637a96d3b59a52fde9f826592a77c6a3cac9eab29644959bee11be231fb2839c45a9c73e3572e06d5eb22dfe96f0c6291d1b6a770e3b821f16f2108dfec6982083638ed7b27608647fa977b5753c97d8ccdee87af0928c9349a0eae8fcb4e7f43ae501aaa6a58f190739e390fe567012d6fccca86201f35cf59b767f76803c98ca61c6ef1eeb772d46e623c7c7943eaff953bb54eeb513f0fa564e52d7a41765cacbe74cc5e0cdf360ec16f0b367aace385373dc4c9d7deb9eb33d2fffdfd0473eb283dbf9841ec9bd19a59f649a4cdb385e0b3a0baa84c2af92511ae658d1ae4c5bad1aac2497f054025a267a8a6db38fe30d9fbd9ff93b8e17c87404cd22d45e45a2425e47df8ee5b57c1e412ee227fa48246f5cce3f91b6debda7382aacf2b4e4fc9bfa59ed93b14f139e3d2a77eaba2e675ed456283cf9951beb1035b11582dfab39cf74393e4be404d137e477eabe19999b7ddab3a4fdedfac8e6df87b486ce1f38240b6394e74e31d3af9f64de9b8dccc0716b3789ce3cd54d0045e21db6a37a669819553c8da8833a4f09d2f0e799722f51d73274d179e51aed39877089bd20aeecf7311cd35ac7d1fc0cd24242f5e91dd1200ee755948c3c731d0b3b2f691c31ec9e52c5d3194b8f849dd25fcb2bf9e068c6e4ca0ee3d862608f61a70c67feedfcd21fd765fc44075c293e227a9aad8709af3f2bf79a4a8f582432e30c24a09431173927cccfc9b00e9975168389d3cd4c499f68ba9debcc6c389ade06f5c41688a7d0fc8c9ebba8018fec36d1c9a8f14b562a27ce25f5afbc70d6f483ff417dc4a4d59b6c4ca60f5be8cf03db3fd2437f04d48043b22ca2163b383b625d6117923c6d39f6149fe92819b99ef242599ae3bd6269cbefc4099bfe9602d3d053d258237a4589e3a71eb89fe721ed5fc321f90c0f39c647227c085127fa399c47329578683b7eee335f36749b37aa675b35e7d4f62b19f7c92cbc805f577dba87d631f01bd15b3ce3a87ed751fc3ea3f86ef517cfadccf13ef8c8dfad8fcc2d1b939ccf18df9bfe07f1ef66c886d43d5acd32ab4c1208caa8d35e663f36ea7e138d36564d81337c4efd714dada60c66536b8db86779d06a1b7c2467b48fdecbf405934eb2108c46c44d6532e42b89e46d14287f043e045d59075afaa5ed27d9929798fa4809b9e3747ef41e4635229a1d988e3a362b6df091a991cf638ebfd818339abfbab51efc1ed397641258ee819e48d7dc05b1b9aea356b8a3de197a08e2b2152f255fcb1dce6b9f0a70e167b31bf2bf346af089284dbdeab8ab2ba7db01f548ad668b7bba3f6aadec55c6f97bf511931699d7d87926568c4fd00ae43b862e92567467207507cf3897f132dc2592b3870a074d608df4092f57cbca71b5da7fc73f228d311a2163a37af238676051de4bdd46b53bb39060d4b373148fa6f1b31c838f6cc3430c5d26c0c57a0c71abe47d61290f72fd8cb1cdb8dee77c44de0fba5dceb8470c0fd131d6a7a423ea6a6d175ea8f331bfd0fce4997e03dc67b947a543715bd34114f7662fedefd64722b6728b87449bd85066da26a5ed5f780b4763fa81de7572dd945e6dac21131695c44711edd5e86f57540324931f2486a3cc1562bf60f3ca5c6bbf40d4b6b52d8f0cfb4ffe9807c26c498fcabd4c81aa8422661971021deccce3cccde2b596ec22c2c66975118da8eb146e63cbb231474a95001f992cccb5aa8e8279216c9486b37c6ce7b8664926c22b9bc11ca4acf7119c5d3aaf734ca617a3d7f62bf349cf09f33b52ac23e6fbbf2031a1ee14906633bfa66fd507cd4b161a778cf43e5d37b8bbca5c81a22d8789ce3b706fd4f7d5fbc46dbaa87847be3cf027ce4ce36cfda78f98b468132fb1e99c60c29af766bb3c72a4a59a3256499c7fc1bf26ab2c22fc809b8bd599b9f5a275dc4ddeb0edfb99581e19a28b520b16ba4046491c997bc22906b664a2c1fc0bf5bd5ec80f312f6ce717319b44e0a35a28aed331bac25f3c923e6b6cfbb3fb5bbdfb60aee433e79883b66bfa6ed46834e37fc11fea40007f217d2fa39e9d61db95e62fa2c360ee5019f48eb0f0338f466de19431b7df8d3f60bfe7dfab8fd8727f141f58ec3026bf014d2bf23584d7f8007f87a2d59541bf2c1e35f161dfafcbefc3c7102914d6595458c3caad65029f7c54575a7f8f28cf9b1a3a13be3b203f4ea54374103e99d4c8592415bf025658d785ac5e9feb77d1b8244ed19ff79cfae9f20e39e49a0f3e0b36ccc7bc44dbca4ad821ea7d9f08a581f0ac88b7f419eb4bd763c906745f8f63a2ef24ac9882a88d4b6c55922b7212f04bc2e7273d92e2743daa115251ef58ed38eee8977f9451cf6fbd388b96e87cea37a88f9bec977b4039d291fae0313ef7cd633fcba1c1c3e2622136afafffabfa88499feac6e76d7303b6f19d7894bfb06c84f536827a8b563d0c9d69540869b5ae137e46f43ec09c159da210d30fc9db8b7b874dbccfe499122f253c959f01f91cfc0c3c4eef608ee10aea81b03e63f391f76c98ff1fe8288267f516f2aa35ba8ce7d67e73ec6dbe6adbb4d43d331c2f9c415ea4637d7fc1185e45aa8b997931c604dfdb3e2b390a66a37cbf8bb5638f45d5ba4e5f1bf091ef6fe24baff251e2a7dcafde3b79c6fbfeae73bdca8a2d87f329ae65e584f2bba0514b9e869ceb1ef8a0f7820fe2b21f1a3e04a2a5af8caf32774cbfcde7fdb76956d8aa5aaf129ff28d532ccf6a495d01416a95d878bb7136ad7b8a5bc335a8be4d98c29ceb584705674597616fba31e21984dfcd99af7fa559b1d38b7b6791812ef29629650e38730a3a89ea43e6703643761c223a813c01fcafcc91fa4ef1d9aaa64ac46bba6ea31cd80749f7046ec12c83c822c2bc91e71703de77e0cc3876c235fbb375bbe1f988aecf9fe023ad6fba37e8d709e34939a14d47ea0c9a476d793d655a8d95f64231ada8671bd8b6848e0876b9498f0a46fb42bf47ae75ee9430826129969a52c20b237e9ef3101b45e77500d78a637303448963b20e683de4cce8b74557279ff1916d9b41f7c1b7106bac7dfb40b7635e832a759953aa26a479a3e2252344df4ca8de6106bef673fafdc2e655199a071dc79d339e578ae9435cbffe643e74db0b1ff1784fdee8f6a8f7ea4d4083bfca475c455f5c6073f4f3acf132fe94f010bb61874ccbe4770f2a3aa8d597b9e877bbc78a9ec12af9c0f4a810e97fc83714cd4a384ee86bfe3d7a35d375ae6e942e206381fb43abbf7c9fa112b3ee27c76c69c9f03a7c27b3e19cbad5693641b439ebf3b5a80e77972d23beaaaa768df64ddcf0bbc4cdc757e778ce6343f75a3487fe385b517c62de9d25105139251f4b2f4116048dd9029b9bdadd6db55bb2d5ea45b656f5ebaf3507fe96cc63b69e6d50ec173e5793ea9867bd3307bd0736302543f8fe98f9fb4ce305df713f3c5e5be15afbb8d9f321f37c13f09104efa16f3c6a3d04f25eff1beeafeedb50ab63029c11c5b197736ad0cc91eb373ce3e3234959d372b6996df1f903da31ab5ab6bd442df0ece8708cd588d8a631e757005b12f4b6c5ef015c41dff8fc87fdce76f83eea39d92ed51c1e6327abd5b5ba23dc14f41b4769780734bc278e59b5f2b26a4cb3eff42e389f1d507d3060f22b461419ffc9d36ee7233be4fbf87494f365f40d590ce78d87049ea5c6b876961d57a03bddd198f7cbc8ec45a465a59e9d8c0eb353bf27f3999d118fcb222602c8a7e0856a8cb20b3a6a3c1735fed965f4b9724cfcfa8df76885f3b1febde623b277beab613f42ae3cd0f4a6b5f6dd57efafeedd386a4fe7392fa8590bdb8e641ce9ca0685308e56fbb42b74d4e70fe8fc027478d5d5a8058d97f614354f90afa26df4738dd315d2fc03876d5706adda762c6c3e72cbf91a4afeaecd076d68b9bd838a17f04287a42f34bc93f0c7808fa855363c244c32d067d069d88c6a97ea9e8842a4da8cb68e143f1f7f3abf26ed453ba39887fa05d0b713b344d59995678e9b594ddfc63e6560c15734bd4f775ba99ad3cad486d9547990159bd214f988b00a4f53f0ed77949e9228f8b3eacba00ddc7b60e234a0c7488ea9c9a3e378c747fdcff071ca983d37d1ebf6a88f484b7cc33dd3c4b12131bd5b5823c87b086c5825d657586f11bd44e4ff6c86f412e47da046baae197e4ebef8005fc5d683b6b59bd832728169afa927a863b344fe1ae821bdc3757d4a620544af42ae5f4fd151d4451c5ed17559c4af15d9e760dd7fadbfbb9c0fb9f719e924f3348de7fbaddf9b3cd079f097e63de104675dc24deba871c82a0a97cd877e92d90dfd3e0b4bf239fd6eaeee9f55bb3e5ba0d88820f6ecabfdb6e7635d1fb1633d777dcc39a1dffa86eb8f48ada9cc0eee3f0726971afd16cbb9412cac17d40d0ca20639666bc0689e22ef8b1f426afa968fb2373ef48382e3766fa66f29b56b925746ce89d93eebdfba5d7fa17df16247b933304096149d018b6dd86fa3b6d49b17c47dc1af032b716b5af1da88a057bc278b28c6fbb9932868ecfc22db868afa7992e761cfc797c7df7837fd0eec2b7a9ebe205e387b0b7f7b2297e8eb671713a7ad45b3e257d456d091a8b5c93495bdcbdea7b3555fe918646f4b65bdec43d65b5df9e3446eda6f1c977bc30cc527d49085966ba616afcea2bb74c88735b5fa239fb7991fdbae958abecf5f10afb50b3aa0560850a8d77cd3864d2812737bc15186669c93156bab7750896c33f8434df40097f04ffb6ce7c1c4c51c3c137e15a446c91ff1a56a0efb7960e105cfccaa3e77eaa1cd4b7f5fa49cff203e2a673ddbe67dbbb26bd963c2f82bd927c288c16e101ea36b58aad55e61de9c3ef67b1d45e12666cc9c110f5c57bac9ac4cf8c4908c75c508252da7cd3951bfeffffae2bc54adcfa17fe4fb7decaeb12fab5bf94c7fe7587016994a3701ec0f2d6d4450dbe2f1a8869263ce79173a3750bee798db408f392404e8e4a473dd0cfdfb519cdfcffa19177bb6213e087825bd27b6e40a968ae11fd128d76a970caad9e72c70ac9ea88f3a36ed1eb5db8125a331afc82e17ff7cc1a209fd237f3afe769c178d8df623a11fc06f863daba6decb1f42aff374ad138d79a2aead749d5fb5b3ca59efda71abc002c66e2ae89c46f2bbdf386ef665d5eedcf9e3c615538357a222d9d7c4bc3657e78ffabf9cbbcac9242eee6c1bdfbb391fd638fd10deef269af6a72d47ba837f69f8a44d1e1113af151b0f1587afcb988ac0bdcdbe71cea3195fb66d3c575c33630ef83df07f0b5a7b8f56bfcebcb26a0d4b6e481658bacfb49b468cd535bba23cf2c0a790def06ce9db36f923bfcb47ccbc12d5dedbd983ac5af9038e4f90da31121f57e994b38db2818702be20710e8269af7e9f547df51bc6783864bfab0ffd5ef6484967c75e887793f2b69b1b737eec1810ddf612af65f3119bb67ef5fe9ece512f22b6b67760ee10c9cd5bafeba7d1df6cccf652fc758810d4d5c91c4270e3fa26eb3992dbf39078ba253c57bdcffb9553ecbef8b7e4338ff64feab6674f54638b83aeb98bcf4a7a999f4cdf10371591b5ed67c7cdc7578f26cd36e3a015cf182b9d2baba858f622e1573b895b8de7bf7474ed43c54716ce3df33dc159cbb16fe48175a897f24023e2ad329de66dc583de098ad885c7f2b93eaa4d8055a0780fe29ad77057b69a9fbf898fd4bdddf211894bbd209bc71a8a82c439597c24825b65238a5ab5a7a4d62c625413b6df769bd8d44d7cc4967fe57f648279d178b2080f618b7015769e4bc67ce4fc45ec1ec4adadc5226f1af3bab79b39f8e83c6220e0af425f6b8499827cc600070d630a3b15e703e918613366ee21ac09807869fc41b2ce94282eac8ddc98672b67f17778c9bfaf8f300d731d37d13db556ff5b68b332e579f091489e86cd438c7ae454edb9e2a1f6794f6288f0cc03a6777fa68fcc2274cba4f779c7ad4d81956ff2bab07fe02ddacfa36b0aba3e7426b74c3b04b9fb6ea5dcd37cc47336c5ccaef3915df290100b20c033436e885b7566d57bf094fa22f3bc6abb3a07d1adbb8dc6b9db745b6edbedd47a4e7199ccd6870e61b7e878e194c619283a2fd0d5eaa9d1aff14d323db81da931e9e4d57dba9c452c3cc7e623dbce4f8a6dae3fc747e4ffd8d8caafdd5bd318ac945e983b1244309af5c6df8c78ad0b2326f8d1c0a9f2a2bf973c14c43fa1ee6f8001b20bdabb2127d3edabf64e96dd35bd49f01c5f48fac37bc096e50ebcc0ff335c1afd3363cfe278499c6d6d577cc4fc5e748b02e58b061829aa7feeb0d2d0f85a29f2eb747b5e88b1c2b6b9c0d793a2ead9ee283cb754e3e26a6474efcff411e963ac8d6f2ffe119b6ed936e8dc17ef8f1a7a9a7e287aa2ebf25a1821817f21c4561f9e19fe07337ffc9e7788601fbe51dd0e48369d5fb524b01fb56fd7c410fe5dff4846fa6dc9bf920bcf7ef7ee9be4531a7a9399ef8ea343f889b32b97aa7bde137aa93be57ccabc81976bf7973e57bf3cfe1927ea8f90fb890f2cc5f45d78d892f251ca0bce6f5f3a0b7748d85cddae3fabcd027c469d9782fac9f07fe975f3aa6d7545e752e927397dfd223dae2f56f944c59df16f72464b6fd97fb1f1997e3b3eff17f84776757fb5eaa72fc8800d7902a4a47e4cfe88f090585caa18fd05bf73e7de6e6b869bf9d3f63d1953a57d1e2339c6f87fc03bdc05bd07f2f7e18fa04aac5e7c3d4133ff6517fac8b673643ec71c4bd14984df18b88df556390b9cc9e9947fcb3cdc5d1af73563b04d5c813f9d8f753ef2fdfa48485b7e075f6bdba3a76965116fd47e4d7781dd889852ac1e77b5d93fb275de38f2334aad828edd7a60dff5b63613db7f1095df858fb8119ae7211fbc9b685d99b50837e7b343ba6c2cdd64d9e1dc11e005df301f79d67e88a2a2bd2d57af285d276411d8e4a6413ecff7cebb39df266dcfd0fb3a35d431738a15485959ae05537016f5c3e5e37cea14dfeb9dcbe1d8a7586bc53b600168649d993f34c633ce96b5adbefbf7e7b3ef8a2e2bdad9ef52541ffc22b1f9ec25c33f525a6fc1ef0dfd05f15b880fd2f9e9362dfcca98d8f6f874f82e33a020f9466ee186a6f5ab1b450dd264d3c2e7aef009f1419c517e466d62f45b9eb52bffc857c641f23d61db3aa1237cf4ed09e597a0924695e3b70403d3cda0a29d17ad1960fa84be321feb7c641f3cc4dcab9b68eb9f1e53864f56ad0e17f81a39f69dc7e5839b7c246697d83e7ad88f5c1718c3865c8d77996f89d911c7334d7d44f0ee83715112c6312152e8a8934f781d76fcfb7d73d19a7841c463fd387886eb622ca0d5e747358da39f336c3fd31dfa47b67dffa83e44e309abed9de3d6b0faaf563769d493bc74afdb45c2c007d2d272e4507ec899b368568124d8b91b25992786b6b428affa5d19e7e7f2d9f7a18ff0ffb097b805da2541ac6c4c3e7b8826647c6f1fd972dcfbc5b88ec2af4c5af5a734d8967f2dfed463bde9231e12485b979c15c0b997a941782ff03fe497b88a0e37c41e9733faff19deef77af0b7936d74549295dca55e3ed2a3ee2726d60bc17fe7718771eef94e638b08e6d63b4df655b9ef26feb231927e44b39a7582f396eab4015aae1d388f292187de4de3a9ab4fa9122e95df881cffcb1c6880af587108beb2bfac84a9fa77b6a4c4a2515f9443fd7305d628e5a1a7b619bd635495a33baff227598b972d58e1f43377ba89c683afc6ae83ff31df947b69dff4c4c7b55ad46b83689a1fbd87e025f9c3d0a4e9a605b767e75ae5df5ddbca1c6a64eb1d17dd8b2e6fc3eb66ded7778c9ff863e82e6b1cdfc8272d351a3bc6fd3625b1fc1b9a7f8b82e91f75b8c798e7b0798b542a3fe9406dbf2afc19b10cf54166c932df888f873504d0d357375de0be35ac1a73d3ca61a523a46c0c60fdb873eb229ef869bf8d0578efbdc7927ea00de01fd4a5799636ccb3eaac72a0914f9a2f8dcbc25c97a2dd6c1d6effe643ea27ce4ffba3e92e5fc01dc53e38b00270bd1d76e71d9617fc947fac8a31d5b1bdd51ddd3f640e3d6e6743eb5590f2bd42376a58f68daa7a422442a16ad78ad8d47c2d5d2117ed7fd47f7057a92e2790f949584e847f0191d6b9675421d809e97f8b6f9b6f50f9b8fc8fb02b7d17766ee6b37051c159db5c05553096793e647c761ab559c4eb96fba0a1e223fcfd2e5d68313ea87612d99a8adf03f7d24ae71ae9a5bfa5c1f89d45167db166647cbf76ab6122b6fbd46c92ef511532ec77d9f2997705bcc78f41748df8b33aaefa57dd8afc48f705e6bf64d2f5a7b446c5b4f5f7887afac05f169708d46a0c9428faa705d7bbb663de2d1b47e891de487d82ffe01c7a7e5ac67fc2e2ff9b7f511933e1d18fc448d4ef362d92a9f7ca48f6cb069315615ceb907e55e50274b9e65dae03fe389bfeb1f51f4b0fdeabfea4a719b70b5acfa23a0a98da253740f518f50cdec0beeafa413c63df67ff959f7886bd51a7dd6388ddfad8fd8fe9014e7449e39b3660eb8ff6a77e45b05f718b995a4176287e85df2e8df9a989315a9d51b447656bca5d213db41053fc39f4fe3bc88ccd5ffb63e62c7cea25d9056b7b57f84b5747d7c269a063ce096600d4afda63ff5e5dafdb5f347e47ecf843e8ae8ef4f717fb9efef4a4e0f560a631a8236030b11abaa65faa2f7ad8fd8efcd3924c8515fa25a7599f4284dcd9ebda00e7180812fd804e7eb3c063106a92b9219024c619387fc4e0ec9bfab8f08a6de2b1f8536237e4bc9a6dd974ff411d31fc21183b01521a210928aaba322f89e1ed3a53963a5d8b6943fd14732d6ef804938571aac2ff5143fe625c86f41de8cae52f04cef9ff451933173d5e3ace471ce1f374e0dff8ec8ddf33dea2399e0fddce989e3baa76e71ac28106ab94f8e29eb18e31ee4849648c2ea1b7e2c1d775032e6eb8d28d952ddd33d631f5954dfdaaebefbbfaf8fc4c5b3b25c9f2a7cae8f04fc43eaa31f52be34ea082ee03f105fae8909181707f53bcd967f4dfdc6a3d8d8f7c616fa086335f62f39bf0ff7e0dcbd296bb6a34bc67689ab1bb24fff88cc0ff0fd536473838517fa45e7c49817838f5095552fc06f0e6221e433f052506de9867cf36b6be03f7d2467b4687cb1d64760050536f9a7f15a467d7444762076b655e8dfb7d4b58ce7a171d1959c1fcab9730363fe2bfa88e92316591abad408b9889fd71f1129e41d517fcf0ec51d3c386ed72d0ffc1cf9113a3a2a9df511799ec9d7bf7bdee5bdf859ee7962914cb3ff0abe0f919e1c89c11649cbbfa55d52abea9d125007fa9df60ddd9394863a98a3b1c1477e27aeeedfd747e26805e8c205d1aa4ffd236f5e18430b6b2fec2c52afd7ac8928b8bfa69f7a57fe1193ce624523e7714b7d04ef83b8a6a07e0ae7f0019f1d3c7188efccfc49539fda873e62f178d8a1908b831d52ab729c00ef927625baf38379c2ce79e27ca0378ac513bf092cdbb8befdee45716bfed3476c7997e28fe8dc0be528241805c8d64702dc78eb3cbc52493573ae46a4d1f4b8a835e01b43960f7de2a1cffa2bfa88c41be5023ea8e3c01aa7992bf803627987f1193b64e1ad8eda23e613afea5a17f7ada792a0af47f586ae494fb53dc2da9339633ef631ff86ad69de280f3a29aa0a81958ff9181cdb39978c85263ce691b06a82df3d528c81447d425e40d5711d4b20e3fe3bbef67f5b1f3179099e05ba9923f954631e5a762b9d3f724047b1bbe33bf8e4878a36e9b8a038fa13476f7719af65de4bad8624accf82b3f5e405182d1541b6f06887b817949bb7c6ef142faa2dd95f62c41447fab1affc11f31d117ff518f284a0b6704cfc9cde45bc73345a600c768dde290e61567666d6b37e878fd8328e9619fe097d242a5f8718b0cfce625c37d0e6c4a77e4fe8d2fafc93926b79c435d646a9f91cf8d4cd5cb5aff6ef33f9375a339d72f72ecabdfe15ef88a7505f82dfa67c49ef31440dc5b7d5d1424b7f1a6b8478e9ab3fd6fa538af2c0b90f8b4037907eed025febb36348cbc5a6e6d64ba97c73caabdbc01788f0f6c770bef44e30eac5c4c5726397745f17b544819ff5ea8476ad4db1c7618e66888b62d92aff117d248e97a4c896d3b63d854ca3ccfa23e32ac9c5dd21d5fff892dfe377c6a46ef4dbe6231ef96546092f5adfdda8cd8b2a37e07d885cd1bcc2acbbf5ea45eba4d8788de67cec2b5e4b9e8de8ff25c591e9fc97ebf01820249dd16713057c936f48ff9eadf53ddf7896f9eccfe6e2dfd647e4dea6dcabe5eecee5ace605bee8d0f354f1c4ae85363f22090c79e1ee65e544c9ee517bfe2edefb237dc4a46538deb0fd2c4d96035df3a96e68ae1ca38c1d32eb79939cd3bead971cf25f670d5b5b4adf2bc4f80d63a3d7e7e3bbe79d9ecbbc52adbc3baa182a3e73c1cd948a75828ea473f44dcc1ab1411abb446a276bf9e0dc59d40f780ca61b7888bdfe8487cb7c98fd9e3b8b7f501f91868ace6a16de575ed46f6b5a4c2f429a8511465476e0538fa3b9bb6ca63e62d359f9fe9978046c36366e98ae3baffa9fbae738e185b7ce2b74748617e67ca7bca8dd47e6631ffa8869db82dded9c6d8ecf848f1f8973f0580a3b33ea429afcc30bf5333b9eab6adb1b7f175f6b4d2ffca7f4919c611757e706e5fe7d2b6bd42d37685180af75ef05d8f2bdc5f8265130f2da4c1de13bf591d0176cd44ed7582fb3e989e213098e123f8cee12e8537ebdf7043f0ae5b27814a725b570a96e6e584737c5bc66dffa4894e733afa4f805d4a3d73cfe5d7881d20f5fbca04e4cf745bc8a060e9ae82166acf6a37f0bed7ed6e925344f7d0d702add98715fef5734ee21e4bb773fc247be531f319fa3e847b2cef5482c395673f233d6d26f49cacaf9ee73aeecadc7f77e178db5f511fb99ac17c1df9eab90fe14d871cea9ffb92ac529e95a1d292f8a8f6bf22bb9b7f9bf391ffbf28f98ff3f938fc4f49deb0a431764cbd398fd77142fa7d15acf42bdccae0520d837d85543aea7f847f3578be9efbfa18f84be54c32ee44d9aeef2b16bacac00978ae55f1dfba3f8484e8d4caedecbe41a0ee532d834fdab3c6f1b7d24d4a75ca92dab3fabfecc1ba31bf8fd358d7d23c90499b9fd9b6675a9add4e039de2488e9255f3ad1c267a3b6498a6397f7ad8f649ce83890bd6dd67ae839dd9a17d6393ea29880de7dc5eb1ff9e3f7e2e0763eed0fa639ff28c77a99d4b08c48676cfdc5795d01c3ce97b779c8a6f9583a89006bd8e025ff983e62d160f8a93b134bd67da3ea36429b746dd7ae1af52b2fea53ff4e1e22f4bdeaadc710dbcfe5cc5d8901061236fe06238e4fb2f946ccf59fcec7bee37e313f67403822dc01cd23de28f61775787b8c2fa6e3e49e292726d7422e65b6895d02fb5580c3cc1218e2bd1609e2bb1b799834d3ce277371c635860b9ec583fe297d44e83ee590b8ab9ee3fa81cddda8057540d535736d8a5c443460aee3b8e585c6748ae61fc4c4ef7c833eb24e73c3fcc4595bc9d653b59a4073735d3f9b7e7366bdeef42d072caa0cd795cd84bf0f9e638fb34d43f7a58fc8fb0bbf7c205e594b273a03c79bacd42e1f9cd7cf5b8aff0309dc45e5bdc700ab51eb6bcde1aa9df995ebe7de590fbb09299fced57c01d57016c92b7ec69d919b6abf7f8a632772cea22675be701ef529cfd6b16efe417d24c3f9d18afee406965fe12dc4fb5da088d890ec20c3b2119bb50f1e22cfb0f3d9e3fe4f11fe6ded063b99f40fb420c6d7eeeb36fddeb73e22cde269b911d571472d4b603106f10d76cc849aafb4a26a5db54372639692bdd006066d7de13396a3e0fddab93246d3eb43edaa1ce344a301735ed7503eb17fff8fe92342ff35b608326cfd0bd3274bda3ab8726e0a8d30371b76298aa30a9ca613aa8711a1c5bbeadf67fa88795e9e2f7c21a5e99dae6fa577067040607b2b10b67af0dbe907cf33e5f19fd447f0fc2ccf91a2d958d5f0f466150faf69d43ccd3f8a814e059900317359f5ee4ff5457bb83aeafe2209193112e29747fd329dc5807191dc1e53b688be3fe2f0502f3299a3dfbbba7664ba7a077b5ba49ee2bfa78f1874b5c5f13b9a137ba1dc0a4e8d6c1e2db92c58a63fa1a6e98b1dcff45d3ef74df9ec71b4ef818f268d145c5cef8331dfc41ff6ad8fd8be8a9217c404e85d7f66bc5b4c5e3ae605fe1ffc76a6f8480e3efa8710a312b114b995757d5cec82b4173afac3c47dfd857518257754efe2e6fb9fd047e47e62db56f427d15fb573498e6b327cb33aef1b517e8a76e5d408642eb5fc099a463ee91b431edd959cfe793e7b48efe6fc7f385eb320b72ec77ef46b67a6eb35a53486fac2e01d8233b508c62263f5e327f411b30f78fe0bf311ec8a39e98039c2472972bfc9fec6b92eed16d52f211d862a5a03a1afcf3829e315b2192ad7ad14df57c623942b22362d8d48eb117e7df5b93ecd659c62eda6f5aa74986aa40e16cfdb3fa28fa4d79f05ac586dd3923a828f64e91da8e7232a7baef847aac7f4ccf4437b1beefb1d6362e3fd7ec4031eaccf422f4f365cb72d1ff96e7dc4ec47cc3cc97b04d86585e8f9604e72e1717ac178c86a4cdad02bb21cafa63e277defe3bc918cf11c60402a6a39468d328cc393d54fddf77f421f11fa2434589d4b0cfa83729d6d5986e5b7a334c3f7b7f203b4bf453fa8ed4af43927ba8c4187b6c961fbaa3e62f29118fbbcbe3e1b609ad0779e81f115de5778d13a1ff9597dc4cc2f9f39e203ba09f8c522877c97824375800b016e3c5d23c71ce33a2b9e8f7a243d64528fca0354481da1424f100fe684b10ba6adcf9c07fcf64e3d57edb877c4c30d9d59d775ba465e4dc087fe217dc47a564b4954a850dc3f0f7dea65458772c01a872f5664e07dfa06ccf651fd914de73e3a1ff7dddfa68f989ffff499a28f315e41fd80751abb4ea5c9471e8ce7caefb84e7cb54cf57e35a67e22aedfff843e62d34e4563d323ff7501db4789f1a7a0d55d39ee60dcb8a8979cc5a4ca7159991df7e34ff4915df3d48ffaf153fac84747d5ca73f6876ce2c1260f446d441cef9cae3baa8f12d3c9236abfb3cee2aefdfe81f349b35e80ac048c824ebbdece5dafda9d337f5cbd57bfbbd5f3b1165bf18fe923429f148dce15c20a378809d5987e152f94553fb09fefa5d9fe917d3fdb9c8f9f1a832f34e81435a53f34d4dcb6525e68ebb3df53f48f07b28da1417799abb590030af76db816b47f646d2cfe097d241aafe522f6d59ffae34a92f3a1b90e49a294fbd5d33bc499e56e8d9a7bfb78ef4d3c7553fcd0f78d7ffc7cfc140fe163c04736f16033275474b14367b1b8f326cd42eeae8add21ba5c78bd81b7e68f1db6a575d4ceea29ca99bbaf8e3a4567d1043ef454eb3f4dad27e1fa69f8dc7f441f11de207ce4816a76b72fc2ac9db6fadd08f4c4f6a3fe0dfac8bedb4fc66beda219b50f1bb04d9e1975776dbd44d64421f4b134d47a484f152f01e6d8b3715dec7cfc13fa888da1f4ea2c205fa6ea946105df7af250697737ce42db3f941ea2f5911b87f8c83ede7b134ffd4f1f89f2918f787024de8a63ac4e1de8118a0750be8d3fa4638467aa63a54b7e91eeb259ccc172f35099e51e956c01ec8202f39a17e7d1096d83c1f3ff317d841be845b247b1b2e021d821c3438eed35f3f1ecbeedb3fda78ffc597fa5f1fc21ce2a32a7361f91f35cab17b98fb907b21c4bad48e135895f71cffa27f4918c139557e74e32f7d4b9ae5f867986c977606639ae3f6479151c9a7098fed3477e9287f0f1537d24daff20c6c01fb28d8b7eafe3b002bf888cabae214c3ba476e6cf66955ad2d799cd0ec52be4187bac60f0d469f8dc7f401f89c997489cf4968b4418a785789e865993dca043ffe9233f3806fb784fd3c78f3570e105751523fef8b8f9f897fc23141f3a15ffacd24366e9a4e03322a36afcd8eb346a4c2fd435938a41b7f6f1de9b78ea7ffa48948f7cc4836d3d23ee7cf4fb68ac0263346bccca2856251d250fd1cc47cafd13fa884d2bd284279be6a86920cba03e928eed34ede73fcd47fed347f6f39e968cb1969f62feb61c374eff843ef2ca7c84730650c7a93f55bbe48122a7c7adee0cd56a225853d0474c3ffb77bff7269efa9f3e12e523dbf2e06ddf338a8d12d6434ec7fcfe96f9483a7addbfa98fe85ce9996a8a77248a542f49cb9f8ca71eb17ffca78ffcdfe623196f7d0d7cb446ecd86333fef8df8ed74a87adbc70dcc6d1f83507741a441d289ed275f1c69cb7b75274a417f847f6f3de9b78ea7ffa48948f6ce209f67a89d33be2de378c050fe3b0e439d3e03bfa0c7d24b5fe9c7f401f316983d085176f929d7b93e6ab3769e57b4bf8dcd7f2d20adee7f4e7bbc7e43f7de4cffbfd3bbffbe8b3996f538b39f76fe823c29784a6bceae32251cd15732fd3d79cfa9cea391a1b70a35d6bdfb473dffac8265a3cfd0d7d64d338c5db9462797c6c9b1bf31167a3dad696b5e977c21b24363cc4f334df6b1def97afdf131f31f7a68d05b24b1a26f7132c8d7eee2d575a9647ea9999f9e830a8c361d6a1dad7bbdb72f3c6f8a03df4c33cf727fac8363a80d9d29fb4b87512778f5daf45f37f733e22efb7177d84ec0982bf5a8dd0a45dd170eb5e95aef6a92f9c436fb2b8f7c783e9f4a576ee4da627d4974935a02fdf1faf15f7ae391e8b9b6f7eaecd4332d67ccc793e3e93ff3f6ae94faecb399ff111b79675a44e58886b66df3fee39dbb68fd7e7fa7c18ed07f848c23ab72b3e62ee7dd8ae047391f349847f44b04ff0ddeb8e9eff27b4775ffac8261a5cf0d66d399fd1dd8fee6f1fbf3a3e9fdd3f0e2739ae6ddb071b5f20aa8f7c6713ba40b42161d0ce306f7b17cf90fb119ec6c2996247705e34e151cd025ae5732ef5ae9ebf5dff84362d1cc2fe48e87eeee3f9664bb15c4e7439b1c535ae930bc6c9b53e7f7eadd895e0c33a303e1b3c23f18be72615fbaced9eb1f9f8f9dc6434ae6342c76ad0b9c056b6473e2234bd669cfb2e3e62da25848720be53fcecc23b3ec2a7da65db44d7f6a58fc4f90784cfc6e98776cbc5b46de9b6f06af3fb57eb9cdcd3fbe4de329771facc2ef84822e65ec4473eb211ece29873423e329dd4024c41913977f11c537e159ca502d3cbb937d1f8afb06b31fd1ab9ba0f6e70ed77beff7aff088f65ea3c46e283be729c7ff27d38ce8b00434cb798f9b05bc87336dbe0ccdfcaefa7ceba7fc2e6216c5fd2f391fa603ee2d689f8cb53cefa18c7f57fd311bf09e76311b94f68d7aa334dfba6a38ecbc767c543b21d3a7ef7f3c66ffc19b4019127496f32c93236782d7780dfe9fce5c4f7bfbf7d1cb9f45c3d16fb787e2d7ad4cf97cfc8c52b73b37ee70cb995ad368cbfefda519eff44c7dca1f159dd6752e5cfe5d1a1be6f8fc7e3b3fbd6a2f7ddf8dc9dcc47c047beb3493dd71b4d337ee9bd3a75ecfa4a7fdad6ef930dce1166df52c779528dc4953aa23ec915d32d9386eeb369baa569f82ec661113b0ed2a64633e7e380e763a5c76511cc8b34397fcb2dee73f41a798ed9171d67abeb6931edc7ff89778d4d4271daf8fd95be1fd58eb1fbf13b2d1573fd67e317f0119e0f6b3dec511f9156dbf3f34406377118cdfab33fd9be4b1f11d95d3ec3ce2735dbf199f16ea1134c32c6351fe914e66f1eaccf252fd42f1e8c67caf566bd0f23177dad0e88cc8f3caf64dc4b9add17f319f67bffee1cc7cec75ef411910989c654bf4d1f91fbadd9c63dc2f04b132fc9a837af293ed238c20830c6ec3ef49175fa5edd993e62ea09e633d4e796faae76caf9dec0474f219b591db102b34e2b66ccc42624f741ec82db701db1c949bd5ed2f93cc64fd4bf57cfb171267306e662ced04b3cc12c718a895f6cd3421e21304c80095cd2f7c5ef8bfadc837e0737d2cf8cbe6611fc6fea34264fd86e7d561d5b2fdb1f1f31f7fb77d1ce8f9a4779cfbaf6ecb3e2f2854a6388aacd477f406b763926dfc5534dbf109f13ecf5488c81c7f361fe3e8e87487b357e2778569ef13b7e4e10cb20cfc26f042b1ebce0c50bf99ac9df6c9e224d303553deba5dcd7c5fab2fbb990fcd47be9b86466d1ee4cb34cfefeafe9b1ae53ecf5c20d31d7b9376d39ba4ef1d1788d8b913835e7ef7fbafdb7faa3b7b8e69634a05e7d9b6571e807fd450c1065538dfe9e800d5756ac41edb4deef76abc8760ecdf514e9fbebfde09541fa5a69ed938f526f512ea510287c699e54e9d59e59c7503d4b03ad07e2b578dbdb62d02b364f2c67d422b305fba56d7afd05ff5ff9d33ab3eaa6bcff89969ddbfa2e6451e788c8ee9e6cf06afd9767e36f191fdf947cc7dfd9df15a9b1ad7df1bbef496fd43aabbd7291a74edbb9fbf694cbe93a70aad9723ea442187e69c723257334fd3786dd3d914476563b7e33ec027bba07ba09e16723e751cdc05e1ceb4d52a5f287e93529f9b556a99153fff84efa1be6b1c7a411e8fc6eb4d7bd13c73ce3dc7fd076d45cdb836a27e96fc26e5ade3fd7fa4577d3417f67c04d7ee297fc4dcd7df1fafb54eb315ed5bcd50d76adc2244a1dcb9b6abcc02f9f67bdf3fae8571a6a92fdedfbe5ee20c966a8697541f0ab862ee69bd302bad8e926ffe78f15a3f71af501b2a51019d0606b234e796ae635a4df7d2fa1c300ea72fd54ee524f1d09bf51c7f3c2865ae528a2f2d2f3ad7ed66eea28dca487d6f922cf7d3be925c062fa8ff8b4a16ed66baa2aecf75ae474da73877da83fa75ee32a9eedd56fc67be6a36862ffe6c39ca5ce53afeec7da8cecd12d7d3c3cea59bf5c733c597f24ef57579df4dccd5ee9caa3e76516de94ae94935d5c7bce653517dc4aebff2f1fc84f361cdd51ef988eccbaaf1ffaef8c86736995ceea0adf491b6da2503458fbaf7444ff5f7a51d3cff77fb27ed9be2b5829834b467aac5b268d07b57d5731b8a6e27d4f9016ab068fdccd3345bd713b469b9e814fc1bf08e7c82eba6abfb75d4774bb51b3b2375ee95723fbbeabbd63b654a0367f9fd9e6a8a2dd54e4d28a92aa3fa9044ec1cf0aeb26a17299ee62bea95f7e9fbd6b56aea5cb94535ab50d955675eabf19aaabe0f81483a57f7549f07d78cb175eaadd79fdf767dd9f31199a7adf247c4bfba0b9aba8bfc914d74d98c199d925d5ed345c5fddfdbe01ffe6d7346d5def2657fd65d8acd24e67d455e35db2e789adc1f72ef92e3833e9297c5576de659cb3bce49c6877e01f91fefaa7d11f83c2cf7564e6252bb290fc66ac5fa07b4a2a58e208e7a45ab7bcf9d7e37a9f483b9e3bfce1dc76dcf6ac979da7151d7a3bb22bd42eb18cdf14d4fe90eef73e2c5bab6cb4b58331d3866bd0342fdd3750a0fa4a67178ae7c48b899a8af2e0d5593f215c2d49cab1d5551bca8a2ee39e8d2fd9a33d5df17f4bde26994f30455aaeea27a2a106b07b3d9cc4dccdab7f5c568599fe7abce0ce3c17acc624d5fcb396b3a4720e384e783f5c47c242efec53cc67d6fda2d64cf6dcaed33aed3bed6b8fb9af625d35e21f7f7bce8feb63f9bf691025502eda132a81ac9e1886850e5996676a4662c5f633bcf677d8e1b179b1f70ac518039cb36a0866bdd9beb6640feae2b1a39e11a1891e79a74fbcca0e7f85f72f1a51fa0e9eabd7ab754d7a9c7efdd519420df209a8c9a5d159f28435063f88d57af3adf2fabff517de2803e830780e6af147d7f573b093b2cdf54b43f4fbc02558ef47d9ed4fbded278e233ee27f7b78f664d6354bab08fe553e37afb7ef77cbd755eefb8537a2ff0aee12df1b486da612d5826d4580d212b9c5bebe9848f2f3c9e9e319ea28fc4f3915c402f176bb4739d9eba6cf3261f6681fdbc520f358cbd25db834993898f446331e999e135b2d7f52a7150636ac6b6787daf6a9f6df399a0feea4cff4f75cadd4caa72517eec5ce6d52a6c4e2b5e6b4e68a6ef638c3461c8f7665cc735cc5958ab9bb7b14569901be903f555eaf2119f52ef50eb693a3f6bab9db380c4703e9be5dbf94ef7bcdc7d7faf2fe66a6652a3cac9cae9e67be9faa2f3d09eceaae5c1fbb473d97cac9cf4c00be6f50534dd66c11f27c7ab76beed8f51b939afe86dbe47727f67b19c244f99221c50fd47da15525b385a63b87c34e8e1a8cf3f1a752351031d55d592cb650f3b51e918c363ba26a82ff91877dfdf3dd22e19bc1bf5c6fee03ea87ba9778d43bb1c481f8d5faadfefb383a6e2afd05d6a73e82fcc5fa06fa5746d7b93b75783dcc4104bc5e42326efb0f7529c0c67c66aa60c3a9ae1a3d8416c9adbdc702ff3c8f7d4368c336ea75e886772e685f69a94d10ffefc3e181dced5b37a6a16cbaf542514dc5eea790fd40aca5e311db16352ed7e65ac71896b621b337dc469ea3f6c3da0f1dd1b929ffb905ace8926bf9788d6a3c6ef44d1695f7db7043ed81dd1764813a0916dc5474625da052d753fac5afce1bd502318f23ef42cff9c7e8755a2df7360ae3aab79448b27237b758634ba794bf7c373c063b0434c5ea4af2b7df08c6d5ac9b86fc9baff96d7077d609ea36b961d53e571e84dbd5f34d618f756827977c15b5bcb938ab50f343fd77cc48e595a97f36db92d3c9fd27e56b69307f770f99cab6b9e9bf13ca5c9732487e0d571993785f56caf81efed8ff383c4ace3555f1bb97a01752260cbc8a895ee1e414e56fce4499d3b51d73d33bfb9a3d61cd54f06155a79ed34c9b77a87bcf9b7b51a8d647ee868fb4fd267ffb0f9bea12dcefde0fdc3ffb38ed4c470a5566c52ad64c8f3ab97f14d7e44abbefb4cab0d2bba7c8236e8a17f22ab3756520942d14648858ffeadac72fc062bc9ffc5ed9ade07bb9ef8a392e52f58967748121a0c6ad528ad8fd268fddca3c130e00dc24b9e154dbe0c6932faaaeff9c2ab50ee07fa7fbc035ea2ee337c64a9ebfccfaea75d22bc508dcb13c6407dd67da6f7812e8335911f67aef29384ef98f92924232422f202d779dfd2ae15679391f3c24fcc7d29745ee46a693837dcf00c432e6c29da9e6f931f630a4e3fed389922d9617a5da2cb3e6650ad8aae7afb461dab51ad16c5a312eabb8a4bb616d062ade5496d5d8ce833d974741fc1435e36bcdf261bd9a6ef3cae6da1fa38573c61a5e8ae7b473619d4636c4127b8a095a76d3d6a65778ea95fa8d98886ff753df937e6797ccccfe83aacc8619d6c46f939d1dcc14928b7bf8f425a2ad7f7cfc3dd61d368f42b8e8f681e7349fdd5dab868e86fc65176c857f9084b7d5fe2494655589115deb3a1be84392f4b5dcc73c65bb3f560531f8934f68face786a11d382606d1faf7a297202f43f18c1adb929a6a266a8abec22692af2626f5e3ca49f3b17eb2784d74eac7f5557e41951ed1dc73aa0101fb7d17b6fc1459223b1763b7a3becf2fc98601cb1f68311a248eda5b3fed1f38453feb67a16ff4b2f955efd871df1bf80eb85af383acda551dd040754c1e54bc60b5a8d5d6873f173cf0c0d03f4c39d46c531e0be133af4e14cf29ad7dc0b3761fb5c3d3dd91479a32e87df93ca4e19a462a391eab9acee5937ae59f100dd4c712fd7e70429fdb15ff96760ff51f3b032b33dc5554ef51ff7f4ff7c7fbd60ee9fcf034ca3b36eb23e1efaa59be97b92b1e896789beb22e69fdac3e621e032a23fdbea777d576bc553e35ba72dce60dfb7c0a2cdfcc9da89fddb071321ff98c86dae7cc3df84cbed099a2754b456f6655427d833e3050ab66f440bd835cdb9c926c08991a0d16495fcdc88c790378809b255b0af800e4c9f113bd2d6880b6b7b32d0335aa348d2e91f531387fce92cc19af4aa1a93ca3b036ae44d711fe67dbac3ee3a5396b1c8026a1ee0b1fbe7efe79947605f4edd15805f08aa5bd807780c6d70ee3e571b1e500bb18bf89ac268bfe6ae94c2417e703da6cea2371df3f7a6bfd2e9fc7dfe74b7ce4abfa88f4d51c0b93c7b10497b9e82df319d645326c737cb5e6f62d6e1f047e76d3266cfa09c42e6f606ec3f60c3b817b5e4f65faf542db4bccf36a65e7ddf762ab4b741e9638c8ded51cf550ece7e5c3c1102b19964669d048f17bd8667a6a97b46bfe512691cfe595c402db4ce549c9d5d8292c2743bed4e70fc8deae3ff3f7d0d6f477daca4b3424a081588dd07093fe71e7a6fababca01aed8901d93a8c1c87a8be61dada44767da66b14bf5c2c5ebb37d0c4810989f79c1db33cfcccb3f448bbbcd60c79048eb5c6682e2b582ad2c5d2e647ae33ffcc7a8a4133710deea7774f839ff564c8e936cd363e933e32f46c5a2cfd0b6d57f67de47b1ed79fd647827e84bb431a3e634d8c0bed615e51e54c8af3541eb44dcb357886bb2906c4f28f98f6f9e7b041c6467c4e0236168ff844fe9a6d2c25a69d6f7c3c229a8ed522766c99797cc668986f10d8c79907689b8c69cf37e9af671cef43da13274f4766d7b3eea3ee9f47dddd36d99adc2bf21f07ef1ce727326a82cb780c5fc85ea5dffbc0b2f39736f42d46c2b0edfe7147d34f10797fa1a3f2ac4796c34d199d9fb9511f89e9dbdae7b8f7b179e31fb62feb2396ff25721f354ec90449f55a07b5f55f23966062c6fd06f38f3d02db3d68e2a04c713dd527c7d5b130b9ca49329bb9eadd341bed666fba9ce46f206bf72e487ad2924f82f6e9fc8269f93dd3bc0db607ff9a69a749e3c426c13270b0ab3ea255b65cbc89d6c97dc546f448b60e78ceb42f173e5e25fd3516e96ee2b23f404c11ec67da8e3ea0463e6cf239b79c7a2a39aebeb612cd2a78e6f48e76b3f082d8d564cf3cbf63f97c4836fdf3e8f591e39b415befd78f7ec1a0f5a66d4776e19a6d6b5d1fd96e3cedf7326c485fe12116b5f8701e3f9adfe0685c2ffa93d3afb6eeba09e8baa95ef5ae71515f941fabafab4262965773ed2a89b4a63405a5a3741b4712ab10d42961bb563343b6a1740b9535158d54aba7a7686d2e4976fcde3dd999612f07cdd4d6d433da1d364d5ba3a146837c0c3e62fa6423ed31a409b1b4ec23fa65cbe506af0af412ee9f5ed53ef7234316e25197fc1379b5ea1b4aca6b252966b5b5245e01bb9a12962633f85d94fed07ba0880c6d5b3af6d67786c9f32c5e213c1634fcb7e56ffbbdbde8fb06beeb33de09b71bee63ea23969eb471a76fe2275f695fd547ccf567f058fddecc5331bfbd278a1b802f1e5139d08ff3f7142fd65414b3aac621c536afbc4747c42c38e7d8230da5455495bee1677bc7a91c623669b5688d986de3819c8ff6423e4d6d773ef7368fa0b93b5827f1af873ae646df4ff4085bae3469da8734ec031b8bf17bfddc42785eaf0cd87b947c3f3f227f84f63ab1b68f11852e857a8af0e2e958e13a35f16fe07ef30bff76766c3c3f8e863d867d90a3f00ebf309a073cc2fc7d1cadfd8006cb7bf50e3d6bdc797cd7c6f3637d2476bc3fdc413fac8fbc7996655a64071ecf22cd29641fc83db95a68eb42c37c4263984dfca37cc159f4677eb63f7366d574a33877441f014dd4deac63f2dbc2670b8f16ecedb0e36b1a78493615cda1cfd8ce7f465af087b4a6e405344bd3dcf7d08e2f7b7d4d76fe8c86f1c8c4ca9fe6bdc41e736ae93feca7c0f307bcca250a4ff348f60b68df7581c645dbca4ec3f78ee8099be8bdcdef2c7da2f2f0c1f55b501e737c3f1c0773bc8cfbafe923dbe879f6f73be0275fd54736c58999f162b26e4dff8e5c8f6a808843cb3f504cb4d846493fc61ea1f84dc86d6c5934f766408348eec48ec1eac0ce88ec8e8f6696ef45b69b418fbc52c65edf441b2c5a134bbb6cde12acd0284f32bd5de8c740bd67fe91fc0ada1ef4c636a37bbeef7dd8e49dc5eea4479bffafd56dfd28466f7ab48ec1f7f3927ec6672be323e967edf7162ffa607c491f11db5a8c7c1f370fa6dc6ff3ce3f3a7a5fd74762fb698cd53dcd6be037e1dfe9cf6c33a43886c1d0bf086524997fe2239af3f35ed6fca2492d79109d01b1e347f48688c6f8f14ce339c255833d1ec31b02fde129469e8eb36d99e7ed26b4dc7886c423e9880d5b5a8a93cd0daa1119e992419b6c3dea33ba68af8c8f7e6bdedf6ef6f98ffa6f5d1789d72a19f78b7b9ecd033f9aebdf69a51dc66b6dfafe39bcbf50765306d05e53752eff443243f47acd470cfa44fe5bf2f16235c867cd5f1ea3b451dbd137d99ce2e4eb12e9239b24a735f972d37db6a695cc430686ed855790d647021abee93e3caa4dbe5e6c381be4fb753dc1babf79d4ef1e43c3b7399ae3f2e4ad8fcb9a8d2afe3e14c3c4f31177ff381afdd9bcfcc97117fa88fdfe46bf484e083f4bd44f649dbd212661346f2fac3559123eb2339af0c97ec7de5d8d7ff3ba1dd8dfe36c60b13ee33d363c7f75e77d4c03bfb989bfea27c741e623b26a7f683e8696bc414df311fddf1769c14747e639e0a8b5fa7cf4edcffbf0482dffccff7fc283beeb081e5dbe9c97b45eb6c7f70e69ad7fab75aa839f9e0f3ae69f7ff0f9180fac878321c57158dfef918f987b754fcfdbd8fe44eedd71131afe23fdb8ff6f3eb69e0f2fe423dfd938ceaa14fa47227e95bd8d4425f48f8c423fc5be6723c8edbe1ccdc96fb38716d1fd581f3967ff489cad6c1b4bc2aec60373f0b0613ef6b43e3896b0277e2cf33cf1916de285be720c7a7116fa96bff3799f1dc9eac97e929fea87436361c6b5edeba8fd0585bf673e341244e1e7e7637816ce87f0b6b2f6b393ff5bfce0bb3f0a7dd0b91255ff0ade19f1717ee77337f607b9da79de25e7fb7fbef8fd25067aefef2ff37144f311998b1f9a0fcdd77f7a3e12341fbdc3e858b07f447cc7df75647f0476c732c5a3f19dcffbec28f15a092fcc0ddcf3f3311e188bfe0f3c5f68b6c6c19afce03cc8f184e7e3d08bc632ec713e300ff962cc7c9c628f0c0e47f3c1e1d0fbae63e561349f8c06c3c969f7b635c9bf4ce6fed5773e6fd3b1fb88e360382d776ff3afcdc5e474345fccf6df8fc121de1fe331ade48b83e1f73f6fd0c3f3c27118f4866743a4b6e9f9d8fffb478f988f6995e683fa89feeeeff96a6df62633c5432ae17c4c46f2fd60f8fffbfffedfffe7ff0f035432c6</data>
689 </image>
690</images>
691<connections>
692 <connection>
693 <sender>frmMap</sender>
694 <signal>signalTz(const QString &amp;, const QString &amp;)</signal>
695 <receiver>CityTimeBase</receiver>
696 <slot>slotNewTz(const QString &amp;, const QString &amp;)</slot>
697 </connection>
698 <connection>
699 <sender>cmdCity1</sender>
700 <signal>toggled(bool)</signal>
701 <receiver>cmdCity2</receiver>
702 <slot>setDisabled(bool)</slot>
703 </connection>
704 <connection>
705 <sender>cmdCity1</sender>
706 <signal>toggled(bool)</signal>
707 <receiver>cmdCity3</receiver>
708 <slot>setDisabled(bool)</slot>
709 </connection>
710 <connection>
711 <sender>cmdCity1</sender>
712 <signal>toggled(bool)</signal>
713 <receiver>cmdCity4</receiver>
714 <slot>setDisabled(bool)</slot>
715 </connection>
716 <connection>
717 <sender>cmdCity1</sender>
718 <signal>toggled(bool)</signal>
719 <receiver>cmdCity7</receiver>
720 <slot>setDisabled(bool)</slot>
721 </connection>
722 <connection>
723 <sender>cmdCity1</sender>
724 <signal>toggled(bool)</signal>
725 <receiver>cmdCity8</receiver>
726 <slot>setDisabled(bool)</slot>
727 </connection>
728 <connection>
729 <sender>cmdCity2</sender>
730 <signal>toggled(bool)</signal>
731 <receiver>cmdCity1</receiver>
732 <slot>setDisabled(bool)</slot>
733 </connection>
734 <connection>
735 <sender>cmdCity2</sender>
736 <signal>toggled(bool)</signal>
737 <receiver>cmdCity3</receiver>
738 <slot>setDisabled(bool)</slot>
739 </connection>
740 <connection>
741 <sender>cmdCity2</sender>
742 <signal>toggled(bool)</signal>
743 <receiver>cmdCity4</receiver>
744 <slot>setDisabled(bool)</slot>
745 </connection>
746 <connection>
747 <sender>cmdCity4</sender>
748 <signal>toggled(bool)</signal>
749 <receiver>cmdCity7</receiver>
750 <slot>setDisabled(bool)</slot>
751 </connection>
752 <connection>
753 <sender>cmdCity2</sender>
754 <signal>toggled(bool)</signal>
755 <receiver>cmdCity8</receiver>
756 <slot>setDisabled(bool)</slot>
757 </connection>
758 <connection>
759 <sender>cmdCity2</sender>
760 <signal>toggled(bool)</signal>
761 <receiver>cmdCity7</receiver>
762 <slot>setDisabled(bool)</slot>
763 </connection>
764 <connection>
765 <sender>cmdCity3</sender>
766 <signal>toggled(bool)</signal>
767 <receiver>cmdCity1</receiver>
768 <slot>setDisabled(bool)</slot>
769 </connection>
770 <connection>
771 <sender>cmdCity3</sender>
772 <signal>toggled(bool)</signal>
773 <receiver>cmdCity2</receiver>
774 <slot>setDisabled(bool)</slot>
775 </connection>
776 <connection>
777 <sender>cmdCity3</sender>
778 <signal>toggled(bool)</signal>
779 <receiver>cmdCity4</receiver>
780 <slot>setDisabled(bool)</slot>
781 </connection>
782 <connection>
783 <sender>cmdCity3</sender>
784 <signal>toggled(bool)</signal>
785 <receiver>cmdCity7</receiver>
786 <slot>setDisabled(bool)</slot>
787 </connection>
788 <connection>
789 <sender>cmdCity3</sender>
790 <signal>toggled(bool)</signal>
791 <receiver>cmdCity8</receiver>
792 <slot>setDisabled(bool)</slot>
793 </connection>
794 <connection>
795 <sender>cmdCity4</sender>
796 <signal>toggled(bool)</signal>
797 <receiver>cmdCity1</receiver>
798 <slot>setDisabled(bool)</slot>
799 </connection>
800 <connection>
801 <sender>cmdCity4</sender>
802 <signal>toggled(bool)</signal>
803 <receiver>cmdCity2</receiver>
804 <slot>setDisabled(bool)</slot>
805 </connection>
806 <connection>
807 <sender>cmdCity4</sender>
808 <signal>toggled(bool)</signal>
809 <receiver>cmdCity3</receiver>
810 <slot>setDisabled(bool)</slot>
811 </connection>
812 <connection>
813 <sender>cmdCity4</sender>
814 <signal>toggled(bool)</signal>
815 <receiver>cmdCity8</receiver>
816 <slot>setDisabled(bool)</slot>
817 </connection>
818 <connection>
819 <sender>cmdCity7</sender>
820 <signal>toggled(bool)</signal>
821 <receiver>cmdCity1</receiver>
822 <slot>setDisabled(bool)</slot>
823 </connection>
824 <connection>
825 <sender>cmdCity7</sender>
826 <signal>toggled(bool)</signal>
827 <receiver>cmdCity2</receiver>
828 <slot>setDisabled(bool)</slot>
829 </connection>
830 <connection>
831 <sender>cmdCity7</sender>
832 <signal>toggled(bool)</signal>
833 <receiver>cmdCity3</receiver>
834 <slot>setDisabled(bool)</slot>
835 </connection>
836 <connection>
837 <sender>cmdCity7</sender>
838 <signal>toggled(bool)</signal>
839 <receiver>cmdCity4</receiver>
840 <slot>setDisabled(bool)</slot>
841 </connection>
842 <connection>
843 <sender>cmdCity7</sender>
844 <signal>toggled(bool)</signal>
845 <receiver>cmdCity8</receiver>
846 <slot>setDisabled(bool)</slot>
847 </connection>
848 <connection>
849 <sender>cmdCity8</sender>
850 <signal>toggled(bool)</signal>
851 <receiver>cmdCity1</receiver>
852 <slot>setDisabled(bool)</slot>
853 </connection>
854 <connection>
855 <sender>cmdCity8</sender>
856 <signal>toggled(bool)</signal>
857 <receiver>cmdCity2</receiver>
858 <slot>setDisabled(bool)</slot>
859 </connection>
860 <connection>
861 <sender>cmdCity8</sender>
862 <signal>toggled(bool)</signal>
863 <receiver>cmdCity3</receiver>
864 <slot>setDisabled(bool)</slot>
865 </connection>
866 <connection>
867 <sender>cmdCity8</sender>
868 <signal>toggled(bool)</signal>
869 <receiver>cmdCity4</receiver>
870 <slot>setDisabled(bool)</slot>
871 </connection>
872 <connection>
873 <sender>cmdCity8</sender>
874 <signal>toggled(bool)</signal>
875 <receiver>cmdCity7</receiver>
876 <slot>setDisabled(bool)</slot>
877 </connection>
878 <connection>
879 <sender>cmdCity1</sender>
880 <signal>toggled(bool)</signal>
881 <receiver>cmdCity5</receiver>
882 <slot>setDisabled(bool)</slot>
883 </connection>
884 <connection>
885 <sender>cmdCity2</sender>
886 <signal>toggled(bool)</signal>
887 <receiver>cmdCity5</receiver>
888 <slot>setDisabled(bool)</slot>
889 </connection>
890 <connection>
891 <sender>cmdCity3</sender>
892 <signal>toggled(bool)</signal>
893 <receiver>cmdCity5</receiver>
894 <slot>setDisabled(bool)</slot>
895 </connection>
896 <connection>
897 <sender>cmdCity4</sender>
898 <signal>toggled(bool)</signal>
899 <receiver>cmdCity5</receiver>
900 <slot>setDisabled(bool)</slot>
901 </connection>
902 <connection>
903 <sender>cmdCity7</sender>
904 <signal>toggled(bool)</signal>
905 <receiver>cmdCity5</receiver>
906 <slot>setDisabled(bool)</slot>
907 </connection>
908 <connection>
909 <sender>cmdCity8</sender>
910 <signal>toggled(bool)</signal>
911 <receiver>cmdCity5</receiver>
912 <slot>setDisabled(bool)</slot>
913 </connection>
914 <connection>
915 <sender>cmdCity5</sender>
916 <signal>toggled(bool)</signal>
917 <receiver>cmdCity1</receiver>
918 <slot>setDisabled(bool)</slot>
919 </connection>
920 <connection>
921 <sender>cmdCity5</sender>
922 <signal>toggled(bool)</signal>
923 <receiver>cmdCity2</receiver>
924 <slot>setDisabled(bool)</slot>
925 </connection>
926 <connection>
927 <sender>cmdCity5</sender>
928 <signal>toggled(bool)</signal>
929 <receiver>cmdCity3</receiver>
930 <slot>setDisabled(bool)</slot>
931 </connection>
932 <connection>
933 <sender>cmdCity5</sender>
934 <signal>toggled(bool)</signal>
935 <receiver>cmdCity4</receiver>
936 <slot>setDisabled(bool)</slot>
937 </connection>
938 <connection>
939 <sender>cmdCity5</sender>
940 <signal>toggled(bool)</signal>
941 <receiver>cmdCity7</receiver>
942 <slot>setDisabled(bool)</slot>
943 </connection>
944 <connection>
945 <sender>cmdCity5</sender>
946 <signal>toggled(bool)</signal>
947 <receiver>cmdCity8</receiver>
948 <slot>setDisabled(bool)</slot>
949 </connection>
950 <connection>
951 <sender>cmdCity1</sender>
952 <signal>toggled(bool)</signal>
953 <receiver>cmdCity6</receiver>
954 <slot>setDisabled(bool)</slot>
955 </connection>
956 <connection>
957 <sender>cmdCity2</sender>
958 <signal>toggled(bool)</signal>
959 <receiver>cmdCity6</receiver>
960 <slot>setDisabled(bool)</slot>
961 </connection>
962 <connection>
963 <sender>cmdCity3</sender>
964 <signal>toggled(bool)</signal>
965 <receiver>cmdCity6</receiver>
966 <slot>setDisabled(bool)</slot>
967 </connection>
968 <connection>
969 <sender>cmdCity4</sender>
970 <signal>toggled(bool)</signal>
971 <receiver>cmdCity6</receiver>
972 <slot>setDisabled(bool)</slot>
973 </connection>
974 <connection>
975 <sender>cmdCity5</sender>
976 <signal>toggled(bool)</signal>
977 <receiver>cmdCity6</receiver>
978 <slot>setDisabled(bool)</slot>
979 </connection>
980 <connection>
981 <sender>cmdCity6</sender>
982 <signal>toggled(bool)</signal>
983 <receiver>cmdCity1</receiver>
984 <slot>setDisabled(bool)</slot>
985 </connection>
986 <connection>
987 <sender>cmdCity6</sender>
988 <signal>toggled(bool)</signal>
989 <receiver>cmdCity2</receiver>
990 <slot>setDisabled(bool)</slot>
991 </connection>
992 <connection>
993 <sender>cmdCity6</sender>
994 <signal>toggled(bool)</signal>
995 <receiver>cmdCity3</receiver>
996 <slot>setDisabled(bool)</slot>
997 </connection>
998 <connection>
999 <sender>cmdCity6</sender>
1000 <signal>toggled(bool)</signal>
1001 <receiver>cmdCity4</receiver>
1002 <slot>setDisabled(bool)</slot>
1003 </connection>
1004 <connection>
1005 <sender>cmdCity6</sender>
1006 <signal>toggled(bool)</signal>
1007 <receiver>cmdCity5</receiver>
1008 <slot>setDisabled(bool)</slot>
1009 </connection>
1010 <connection>
1011 <sender>cmdCity6</sender>
1012 <signal>toggled(bool)</signal>
1013 <receiver>cmdCity7</receiver>
1014 <slot>setDisabled(bool)</slot>
1015 </connection>
1016 <connection>
1017 <sender>cmdCity6</sender>
1018 <signal>toggled(bool)</signal>
1019 <receiver>cmdCity8</receiver>
1020 <slot>setDisabled(bool)</slot>
1021 </connection>
1022 <connection>
1023 <sender>cmdCity6</sender>
1024 <signal>toggled(bool)</signal>
1025 <receiver>cmdCity9</receiver>
1026 <slot>setDisabled(bool)</slot>
1027 </connection>
1028 <connection>
1029 <sender>cmdCity7</sender>
1030 <signal>toggled(bool)</signal>
1031 <receiver>cmdCity6</receiver>
1032 <slot>setDisabled(bool)</slot>
1033 </connection>
1034 <connection>
1035 <sender>cmdCity8</sender>
1036 <signal>toggled(bool)</signal>
1037 <receiver>cmdCity6</receiver>
1038 <slot>setDisabled(bool)</slot>
1039 </connection>
1040 <connection>
1041 <sender>cmdCity9</sender>
1042 <signal>toggled(bool)</signal>
1043 <receiver>cmdCity1</receiver>
1044 <slot>setDisabled(bool)</slot>
1045 </connection>
1046 <connection>
1047 <sender>cmdCity9</sender>
1048 <signal>toggled(bool)</signal>
1049 <receiver>cmdCity3</receiver>
1050 <slot>setDisabled(bool)</slot>
1051 </connection>
1052 <connection>
1053 <sender>cmdCity9</sender>
1054 <signal>toggled(bool)</signal>
1055 <receiver>cmdCity4</receiver>
1056 <slot>setDisabled(bool)</slot>
1057 </connection>
1058 <connection>
1059 <sender>cmdCity9</sender>
1060 <signal>toggled(bool)</signal>
1061 <receiver>cmdCity5</receiver>
1062 <slot>setDisabled(bool)</slot>
1063 </connection>
1064 <connection>
1065 <sender>cmdCity9</sender>
1066 <signal>toggled(bool)</signal>
1067 <receiver>cmdCity6</receiver>
1068 <slot>setDisabled(bool)</slot>
1069 </connection>
1070 <connection>
1071 <sender>cmdCity9</sender>
1072 <signal>toggled(bool)</signal>
1073 <receiver>cmdCity7</receiver>
1074 <slot>setDisabled(bool)</slot>
1075 </connection>
1076 <connection>
1077 <sender>cmdCity9</sender>
1078 <signal>toggled(bool)</signal>
1079 <receiver>cmdCity8</receiver>
1080 <slot>setDisabled(bool)</slot>
1081 </connection>
1082 <connection>
1083 <sender>cmdCity1</sender>
1084 <signal>toggled(bool)</signal>
1085 <receiver>cmdCity9</receiver>
1086 <slot>setDisabled(bool)</slot>
1087 </connection>
1088 <connection>
1089 <sender>cmdCity2</sender>
1090 <signal>toggled(bool)</signal>
1091 <receiver>cmdCity9</receiver>
1092 <slot>setDisabled(bool)</slot>
1093 </connection>
1094 <connection>
1095 <sender>cmdCity3</sender>
1096 <signal>toggled(bool)</signal>
1097 <receiver>cmdCity9</receiver>
1098 <slot>setDisabled(bool)</slot>
1099 </connection>
1100 <connection>
1101 <sender>cmdCity4</sender>
1102 <signal>toggled(bool)</signal>
1103 <receiver>cmdCity9</receiver>
1104 <slot>setDisabled(bool)</slot>
1105 </connection>
1106 <connection>
1107 <sender>cmdCity5</sender>
1108 <signal>toggled(bool)</signal>
1109 <receiver>cmdCity9</receiver>
1110 <slot>setDisabled(bool)</slot>
1111 </connection>
1112 <connection>
1113 <sender>cmdCity7</sender>
1114 <signal>toggled(bool)</signal>
1115 <receiver>cmdCity9</receiver>
1116 <slot>setDisabled(bool)</slot>
1117 </connection>
1118 <connection>
1119 <sender>cmdCity8</sender>
1120 <signal>toggled(bool)</signal>
1121 <receiver>cmdCity9</receiver>
1122 <slot>setDisabled(bool)</slot>
1123 </connection>
1124 <connection>
1125 <sender>cmdCity9</sender>
1126 <signal>toggled(bool)</signal>
1127 <receiver>cmdCity2</receiver>
1128 <slot>setDisabled(bool)</slot>
1129 </connection>
1130 <connection>
1131 <sender>cmdCity1</sender>
1132 <signal>toggled(bool)</signal>
1133 <receiver>CityTimeBase</receiver>
1134 <slot>beginNewTz()</slot>
1135 </connection>
1136 <connection>
1137 <sender>cmdCity2</sender>
1138 <signal>toggled(bool)</signal>
1139 <receiver>CityTimeBase</receiver>
1140 <slot>beginNewTz()</slot>
1141 </connection>
1142 <connection>
1143 <sender>cmdCity7</sender>
1144 <signal>toggled(bool)</signal>
1145 <receiver>CityTimeBase</receiver>
1146 <slot>beginNewTz()</slot>
1147 </connection>
1148 <connection>
1149 <sender>cmdCity3</sender>
1150 <signal>toggled(bool)</signal>
1151 <receiver>CityTimeBase</receiver>
1152 <slot>beginNewTz()</slot>
1153 </connection>
1154 <connection>
1155 <sender>cmdCity4</sender>
1156 <signal>toggled(bool)</signal>
1157 <receiver>CityTimeBase</receiver>
1158 <slot>beginNewTz()</slot>
1159 </connection>
1160 <connection>
1161 <sender>cmdCity5</sender>
1162 <signal>toggled(bool)</signal>
1163 <receiver>CityTimeBase</receiver>
1164 <slot>beginNewTz()</slot>
1165 </connection>
1166 <connection>
1167 <sender>cmdCity6</sender>
1168 <signal>toggled(bool)</signal>
1169 <receiver>CityTimeBase</receiver>
1170 <slot>beginNewTz()</slot>
1171 </connection>
1172 <connection>
1173 <sender>cmdCity8</sender>
1174 <signal>toggled(bool)</signal>
1175 <receiver>CityTimeBase</receiver>
1176 <slot>beginNewTz()</slot>
1177 </connection>
1178 <connection>
1179 <sender>cmdCity9</sender>
1180 <signal>toggled(bool)</signal>
1181 <receiver>CityTimeBase</receiver>
1182 <slot>beginNewTz()</slot>
1183 </connection>
1184 <slot access="public">beginNewTz()</slot>
1185 <slot access="public">slotNewTz(const QString &amp;, const QString &amp;)</slot>
1186</connections>
1187<tabstops>
1188 <tabstop>cmdCity1</tabstop>
1189 <tabstop>cmdCity2</tabstop>
1190 <tabstop>cmdCity3</tabstop>
1191 <tabstop>cmdCity4</tabstop>
1192 <tabstop>cmdCity5</tabstop>
1193 <tabstop>cmdCity6</tabstop>
1194 <tabstop>cmdCity7</tabstop>
1195 <tabstop>cmdCity8</tabstop>
1196 <tabstop>cmdCity9</tabstop>
1197 <tabstop>frmMap</tabstop>
1198</tabstops>
1199</UI>
diff --git a/core/settings/citytime/light.png b/core/settings/citytime/light.png
deleted file mode 100644
index 2aab906..0000000
--- a/core/settings/citytime/light.png
+++ b/dev/null
Binary files differ
diff --git a/core/settings/citytime/mag.png b/core/settings/citytime/mag.png
deleted file mode 100644
index 9cbd32b..0000000
--- a/core/settings/citytime/mag.png
+++ b/dev/null
Binary files differ
diff --git a/core/settings/citytime/opie-citytime.control b/core/settings/citytime/opie-citytime.control
index aa94dd4..faaf3a2 100644
--- a/core/settings/citytime/opie-citytime.control
+++ b/core/settings/citytime/opie-citytime.control
@@ -1,9 +1,9 @@
1Files: bin/citytime apps/Applications/citytime.desktop pics/citytime 1Files: bin/citytime apps/Settings/citytime.desktop pics/citytime
2Priority: optional 2Priority: optional
3Section: opie/applications 3Section: opie/settings
4Maintainer: Warwick Allison <warwick@trolltech.com> 4Maintainer: Maximilian Reiss <harlekin@handhelds.org>
5Architecture: arm 5Architecture: arm
6Version: $QPE_VERSION-$SUB_VERSION 6Version: $QPE_VERSION-$SUB_VERSION
7Depends: opie-base ($QPE_VERSION), timezones 7Depends: opie-base ($QPE_VERSION), timezones
8Description: Time-zone / world clock settings 8Description: Time-zone / world clock settings
9 The time-zone manager for the Opie environment. 9 The time-zone manager for the Opie environment.
diff --git a/core/settings/citytime/zonemap.cpp b/core/settings/citytime/zonemap.cpp
index 1d60aee..872e786 100644
--- a/core/settings/citytime/zonemap.cpp
+++ b/core/settings/citytime/zonemap.cpp
@@ -1,87 +1,93 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 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 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 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 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. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21// changes by Maximilian Reiss <harlekin@handhelds.org>
22
21#include "sun.h" 23#include "sun.h"
22#include "zonemap.h" 24#include "zonemap.h"
23 25
24#include <qpe/resource.h> 26#include <qpe/resource.h>
25#include <qpe/timestring.h> 27#include <qpe/timestring.h>
26#include <qpe/qpeapplication.h> 28#include <qpe/qpeapplication.h>
27 29
28#include <qdatetime.h> 30#include <qdatetime.h>
29#include <qfile.h> 31#include <qfile.h>
30#include <qimage.h> 32#include <qimage.h>
31#include <qlabel.h> 33#include <qlabel.h>
32#include <qlist.h> 34#include <qlist.h>
33#include <qmessagebox.h> 35#include <qmessagebox.h>
34#include <qpixmap.h> 36#include <qpixmap.h>
35#include <qpainter.h> 37#include <qpainter.h>
36#include <qregexp.h> 38#include <qregexp.h>
37#include <qtextstream.h> 39#include <qtextstream.h>
38#include <qtimer.h> 40#include <qtimer.h>
39#include <qtoolbutton.h> 41#include <qtoolbutton.h>
42#include <qlayout.h>
43#include <qhbox.h>
44#include <qlistview.h>
45#include <qwhatsthis.h>
40 46
41#include <limits.h> 47#include <limits.h>
42 48
43// the map file... 49// the map file...
44static const char strZONEINFO[] = "/usr/share/zoneinfo/zone.tab"; 50static const char strZONEINFO[] = "/usr/share/zoneinfo/zone.tab";
45static const char strMAP[] = "citytime/simple_grid_400"; 51static const char strMAP[] = "citytime/simple_grid_400";
46 52
47// the maximum distance we'll allow the pointer to be away from a city 53// the maximum distance we'll allow the pointer to be away from a city
48// and still show the city's time 54// and still show the city's time
49static const int iTHRESHOLD = 50000; 55static const int iTHRESHOLD = 50000;
50 56
51// The label offset (how far away from pointer) 57// The label offset (how far away from pointer)
52static const int iLABELOFFSET = 8; 58static const int iLABELOFFSET = 8;
53 59
54// the size of the dot to draw, and where to start it 60// the size of the dot to draw, and where to start it
55static const int iCITYSIZE = 3; 61static const int iCITYSIZE = 3;
56const int iCITYOFFSET = 2; 62const int iCITYOFFSET = 2;
57 63
58// the darkening function 64// the darkening function
59static inline void darken( QImage *pImage, int start, int stop, int row ); 65static inline void darken( QImage *pImage, int start, int stop, int row );
60static void dayNight( QImage *pImage ); 66static void dayNight( QImage *pImage );
61 67
62ZoneField::ZoneField( const QString& strLine ) 68ZoneField::ZoneField( const QString& strLine )
63{ 69{
64 // make a bunch of RegExp's to match the data from the line 70 // make a bunch of RegExp's to match the data from the line
65 QRegExp regCoord( "[-+][0-9]+" );// the latitude 71 QRegExp regCoord( "[-+][0-9]+" );// the latitude
66 QRegExp regCountry( "[A-Za-z]+/" ); // the country (not good enough) 72 QRegExp regCountry( "[A-Za-z]+/" ); // the country (not good enough)
67 QRegExp regCity( "[A-Za-z_-]*" ); // the city 73 QRegExp regCity( "[A-Za-z_-]*" ); // the city
68 74
69 int iStart, 75 int iStart,
70 iStop, 76 iStop,
71 iLen, 77 iLen,
72 tmp; 78 tmp;
73 QString strTmp; 79 QString strTmp;
74 // we should be able to assume that the country code is always the first 80 // we should be able to assume that the country code is always the first
75 // two chars, so just grap them and let it go... 81 // two chars, so just grap them and let it go...
76 strCountryCode = strLine.left( 2 ); 82 strCountryCode = strLine.left( 2 );
77 iStart = regCoord.match( strLine, 0, &iLen ); 83 iStart = regCoord.match( strLine, 0, &iLen );
78 if ( iStart >= 0 ) { 84 if ( iStart >= 0 ) {
79 strTmp = strLine.mid( iStart, iLen ); 85 strTmp = strLine.mid( iStart, iLen );
80 tmp = strTmp.toInt(); 86 tmp = strTmp.toInt();
81 // okay, there are two versions of the format, make a decision based on 87 // okay, there are two versions of the format, make a decision based on
82 // the size... 88 // the size...
83 // Oh BTW, we are storing everything in seconds! 89 // Oh BTW, we are storing everything in seconds!
84 if ( iLen < 7 ) { 90 if ( iLen < 7 ) {
85 _y = tmp / 100; 91 _y = tmp / 100;
86 _y *= 60; 92 _y *= 60;
87 _y += tmp % 100; 93 _y += tmp % 100;
@@ -412,101 +418,156 @@ void ZoneMap::showCity( ZoneField *city )
412 // this only happens on the a zoom when you are near the top, 418 // this only happens on the a zoom when you are near the top,
413 // a quick workaround.. 419 // a quick workaround..
414 y = iLABELOFFSET; 420 y = iLABELOFFSET;
415 } else { 421 } else {
416 // the default 422 // the default
417 y += iLABELOFFSET; 423 y += iLABELOFFSET;
418 } 424 }
419 425
420 // draw in the city and the label 426 // draw in the city and the label
421 if ( pRepaint ) { 427 if ( pRepaint ) {
422 int repx, 428 int repx,
423 repy; 429 repy;
424 zoneToWin( pRepaint->x(), pRepaint->y(), repx, repy ); 430 zoneToWin( pRepaint->x(), pRepaint->y(), repx, repy );
425 updateContents( repx - iCITYOFFSET, repy - iCITYOFFSET, 431 updateContents( repx - iCITYOFFSET, repy - iCITYOFFSET,
426 iCITYSIZE, iCITYSIZE ); 432 iCITYSIZE, iCITYSIZE );
427 } 433 }
428 updateContents( tmpx - iCITYOFFSET, tmpy - iCITYOFFSET, iCITYSIZE, 434 updateContents( tmpx - iCITYOFFSET, tmpy - iCITYOFFSET, iCITYSIZE,
429 iCITYSIZE ); 435 iCITYSIZE );
430 pRepaint = pLast; 436 pRepaint = pLast;
431 437
432 lblCity->move( x, y ); 438 lblCity->move( x, y );
433 lblCity->show(); 439 lblCity->show();
434} 440}
435 441
436void ZoneMap::resizeEvent( QResizeEvent *e ) 442void ZoneMap::resizeEvent( QResizeEvent *e )
437{ 443{
438 // keep the zoom button down in the corner 444 // keep the zoom button down in the corner
439 QSize _size = e->size(); 445 QSize _size = e->size();
440 cmdZoom->move( _size.width() - cmdZoom->width(), 446 cmdZoom->move( _size.width() - cmdZoom->width(),
441 _size.height() - cmdZoom->height() ); 447 _size.height() - cmdZoom->height() );
442 if ( !bZoom ) { 448 if ( !bZoom ) {
443 drawableW = width() - 2 * frameWidth(); 449 drawableW = width() - 2 * frameWidth();
444 drawableH = height() - 2 * frameWidth(); 450 drawableH = height() - 2 * frameWidth();
445 makeMap( drawableW, drawableH ); 451 makeMap( drawableW, drawableH );
446 resizeContents( drawableW, drawableH ); 452 resizeContents( drawableW, drawableH );
447 } 453 }
448} 454}
449 455
450void ZoneMap::showZones( void ) const 456void ZoneMap::showZones( void ) const
451{ 457{
452 // go through the zones in the list and just display the values... 458 // go through the zones in the list and just display the values...
453 QListIterator<ZoneField> itZone( zones ); 459 QListIterator<ZoneField> itZone( zones );
454 for ( itZone.toFirst(); itZone.current(); ++itZone ) { 460 for ( itZone.toFirst(); itZone.current(); ++itZone ) {
455 ZoneField *pZone = itZone.current(); 461 ZoneField *pZone = itZone.current();
456 pZone->showStructure(); 462 pZone->showStructure();
457 } 463 }
458} 464}
459 465
466
467QWidget* ZoneMap::selectionWidget( QWidget *parent) {
468
469 QWidget *returnWidget = new QWidget( parent );
470
471 QVBoxLayout *layout = new QVBoxLayout( returnWidget );
472 QHBox *hBox = new QHBox( returnWidget );
473 QListView *continentView = new QListView( hBox );
474 continentView->addColumn( tr("Continent") );
475 QWhatsThis::add( continentView, tr("Select a continent/country here, then select a city") );
476 connect ( continentView, SIGNAL( clicked ( QListViewItem * ) ), this, SLOT( slotGetCities( QListViewItem * ) ) );
477
478 QStringList continentList;
479 QListIterator<ZoneField> itZone( zones );
480 for ( itZone.toFirst(); itZone.current(); ++itZone ) {
481 ZoneField *pZone = itZone.current();
482 if ( continentList.contains( pZone->country() ) == 0 ) {
483 QString name;
484 QListViewItem *item;
485 if ( !(pZone->country().length() > 24) ) {
486 name = pZone->country().left(pZone->country().length()-1 );
487 } else {
488 name = pZone->country().left( 24 );
489 }
490 item = new QListViewItem( continentView, name, pZone->country() );
491 continentList.append( pZone->country() );
492 }
493 }
494
495 cityView = new QListView( hBox );
496 cityView->addColumn( tr("City") );
497
498 layout->addWidget( hBox );
499 return returnWidget;
500}
501
502void ZoneMap::slotGetCities( QListViewItem * contItem) {
503
504 cityView->clear();
505 selectedCont = contItem->text( 1 );
506 QListIterator<ZoneField> itZone( zones );
507 for ( itZone.toFirst(); itZone.current(); ++itZone ) {
508 ZoneField *pZone = itZone.current();
509 if ( pZone->country() == contItem->text( 1 ) ) {
510 QListViewItem *item;
511 item = new QListViewItem( cityView, pZone->city() );
512 connect ( cityView, SIGNAL( clicked ( QListViewItem* ) ), this, SLOT( slotCitySelected( QListViewItem* ) ) );
513 }
514 }
515}
516
517void ZoneMap::slotCitySelected( QListViewItem *cityItem ) {
518 if ( cityItem ) {
519 emit signalTz( selectedCont, cityItem->text( 0 ) );
520 }
521}
522
460void ZoneMap::drawCities( QPainter *p ) 523void ZoneMap::drawCities( QPainter *p )
461{ 524{
462 int x, 525 int x, y, j;
463 y,
464 j;
465 // draw in the cities 526 // draw in the cities
466 // for testing only as when you put it 527 // for testing only as when you put it
467 // on the small screen it looks awful and not to mention useless 528 // on the small screen it looks awful and not to mention useless
468 p->setPen( red ); 529 p->setPen( red );
469 QListIterator<ZoneField> itZone( zones ); 530 QListIterator<ZoneField> itZone( zones );
470 for ( itZone.toFirst(), j = 0; itZone.current(); ++itZone, j++ ) { 531 for ( itZone.toFirst(), j = 0; itZone.current(); ++itZone, j++ ) {
471 ZoneField *pZone = itZone.current(); 532 ZoneField *pZone = itZone.current();
472 zoneToWin( pZone->x(), pZone->y(), x, y ); 533 zoneToWin( pZone->x(), pZone->y(), x, y );
473 if ( x > wImg ) 534 if ( x > wImg )
474 x = x - wImg; 535 x = x - wImg;
475 p->drawRect( x - iCITYOFFSET, y - iCITYOFFSET, iCITYSIZE, iCITYSIZE); 536 p->drawRect( x - iCITYOFFSET, y - iCITYOFFSET, iCITYSIZE, iCITYSIZE);
476 } 537 }
477} 538}
478 539
479static void dayNight(QImage *pImage) 540static void dayNight(QImage *pImage)
480{ 541{
481 // create a mask the functions from sun.h 542 // create a mask the functions from sun.h
482 double dJulian, 543 double dJulian,
483 dSunRad, 544 dSunRad,
484 dSunDecl, 545 dSunDecl,
485 dSunRadius, 546 dSunRadius,
486 dSunLong; 547 dSunLong;
487 int wImage = pImage->width(), 548 int wImage = pImage->width(),
488 hImage = pImage->height(), 549 hImage = pImage->height(),
489 iStart, 550 iStart,
490 iStop, 551 iStop,
491 iMid, 552 iMid,
492 relw, 553 relw,
493 i; 554 i;
494 short wtab[ wImage ]; 555 short wtab[ wImage ];
495 time_t tCurrent; 556 time_t tCurrent;
496 struct tm *pTm; 557 struct tm *pTm;
497 558
498 // get the position of the sun bassed on our current time... 559 // get the position of the sun bassed on our current time...
499 tCurrent = time( NULL ); 560 tCurrent = time( NULL );
500 pTm = gmtime( &tCurrent ); 561 pTm = gmtime( &tCurrent );
501 dJulian = jtime( pTm ); 562 dJulian = jtime( pTm );
502 sunpos( dJulian, 0, &dSunRad, &dSunDecl, &dSunRadius, &dSunLong ); 563 sunpos( dJulian, 0, &dSunRad, &dSunDecl, &dSunRadius, &dSunLong );
503 564
504 // now get the projected illumination 565 // now get the projected illumination
505 projillum( wtab, wImage, hImage, dSunDecl ); 566 projillum( wtab, wImage, hImage, dSunDecl );
506 relw = wImage - int( wImage * 0.0275 ); 567 relw = wImage - int( wImage * 0.0275 );
507 568
508 // draw the map, keeping in mind that we may go too far off the map... 569 // draw the map, keeping in mind that we may go too far off the map...
509 iMid = ( relw * ( 24*60 - pTm->tm_hour * 60 - pTm->tm_min ) ) / ( 24*60 ); 570 iMid = ( relw * ( 24*60 - pTm->tm_hour * 60 - pTm->tm_min ) ) / ( 24*60 );
510 571
511 for ( i = 0; i < hImage; i++ ) { 572 for ( i = 0; i < hImage; i++ ) {
512 if ( wtab[i] > 0 ) { 573 if ( wtab[i] > 0 ) {
diff --git a/core/settings/citytime/zonemap.h b/core/settings/citytime/zonemap.h
index c9c2035..ea0142b 100644
--- a/core/settings/citytime/zonemap.h
+++ b/core/settings/citytime/zonemap.h
@@ -1,157 +1,165 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 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 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 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 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. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#ifndef ZONEMAP_H 21#ifndef ZONEMAP_H
22#define ZONEMAP_H 22#define ZONEMAP_H
23 23
24#include "stylusnormalizer.h" 24#include "stylusnormalizer.h"
25 25
26#include <qlist.h> 26#include <qlist.h>
27#include <qscrollview.h> 27#include <qscrollview.h>
28#include <qstring.h> 28#include <qstring.h>
29 29
30extern const int iCITYOFFSET; 30extern const int iCITYOFFSET;
31 31
32class QImage; 32class QImage;
33class QComboBox; 33class QComboBox;
34class QLabel; 34class QLabel;
35class QTimer; 35class QTimer;
36class QToolButton; 36class QToolButton;
37 37class QListViewItem;
38class QListView;
38 39
39 40
40class ZoneField 41class ZoneField
41{ 42{
42public: 43public:
43 ZoneField( const QString & ); 44 ZoneField( const QString & );
44 void showStructure( void ) const; 45 void showStructure( void ) const;
45 inline int x( void ) const { return _x; }; 46 inline int x( void ) const { return _x; };
46 inline int y( void ) const { return _y; }; 47 inline int y( void ) const { return _y; };
47 48
48 inline QString city( void ) const { return strCity; }; 49 inline QString city( void ) const { return strCity; };
49 inline QString country( void ) const { return strCountry; }; 50 inline QString country( void ) const { return strCountry; };
50 inline QString code( void ) const { return strCountryCode; }; 51 inline QString code( void ) const { return strCountryCode; };
51private: 52private:
52 int _x; 53 int _x;
53 int _y; 54 int _y;
54 QString strCountryCode; 55 QString strCountryCode;
55 QString strCountry; 56 QString strCountry;
56 QString strCity; 57 QString strCity;
57}; 58};
58 59
59class ZoneMap : public QScrollView 60class ZoneMap : public QScrollView
60{ 61{
61 Q_OBJECT 62 Q_OBJECT
62public: 63public:
63 ZoneMap( QWidget *parent = 0, const char *name = 0 ); 64 ZoneMap( QWidget *parent = 0, const char *name = 0 );
64 ~ZoneMap(); 65 ~ZoneMap();
65 void showZones( void ) const; 66 void showZones( void ) const;
67 QWidget* selectionWidget( QWidget* parent );
66 // convert between the pixels on the image and the coordinates in the 68 // convert between the pixels on the image and the coordinates in the
67 // database 69 // database
68 inline bool zoneToWin( int zoneX, int zoneY, int &winX, int &winY ) const; 70 inline bool zoneToWin( int zoneX, int zoneY, int &winX, int &winY ) const;
69 inline bool winToZone( int winX, int winY, int &zoneX, int &zoneY ) const; 71 inline bool winToZone( int winX, int winY, int &zoneX, int &zoneY ) const;
70 72
71public slots: 73public slots:
72 void slotZoom( bool setZoom ); 74 void slotZoom( bool setZoom );
73 void slotIllum( bool setIllum ); 75 void slotIllum( bool setIllum );
74 void slotUpdate( void ); 76 void slotUpdate( void );
75 void slotRedraw( void ); 77 void slotRedraw( void );
76 void slotFindCity( const QPoint &pos ); // Find the closest city 78 void slotFindCity( const QPoint &pos ); // Find the closest city
77 void changeClock( bool ); 79 void changeClock( bool );
78 80
79signals: 81signals:
80 void signalTz( const QString &newCountry, const QString &newCity ); 82 void signalTz( const QString &newCountry, const QString &newCity );
81 83
82protected: 84protected:
83 virtual void viewportMouseMoveEvent( QMouseEvent *event ); 85 virtual void viewportMouseMoveEvent( QMouseEvent *event );
84 virtual void viewportMousePressEvent( QMouseEvent *event ); 86 virtual void viewportMousePressEvent( QMouseEvent *event );
85 virtual void viewportMouseReleaseEvent( QMouseEvent *event ); 87 virtual void viewportMouseReleaseEvent( QMouseEvent *event );
86 virtual void keyPressEvent( QKeyEvent * ); 88 virtual void keyPressEvent( QKeyEvent * );
87 virtual void resizeEvent( QResizeEvent *); 89 virtual void resizeEvent( QResizeEvent *);
88 virtual void drawContents( QPainter *p, int cx, int cy, int cw, int ch ); 90 virtual void drawContents( QPainter *p, int cx, int cy, int cw, int ch );
89 91
92private slots:
93 void slotGetCities( QListViewItem * );
94 void slotCitySelected( QListViewItem * );
90private: 95private:
91 ZoneField *findCityNear( ZoneField *city, int key ); 96 ZoneField *findCityNear( ZoneField *city, int key );
92 void showCity( ZoneField *city ); 97 void showCity( ZoneField *city );
93 void drawCities( QPainter *p );// put all the cities on the map (ugly) 98 void drawCities( QPainter *p );// put all the cities on the map (ugly)
94 void drawCity( QPainter *p, const ZoneField *pCity ); // draw the given city on the map 99 void drawCity( QPainter *p, const ZoneField *pCity ); // draw the given city on the map
95 void readZones( void ); // Read in the zone information from the file 100 void readZones( void ); // Read in the zone information from the file
96 void zoom( void ); // Zoom the map... 101 void zoom( void ); // Zoom the map...
97 void makeMap( int width, int height ); 102 void makeMap( int width, int height );
98 QPixmap* pixCurr; // image to be drawn on the screen 103 QPixmap* pixCurr; // image to be drawn on the screen
99 QLabel* lblCity; // the "tool-tip" that shows up when you pick a city... 104 QLabel* lblCity; // the "tool-tip" that shows up when you pick a city...
100 QToolButton *cmdZoom; // our zoom option... 105 QToolButton *cmdZoom; // our zoom option...
101 QTimer*tHide; // the timer to hide the "tool tip" 106 QTimer*tHide; // the timer to hide the "tool tip"
102 ZoneField *pLast; // the last known good city that was found... 107 ZoneField *pLast; // the last known good city that was found...
103 ZoneField *pRepaint; // save the location to maximize the repaint... 108 ZoneField *pRepaint; // save the location to maximize the repaint...
104 QList<ZoneField> zones; // a linked list to hold all this information 109 QList<ZoneField> zones; // a linked list to hold all this information
105 StylusNormalizer norm; 110 StylusNormalizer norm;
106 111
112 QListView *cityView;
113 QString selectedCont;
114
107 //the True width and height of the map... 115 //the True width and height of the map...
108 int wImg; 116 int wImg;
109 int hImg; 117 int hImg;
110 // the pixel points that correspond to (0, 0); 118 // the pixel points that correspond to (0, 0);
111 int ox; 119 int ox;
112 int oy; 120 int oy;
113 121
114 // the drawable area of the map... 122 // the drawable area of the map...
115 int drawableW; 123 int drawableW;
116 int drawableH; 124 int drawableH;
117 125
118 bool bZoom; // a flag to indicate zoom is active 126 bool bZoom; // a flag to indicate zoom is active
119 bool bIllum; // flag to indicat that illumination is active 127 bool bIllum; // flag to indicat that illumination is active
120 bool ampm; 128 bool ampm;
121 129
122 ZoneField *cursor; 130 ZoneField *cursor;
123}; 131};
124 132
125inline bool ZoneMap::zoneToWin( int zoneX, int zoneY, 133inline bool ZoneMap::zoneToWin( int zoneX, int zoneY,
126 int &winX, int &winY ) const 134 int &winX, int &winY ) const
127{ 135{
128 winY = oy - ( ( hImg * zoneY ) / 648000 ); // 180 degrees in secs 136 winY = oy - ( ( hImg * zoneY ) / 648000 ); // 180 degrees in secs
129 winX = ox + ( ( wImg * zoneX ) / 1296000 ); // 360 degrees in secs 137 winX = ox + ( ( wImg * zoneX ) / 1296000 ); // 360 degrees in secs
130 // whoa, some things aren't in the best spots.. 138 // whoa, some things aren't in the best spots..
131 if ( winX > wImg ) { 139 if ( winX > wImg ) {
132 winX = wImg - iCITYOFFSET; 140 winX = wImg - iCITYOFFSET;
133 } else if ( winX <= 0 ) { 141 } else if ( winX <= 0 ) {
134 winX = iCITYOFFSET; 142 winX = iCITYOFFSET;
135 } 143 }
136 144
137 if ( winY >= hImg ) { 145 if ( winY >= hImg ) {
138 winY = hImg - iCITYOFFSET; 146 winY = hImg - iCITYOFFSET;
139 } else if ( winY <= 0 ) { 147 } else if ( winY <= 0 ) {
140 winY = iCITYOFFSET; 148 winY = iCITYOFFSET;
141 } 149 }
142 // perhaps in the future there will be some real error checking 150 // perhaps in the future there will be some real error checking
143 // for now just return true... 151 // for now just return true...
144 return true; 152 return true;
145} 153}
146 154
147inline bool ZoneMap::winToZone( int winX, int winY, 155inline bool ZoneMap::winToZone( int winX, int winY,
148 int &zoneX, int &zoneY ) const 156 int &zoneX, int &zoneY ) const
149{ 157{
150 zoneY = ( 648000 * ( oy - winY ) ) / hImg; 158 zoneY = ( 648000 * ( oy - winY ) ) / hImg;
151 zoneX = ( 1296000 * ( winX - ox ) ) / wImg; 159 zoneX = ( 1296000 * ( winX - ox ) ) / wImg;
152 // perhaps in the future there will be some real error checking 160 // perhaps in the future there will be some real error checking
153 // for now just return true... 161 // for now just return true...
154 return true; 162 return true;
155} 163}
156 164
157#endif 165#endif