summaryrefslogtreecommitdiff
path: root/core/settings
Unidiff
Diffstat (limited to 'core/settings') (more/less context) (ignore whitespace changes)
-rw-r--r--core/settings/citytime/.cvsignore5
-rw-r--r--core/settings/citytime/Makefile.in184
-rw-r--r--core/settings/citytime/citytime.cpp272
-rw-r--r--core/settings/citytime/citytime.h66
-rw-r--r--core/settings/citytime/citytime.pro13
-rw-r--r--core/settings/citytime/citytimebase.ui1199
-rwxr-xr-xcore/settings/citytime/findvalidzones38
-rw-r--r--core/settings/citytime/light.pngbin0 -> 223 bytes
-rw-r--r--core/settings/citytime/mag.pngbin0 -> 193 bytes
-rw-r--r--core/settings/citytime/main.cpp30
-rw-r--r--core/settings/citytime/qpe-citytime.control9
-rw-r--r--core/settings/citytime/stylusnormalizer.cpp98
-rw-r--r--core/settings/citytime/stylusnormalizer.h70
-rw-r--r--core/settings/citytime/sun.c323
-rw-r--r--core/settings/citytime/sun.h57
-rw-r--r--core/settings/citytime/zonemap.cpp670
-rw-r--r--core/settings/citytime/zonemap.cw21
-rw-r--r--core/settings/citytime/zonemap.h157
-rw-r--r--core/settings/light-and-power/.cvsignore4
-rw-r--r--core/settings/light-and-power/Makefile.in135
-rw-r--r--core/settings/light-and-power/light-and-power.pro12
-rw-r--r--core/settings/light-and-power/light-off.xpm23
-rw-r--r--core/settings/light-and-power/light-on.xpm24
-rw-r--r--core/settings/light-and-power/light.cpp133
-rw-r--r--core/settings/light-and-power/lightsettingsbase.ui471
-rw-r--r--core/settings/light-and-power/main.cpp38
-rw-r--r--core/settings/light-and-power/qpe-light-and-power.control9
-rw-r--r--core/settings/light-and-power/settings.h50
-rw-r--r--core/settings/security/.cvsignore5
-rw-r--r--core/settings/security/Makefile.in135
-rw-r--r--core/settings/security/main.cpp38
-rw-r--r--core/settings/security/qpe-security.control9
-rw-r--r--core/settings/security/security.cpp234
-rw-r--r--core/settings/security/security.h64
-rw-r--r--core/settings/security/security.pro12
-rw-r--r--core/settings/security/securitybase.ui200
36 files changed, 4808 insertions, 0 deletions
diff --git a/core/settings/citytime/.cvsignore b/core/settings/citytime/.cvsignore
new file mode 100644
index 0000000..d316ac9
--- a/dev/null
+++ b/core/settings/citytime/.cvsignore
@@ -0,0 +1,5 @@
1moc_*
2*.moc
3Makefile
4citytimebase.cpp
5citytimebase.h
diff --git a/core/settings/citytime/Makefile.in b/core/settings/citytime/Makefile.in
new file mode 100644
index 0000000..b058021
--- a/dev/null
+++ b/core/settings/citytime/Makefile.in
@@ -0,0 +1,184 @@
1#############################################################################
2
3####### Compiler, tools and options
4
5 CXX =$(SYSCONF_CXX) $(QT_CXX_MT)
6 CXXFLAGS=$(SYSCONF_CXXFLAGS_QT) $(SYSCONF_CXXFLAGS)
7 CC =$(SYSCONF_CC) $(QT_C_MT)
8 CFLAGS =$(SYSCONF_CFLAGS)
9 INCPATH =-I$(QPEDIR)/include
10 LFLAGS =$(SYSCONF_LFLAGS_QT) $(SYSCONF_RPATH_QT) $(SYSCONF_LFLAGS) $(QT_LFLAGS_MT)
11 LIBS =$(SUBLIBS) -lqpe $(SYSCONF_LIBS_QT) $(SYSCONF_LIBS) $(SYSCONF_LIBS_QTAPP)
12 MOC =$(SYSCONF_MOC)
13 UIC =$(SYSCONF_UIC)
14
15####### Target
16
17DESTDIR = $(QPEDIR)/bin/
18VER_MAJ = 1
19VER_MIN = 0
20VER_PATCH = 0
21 TARGET= citytime
22TARGET1 = lib$(TARGET).so.$(VER_MAJ)
23
24####### Files
25
26 HEADERS =citytime.h \
27 zonemap.h \
28 sun.h \
29 stylusnormalizer.h
30 SOURCES =citytime.cpp \
31 zonemap.cpp \
32 main.cpp \
33 sun.c \
34 stylusnormalizer.cpp
35 OBJECTS =citytime.o \
36 zonemap.o \
37 main.o \
38 sun.o \
39 stylusnormalizer.o \
40 citytimebase.o
41INTERFACES = citytimebase.ui
42UICDECLS = citytimebase.h
43UICIMPLS = citytimebase.cpp
44 SRCMOC =moc_citytime.cpp \
45 moc_zonemap.cpp \
46 moc_stylusnormalizer.cpp \
47 moc_citytimebase.cpp
48 OBJMOC =moc_citytime.o \
49 moc_zonemap.o \
50 moc_stylusnormalizer.o \
51 moc_citytimebase.o
52
53
54####### Implicit rules
55
56.SUFFIXES: .cpp .cxx .cc .C .c
57
58.cpp.o:
59 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
60
61.cxx.o:
62 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
63
64.cc.o:
65 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
66
67.C.o:
68 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
69
70.c.o:
71 $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
72
73####### Build rules
74
75
76all: $(DESTDIR)$(TARGET)
77
78$(DESTDIR)$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(SUBLIBS)
79 $(SYSCONF_LINK) $(LFLAGS) -o $(DESTDIR)$(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
80
81moc: $(SRCMOC)
82
83tmake:
84 tmake citytime.pro
85
86clean:
87 -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS)
88 -rm -f *~ core
89 -rm -f allmoc.cpp
90
91####### Extension Modules
92
93listpromodules:
94 @echo
95
96listallmodules:
97 @echo
98
99listaddonpromodules:
100 @echo
101
102listaddonentmodules:
103 @echo
104
105
106REQUIRES=
107
108####### Sub-libraries
109
110
111###### Combined headers
112
113
114
115####### Compile
116
117citytime.o: citytime.cpp \
118 zonemap.h \
119 stylusnormalizer.h \
120 citytime.h \
121 citytimebase.h \
122 $(QPEDIR)/include/qpe/qpeapplication.h \
123 $(QPEDIR)/include/qpe/config.h \
124 $(QPEDIR)/include/qpe/timestring.h \
125 $(QPEDIR)/include/qpe/tzselect.h \
126 $(QPEDIR)/include/qpe/qcopenvelope_qws.h
127
128zonemap.o: zonemap.cpp \
129 sun.h \
130 zonemap.h \
131 stylusnormalizer.h \
132 $(QPEDIR)/include/qpe/resource.h \
133 $(QPEDIR)/include/qpe/timestring.h \
134 $(QPEDIR)/include/qpe/qpeapplication.h
135
136main.o: main.cpp \
137 citytime.h \
138 citytimebase.h \
139 $(QPEDIR)/include/qpe/qpeapplication.h
140
141sun.o: sun.c \
142 sun.h \
143 $(QPEDIR)/include/qpe/qmath.h
144
145stylusnormalizer.o: stylusnormalizer.cpp \
146 stylusnormalizer.h
147
148citytimebase.h: citytimebase.ui
149 $(UIC) citytimebase.ui -o $(INTERFACE_DECL_PATH)/citytimebase.h
150
151citytimebase.cpp: citytimebase.ui
152 $(UIC) citytimebase.ui -i citytimebase.h -o citytimebase.cpp
153
154citytimebase.o: citytimebase.cpp \
155 citytimebase.h \
156 citytimebase.ui
157
158moc_citytime.o: moc_citytime.cpp \
159 citytime.h \
160 citytimebase.h
161
162moc_zonemap.o: moc_zonemap.cpp \
163 zonemap.h \
164 stylusnormalizer.h
165
166moc_stylusnormalizer.o: moc_stylusnormalizer.cpp \
167 stylusnormalizer.h
168
169moc_citytimebase.o: moc_citytimebase.cpp \
170 citytimebase.h
171
172moc_citytime.cpp: citytime.h
173 $(MOC) citytime.h -o moc_citytime.cpp
174
175moc_zonemap.cpp: zonemap.h
176 $(MOC) zonemap.h -o moc_zonemap.cpp
177
178moc_stylusnormalizer.cpp: stylusnormalizer.h
179 $(MOC) stylusnormalizer.h -o moc_stylusnormalizer.cpp
180
181moc_citytimebase.cpp: citytimebase.h
182 $(MOC) citytimebase.h -o moc_citytimebase.cpp
183
184
diff --git a/core/settings/citytime/citytime.cpp b/core/settings/citytime/citytime.cpp
new file mode 100644
index 0000000..b2f9f14
--- a/dev/null
+++ b/core/settings/citytime/citytime.cpp
@@ -0,0 +1,272 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20
21#include "zonemap.h"
22#include "citytime.h"
23
24#include <qpe/qpeapplication.h>
25#include <qpe/config.h>
26#include <qpe/timestring.h>
27#include <qpe/tzselect.h>
28#if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP)
29#include <qpe/qcopenvelope_qws.h>
30#endif
31
32
33#include <qdir.h>
34#include <qfile.h>
35#include <qlabel.h>
36#include <qmessagebox.h>
37#include <qregexp.h>
38#include <qtextstream.h>
39#include <qtoolbutton.h>
40
41#include <stdlib.h>
42
43CityTime::CityTime( QWidget *parent, const char* name,
44 WFlags fl )
45 : CityTimeBase( parent, name, fl ),
46 strRealTz(0),
47 bAdded(false)
48{
49 Config config( "qpe" );
50 bWhichClock = config.readBoolEntry( "AMPM", TRUE );
51 frmMap->changeClock( bWhichClock );
52
53 char *pEnv;
54 pEnv = NULL;
55 pEnv = getenv("TZ");
56 if ( pEnv )
57 strRealTz = pEnv;
58 pEnv = NULL;
59 pEnv = getenv("HOME");
60 if ( pEnv )
61 strHome = pEnv;
62 // append the labels to their respective lists...
63 listCities.setAutoDelete( true );
64 listTimes.setAutoDelete( true );
65
66 listCities.append( cmdCity1 );
67 listCities.append( cmdCity2 );
68 listCities.append( cmdCity3 );
69
70 listTimes.append( lblCTime1 );
71 listTimes.append( lblCTime2 );
72 listTimes.append( lblCTime3 );
73
74
75 // kludgy way of getting the screen size so we don't have to depend
76 // on a resize event...
77 QWidget *d = QApplication::desktop();
78 if ( d->width() < d->height() ) {
79 // append for that 4 down look
80
81 listCities.append( cmdCity4 );
82 listCities.append( cmdCity5 );
83 listCities.append( cmdCity6 );
84 listTimes.append( lblCTime4 );
85 listTimes.append( lblCTime5 );
86 listTimes.append( lblCTime6 );
87 lblCTime7->hide();
88 lblCTime8->hide();
89 lblCTime9->hide();
90 cmdCity7->hide();
91 cmdCity8->hide();
92 cmdCity9->hide();
93 } else {
94 listCities.append( cmdCity7 );
95 listCities.append( cmdCity8 );
96 listCities.append( cmdCity9 );
97 listTimes.append( lblCTime7 );
98 listTimes.append( lblCTime8 );
99 listTimes.append( lblCTime9 );
100 lblCTime4->hide();
101 lblCTime5->hide();
102 lblCTime6->hide();
103 cmdCity4->hide();
104 cmdCity5->hide();
105 cmdCity6->hide();
106 }
107 bAdded = true;
108 readInTimes();
109 changed = FALSE;
110 QObject::connect( qApp, SIGNAL( clockChanged(bool) ),
111 this, SLOT( changeClock(bool) ) );
112 // now start the timer so we can update the time quickly every second
113 timerEvent( 0 );
114}
115
116CityTime::~CityTime()
117{
118 if ( changed ) {
119 Config cfg("CityTime");
120 cfg.setGroup("TimeZones");
121 QListIterator<QToolButton> itCity( listCities );
122 int i;
123 bool realTzWritten = FALSE;
124 for ( i = 0, itCity.toFirst(); i < CITIES; i++, ++itCity ) {
125 if ( !strCityTz[i].isNull() ) {
126 cfg.writeEntry("Zone"+QString::number(i), strCityTz[i]);
127 cfg.writeEntry("ZoneName"+QString::number(i), itCity.current()->text());
128 if ( strCityTz[i] == strRealTz )
129 realTzWritten = TRUE;
130 }
131 }
132 if ( realTzWritten ) {
133 cfg.removeEntry("Zone"+QString::number(CITIES));
134 cfg.removeEntry("ZoneName"+QString::number(CITIES));
135 } else {
136 cfg.writeEntry("Zone"+QString::number(CITIES), strRealTz);
137 if ( nameRealTz.isEmpty() ) {
138 int i = strRealTz.find( '/' );
139 nameRealTz = strRealTz.mid( i+1 );
140 }
141 cfg.writeEntry("ZoneName"+QString::number(CITIES), nameRealTz);
142 }
143 QCopEnvelope ( "QPE/System", "timeZoneListChange()" );
144
145 changed = FALSE;
146 }
147 // restore the timezone, just in case we messed with it and
148 // are destroyed at an inoppurtune moment
149 if ( !strRealTz.isNull() ) {
150 // this should be checked, but there is not much that can done at this
151 //point if it fails
152 setenv( "TZ", strRealTz, true );
153 }
154}
155
156void CityTime::timerEvent( QTimerEvent *e )
157{
158 if ( e )
159 killTimer( timerId );
160 // change the time again!!
161 showTime();
162 int ms = 1000 - QTime::currentTime().msec();
163 timerId = startTimer( ms );
164}
165
166void CityTime::mousePressEvent( QMouseEvent * )
167{
168 // DEBUG enable this to get a look at the zone information DEBUG
169// frmMap->showZones();
170}
171
172void CityTime::showTime( void )
173{
174 int i;
175 QListIterator<QLabel> itTime(listTimes);
176
177 // traverse the list...
178 for ( i = 0, itTime.toFirst(); i < CITIES; i++, ++itTime) {
179 if ( !strCityTz[i].isNull() ) {
180 if ( setenv( "TZ", strCityTz[i], true ) == 0 ) {
181 itTime.current()->setText( TimeString::shortTime(bWhichClock) );
182 } else {
183 QMessageBox::critical( this, tr( "Time Changing" ),
184 tr( "There was a problem setting timezone %1" )
185 .arg( QString::number( i + 1 ) ) );
186 }
187 }
188 }
189 // done playing around... put it all back
190 unsetenv( "TZ" );
191 if ( !strRealTz.isNull() ) {
192 if ( setenv( "TZ", strRealTz, true ) != 0 ) {
193 QMessageBox::critical( this, tr( "Restore Time Zone" ),
194 tr( "There was a problem setting your timezone."
195 "Your time may be wrong now..." ) );
196 }
197 }
198}
199
200void CityTime::beginNewTz()
201{
202 frmMap->setFocus();
203}
204
205void CityTime::slotNewTz( const QString & strNewCountry,
206 const QString & strNewCity )
207{
208 // determine what to do based on what putton is pressed...
209 QListIterator<QToolButton> itCity(listCities);
210 int i;
211 // 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 ) {
213 QToolButton *cmdTmp = itCity.current();
214 if ( cmdTmp->isOn() ) {
215 strCityTz[i] = strNewCountry + strNewCity;
216 QString s = strNewCity;
217 cmdTmp->setText( s.replace( QRegExp("_"), " " ) );
218 cmdTmp->toggle();
219 // we can actually break, since there is only one button
220 // that is ever pressed!
221 changed = TRUE;
222 break;
223 }
224 }
225 showTime();
226}
227
228void CityTime::readInTimes( void )
229{
230 Config cfg("CityTime");
231 cfg.setGroup("TimeZones");
232 QListIterator<QToolButton> itCity( listCities );
233 int i=0;
234 nameRealTz = QString::null;
235 QString zn;
236 for ( ; i < CITIES ; i++ ) {
237 zn = cfg.readEntry("Zone"+QString::number(i), QString::null);
238 if ( zn.isNull() )
239 break;
240 QString nm = cfg.readEntry("ZoneName"+QString::number(i));
241 strCityTz[i] = zn;
242 itCity.current()->setText(nm);
243 if ( zn == strRealTz )
244 nameRealTz = nm;
245 ++itCity;
246 }
247 if ( i == 0 ) {
248 // write in our own in a shameless self promotion and some humor
249 QStringList list = timezoneDefaults();
250 int i;
251 QStringList::Iterator it = list.begin();
252 for ( i = 0, itCity.toFirst(); i < CITIES && itCity.current();
253 i++, ++itCity ) {
254 strCityTz[i] = *it++;
255 itCity.current()->setText( *it++ );
256 }
257 }
258 if ( nameRealTz.isEmpty() ) {
259 //remember the current time zone even if we don't have room
260 //to show it.
261 zn = cfg.readEntry("Zone"+QString::number(CITIES), QString::null);
262 if ( zn == strRealTz )
263 nameRealTz = cfg.readEntry("ZoneName"+QString::number(CITIES));
264 i++;
265 }
266}
267
268void CityTime::changeClock( bool newClock )
269{
270 bWhichClock = newClock;
271 showTime();
272}
diff --git a/core/settings/citytime/citytime.h b/core/settings/citytime/citytime.h
new file mode 100644
index 0000000..5a2c4d8
--- a/dev/null
+++ b/core/settings/citytime/citytime.h
@@ -0,0 +1,66 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20
21#ifndef TIMEWIDGETIMPL_H
22#define TIMEWIDGETIMPL_H
23
24#include <qlist.h>
25#include <qwidget.h>
26
27#include "citytimebase.h"
28
29const int CITIES = 6; // the number of cities...
30
31class ZoneMap;
32
33class CityTime : public CityTimeBase
34{
35 Q_OBJECT
36public:
37 CityTime(QWidget* parent = 0, const char *name = 0, WFlags fl = 0);
38 ~CityTime();
39
40public slots:
41 void beginNewTz();
42 void slotNewTz( const QString& strNewCountry, const QString& strNewCity );
43 void changeClock( bool newClock );
44
45protected:
46 void timerEvent( QTimerEvent* );
47 void mousePressEvent( QMouseEvent* event );
48
49private:
50 void showTime( void ); // get and show the time for various places...
51 void readInTimes( void ); // a method to get information from the config
52 QString strRealTz; // save the TZ var
53 QString nameRealTz; // and what it is called
54 QString strHome; // the home variable...
55 bool bAdded; // a flag to indicate things have been added...
56 bool bWhichClock;
57 int timerId;
58
59 // a spot to hold the time zone for each city
60 QString strCityTz[CITIES];
61 QList<QToolButton> listCities;
62 QList<QLabel> listTimes;
63 bool changed;
64};
65
66#endif
diff --git a/core/settings/citytime/citytime.pro b/core/settings/citytime/citytime.pro
new file mode 100644
index 0000000..d988b48
--- a/dev/null
+++ b/core/settings/citytime/citytime.pro
@@ -0,0 +1,13 @@
1# $Id$
2CONFIG += qt warn_on release
3TEMPLATE = app
4DESTDIR = $(QPEDIR)/bin
5INTERFACES = citytimebase.ui
6HEADERS = citytime.h zonemap.h sun.h stylusnormalizer.h
7SOURCES = citytime.cpp zonemap.cpp main.cpp sun.c stylusnormalizer.cpp
8TARGET = citytime
9INCLUDEPATH += $(QPEDIR)/include
10DEPENDPATH += $(QPEDIR)/include
11LIBS += -lqpe
12
13TRANSLATIONS = ../i18n/de/citytime.ts
diff --git a/core/settings/citytime/citytimebase.ui b/core/settings/citytime/citytimebase.ui
new file mode 100644
index 0000000..4665097
--- a/dev/null
+++ b/core/settings/citytime/citytimebase.ui
@@ -0,0 +1,1199 @@
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>289</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>&lt;location 4&gt;</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>&lt;CITY 6 TIME&gt;</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>&lt;location 5&gt;</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>&lt;location 2&gt;</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>&lt;CITY 6 TIME&gt;</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>&lt;location 6&gt;</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>&lt;location 4&gt;</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>&lt;CITY 5 TIME&gt;</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>&lt;CITY 2 TIME&gt;</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>&lt;CITY 1 TIME&gt;</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>&lt;location 3&gt;</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>&lt;CITY 5 TIME&gt;</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>&lt;location 1&gt;</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>&lt;CITY 3 TIME&gt;</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>&lt;CITY 4 TIME&gt;</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>&lt;location 5&gt;</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>&lt;CITY 3 TIME&gt;</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>&lt;location 6&gt;</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/findvalidzones b/core/settings/citytime/findvalidzones
new file mode 100755
index 0000000..f9e8b5b
--- a/dev/null
+++ b/core/settings/citytime/findvalidzones
@@ -0,0 +1,38 @@
1#!/usr/bin/perl
2
3# A Little utility to help tidy up messy zoneinfo directories.
4
5use File::Find;
6
7find sub {
8 if ( -f $_ ) {
9 my $a;
10 open T, $_;
11 read T, $a, 4;
12 if ( $a eq "TZif" ) {
13 my $d="$File::Find::dir/$_";
14 $d =~ s/^.\///;
15 $D{$d}=1;
16 }
17 close T;
18 }
19}, ".";
20
21open Z, "zone.tab" || die;
22
23while (<Z>) {
24 next if /^#/;
25 if ( ($cc, $north, $east, $z, $comment) =
26 $_ =~ /^(\S\S)\s+([+-]\d+)([+-]\d+)\s+(\S+)\s*(\S*)/ )
27 {
28 $Z{$z}=1;
29 }
30}
31
32for $d ( sort keys %D ) {
33 print "rm $d\n" if !$Z{$d};
34}
35
36for $z ( sort keys %Z ) {
37 print "zone $z, but no such file\n" if !$D{$z};
38}
diff --git a/core/settings/citytime/light.png b/core/settings/citytime/light.png
new file mode 100644
index 0000000..2aab906
--- a/dev/null
+++ b/core/settings/citytime/light.png
Binary files differ
diff --git a/core/settings/citytime/mag.png b/core/settings/citytime/mag.png
new file mode 100644
index 0000000..9cbd32b
--- a/dev/null
+++ b/core/settings/citytime/mag.png
Binary files differ
diff --git a/core/settings/citytime/main.cpp b/core/settings/citytime/main.cpp
new file mode 100644
index 0000000..e8664c6
--- a/dev/null
+++ b/core/settings/citytime/main.cpp
@@ -0,0 +1,30 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20
21#include "citytime.h"
22#include <qpe/qpeapplication.h>
23
24int main( int argc, char** argv )
25{
26 QPEApplication a( argc, argv );
27 CityTime main;
28 a.showMainWidget( &main );
29 return a.exec();
30}
diff --git a/core/settings/citytime/qpe-citytime.control b/core/settings/citytime/qpe-citytime.control
new file mode 100644
index 0000000..fcec4a6
--- a/dev/null
+++ b/core/settings/citytime/qpe-citytime.control
@@ -0,0 +1,9 @@
1Files: bin/citytime apps/Applications/citytime.desktop
2Priority: optional
3Section: qpe/applications
4Maintainer: Warwick Allison <warwick@trolltech.com>
5Architecture: arm
6Version: $QPE_VERSION-3
7Depends: qpe-base ($QPE_VERSION), timezones
8Description: Time-zone / world clock settings
9 The time-zone manager for the Qtopia environment.
diff --git a/core/settings/citytime/stylusnormalizer.cpp b/core/settings/citytime/stylusnormalizer.cpp
new file mode 100644
index 0000000..62de28b
--- a/dev/null
+++ b/core/settings/citytime/stylusnormalizer.cpp
@@ -0,0 +1,98 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20
21#include <qpoint.h>
22#include <qtimer.h>
23
24#include "stylusnormalizer.h"
25
26static const int FLUSHTIME = 100;
27
28_StylusEvent::_StylusEvent( const QPoint& newPt )
29 : _pt( newPt ),
30 _t( QTime::currentTime() )
31{
32}
33
34_StylusEvent::~_StylusEvent()
35{
36}
37
38StylusNormalizer::StylusNormalizer( QWidget *parent, const char* name )
39 : QWidget( parent, name ),
40 _next( 0 ),
41 bFirst( true )
42{
43 // initialize _ptList
44 int i;
45 for (i = 0; i < SAMPLES; i++ ) {
46 _ptList[i].setPoint( -1, -1 );
47 }
48 _tExpire = new QTimer( this );
49 QObject::connect( _tExpire, SIGNAL( timeout() ),
50 this, SLOT( slotAveragePoint() ) );
51}
52
53StylusNormalizer::~StylusNormalizer()
54{
55}
56
57void StylusNormalizer::addEvent( const QPoint& pt )
58{
59 _ptList[_next].setPoint( pt );
60 _ptList[_next++].setTime( QTime::currentTime() );
61 if ( _next >= SAMPLES ) {
62 _next = 0;
63 }
64 // make a single mouse click work
65 if ( bFirst ) {
66 slotAveragePoint();
67 bFirst = false;
68 }
69}
70
71void StylusNormalizer::slotAveragePoint( void )
72{
73 QPoint pt( 0, 0 );
74 QTime tCurr = QTime::currentTime();
75 int i,
76 size;
77 size = 0;
78 for ( i = 0; i < SAMPLES; i++ ) {
79 if ( ( (_ptList[i]).time().msecsTo( tCurr ) < FLUSHTIME ) &&
80 ( _ptList[i].point() != QPoint( -1, -1 ) ) ) {
81 pt += _ptList[i].point();
82 size++;
83 }
84 }
85 if ( size > 0 )
86 emit signalNewPoint( pt /= size );
87}
88
89void StylusNormalizer::start( void )
90{
91 _tExpire->start( FLUSHTIME );
92}
93
94void StylusNormalizer::stop( void )
95{
96 _tExpire->stop();
97 bFirst = true;
98} \ No newline at end of file
diff --git a/core/settings/citytime/stylusnormalizer.h b/core/settings/citytime/stylusnormalizer.h
new file mode 100644
index 0000000..d5e44a3
--- a/dev/null
+++ b/core/settings/citytime/stylusnormalizer.h
@@ -0,0 +1,70 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20
21#ifndef STYLUSNORMALIZER_H
22#define STYLUSNORMALIZER_H
23
24#include <qdatetime.h>
25#include <qwidget.h>
26
27class QTimer;
28
29class _StylusEvent
30{
31public:
32 _StylusEvent( const QPoint &pt = QPoint( 0, 0 ) );
33 ~_StylusEvent();
34 QPoint point( void ) const { return _pt; };
35 QTime time( void ) const { return _t; };
36 void setPoint( int x, int y) { _pt.setX( x ); _pt.setY( y ); };
37 void setPoint( const QPoint &newPt ) { _pt = newPt; };
38 void setTime( QTime newTime ) { _t = newTime; };
39
40private:
41 QPoint _pt;
42 QTime _t;
43};
44
45
46class StylusNormalizer : public QWidget
47{
48 Q_OBJECT
49public:
50 StylusNormalizer( QWidget *parent = 0, const char* name = 0 );
51 ~StylusNormalizer();
52 void start();
53 void stop();
54 void addEvent( const QPoint &pt ); // add a new point in
55
56signals:
57 void signalNewPoint( const QPoint &p );
58
59private slots:
60 void slotAveragePoint( void ); // return an averaged point
61
62private:
63 static const int SAMPLES = 10;
64 _StylusEvent _ptList[SAMPLES];
65 int _next;
66 QTimer *_tExpire;
67 bool bFirst; // the first item added in...
68};
69
70#endif
diff --git a/core/settings/citytime/sun.c b/core/settings/citytime/sun.c
new file mode 100644
index 0000000..d3f3731
--- a/dev/null
+++ b/core/settings/citytime/sun.c
@@ -0,0 +1,323 @@
1/*
2 * Sun clock. X11 version by John Mackin.
3 *
4 * This program was derived from, and is still in part identical with, the
5 * Suntools Sun clock program whose author's comment appears immediately
6 * below. Please preserve both notices.
7 *
8 * The X11R3/4 version of this program was written by John Mackin, at the
9 * Basser Department of Computer Science, University of Sydney, Sydney,
10 * New South Wales, Australia; <john@cs.su.oz.AU>. This program, like
11 * the one it was derived from, is in the public domain: `Love is the
12 * law, love under will.'
13 */
14
15/*
16
17 Sun clock
18
19 Designed and implemented by John Walker in November of 1988.
20
21 Version for the Sun Workstation.
22
23 The algorithm used to calculate the position of the Sun is given in
24 Chapter 18 of:
25
26 "Astronomical Formulae for Calculators" by Jean Meeus, Third Edition,
27 Richmond: Willmann-Bell, 1985. This book can be obtained from:
28
29 Willmann-Bell
30 P.O. Box 35025
31 Richmond, VA 23235
32 USA
33 Phone: (804) 320-7016
34
35 This program was written by:
36
37 John Walker
38 Autodesk, Inc.
39 2320 Marinship Way
40 Sausalito, CA 94965
41 USA
42 Fax: (415) 389-9418
43 Voice: (415) 332-2344 Ext. 2829
44 Usenet: {sun,well,uunet}!acad!kelvin
45 or: kelvin@acad.uu.net
46
47 modified for interactive maps by
48
49 Stephen Martin
50 Fujitsu Systems Business of Canada
51 smartin@fujitsu.ca
52
53 This program is in the public domain: "Do what thou wilt shall be the
54 whole of the law". I'd appreciate receiving any bug fixes and/or
55 enhancements, which I'll incorporate in future versions of the
56 program. Please leave the original attribution information intactso
57 that credit and blame may be properly apportioned.
58
59 Revision history:
60
61 1.0 12/21/89 Initial version.
62 8/24/89 Finally got around to submitting.
63
64 1.1 8/31/94 Version with interactive map.
65 1.2 10/12/94 Fixes for HP and Solaris, new icon bitmap
66 1.3 11/01/94 Timezone now shown in icon
67 1.4 03/29/98 Fixed city drawing, added icon animation
68
69*/
70
71#include "sun.h"
72
73#include <qpe/qmath.h>
74
75/* PROJILLUM -- Project illuminated area on the map. */
76
77void
78projillum(wtab, xdots, ydots, dec)
79short *wtab;
80int xdots, ydots;
81double dec;
82{
83 int i, ftf = 1, ilon, ilat, lilon = 0, lilat = 0, xt;
84 double m, x, y, z, th, lon, lat, s, c;
85
86 /* Clear unoccupied cells in width table */
87
88 for (i = 0; i < ydots; i++)
89 wtab[i] = -1;
90
91 /* Build transformation for declination */
92
93 s = qSin(-dtr(dec));
94 c = qCos(-dtr(dec));
95
96 /* Increment over a semicircle of illumination */
97
98 for (th = -(PI / 2); th <= PI / 2 + 0.001;
99 th += PI / TERMINC) {
100
101 /* Transform the point through the declination rotation. */
102
103 x = -s * qSin(th);
104 y = qCos(th);
105 z = c * qSin(th);
106
107 /* Transform the resulting co-ordinate through the
108 map projection to obtain screen co-ordinates. */
109
110 lon = (y == 0 && x == 0) ? 0.0 : rtd(qATan2(y, x));
111 lat = rtd(qASin(z));
112
113 ilat = ydots - (lat + 90) * (ydots / 180.0);
114 ilon = lon * (xdots / 360.0);
115
116 if (ftf) {
117
118 /* First time. Just save start co-ordinate. */
119
120 lilon = ilon;
121 lilat = ilat;
122 ftf = 0;
123 } else {
124
125 /* Trace out the line and set the width table. */
126
127 if (lilat == ilat) {
128 wtab[(ydots - 1) - ilat] = ilon == 0 ? 1 : ilon;
129 } else {
130 m = ((double) (ilon - lilon)) / (ilat - lilat);
131 for (i = lilat; i != ilat; i += sgn(ilat - lilat)) {
132 xt = lilon + qFloor((m * (i - lilat)) + 0.5);
133 wtab[(ydots - 1) - i] = xt == 0 ? 1 : xt;
134 }
135 }
136 lilon = ilon;
137 lilat = ilat;
138 }
139 }
140
141 /* Now tweak the widths to generate full illumination for
142 the correct pole. */
143
144 if (dec < 0.0) {
145 ilat = ydots - 1;
146 lilat = -1;
147 } else {
148 ilat = 0;
149 lilat = 1;
150 }
151
152 for (i = ilat; i != ydots / 2; i += lilat) {
153 if (wtab[i] != -1) {
154 while (1) {
155 wtab[i] = xdots / 2;
156 if (i == ilat)
157 break;
158 i -= lilat;
159 }
160 break;
161 }
162 }
163}
164
165/*
166 * Sun clock - astronomical routines.
167 */
168
169/* JDATE -- Convert internal GMT date and time to Julian day
170 and fraction. */
171
172long
173jdate(t)
174struct tm *t;
175{
176 long c, m, y;
177
178 y = t->tm_year + 1900;
179 m = t->tm_mon + 1;
180 if (m > 2)
181 m = m - 3;
182 else {
183 m = m + 9;
184 y--;
185 }
186 c = y / 100L; /* Compute century */
187 y -= 100L * c;
188 return t->tm_mday + (c * 146097L) / 4 + (y * 1461L) / 4 +
189 (m * 153L + 2) / 5 + 1721119L;
190}
191
192 /* JTIME -- Convert internal GMT date andtime to astronomical
193 Julian time (i.e. Julian date plus day fraction,
194 expressed as a double).*/
195
196double
197jtime(t)
198struct tm *t;
199{
200 return (jdate(t) - 0.5) +
201 (((long) t->tm_sec) +
202 60L * (t->tm_min + 60L * t->tm_hour)) / 86400.0;
203}
204
205 /* KEPLER --Solve the equation of Kepler. */
206
207double
208kepler(m, ecc)
209double m, ecc;
210{
211 double e, delta;
212#define EPSILON 1E-6
213
214 e = m = dtr(m);
215 do {
216 delta = e - ecc * qSin(e) - m;
217 e -= delta / (1 - ecc * qCos(e));
218 } while (qFabs(delta) > EPSILON);
219 return e;
220}
221
222 /* SUNPOS -- Calculate position of the Sun.JD is the Julian date
223 of the instant for which the position is desired and
224 APPARENT should be nonzero if the apparent position
225 (corrected for nutation and aberration) is desired.
226 The Sun's co-ordinates are returned in RA and DEC,
227 both specified in degrees (divide RA by 15 to obtain
228 hours). The radius vector to the Sun in astronomical
229 units is returned in RV and the Sun's longitude (true
230 or apparent, as desired) is returned as degrees in
231 SLONG.*/
232
233
234void
235sunpos(jd, apparent, ra, dec, rv, slong)
236double jd;
237int apparent;
238double *ra, *dec, *rv, *slong;
239{
240 double t, t2, t3, l, m, e, ea, v, theta, omega,
241 eps;
242
243 /* Time, in Julian centuries of 36525 ephemeris days,
244 measured from the epoch 1900 January 0.5 ET. */
245
246 t = (jd - 2415020.0) / 36525.0;
247 t2 = t * t;
248 t3 = t2 * t;
249
250 /* Geometric mean longitude of the Sun, referred to the
251 mean equinox of the date. */
252
253 l = fixangle(279.69668 + 36000.76892 * t + 0.0003025 * t2);
254
255 /* Sun's mean anomaly. */
256
257 m = fixangle(358.47583 + 35999.04975*t - 0.000150*t2 - 0.0000033*t3);
258
259 /* Eccentricity of the Earth's orbit. */
260
261 e = 0.01675104 - 0.0000418 * t - 0.000000126 * t2;
262
263 /* Eccentric anomaly. */
264
265 ea = kepler(m, e);
266
267 /* True anomaly */
268
269 v = fixangle(2 * rtd(qATan(qSqrt((1 + e) / (1 - e)) * qTan(ea / 2))));
270
271 /* Sun's true longitude. */
272
273 theta = l + v - m;
274
275 /* Obliquity of the ecliptic. */
276
277 eps = 23.452294 - 0.0130125 * t - 0.00000164 * t2 + 0.000000503 * t3;
278
279 /* Corrections for Sun's apparent longitude, if desired. */
280
281 if (apparent) {
282 omega = fixangle(259.18 - 1934.142 * t);
283 theta = theta - 0.00569 - 0.00479 * qSin(dtr(omega));
284 eps += 0.00256 * qCos(dtr(omega));
285 }
286
287 /* Return Sun's longitude and radius vector */
288
289 *slong = theta;
290 *rv = (1.0000002 * (1 - e * e)) / (1 + e * qCos(dtr(v)));
291
292 /* Determine solar co-ordinates. */
293
294 *ra =
295 fixangle(rtd(qATan2(qCos(dtr(eps)) * qSin(dtr(theta)), qCos(dtr(theta)))));
296 *dec = rtd(qASin(sin(dtr(eps)) * qSin(dtr(theta))));
297}
298
299/* GMST -- Calculate Greenwich Mean Siderial Time for a given
300 instant expressed as a Julian date and fraction.*/
301
302double
303gmst(jd)
304double jd;
305{
306 double t, theta0;
307
308
309 /* Time, in Julian centuries of 36525 ephemeris days,
310 measured from the epoch 1900 January 0.5 ET. */
311
312 t = ((qFloor(jd + 0.5) - 0.5) - 2415020.0) / 36525.0;
313
314 theta0 = 6.6460656 + 2400.051262 * t + 0.00002581 * t * t;
315
316 t = (jd + 0.5) - (qFloor(jd + 0.5));
317
318 theta0 += (t * 24.0) * 1.002737908;
319
320 theta0 = (theta0 - 24.0 * (qFloor(theta0 / 24.0)));
321
322 return theta0;
323}
diff --git a/core/settings/citytime/sun.h b/core/settings/citytime/sun.h
new file mode 100644
index 0000000..2091621
--- a/dev/null
+++ b/core/settings/citytime/sun.h
@@ -0,0 +1,57 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20/*
21 * Sun clock definitions.
22 */
23
24#include <stdio.h>
25#include <stdlib.h>
26#include <math.h>
27#include <time.h>
28
29#ifndef PI
30#define PI 3.14159265358979323846
31#endif
32
33#ifndef E
34#define E 2.7182818284590452354
35#endif
36
37 #define abs(x) ((x) < 0 ? (-(x)) : x) /* Absolute value */
38 #define sgn(x) (((x) < 0) ? -1 : ((x) > 0 ? 1 : 0)) /* Extract sign */
39 #define dtr(x) ((x) * (PI / 180.0)) /* Degree->Radian */
40 #define rtd(x) ((x) / (PI / 180.0)) /* Radian->Degree */
41 #define fixangle(a) ((a) - 360.0 * (qFloor((a) / 360.0))) /* Fix angle */
42
43 #define TERMINC 100 /* Circle segments for terminator */
44
45 #define PROJINT (60 * 10) /* Frequency of seasonal recalculation */
46
47
48#ifdef __cplusplus
49extern "C" {
50#endif
51double jtime(struct tm *t);
52double kepler(double m, double ecc);
53void sunpos(double jd, int apparent, double *ra, double *dec, double *rv, double *slong);
54void projillum(short *wtab, int xdots, int ydots, double dec);
55#ifdef __cplusplus
56};
57#endif
diff --git a/core/settings/citytime/zonemap.cpp b/core/settings/citytime/zonemap.cpp
new file mode 100644
index 0000000..337f4d9
--- a/dev/null
+++ b/core/settings/citytime/zonemap.cpp
@@ -0,0 +1,670 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20
21#include "sun.h"
22#include "zonemap.h"
23
24#include <qpe/resource.h>
25#include <qpe/timestring.h>
26#include <qpe/qpeapplication.h>
27
28#include <qdatetime.h>
29#include <qfile.h>
30#include <qimage.h>
31#include <qlabel.h>
32#include <qlist.h>
33#include <qmessagebox.h>
34#include <qpixmap.h>
35#include <qpainter.h>
36#include <qregexp.h>
37#include <qtextstream.h>
38#include <qtimer.h>
39#include <qtoolbutton.h>
40
41#include <limits.h>
42
43// the map file...
44static const char strZONEINFO[] = "/usr/share/zoneinfo/zone.tab";
45static const char strMAP[] = "simple_grid_400";
46
47// the maximum distance we'll allow the pointer to be away from a city
48// and still show the city's time
49static const int iTHRESHOLD = 50000;
50
51// The label offset (how far away from pointer)
52static const int iLABELOFFSET = 8;
53
54// the size of the dot to draw, and where to start it
55static const int iCITYSIZE = 3;
56const int iCITYOFFSET = 2;
57
58// the darkening function
59static inline void darken( QImage *pImage, int start, int stop, int row );
60static void dayNight( QImage *pImage );
61
62ZoneField::ZoneField( const QString& strLine )
63{
64 // make a bunch of RegExp's to match the data from the line
65 QRegExp regCoord( "[-+][0-9]+" );// the latitude
66 QRegExp regCountry( "[A-Za-z]+/" ); // the country (not good enough)
67 QRegExp regCity( "[A-Za-z_-]*" ); // the city
68
69 int iStart,
70 iStop,
71 iLen,
72 tmp;
73 QString strTmp;
74 // 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...
76 strCountryCode = strLine.left( 2 );
77 iStart = regCoord.match( strLine, 0, &iLen );
78 if ( iStart >= 0 ) {
79 strTmp = strLine.mid( iStart, iLen );
80 tmp = strTmp.toInt();
81 // okay, there are two versions of the format, make a decision based on
82 // the size...
83 // Oh BTW, we are storing everything in seconds!
84 if ( iLen < 7 ) {
85 _y = tmp / 100;
86 _y *= 60;
87 _y += tmp % 100;
88 _y *= 60;
89 } else {
90 _y = tmp / 10000;
91 _y *= 60;
92 tmp %= 10000;
93 _y += tmp / 100;
94 _y *= 60;
95 tmp %= 100;
96 _y += tmp;
97 }
98 }
99 iStart = regCoord.match( strLine, iStart + iLen, &iLen );
100 if ( iStart >= 0 ) {
101 strTmp = strLine.mid( iStart, iLen );
102 tmp = strTmp.toInt();
103 if ( iLen < 8 ) {
104 _x = tmp / 100;
105 _x *= 60;
106 _x += tmp % 100;
107 _x *= 60;
108 } else {
109 _x = tmp / 10000;
110 _x *= 60;
111 tmp %= 10000;
112 _x += tmp / 100;
113 _x *= 60;
114 tmp %= 100;
115 _x += tmp;
116 }
117 }
118 iStart = regCountry.match( strLine, 0, &iLen );
119 // help with the shortcoming in 2.x regexp...
120 iStop = strLine.findRev( '/' );
121 if ( iStart >= 0 ) {
122 iLen = (iStop - iStart) + 1;
123 strCountry = strLine.mid( iStart, iLen );
124 }
125 // now match the city...
126 iStart = regCity.match( strLine, iStart + iLen, &iLen );
127 if ( iStart >= 0 ) {
128 strCity = strLine.mid( iStart, iLen );
129 }
130}
131
132void ZoneField::showStructure( void ) const
133{
134 qDebug( "Country: %s", strCountry.latin1() );
135 qDebug( "City: %s", strCity.latin1() );
136 qDebug( "x: %d", _x );
137 qDebug( "y: %d\n", _y );
138}
139
140ZoneMap::ZoneMap( QWidget *parent, const char* name )
141 : QScrollView( parent, name ),
142 pLast( 0 ),
143 pRepaint( 0 ),
144 ox( 0 ),
145 oy( 0 ),
146 drawableW( -1 ),
147 drawableH( -1 ),
148 bZoom( FALSE ),
149 bIllum( TRUE ),
150 cursor( 0 )
151{
152 viewport()->setFocusPolicy( StrongFocus );
153
154 // set mouse tracking so we can use the mouse move event
155 zones.setAutoDelete( true );
156 // get the map loaded
157 // just set the current image to point
158 pixCurr = new QPixmap();
159
160 QPixmap pixZoom = Resource::loadPixmap( "mag" );
161
162 cmdZoom = new QToolButton( this, "Zoom command" );
163 cmdZoom->setPixmap( pixZoom );
164 cmdZoom->setToggleButton( true );
165
166 cmdZoom->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0,
167 (QSizePolicy::SizeType)0,
168 cmdZoom->sizePolicy().hasHeightForWidth() ) );
169 cmdZoom->setMaximumSize( cmdZoom->sizeHint() );
170 // probably don't need this, but just in case...
171 cmdZoom->move( width() - cmdZoom->width(), height() - cmdZoom->height() );
172
173
174 lblCity = new QLabel( tr( "CITY" ), this, "City Label" );
175 lblCity->setMinimumSize( lblCity->sizeHint() );
176 lblCity->setFrameStyle( QFrame::Plain | QFrame::Box );
177 lblCity->setBackgroundColor( yellow );
178 lblCity->hide();
179
180 // A timer to make sure the label gets hidden
181 tHide = new QTimer( this, "Label Timer" );
182 QObject::connect( tHide, SIGNAL( timeout() ),
183 lblCity, SLOT( hide() ) );
184 QObject::connect( tHide, SIGNAL( timeout() ),
185 this, SLOT( slotRedraw() ) );
186 QTimer *tUpdate = new QTimer( this, "Update Timer" );
187 QObject::connect( tUpdate, SIGNAL( timeout() ),
188 this, SLOT( slotUpdate() ) );
189 QObject::connect( qApp, SIGNAL( timeChanged() ),
190 this, SLOT( slotUpdate() ) );
191 QObject::connect( cmdZoom, SIGNAL( toggled( bool ) ),
192 this, SLOT( slotZoom( bool ) ) );
193 QObject::connect( &norm, SIGNAL( signalNewPoint( const QPoint& ) ),
194 this, SLOT( slotFindCity( const QPoint& ) ) );
195 QObject::connect( qApp, SIGNAL( clockChanged( bool ) ),
196 this, SLOT( changeClock( bool ) ) );
197 // update the sun's movement every 5 minutes
198 tUpdate->start( 5 * 60 * 1000 );
199 // May as well read in the timezone information too...
200 readZones();
201}
202
203ZoneMap::~ZoneMap()
204{
205}
206
207void ZoneMap::readZones( void )
208{
209 QFile fZone( strZONEINFO );
210 if ( !fZone.open( IO_ReadOnly ) ) {
211 QMessageBox::warning (this,
212 tr( "Unable to Find Timezone Info" ),
213 tr( "<p>Unable to find any timezone information in %1" )
214 .arg( strZONEINFO ));
215 exit(-1);
216 } else {
217 QTextStream tZone( &fZone );
218 while ( !tZone.atEnd() ) {
219 QString strLine = tZone.readLine();
220 // only pass on lines that aren't comments
221 if ( strLine[0] != '#' ) {
222 zones.append( new ZoneField( strLine ) );
223 }
224 }
225 fZone.close();
226 }
227}
228
229void ZoneMap::viewportMousePressEvent( QMouseEvent* event )
230{
231 // add the mouse event into the normalizer, and get the average,
232 // pass it along
233 slotRedraw();
234 norm.start();
235 norm.addEvent( event->pos() );
236}
237
238void ZoneMap::viewportMouseMoveEvent( QMouseEvent* event )
239{
240 norm.addEvent( event->pos() );
241}
242
243void ZoneMap::viewportMouseReleaseEvent( QMouseEvent* )
244{
245 // get the averaged points in case a timeout hasn't occurred,
246 // more for "mouse clicks"
247 norm.stop();
248 if ( pLast != NULL ) {
249 emit signalTz( pLast->country(), pLast->city() );
250 pLast = NULL;
251 }
252 tHide->start( 2000, true );
253}
254
255void ZoneMap::keyPressEvent( QKeyEvent *ke )
256{
257 switch ( ke->key() ) {
258 case Key_Left:
259 case Key_Right:
260 case Key_Up:
261 case Key_Down: {
262 tHide->stop();
263 if ( !cursor )
264 slotFindCity( QPoint( contentsWidth(), contentsHeight() ) / 2 );
265 ZoneField *city = findCityNear( cursor, ke->key() );
266 if ( city ) {
267 cursor = city;
268 int tmpx, tmpy;
269 zoneToWin( cursor->x(), cursor->y(), tmpx, tmpy );
270 ensureVisible( tmpx, tmpy );
271 showCity( cursor );
272 tHide->start( 3000, true );
273 }
274 }
275 break;
276
277 case Key_Space:
278 case Key_Enter:
279 case Key_Return:
280 if ( cursor ) {
281 emit signalTz( cursor->country(), cursor->city() );
282 tHide->start( 0, true );
283 }
284 break;
285 }
286}
287
288ZoneField *ZoneMap::findCityNear( ZoneField *city, int key )
289{
290 ZoneField *pZone;
291 ZoneField *pClosest = 0;
292 long ddist = LONG_MAX;
293
294 QListIterator<ZoneField> it( zones );
295 for (; it.current(); ++it) {
296 pZone = it.current();
297 long dx = (pZone->x() - city->x())/100;
298 long dy = (pZone->y() - city->y())/100;
299 switch ( key ) {
300 case Key_Right:
301 case Key_Left:
302 if ( key == Key_Left )
303 dx = -dx;
304 if ( dx > 0 ) {
305 long dist = QABS(dy)*4 + dx;
306 if ( dist < ddist ) {
307 ddist = dist;
308 pClosest = pZone;
309 }
310 }
311 break;
312 case Key_Down:
313 case Key_Up:
314 if ( key == Key_Down )
315 dy = -dy;
316 if ( dy > 0 ) {
317 long dist = QABS(dx)*4 + dy;
318 if ( dist < ddist ) {
319 ddist = dist;
320 pClosest = pZone;
321 }
322 }
323 break;
324 }
325 }
326
327 return pClosest;
328}
329
330void ZoneMap::slotFindCity( const QPoint &pos )
331{
332 lblCity->hide();
333 // given coordinates on the screen find the closest city and display the
334 // label close to it
335 int tmpx, tmpy, x, y;
336 long lDistance,
337 lClosest;
338 ZoneField *pZone,
339 *pClosest;
340
341 if ( tHide->isActive() ) {
342 tHide->stop();
343 }
344 viewportToContents(pos.x(), pos.y(), tmpx, tmpy);
345 winToZone( tmpx, tmpy, x, y );
346 // Find city alogorithim: start out at an (near) infinite distance away and
347 // then find the closest city, (similar to the Z-buffer technique, I guess)
348 // the only problem is that this is all done with doubles, but I don't know
349 // another way to do it at the moment. Another problem is a linked list is
350 // used obviously something indexed would help
351 QListIterator<ZoneField> it( zones );
352 pClosest = 0;
353 lClosest = LONG_MAX;
354 for (; it.current(); ++it) {
355 pZone = it.current();
356 // use the manhattenLength, a good enough of an appoximation here
357 lDistance = QABS( x - pZone->x() ) + QABS( y - pZone->y() );
358 // first to zero wins!
359 if ( lDistance < lClosest ) {
360 lClosest = lDistance;
361 pClosest = pZone;
362 }
363 }
364
365 // Okay, we found the closest city, but it might still be too far away.
366 if ( lClosest <= iTHRESHOLD ) {
367 showCity( pClosest );
368 cursor = pClosest;
369 }
370}
371
372void ZoneMap::showCity( ZoneField *city )
373{
374 pLast = city;
375 // we'll use city and country a couple of times, get them to save some
376 // time
377 QString strCity = pLast->city();
378 QString strCountry = pLast->country();
379 // Display the time at this location by setting the environment timezone
380 // getting the current time [there] and then swapping back the variable
381 // so no one notices...
382 QString strSave;
383 char *p = getenv( "TZ" );
384 if ( p ) {
385 strSave = p;
386 }
387 // set the timezone :)
388 setenv( "TZ", strCountry + strCity, true );
389 lblCity->setText( strCity.replace( QRegExp("_"), " ") + "\n" +
390 TimeString::shortTime( ampm ) );
391 lblCity->setMinimumSize( lblCity->sizeHint() );
392 // undue our damage...
393 unsetenv( "TZ" );
394 if ( p )
395 setenv( "TZ", strSave, true );
396 // Now decide where to move the label, x & y can be reused
397 int tmpx, tmpy, x, y;
398 zoneToWin( pLast->x(), pLast->y(), tmpx, tmpy );
399 contentsToViewport(tmpx, tmpy, x, y);
400 if ( lblCity->width() > drawableW - x ) {
401 // oops... try putting it on the right
402 x = x - lblCity->width() - iLABELOFFSET;
403 } else {
404 // the default...
405 x += iLABELOFFSET;
406 }
407 if ( lblCity->height() > drawableH - y ) {
408 // move it up...
409 y = y - lblCity->height() - iLABELOFFSET;
410 } else if ( y < 0 ) {
411 // the city is actually off the screen...
412 // this only happens on the a zoom when you are near the top,
413 // a quick workaround..
414 y = iLABELOFFSET;
415 } else {
416 // the default
417 y += iLABELOFFSET;
418 }
419
420 // draw in the city and the label
421 if ( pRepaint ) {
422 int repx,
423 repy;
424 zoneToWin( pRepaint->x(), pRepaint->y(), repx, repy );
425 updateContents( repx - iCITYOFFSET, repy - iCITYOFFSET,
426 iCITYSIZE, iCITYSIZE );
427 }
428 updateContents( tmpx - iCITYOFFSET, tmpy - iCITYOFFSET, iCITYSIZE,
429 iCITYSIZE );
430 pRepaint = pLast;
431
432 lblCity->move( x, y );
433 lblCity->show();
434}
435
436void ZoneMap::resizeEvent( QResizeEvent *e )
437{
438 // keep the zoom button down in the corner
439 QSize _size = e->size();
440 cmdZoom->move( _size.width() - cmdZoom->width(),
441 _size.height() - cmdZoom->height() );
442 if ( !bZoom ) {
443 drawableW = width() - 2 * frameWidth();
444 drawableH = height() - 2 * frameWidth();
445 makeMap( drawableW, drawableH );
446 resizeContents( drawableW, drawableH );
447 }
448}
449
450void ZoneMap::showZones( void ) const
451{
452 // go through the zones in the list and just display the values...
453 QListIterator<ZoneField> itZone( zones );
454 for ( itZone.toFirst(); itZone.current(); ++itZone ) {
455 ZoneField *pZone = itZone.current();
456 pZone->showStructure();
457 }
458}
459
460void ZoneMap::drawCities( QPainter *p )
461{
462 int x,
463 y,
464 j;
465 // draw in the cities
466 // for testing only as when you put it
467 // on the small screen it looks awful and not to mention useless
468 p->setPen( red );
469 QListIterator<ZoneField> itZone( zones );
470 for ( itZone.toFirst(), j = 0; itZone.current(); ++itZone, j++ ) {
471 ZoneField *pZone = itZone.current();
472 zoneToWin( pZone->x(), pZone->y(), x, y );
473 if ( x > wImg )
474 x = x - wImg;
475 p->drawRect( x - iCITYOFFSET, y - iCITYOFFSET, iCITYSIZE, iCITYSIZE);
476 }
477}
478
479static void dayNight(QImage *pImage)
480{
481 // create a mask the functions from sun.h
482 double dJulian,
483 dSunRad,
484 dSunDecl,
485 dSunRadius,
486 dSunLong;
487 int wImage = pImage->width(),
488 hImage = pImage->height(),
489 iStart,
490 iStop,
491 iMid,
492 relw,
493 i;
494 short wtab[ wImage ];
495 time_t tCurrent;
496 struct tm *pTm;
497
498 // get the position of the sun bassed on our current time...
499 tCurrent = time( NULL );
500 pTm = gmtime( &tCurrent );
501 dJulian = jtime( pTm );
502 sunpos( dJulian, 0, &dSunRad, &dSunDecl, &dSunRadius, &dSunLong );
503
504 // now get the projected illumination
505 projillum( wtab, wImage, hImage, dSunDecl );
506 relw = wImage - int( wImage * 0.0275 );
507
508 // 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 );
510
511 for ( i = 0; i < hImage; i++ ) {
512 if ( wtab[i] > 0 ) {
513 iStart = iMid - wtab[i];
514 iStop = iMid + wtab[i];
515 if ( iStart < 0 ) {
516 darken( pImage, iStop, wImage + iStart, i );
517 } else if ( iStop > wImage ) {
518 darken( pImage, iStop - wImage, iStart, i );
519 } else {
520 darken( pImage, 0, iStart, i );
521 darken( pImage, iStop, wImage, i );
522 }
523 } else {
524 darken( pImage, 0, wImage, i );
525 }
526 }
527}
528
529static inline void darken( QImage *pImage, int start, int stop, int row )
530{
531 int colors,
532 j;
533 uchar *p;
534
535 // assume that the image is similar to the one we have...
536 colors = pImage->numColors() / 2;
537
538 p = pImage->scanLine( row );
539 for ( j = start; j <= stop; j++ ) {
540 if ( p[j] < colors )
541 p[j] += colors;
542 }
543}
544
545void ZoneMap::makeMap( int w, int h )
546{
547 QImage imgOrig = Resource::loadImage( strMAP );
548 if ( imgOrig.isNull() ) {
549 QMessageBox::warning( this,
550 tr( "Couldn't Find Map" ),
551 tr( "<p>Couldn't load map: %1, exiting")
552 .arg( strMAP ) );
553 exit(-1);
554 }
555
556 // set up the color table for darkening...
557 imgOrig = imgOrig.convertDepth( 8 );
558 int numColors = imgOrig.numColors();
559 // double the colors
560 imgOrig.setNumColors( 2 * numColors );
561 // darken the new ones...
562 for ( int i = 0; i < numColors; i++ ) {
563 QRgb rgb = imgOrig.color( i );
564 imgOrig.setColor ( i + numColors, qRgb( 2 * qRed( rgb ) / 3,
565 2 * qGreen( rgb ) / 3, 2 * qBlue( rgb ) / 3 ) );
566 }
567
568 // else go one with making the map...
569 if ( bIllum ) {
570 // do a daylight mask
571 dayNight(&imgOrig);
572 }
573 // redo the width and height
574 wImg = w;
575 hImg = h;
576 ox = ( wImg / 2 ) - int( wImg * 0.0275 );
577 oy = hImg / 2;
578 pixCurr->convertFromImage( imgOrig.smoothScale(w, h),
579 QPixmap::ThresholdDither );
580}
581
582void ZoneMap::drawCity( QPainter *p, const ZoneField *pCity )
583{
584 int x,
585 y;
586
587 p->setPen( red );
588 zoneToWin( pCity->x(), pCity->y(), x, y );
589 p->drawRect( x - iCITYOFFSET, y - iCITYOFFSET, iCITYSIZE, iCITYSIZE );
590}
591
592void ZoneMap::drawContents( QPainter *p, int cx, int cy, int cw, int ch )
593{
594 // if there is a need to resize, then do it...
595 // get our drawable area
596 drawableW = width() - 2 * frameWidth();
597 drawableH = height() - 2 * frameWidth();
598
599 int pixmapW = pixCurr->width(),
600 pixmapH = pixCurr->height();
601 if ( !bZoom && ( ( pixmapW != drawableW ) ||
602 ( pixmapH != drawableH) ) ) {
603 makeMap( drawableW, drawableH );
604 }
605
606 // taken from the scrollview example...
607 int rowheight = pixCurr->height();
608 int toprow = cy / rowheight;
609 int bottomrow = ( cy + ch + rowheight - 1 ) / rowheight;
610 int colwidth = pixCurr->width();
611 int leftcol= cx / colwidth;
612 int rightcol= ( cx + cw + colwidth - 1 ) / colwidth;
613 for ( int r = toprow; r <= bottomrow; r++ ) {
614 int py = r * rowheight;
615 for ( int c = leftcol; c <= rightcol; c++ ) {
616 int px = c * colwidth;
617 p->drawPixmap( px, py, *pixCurr );
618 }
619 }
620
621 // Draw that city!
622 if ( pLast )
623 drawCity( p, pLast );
624}
625
626void ZoneMap::slotZoom( bool setZoom )
627{
628 bZoom = setZoom;
629 if ( bZoom ) {
630 makeMap( 2 * wImg , 2 * hImg );
631 resizeContents( wImg, hImg );
632 } else {
633 makeMap( drawableW, drawableH );
634 resizeContents( drawableW, drawableH );
635 }
636}
637
638void ZoneMap::slotIllum( bool setIllum )
639{
640 bIllum = !setIllum;
641 // make the map...
642 makeMap( pixCurr->width(), pixCurr->height() );
643 updateContents( 0, 0, wImg, hImg );
644}
645
646void ZoneMap::slotUpdate( void )
647{
648 // recalculate the light, most people will never see this,
649 // but it is good to be complete
650 makeMap ( pixCurr->width(), pixCurr->height() );
651 updateContents( contentsX(), contentsY(), drawableW, drawableH );
652}
653
654void ZoneMap::slotRedraw( void )
655{
656 // paint over that pesky city...
657 int x,
658 y;
659 if ( pRepaint ) {
660 pLast = 0;
661 zoneToWin(pRepaint->x(), pRepaint->y(), x, y);
662 updateContents( x - iCITYOFFSET, y - iCITYOFFSET, iCITYSIZE, iCITYSIZE);
663 pRepaint = 0;
664 }
665}
666
667void ZoneMap::changeClock( bool whichClock )
668{
669 ampm = whichClock;
670}
diff --git a/core/settings/citytime/zonemap.cw b/core/settings/citytime/zonemap.cw
new file mode 100644
index 0000000..8e8625e
--- a/dev/null
+++ b/core/settings/citytime/zonemap.cw
@@ -0,0 +1,21 @@
1<!DOCTYPE CW><CW>
2<customwidgets>
3 <customwidget>
4 <class>ZoneMap</class>
5 <header location="local">zonemap.h</header>
6 <sizehint>
7 <width>200</width>
8 <height>200</height>
9 </sizehint>
10 <container>0</container>
11 <sizepolicy>
12 <hordata>1</hordata>
13 <verdata>1</verdata>
14 </sizepolicy>
15 <pixmap>
16 <data format="XPM.GZ" length="220836">789cc4bd59732acbb2adf97e7fc5b6936fc7cab87492d0433d8010926804089080b27ac88ebe134280b87fbe32638ce19a6beeb99add9d5a662ce6a7c88c708fc6c33d2232f9dffffdb761a7f5b7fffedfffebe3e01fe6e1dfc299bfffdb7f479febf5d7fff3fffedfffe77ffd57319bfd5b3ef9146e8ab77fcbffd7fff5bffe2b5efd2dfc9b974dfecb95525e44e2422ee5c9855ccc65533ebd8bf3b729875b7229ebd2a3a318d7cf3e8d5dfe5f6571dea5c7afe410f7af8bc6eefac9ad18f9357c31cacfdf890b906707ce65915fb83176f9f94731e4095a62c8f3f5252e3afdf7757291fa7d8a71bf7f12e3fe69c6d8c913293fd6cf639b4c7ddfa94f9ef2762e62dcdfa2fe7996ff1e93999fff2246f977ca8ff9d73be04216f537bf729cb40eda777c12177dd7fea1f8caf58fca1759fae87ab6e79331d26b1931dae3b224b3fd3eafc5b8fec8eb13fd5c7e777531d20f7b32f56d04c6eefa774f0c791e28bff47f8ac428ffebded85ddfbe88517fc505b8c0fef14efd0b6cef21f52d509e1af529b2fd9e8664b657be9272dadb6e02571f5532cb3b9fc5688f55518cfe57f900ab3f444b31eaf7ae29c6f5d32399fdd1ff2497907ff799ccf2a38e18e9770fc62effa78cf8caf58fa82dbe29a4bc2517285f6743667d753ec428ef93e517d47e9f625cdf1f8a91df23f52bb0fdb6bcbfc8f15a2f90d91ec7bab1cbefd5d99ba47766216fff815c447fbfb4c9ecafc1b318e9eb0199fdf5b417a3be465931eae775042eb03d8e1199fd79fb48a67efb3e99fa95a762e8b7db8a311e7b336357dedd0bb8c8fa3ffb648ea7cd5c8cfc8e2cbfc8fc87f7c6eefee731f88af662ccf2afae50bf634f8cf4418e7c8bf4b91b0f496f65fdeef364d6e7ec400ec1bb5bf1b5d32f5c830b6cdf55498cfa0eb262d46fdeae477d2c9be2926bef498e2cfbfc2a467ecd8bb1d3ffe5598cfade7e92695f170f62dc7ff4c490c7ff3276f21cb662c817eec9acff9aee677f6aec8cd1ff250fed41bd2c867ccd1e58e321781723bfcbabb1cb2f7b12633ce47c63679fe603b2fa6b20863eed2299f3fbfc057cc5f2f76fe42b8ce7f1907ccbfed42247485fa2fd6ef325b4d7eb52ec872e7f31f51d42bedb02e7abcbb318fd677c11431fbf452ea2fe665b31daa3d7155f3b1eb7c5a89fc998ccf17a1f89519fb58618f9573fc590d75f1abbfc1f4e62c8bb7e11df165d7ed287ed9fff12b37f493fd647e1d118e369042e72fcdec762dcffd03646ff7c27d3bf6bb4c4283f5714e3feac5dcff1bb13439f0af52fd29e6f2b62ce376763cc5f3d31fa6bffc518f3cf5a8cf2ee2c3fe87fdf21d37eeda53fc7d3b96aecd2fb3531f2ab2dc0eabfc7bc31fc939218f9ed8de91fde18bbfc3edfc8579cef5a62da8b1cf916e9eba518e9f7ec1fc9f8807da53cd7b7b0e74d967793a37d873dba2d91974e9f424ef351ee0e2c7b38fe22b3bdf22d31fafbfc22be75e36fb323b3fe274f628caffb1e59e373658cf1d414a33c7f61ecd2bf1ec5287fb314633cec299ffaebcbbd18e575dec5cccf23d3befb6731eba320863cab1732fbdf626fecda7f7d25a6fdd818bbfcfa1f62c8b31818bbf4e1b318f59fdd92d55f2f629457cd89515ed03486bd2a8b51de970f56ff3dec8c317e4a62e4df198b917f3f34c6789e8a39ffb1bca43fbbfbcbaf62e457dc88694f1662dcdf7e23df223dbb16a37e3e1fc811f27fa988391f37c490b799055fe738be57c6eefade0d99e3affa64ecd2eb7932e7a3cdd418f395f2e7f83c3e19bbfb47ecafd71c9fe399b1bbbf5e13e3fe11fbd74d0ee9a79e98f690fade50de25fa5f321f603c0c2fe2921b6fe793d8c77c31100791ab9f2999e3697c3476f767ba62f4c7cca331d2db62e437e1fd45cdaf6763d77e83b118e5f9cfc6c86f224679a33b63971e0562ccf7719dccf925c888517ef7c1d8a537d762d8ab7841e6f89decc4e86f8b9518f9554fc62e7d9b17439fe6bb18f2175ac64efed72b31ecd52514a37df60d32c7efaa20863ce70f31e4d9bd1a43de9298f659f2b3fd96185f361fe52fc6b0876b31c6636b650c7b722d46f95bb6b7c6f7c78d18f9750a62c853a1fec9fc85f58a8198f14f598cf20f4d63979f7f1053ffa5b14b2fb3fe641f4e2531e381ba31e2b7bd18e5bf9d8c919f2f663cb53576e9ef3931e429d8f590675704cbfebc1f8d5df9ef1331ca7fef1ba3bd59dfb24fb5b531fcc90731f22fb3bdae599f77436397df3dc7a3eccd7a21a6bdbf17633c3e4462f49f0ae54bec11e2c71b31eedf5d89517ed41523bfda1799fe7ef149ccf58dbc31e623d66f89f670332353df8cabcf624ef627d304cb5e3c8ec5811b5fc32199fe4bcb1343bfe1abb1bb7f742546fea3aa38bc725c3176e9f72a8ff6e1fc2986fe8b6731ed5bd118eb3d2d31ec43612b86fc930f31caafeb7ada87cd468cfed8ac18bbf4ee488cf2a3508cf21a0531ec6b9007cb1e043963f847cf629417978d31fe2331ed37e54fec03e6e32f31fd938cb1bbbf5210335e507eb4276fc6b09f31f595fda8768c5d7e4f9e18f9b5b3c6f02fba64da83cf8231c6f3b598f2b68c311f283fda83d39331fc61e6277b305b8b51defad618f3d94e8cf2f63d6397fe7625467945df18fad4c8b4cff3be98f167c918f1f1b598eb056d63a46fc5282f627b5f331e69f48c5d798d8a18e50d76c698af2c1de5ad2363ac8f497edaa7ea8d18f9dd53be1bd667361623fd301263becfefc4e82ff7d447f627ba1323bfe154ccf9a16f0cfff54b8cf19d3f8b31be6ab44f37f40feb0f62caa7f26e717dd113633c360332ed75f1d118fea5f4e3fcd6b812737e57fd44187ffb15b844fbfd702346fd36698f4ab4bf8f0531e793580c799f395e4b6cffe1814cffb6037bebcb3f5a6ec8f44f964731f25b3c8961ef6a2fe02bfa8b8b9698eb757563a7dfa426e6fac84c8cf6def68c5d7f187d91d9dfb77d63f43f4f8cf2efb3c6aebcbedd8ff2e67931cafbb4fc505e7b4d66ff6e9dc418af7e594cff2d678cf9f355ccfabf18bbf4fa500c79a662daaf73490c7d1f3bc6981f76628ceffed918f6682ca6fdcd19a3ff5b79d0dfbf13a33dc377b0ec59e7468cf28e6b6357de692b46799f763debdfae67bcc3fa90bd9b94c4286fd33346fb0ec528fffdda18feeebd18e53f7d89d19ef94f32edd97e2c4679ab9331e64bc9c3f9e7e1da18f347284679bb8db1d3efae4066fb859fc6eefefc8b98f7bf1bbbfb3f31bff8b297f1b3b1abafaf8398fee83763fe7c12a3bc6345cc78ef468cf243d687fcb946284679fba198eb612731f4eb7a62e47fe6f8be617cfdd21353fe6b31d7ff2231e47d91fcb497cf6f625cfffc29c6f54ddaa712ebeb6e45e6fcf034216b3e72ed7b95bfca46ce3f1b3f92af30ff4c3ec5180fab5bb2e297ba98f62663ecda6fd613737e991bbbf481e587f13f691bbbf25f2f62c69b2f62f8b7f72199e37d267dd87fee3d31caef67c52caf2c46fe830fb0c6737d2ea63f1c8b915faf600c7bd71523bfcb82ccf1bb50feec1ff74fc6b0af0731eab3f3cd287f2d66f9ef6294b710733c4f8bc6589fef8b693f32c62ebdf12a46f92bc9cbf63b7e193b797a3b31fd7fc9cbf60a57648effcac518e3b322a63f3e32c6fee4b318f21c0ec6aefc4a550cf9ea963fe4c9bf8961ff2e1bf00dedf9dda331da672ce6fa69d618fed3a718f294236327cff3448cfac90fc428ffb545a6fdd8dc88399fdf19c3ded7c590e775658c78632ae6fa54d718f1a49547ff91f5237fae5531c6fef78b18f2bcbd19633e6e8821cf8be507791eefc5ac9fa5b19327d713a37e3e9b64dab353518cf29f7d63d847c9c3fef261d7a3fc07f61ff9877151ccfaa47eb2879db5b1bbbefd24863c837731e43952bf12ebeb59e5d1dfafefc448af703cdd529ea1f34fae7cad5f16cac6ae3e4e186fbef63b1f037211e943d8b3c45f427f1aeec488e7c71531ec793e43a63f1d6fc48c9f4762d8f75cde18f6f54d8cf8fdb162ecd26b4d31e70f8c8fc4bf613c70670c79d762f4c76a568cfca65762e4b76a18c729cf7d32c747b32c467dd6d7c6580ff2c4b00f87a118f2bd3e1b637c7e89215f6360ecd2572331ea672ef9af503f8b83b14b7fb1f220ff94f529fb3b51791c1fd5400c793b4fc6586f517dd2debec6c64ebeeaad18f29f25cf2de4dbb2fd656fcf7b63579fd38b18f5592d1ba37f1ec5902f181a23fd2c867cedb1b1936f9f11a3fe16ecbfb2bf93be98f1455b0c796adfeccadbedc59067766decd2975762c8336b183b79165f62b4effb8d18e321df3376f2166a62d4e794fac97eafbac6384f9017a3be1f8bc6f0bf6fc5d0efc3eea77e6731fb6fce18fed38318fab50231f4c95afe90f7783176fa5ceec9b467ad500cf94fb118f25feac6f08f3ec4dcdf8c8ce1afa83cf6e77ad3d8a537d47eecaf5bbb9ff3b5da8ffedef3540c7d6a4b32e7878bca63ff8e9ac68857aa62c81b6c8c317fcfc45c5fb5eb59df9f62d477e5510c793fd93f35ff349ec5a8dfed9798f349410c799f6f8de1ff0762c8fb7e67ece4f9b0fb216f8efa6bfde36d2846799ff7c6f0bfea6294ffd533c67e41438cf21a2f64add75f89e9bfb48cd13fec7afa9b4d63cce7b4a725b6d733ede92ded418de3f196fa3429ef2de7dbb9f3afaff3852cc67324e67e593e47e67ed5b04fe6fc5bb936c67ac42bb8c8fc864d32e7df684fe67a75b56a0c7fae2fc6f54103acf5a071991c613e58eec08a2fee1fc5b03ff737c6aeffe70662f4ffea511cbbfcf20fe2c9b52b4fd7737eabf5c4a88fe9b5b14bbfbf13a3fc59d7d8951f4dc5283f776becd2979118f3f773ded8c937d88863275fa6638c742b1ff2df0764da8ffb9131fcc95731c6e36665ecf479cc89a1effcc9d8a5676a62e85bb5fca16f752886beed8131fc15b517fdad85c90b7ddf2c7fe8b3527bd2de743c31f45b3d1bbb742f2b867ee7576327ffb42a66bcd93746ff95fef4efbc0f63277fe524a6ff3213439fb7a618ed3565fd68be1e5dc45c6f2b88b9fe7934c6f9bba998fe83e5477d8b62e8eb5d1bc3ffda8ba16ffbddd8a57b563ef4dbc762b457ff534cfdd85e9a8fe32731e5df1a3bf9b6c6943f3276e987ba98f1f0c2d8c9773c8bb9defa620c7fe44d8cf6f237c64efe9631daaba8fae0785bdc1abbfe77c7fea0f97c951743df554f0c7d2f0d63a74fa8f6e0f87b2f19bbf4aeda93e3efd9ee87be33d5a7e6f7b531faaf950ffdcaa198facd8c5dfa4cf5cbf1f6207d38ff871f629eb72d18bbf4f9ab98ed7b3676faac3b62e8bbfd6697feaefae578dc59799c6fd43e1c7f0f8f62fa2fea8f1c6faf596397fe3e16a3fdb607b0fc85cb5c0cfd5a37c6380f711443bf46c318e7453fc4d0efe3d518f6a82b867eef5963a74f6e21467be6fa62e8f769d7737e90fc5adfb81863fd50d7d3ff58bd1a63bff045ccf3f8beb193b75516733fe69b5dfa5b550c7dc61b31c6d785fd53fe4aa323863c77256397fe2179395e1eed7ec6e7d762947fbc13a33fbc7c8a517ef662ecea6f7345667f0ed49e8ad7dac658ef903eeccf7ecfd895ff247dd87f2f0531db8ff2dc72fd7c743086ff7f25e6f996b331d6d32d9dfbd33563eccf64c4f4b7585fb73a5f3711f3fccede18e70b8b62e49fa3fdbde5fa79c513f37986b998ebf10b63f8a32a8fedfbccf6b9657d6f385e7dfa9bf74d63975e647f0af2e0bcf3a7affd02cf1fe4eb62b4ef06f2fa3a1ff6be10a33f0e46c6eefece5c8cf6293f91b9df38ee8bb91fb8045ff13c5a2f4fe67c7d0f797df98ff70531c6e77d8dccf965f22246baf765ecd2dfd662d8dfcc590cff2df32186bff3726b3c71f989393fdc17c55c7ff78de19f3d8b519f998531cecf2cc590d77f3086be5762c85bf58c9dbcf70331fdd19d31f4998ba18f7767ecf499bd91391f9c6ac638af771143bfcc9331f48bc4d4cf37867fa6fae57c31088ca15f570cfdee87c64efed5b598fa79c6d0cfe4837ebec90ffd0eb027b65fd6bd16a33f7a2531f48fdf8db19ee68ba17fab6decd2cf4731fdd3d818f14e530cfd5b9fc6a89f8d18fa2f4363c457961ff5bf3346bc712586fe01fbaffcbfd6d118e7117262faeb1563f8af7931fdf5a1319ef7b0eb511fc1ab31fc5be9cbf969723676fa7a563ec7e79531d26fc4a88fc9bdb1d3b75f15a33e9acfc6f037381ee40f7edd183bfda696cef3753963f817d28ffea0bf3676fa15240fc7fb7a2786bee599b1d3e7a8f6e4f85ecc8d5d7a57f5cbf9f0291043fee3d218fb731d31e4df378da1df8b18f247cfc64efeca560cf93f4263a4ab7f713c1f8fc658efec8ba1cf8767ecd2fd9518ed377b3446fb487f8ee715f591bf57a918c35fbd1243dfa7ac31d6e75ec5d0775b3476fa743fc4dc7fb5fb793e2410439fd5d8d8e9f33115d35fbf3776faecd87ef20f271b63cce77d31cfcf7e33d68f5a62ae9f8e8ce1efa83eb47e1a19bbf4e68b18fa772fc6b05f763ff47fde8bd19e6f0731f47ffb32c67a7153cc788cfd49fee649f547ff72a3fae3f88bdf8c115f4ec4d0c7df1a63bd6925863e8f9eb1d3677c27a63e2763977e772b46ff7d793476fabcaa7d381ebb0563d863da07f35f553f1c9fb1a543bfbb8bb1937fa3fec8f179ae18c39f55ffe1f8fcb2fce83fa97d383ef3ea2f1c6f35d68ffcd5cec9d8c9b7bc1143bef3c418e3e9494cfb5733c6f9db0f31e45b5b79a8cf915d8ffaacefc590ef8ef3abfcdffd42ccf3465d639c3f398a21eff3bd31e21fc9c3feff7230c679a48a18f595b5fb21efa3e4a37f1d5f89215f762a66bc5d35c67e82ca677feede18633ea57dbee57e6f2332c6fea9e461fcd3fa32463ca6fcd99f3a7d31e3db9d18fdfb8bf6d3677cf37225663c7a234679839931d6a375bdcff3596c4f3fe6fe09fdcf20cfe78356c6989fdec53cff4afd826bdc7f6c8a717f3143f6915ea07d0e59de4b4bccf354ae7fde140a3c6f1dafc18a27c64fc6f037b6e422c74b955cc2787a3883751ed1cf80e54f67b662aed7de1b3bffb1f946e678ed1e8d5dfebe27e67eb05d4f7ff8da18fefe49ccf82527a6ffdb37867ffb29867fe33d8821efee60ece49de4c15acfdcecc5a8af7d470c79b63531e41996c590a7d617331e7b3576f254c762c893b7fc204ffb83ccf968198821cf6c24467d457363c407d762c837793446fa8b18f5e54562c6074331e5b3fb21dfb04ed6788fc5b4975331c6e340f9717eda958c31df16c4e80fcb6fc6faa8cae7fc346f183b7d1ed43e9c9fc6563ef4cde5c45c2ff5c5689f8f8998faf5c85a9fff32c6faa8e467ff5e6d8ce11fa97ed9bf7b4363e823f9d8df3b3b63ac5fcfc4d027affa657fafd8f5907fdd1543fe39e5977f383b8ab91eb13176fa7c3d89793eae25e6fec2de18fb495931e47f3a18637ff924a6bf1b19c33ffa14439f4f9307fdb17511a33f76696fe4efc58fc6f0df953fe7b7695f0c7d1e0ac6183f4531d7a7afc41ccf763de48bdec99cef9e0ac6d8ef577d71be9b0cc5dc2f981863bdf54e4c7f6d61ece42babbd381e4e5fc6e83f963fe47d2919e3fc89e50ff91bba5ee7eb1ec47c1e73618cfd8e9198f1d2d118ebe5ea2fecffadb3b193afaff2b5deb833c6f904e9c3fe9d7d31c67e00eb53eb8db97b31f72ffa62c8bb7a1343dec7a1b14b1f5f8bd91f2c1df2be5bfe90b7f821e6fafd4accf5ed8918f53ba81bc3beb37ee5af2d6a62eee75b3ae41f7c89e9bf2c8d719ee9564cfbb936c6fa63560cf99fba62c87f67ccf5b29d31f42b88a1cf59f9b1bfc73d63f82b1d31cfbb4f8cd17f6231cfdf968db17f24fdb47ffb4c66ffdc287ff6cf8f6fc6790dbb9efeed8731ce178ec5c8ff692666fd70be97ff1766c55c6f7f34c6fc66ccf78b648c711ea32c863c5f9c6fb47efc5917c3bf8bee8d71bef241ccf39e7b63f8bb5b31cba7bfe6d33f0c5fc5c87fd43386ff6ad723ff5a854c7ff2fe5dccf74f7c1843be404c79289fd6c3bfc662dc5f8b8de15fefc4287f78678cf579b667e20fe3bcffad31e45b8af93c41608cf66988f93c23fb8bfce78bf263fdb4aac6b0dfecff01eba3bd11f33c6ac518f549f943ca538bc4283f5b15a3bd5e381f862cff79610cfdd9bef2efebf762e6ff6e8cf3a9b48f11ebbfb210b3fd56c6d8bfa07f1851de16fc9f40cf671e2e64ee2fcc72623e3f9a3776f622467b047a9e69d41463bc953b628cb7d950cc78b860ecf2fbba8839ff62fe09142f54f262fa53960e7977a8ef40e709ca1731f79b3d31cfd754c4f0979edec8b4bf5f0d31ca3f18339e2a1abbf4412ca63e2732edddf051ccf3634363777f3d2b46feaba918f22e3d63f857be18f3cda22386bfd46b8ba15f7541a6bdcc758db11e3013f3f9b01b31fb83e4a3bfbafc3476f2b4fb62f6976b63977eda8921df51f5c3786cd43176f2be515ef9a7872731fdb78198fd2b2fe6fa6b60ecca5f5dc4906f5e1073bdfc5dccf5d59d31d6cf7362c8b7bb27eb794a95cffe135e8b21efae25e6f31a7563f81f2b31e47fed1863fdf8538cfa0c6fc43c7f3d31c6f923e9cbf57edfca833ecf3532e7ebd3544c7f6f6e0c7ffa20a6ffd13676f2bf8562aeefbf19c31fb4fcb9be5830c6f987ad98e795d51ef45ff77b63277f4ef5c3fe5e3079d09f9aca9ffec2e224867e6f5d63ac2f8ec4d4cfd2795e58fd91f667d234c67a86ea8be3e1f52c663c7a30c679fdaa98e7e54ac64e9ff64c8cf67b817f1ce879829d31f73b1662e8170f8dd1bef762e8f7b932c6f3f33331edeb9731d68f6fc568bf879a31f4198b19af8e8c11cf9ec4d0275b3476fa76389eb5de59e889b91f1719e3f9b28c98fef2ad319eafec8b391f7d33eced9d98fbed8131e2938e98fa9a7cd0efa966ecf46be4c41c8f961ff43d5f91e94f8f545ff49f0b96cef3a85531cf23d9f5d06f751043bfdec018eda9fea0f5feb531da53fd81e36f581243bffeab18f27faa3ef4bc56cb18cfd77c8a795ebf680cfb3111733faa678c7840fd8fe3ef2536867d947e1c6f4f8f62c8fb7a30c6fac2458cf668523f9fef276a5e89b9df742366fc712de679b1ac31e20bcb8feb4347633c7fd015f3bcc7ded8c9dfea8bb9feee89a1cf82eda378e0f0628cfd154be7f9fb9231f683a40fc7c7a0608cfa0ec55c9f957e1c0f3dda6bc513355dcff8615331863c65319fa7bd18bbf2da6731e469f58c71fe99f3ade28f42648cf85ff2c58c1f1e8cb17f732be6f382cf623ebf583576e5bdb27cc52f8d1b31e38bbe31e2b72731df57f2688cfe5315335e7d37863ffa4156bcf0698cfe561723fffdab31e29f9698fbf3b4ef8a67ee1bc688873a62be8f6426c6fd7bda03c5371fe490fad5ee8df1bcdbbb98ef8bca19633f55d753bffbbd31e2a5a998cf9b4ec45c7f3266feac0fc54be76763777ff54acce7693f8db1df62d723bf06fd03c557e79698ed7130467d6fc49c8ff262eeb7b3be156fd53e8ca1ef59ccfae4f850fc1586c6e8bfae7e4b05bdef21f0c08a5f66af62cc47ad67639c8fbd256bfcbe8879bee2ced85d9f3f92399f94951fe78fe1580c7b34a819e37c7c48a67d7edb8a517e67224679870fb09d2f35c6f587d818fb1d2b31e46f54c590a77b25867ddf505fadff56e7629e4f6e89b9dfb51723ffb7ba31e2ab408cf25a3531e6c3b7bc31d6a7253ff74b961963172f2cd97ef2b7834f31df0ffb24e6f37d2531e47da919239eb574eefff8c638cf771043fe51d9d8a50feec58c7f4ec64e9f99da87f3ffbc6a8cf8c2ca837ef91b32e7fba331f4db14c43c8fa0fa627f99178db1fe5d1143bffec518e72f4662e8d7537b73be5f34c4907ffccd4efef2408cf67a0e8d9d3e5f6c7fad3f9f2662e853be32c6fac7548cf61b6e8c11ff95c5d07763f943df7a45ccfdf76b63ec6ff5c43c8f69e5419fd149cce77f3ac64e9f40f2d21fd8dd1943fe9c98effb8bc48c577bc6d81f2e8ab91f373286ff3513a37d0ab131d2f762b4d7e3c0d8e9f3d21733fe3e88a15f2cf9399e9aba9ee3691e1be3f993b618fa2d6bc6787e6f2ba6fddc1b63fd49edcff1f6fc688cf36a9f62e89b0b8cb1befe2586beaf3b638ca7b318fdf5f4608cf1d81443ff3ec797fce9eacc18cf47a93de84f6faf8d11afbe8b799ead668cfa507fd07a4fdb18e7fdd55e1c7f4f1fc68827d47f381e2fea2f1c8f17bb1ffa4d694fe57fc75531e6db75cd18cfb3f7c55c6f3919237e1a88a1ff62648cf67c10f379efb5b14b0f8f62e897ad1b3bfd1e8dd17e4dda0f9fef17f8ba15439faae4a5bffed236c67eb2f4e7f8dc9c8d713e6a28e6f922c9cbf1f9b61743beec9d98eb27d762c6a3eceff2d78307639c9f1b8be93ff78db1dfa1fc7dcee779639cf75c89f9fe09da2bf9eff5c018fea0e493ff9e37c6fa4543ccf79f548db17fd613f3f9ab2f633c1fcff947fefa7d5dcc78b5668c78a522467997a1b14b2f1cc5b4f71cfff2e7ab5b31cffb948d319f34c5283f9b35c6f87d17f37d6b6c1ff9f3e19398fb892f62be6f47e5b33eabaccf90fa9ee7c6789e6626e6f9b6b531dabb22c678a8b17f87d4ef60ccf5a8d818fb811331df8f427f28647f7bac8939bfd27f927f1ef68c71fee95dcce743a98ffceff642ccf7b7b9fd8a52a0f3451bdc1fc83f1e3c9275fe64648ce72d9ec57c1ff14a8cfa9864c95adf288a917f1018c3ffd6fdb49f6d95cff5bf9c31c66b07f565ebe1cb3b31d7bf6fc4f41f66c6785f8531fdc18631de173a27737e3f0cc4cc6f698cf52e4f8cfc56763ffc8dbad2391f6f32629e2fae89f9bee7b131fc8b4f31caeb34c5286f3c32867fa4f2395f5eec7aca5322b37dc62b31c66f363486bdb888198f497fb6e7d7560c790e960e795ea50fe7bfc6464c7ffa564c7fe6cbd8c9ebb3ffc89f6c8e8cd13e7d31ea2fca1863bd7d2e86bc77964e7fb22b86fcfb6f467d6fc53c8fb316733ddaf2633cf029863ee5b631eadf27eb7d026731f777242fe7b7c137231ecc89393eed7ee83ba988a16ffc618c78a82a86bef3b131c6474d8cf60a4c5ee8f7a0fa60ff8ed83fe46f6627c6983fca62be7fe44b4c7fe3c118f19cea9ffe656e6f8cf5f3500cf9dfe6c6388f782f86fcbd3b63c4a7d29fe3a37d10a3bd06d7c64ebf91cae378e9aabe395e96556327ff7625867e95a3319e7f91fe1c3fdb9cb193bfa7fae6782a4c8cb1ffb511733dd7e4e1f3114331fa676f6decd2d74d31f47db574e85b833f60ebbb8f5331f43d6cc4d0e7b41473fee81ac33fce8b39be26c62e7db71073ff676bece41d5e89a1cf283076e9679397ed773176fae458df7a9e31ae89e94fe78c111f8562ae47583adaf743e5697ec88aa9ffca18fdd5cae77ec2c218cfef34c5d03fdb30463cabfaa4bfda36f9a0fff84d0cfd1f383fcb3f1d3d89217f311673bda9688cf5abb298f6236b8cfd6d4fcce739d87ffc98bf679611733dfc51ccfdc6a398fb350d63945f11f3fc59688cfec6f2e5bf6e2e62fa8747639cff7f1573be6d88f9fe848918fa9d387ee48fb69ac6781f512046790f96cef30da118faf5b7c6aefc665eccf541da8f40fb03928fed776c8b39ff293fd66fdf17e3feb3ea87f5fdd531c6f3b14f62e4978bc4b4c7ec6f5aef6ecdc57c7f6b20e6f83889b95feb8b31fe5ee95fca3f3e3d8bf93c84f267fd0d9662e4f7bc11f379da1d99f5957d12b3fdbf8cf1bc9be465bc753f11b37d551eeb2bbc33c6fe16fb83fce726db27627fb8e37c1fb37e3a6e3cde16e52f2fe762eeef2fc5d0ef6cd743bfd62b59fe7153ccf5e7ac18f662f8cdf03f1a62aecf7a60f9bbbd8a98f1fa8cacf76d348d619fc662dcef378c315fe5c428af51236b3ff545ccf5ea9398e7b32764ce978d92319e57d98b215f253486bf321423ff75460c791e7c31ca7b88c15aaffc5a89b91e9215439ed1d018f67e2c863c9f7363f8934731d74b06c658ef33e6796a9307f24691b16b9f49474cfff864ecf439e97afa831f4363f43fddaff7d72e8d61cf7762fa83d287f351e55dcce7876f8c9d7cf1590cf9a29931d68f3fc9f4ffbeeac6587fbb16f3f99a92b14bdfa8bee80ff626c6882f9a62c8ffe219233d23e6f3d1763ffa7f640cfd661563ac37aafef4fc7bcb18cf47287fae371e8b62be5ff2de18f19cf4637fefbe1a23be7a11b33d1e8de1ff493f8efff597b19377ef8ba9cfb331e6eb8618fa6c3e8d713e8ef561e7779fc5d0a77830863e6b31f4799f1be3f9aaa198fed1d118f173530c7d77df8cf78184623e0fdc3276fa546231c77bd618f391c9cff74fcd8c9dbead2959cf47bc89b9df9635863f178919efbe1a23feb0fb21effbc818fef7bb98fb317363bcdf53fa69ffec9b9dbc15b6afd6232b3d31d71f5bc6381f22fde8ef6d3c6397be1e8bb99eff6a0c7f2827a67db5f2b9be2a7d7daeaf9e8d118fa8be7dc6cb260ff46d5afed0b7fb62ecf49d2a9dfe4db41543ffb6fa0bfd99f6a731f4bf88a16fe1430c7d3f06c64e9fb5e50f7ddfdf8c5dfad3b518fa764ac6d89f517f8ba1df52fac7d0afd33086fdee83b5de5a3988b9de3c33c6f3266531d7977762b46fff680c7f371073fdc3eee77ad242ccf8ecca18e99f62e87b588979fe93fd47fe70bf24867ca78298cf371e8cb11f581733dec81ba37f49de6bc85357f9d78c7fd91e818ff3808357319f8fea8a79de666b8cf8f646ccfda192b193afa1f2385efa6a2f8e97fabb31ce83d37e6abd395b33463cb214f3798d9118e58fde8d713e4af2d03fafb0bee47f3f648ce1af9ec5f4ef3d63bcbfea24e6fb66be19cfbf733cc83f6fbd1be3bcd0a398fb6d0d63c407763dca0fa99ffcf5a6e4657b14cec6580fa37d0819df148df97e9f9298bfc7447b2cfffc4bccfd85c1404cff9dfd39a23c0f185fa1fce543d918eb0f4f628cdf21ec4128ff39b317d33faa1823bd21a6ff60e9183fbd1e99f3c7ebad98fe7dcb18f94dc52c2f30c6fad6418cf2326b63d853ea277f3c3716a3bcc2dc18e53d88595ed518eba10532fd995d478cf11084629477f934c6fc7e14a3fce3abb1cb3ffb2846f979cb9fcfe3327ff9e38da2319eff9b88b95ed83346fcf221a67ff86c8c78aa20e6797d5f8cf2f76d63f84fca8ffef7e39598f6e2cdd895bf1c8a195f05c6787ee241ccf7994b3eb6ffd38bb1936f9317b3bf9d8cd1fe3b32fdeb93ea8ffef5e7cc18f567e990afbc30c6fb764662d6572c867cdebd31fa534e4cf9d6c64ebef53599fe74f54b4cff782be6798b37633cdf501533de8d8d31bf1fc4a8cfd1c018fbef0d31fb7bd118cf877b628eaf8231ceffb0bee52f57c662c667df8cf86621e6f3cf45638c9fb598f1c08331cebb95c5d0675a3746fcb213b33d4263b4475f4c7d4c3ee8d3d1f53a1ffb658cf5d02b31dfe73935c67a5e5b4cffea534c7ff26c0c7deec4d0e7c337c6f33d5d319fe79818bb743f12b37f1d8c9d3e47da57f9c72fba9efef13c23467b1446629e477e31c6fb8aaa62cafb600c79541ff47f5775638c57c947ffd7eb193b7937aa3ffa07e3a531fc13e943ffe0e1c518f62716d3df0d8c315e9ec4dccfce19e3fd458f62bebfe8c118f1a6fa6b0cfdba763df4dbcdc4d4cfe4837e31e593ff7bbc1643dfeabd98cf4f3f18637da321e6feec8bb193bf781643bffac118fe6557cce715d6c6881f4d3eee3f583adf376df9f17d1a2763d833da07ad0f3f491efa47e5b531cefb3d8ae99f558da1afa573ffd5f283bee73b31f4edd48da16f45ccfeda13f3fc5fc7d8c9df7d27d35f9b6e8d619f55dff49fab0363f4cf4f31cff7fbc6783f84da53e3ad610c7b118ab99ef62146fb4cd45fe80f9e6762c873dc18431eb50fc7cb73d718f3a1f4e7786959fe3cbfcbfce56f9727629457b7743effbf14f379afbdb1cbaf45fb2f7ffa5015f37d8a96cef7694cc53c0fbd22b37d7aafc6389ff324a6bdbb21b3be0a2731f72b32c68807d8bfe45f577762969715f3fd87ac2fad8f5796629e47a4bf27ffbb9d1323bd497b16317eda71bed5fa7ac1d58f5fb4f7ede48db11e1790393f7befc62ebd7f05d6fb681ecbc698df7d31d78beec89cbf86b762beefa0640cffe1468cfc875b63bc6ff3410c79f6cf64bdaf53f2d01fef47c6789f654bccf5f63199fe4ea56c8cf396ba9ffaafce609d87290cc57c7ea82ba63fbe3286bf7010d37f7817d37fb0eb595e9bacf3f65b31f7038ac638cf3b10d31fff3046792d31fdb3d018e93331e5d918633f4ae5ebf735243ffddbdec218f654f2b03d5eb2c628af2ea63cb131d2cb62caf365ece469a87cfab7f54f31eaebe9410cf9366b63973eb5fbe9ffdd19bbf21f553ff267ef8d11df4a1e8e97b79d31ce033c81ed7d230331e46d2cc5b06fedae31f6178e629e8fad1a43fe7b31e40dda623e6fa7ebe95f5ecec6382ff229e6f9f88231e2bbb118e51f1f8c117f5dc48cafe662beefbf668ce7338d694f3cb27e6fe856ccf7010d8c11df5f8b21cf3434c67aeb49ccf3e09131d68f1b62aea7aa3e144f7db393ef8ef651cf274e46629e2f53fb319e3a6d8cf1be949d98ed171ac37e4cc5f49f5e8c313fefc58c3f86c6b0b76a5fc5535963f84f64c54beb4731e47ddf8921dfe3a731ce279fc57cff71c618fef9bd98e3e3cd18e3f7454cf946c64ebe90edabf799ec6b62fe3e4a57ccf8efda18f19fca63ff6dc6c6b0877762ae0f748c715eb12de67a68d518f56bf9b3fe0363e8f72aa67e2563a75f41f5457fad2179e8afbdd78d319ea41ffdb5d69331e2d9b998f6aa6d8cf9d3ae67bc5433467a53ccfede31c679348e0fc547a3ad98fe5edf18cfd3aa3fd1dfeb748ce12f1fc45c1fff30c6fa554eccfda97b63c4df7b31edc9b331e2a78218fa4c7d63a74f96f5a5f5fee24accf32bf7c6f00fbfc47cbfc8de18fef449ccf3aa763fcf67f68d616f3c31dfaf66f951fe400cf91f8fc64efe33eb47f14f6d28e6ef53de1a23fe298a793e66668cf6cc88b99ffd608cf315963ff7aff7c6680fbb1efa0cac3ce8737813733d8ff657f14b7d6a8cf396af62ce3f6d31d717d55eecef03d527fb77376fecca7fb5f2e8cfd27e28beb95b1ac37fbe11d39fd989b99eb710d31fac8bd15e05bb9ff11ec75fc8f3e34d63febef49b319eef2c89f97cd146cc78a029e6f319b7c64ede1ae5d5f9a0afac98f19cca677f795c1b637faf2de6fb0aaec45c0fce1be33c8be4e5fb906a2731ec7753f2f2f982e151ccf3d2ef62c6473762ee7f5b3a7fef94f383bdaf742be6fb878ac678beda13f33cedd818cf4394c5dcdf9919bbf2ce3d31e4b9b3fcb97fa5faa43d7bb2fcd11f8ab4ef7a9fd2e5460c799f76c62e7d3a17f3f7cd7bc678bfedbd98f16cdd18cf1755c47cff84678c789cf389e2c7e6c018cf8f9ec58c5ff3c6eefe5e53ccfa9818c35eb2ff446cffc154ccf78744c678fe48f971bde3f322a6ff477b1eb33e5a77c638dfdd11f3f94fdaa398f2b795cefdcbf2ad31f6df0231fb23db2366bcfc7c34c6fbfe7c31ebef608ce79b38de268aafdfc4bc9ef74ff4feae9531ceeb35c5bcde3346f9b48f13ca5f30e6fea7f29ff079ab9c98cfb340ff50ef73babb17f33ce097b1b35ff73e99fea83716c3de2e2d9defcb7916733f0ee3c5f6f75ef362dcbf681be3fcc29798cf23b23cc5b3c19b98e7797d31f29b6cc9fa3d9c9d18f71f0762c6035d63c46f924fe7d5593f8a1f3b67319f17d91be3bcca8398e7350a62c8f7fa668cf5ce8698ef179a18bbf2df597f8af73e32c68827dec5d0a75c36c679e6ba98eb335963c45f961fcfafbf92b5df3612f37cfd8db12bbf2ff9e84f3f2c8c11afeec5906f7e67ecca1f3c8bd99f0ec638bf23f9e94f3ff6c97c5fe4a824e6fbb90ec6989f743fe3c359418cf20f1531e3bf3763b48fea57f160c3d8b5cfe72799fbb52f4b31f707aac638cf2879f47c4f688cf30eaa2ff69f782766fd7c19e379a40f31cf37158df1be6cacefd8fe58211443be6e648ce7f73362b6e7d418ed792de67a52de18fbd76f62c85bf5c5acbfb231d6433664bd7ffe51cce7b7be19fb952531fd918c31d6974662aeeff8c62ebd1288b93fdf37c6fef88398fb61a131d67fa4aff6c376c6389fc9fea4f363eb9e18fa3caec4fc7dc8b331f6a76b62c81fc4c62e3d527bd2ff3d3d1ae3bc9431cfc37d18c31e75c5fc7d9a8131cec3a97ee9ef7cbd8a19efb4c5f4776ec490a7db3386bd57ff617c7627fde81f051d63acff90edfc55dd18f1fd488cfadb4f8d113f66c5dcdfe81ba37e8d21ef9d95c7f5b19e31eaeb45ccf67e36c67933f62fc55b5f6f629edf7832c6f9a39c18f21f8ec688b76a629e2751f98cbf72a131de673016f3bca631df7fb833c6ef2f713eb3fda64731f757a4bf9e67991a43bfae98eb5b9fc658bf5a8b51dff99918f296ed7e3eff7627e6f9f51399fef84bd918ed6fcce7f54ac6587fa888b9dfa4fec0fe5a5f1ac35eb07e159f15dfc5b047b92b31fdc9bab12beffe590c790a5963d8db9218f28c2d3feee7d29ee8bc57f42ae6fedfbb31fcf7ae98bf7f75658cf72b2cc55caf647f533c767732c6f3ea07317f0f6f2de6f3b54fc64ebee2a798cfa7d78c112f4662ae2f778db11e6fe95c9f933c8ce79e1a62beef696d8cf761cdc494f72c86bca79531f6bf2d3fc8d31c1ae3f904b53fedd13de7577bffd2de18f1ed45ccdf5f3f8879be7b648cf1d514f3f7bb1662be0fa4668cfeb21473ffdde4e1fbc22d9dfb3d9c3ff5fea7fb85317eeff043ccf71d0cc4fcfdf42b633c3f5f12f37c4ad918e74b252ffbdfe7c118f1f944cce74bde8ce13f4fc5a8ef06e7b788eb07c38a18f23c7b62c8f3b132863f7027e679d8ba31c64b5b4c7f4cf5a5fe726b8cf77b583a9f0fab19637da42fe6fa2dfb83e2d37ad118e7333b629e876d1ae3fce852ccfeb011d39f65f931dbe7a52be6fe78db18e7874e62fe3e796c8cf50cce1f8a77c317639cdfe578517cbbdf1ae37ce75eccfef126667958bf0827dcdf9ecc8cd1ffca62e4bfec1ba3bd1fc47cbe85f5a97879ba34c6fad8a718f9cda6c6887f55bed603743fd703661363bcff7321667e33633c9f26fdd81f1bdf8cfe217926983f1e4b62fede6cdd18cf4b15c43c9f3e32c679887731cabb3b1abbf216ceff0d6cff785e22eb79d66731c6dbe4c118fbb74532e39f45d3d8dddfd88ab93f7345e67ac0e39d18e9830358f1e87320e6f33f6732fdf3c6d118cf83e87efae7ed480cf97bcfc6aebce71b32e3bb8f7b319f27f0c53c6fd412f3bc94aee77ede712ee67ee39db193ef521673ff682fe67e45df18feaf31dfcf60e5a13e56ef62fa974fc6d82f62fd295e0b0fc64e9edc8718e5ef56c6f02fbec4287f773146bcd012a3fc304766fc55d4f58cb7b237c688072c1dedf7f92ae6fb02fac638ff7525e6fb7aad3cbedf616e8cfd27e94bff32927e8c8f1e2ac678fefd59ccf8f4648cfd979198eb213b633cff64e990675e36c67a96da83f1d04ee5d39fdca97e180fd547c6e8ffd29ffb57fd8d31ce2faa3d190f45944ff1d0bc23e6fb270662c6bb2763ec7f67c53c9ff6628c78f7594c7b5113f3bc6a9bccf97bf726e6f3b313639c6fb474beef626a8cf3cc2b31f4cf1d8d5dfa93a5f3bc26fbafe28dc6a398f1d1ca18e7c90a629ef7d91ba3fc8c18f997d9ff144f043563f8174f62f6ff8231d6dfb662c6173d63ecdf8ec57c9fc09731e247f617c51bef6731d7efaf8d317f8fc57c7ef3cd18fee15cccfdc84f63f85fcf62ae5f35c87cbe23ea89591f5563577e47f2d0bf9b9d8c51fe8798ef635889196f537f7bbfead118fe5f47ccf7b5a83ee8df95df8c71de6222e67a56cb18f1e7528cfac8978d717ea42d46ffa8df8ab9fe3d2333dea8168df1fb2496cef743c462fa677d6327efbe22e6f3472b63d4ef9518f215d91f157fb47662c8f3762de6fb12f662ee67d9fd7c1fc4a398bfbffa648cfabc88f9fca295c7e7171662c85763fd47dc6f6ccc8c9dbc075fccfde858ccfddd7b31cfcb558d317eea628c9f3ac78be281a7ad31ce63aa3e743eb6690cfd1a62949f2f18bbf29a5d31df17630cfb74e27c14b1fdb65363f8f39297f662f46a8cf527fa138a0fea2731cf2f178c112f1fc58cf7bbc658efb0ebb99ec8feaff860d03746fc168ab9be736d8cfdee8998eb6b9c5f141ff46ec57c1ead618cfd5be9c7fa5f79c6b0a7763f9f57667f52bc31681bbbf2de252fc7d37e670c7d1ec47cfebb620c7f5cf5c1f6289e8c61bfd95f15af5cde8cb17eb01373ffbc688cfdcb58ccf8feded8953fff10f3f7a1ec7aee97de89d95fd8de8a77eec6c6aebcc9540c79264b63ac1fd9f56c9f8531e261e9c7f62fb2be140f9d5e8d515e24e6fe6dc618ef97b474eedf7e1863bc97c48c6f69df141f9dbb6296e789a9dfdc18e9d287f1d057de18fd2f2be6fb0f607f22c5471f3159fb7b282f52bc12de1ae37d296531e39b17b2ce2b2fc4dc7fbc33c679bd8618f66bfd618cf843e9fa7dbdaa98ebbd6d63975fef51cc78e6c618cf2b4a7ec62bcdbd98ef435a8af97eb59698fb6b5563eccf305df1c66a21e6f39bbe31ce5fbf93191fbcccc5f4373362fe9e9031cf6b558cf1be3aea277f7eb53686bef762becfb065ecd273763ff2af7c33f2bf2273be7d93fcf4dfbf3662e41f1f8ce1afbe8af93c20fc9b48fe786b2ce6fb25eac6d84f9a8bb93fdc30c67af9a798f1efd918ebe50159fb09c6287ff920e6f34696cedf136c8bb97f7025e6f9e5a231ca63fdcb1f7f9c18e37cb52f667c101a633ebf17f37dc537c6e80fd257e7b9dac6385fb011f3f9a01e99f67e5d12733eac19bbf2e7aa3fb677a52be6f89889517e8dfac8df3e8d8dddfdd5a998fb6173633c8f722f663cdc31c6fa4028867ef52732fda9f845cce7533c31df37da3586bffb21a6ffb81633fecb1ba3fdafc96ccfcf8a31cefbbe89b95fdd32c6feff4accf1d733c6f9d2bd98e7e10664cedf5155ccf7e7778d5d7a55f733be6a8e8d11cfd09ec97fcd4fc4dcffef88f9bc27f3d37af54359ccf8e52ce6f3cd1b63f46f5dcff9ac3d3786bff628c6fd27b69ffcc3d348ccfda0ae31ece58398e74b589ff20f3f3362947f9c8ae9df2c8d719ef94dccf799b2fde40f6e4f62ee57c6c6f05fb662ae3f7d1923dea7fef2ff668198f1c58331c6a7f2577f2b1be37c8ef4d5fa0eedabfcc17324a67f3334467f5279ec4f97bc31cec7593ad7d75f8c5df965cb0fe5dfd1de9bffd734c6fbc20331fdbf8c319e2fec89e98f8c8d5dbaff26e6f3d7efc6f04f5fc5ac0f8e6ff97f9f7b63f8631d31e4890ac6d81f388bf97b6a1563d48f27e6fb42d9bfe40f36543efdc1f7b231ca9f88597ed618ed3312339edf1823feb0f2f87c7f6c8cf1a7fa97bfa8faa7bf18df18c31f36667f691ba3ffdf8af97eb26f863cce1f0fafb41e3ee982e50f4e5b64ad577a64f9631331e6ab59db18ebbbd764ae0f6f7762aed73f1be379f808acf5dde9ad98eb89d762dcefcf8ce19f95c9f4cf025dcff5f8bd27a6bc356377ffec854c7bbedc92b5be3916237d9c07cbbf59ad8c519f3d31fdbf0763f8e71b32edeff4438cfc8a8131ceb38dc4cccfd2b95f3020ebbc8c31f22b7862fa174763ec97ccc9d4f7732de6fb014bc688379ec4c8ef60d7d39f627bca9fb874c45cbfdc89f9bed9404cf9e6c6584f64feb61e772566fdc562fa5f77c6a88f5b31d7c733c6f0bf5ec428bf6de928ff2347a6fdae158c71de6229e6f3353b638c175fcce72336c6380f67f9f3fd4f2fc6184fec3f21edf9742ae67acead31f62b543efdbf97a618e5bd57c53c1ff9618cf7e1b2fe6dfdad2da67f766b8ce7174e62c8139e8d71feae2266bc64e9b40fec4fdaafdf2ec43c3fd413733fec620c7fe041ccf3a22363f4afa198f5f94ed6fa4f5dccf3582d31df477f31863cc63caf903376e921fb83f6e3479fc6585f698851de8bcae7fc1d3f1863fddf18e56df7c6d82fb3fce8ef6f8cb1ff427b2dff2a9e89f97c4cc618f3f38798efe3898de1cfe5c42c8ff2c45cdf19adc49c7f7d31e3ab9e31faeb9d18e59dcbc6f0c7242fdb77712d46ffa94b7ecec775c9c7f9789137c67af5a798ef33b574fa972a8fed7bf7640cffdbeee7fb61d89fe5af0ddec4f43f1f8d719ee95d4c7f6d6fecf25f5c89b9df3131c6783b8a79de93f393fcb5eab3b12beff82e667d148db1df5e1533def68c118f3c8ab99e7d34463cb615f3793df63ff967d140cce71b9bc6583ffd12f379c1b631dadfd2197f978d31bf707e92bf766a89e91f3d1b637d3512f3f7204263f8939f62faf35fc6188f5762c8f3c5f691ffd63b8831fed796cef53e633effe41963bcccc4902f6c19c35eacc5dcaf42fbda7a5ed027d3bff16a64fa675e864cff6bfb0ab6f7ffecc5f47742b2de4f7914f3fcc3454cff2c3676f73f9ec89ccfe24f32e71b1ffdcbd67ffc2732edb57f4be67ce9b5c5d46740667e01fab7ad4f1c1e8df17c455f0c7d2bb7629e57b074eabf20733e297f8979fe60600c7fa32ba6bfd63186fe7332fb4f7f628cfda7bc18e51ddfc4fcbd2b4ba7ffd412f3bcfcd418bf277126d35e545f8dddfdcb2731f22f578de1efa93ef47eca95b1cb7fc2fad67ac5e4464c7f252be6efb7dc1a637c37c4fcfdab9131ced356c55c8fb1fbb95e6be5f17c6840a63db97c89517e5c10d3bfbd37c6f9e39918f9b5258fec4b460c7d87925fefc36f1b637fec45ccf743dd19c39f55fd713ee95d8cb15e2ffdd9fecd0f32fd8b8eea97f349503186ffb516a3fce89bf17ccf52ccf561f677edc7553a629e87ae88d97f1bc6981ff762b667cf18f5abfc68fff35331d70356c6f0afdfc5f4afe7629edfe2f8d0f9bfc70f31cfef066294b7b574d457f9c518f349468cf2cb6731d79b7364d6f7d3ded85d5f577db0be8f4363979ebd16f33c17eda9d663b22d63f8df4b31e48f3b623ebf7436c6faed5accf7a7dd1b637db829e6ef276dc41ccfba9ff3f7312be6fe5e49ccf1f5628cfe9411737df5640cffb22ae6f9094f8cf2df9ec99c9f1b0763ec0fefc58c478ac6f0876331ca7fce19a33d391f6a3ebe3c88f97ccbd418fe822fe6fb91abc6580f1b88e9df5a7e7c3fc344ccf8c8cae7efffb9fe1dd97a8b772473becee4c99caf333db0e6e7bb3659ef671818e3f99d1d99f6da5b8135df7a5b32ebdf9b9035bfcec8bcbfc574cd9fabb298f3e7c218f777c9cc7ff548a63d9b3f1bc39fa88a198f0ec91c2f6f336377fd6229e6fb40585f9a7ff29e98ef036f89b9ff3536c67e8d5dcff5888631d66fea64f903ba9ff3c9fbab98e791aec8b41fb53763d8c38118f7b732c6785e4ff9b33e163932ed4bf5ce18f6652546fec59d98f5eb83755e635710737fef45ccf9f720e6f3796bb27e8fa323e6f9d86b63d81763aed7b17d656ff357623edf343446bae465fd856563c8c3fea4f8aa2c79699f9b0f62dae38931e2f9ae98fb49763f9f37657dcbbed6bfc4c86f3833c6fcb716733d624fa6fd9c5c89f93ebb82b1bb7f9c11d37e1d8c614f1ec4fc3de77b32ed616b24e679b08598bf5fccfe217bb6df1863becc8bf9fec0b631e2f558ccf7f13b7f3e8a65af565764da2b8fe9b25719a6cb3e751ec8b24f68cfd8ecd3862cfb3425cb3ecdc9baff0296fdc9dc92797fd0252b1e3992653f307e638df75395ccfa9e9ec418af1f25639c071e8aa95f9eccf1dd6f1ae37a9547ff7d7163ecee2f4664fadf998c31deffc2fb63dab327eaabf595565dccdf23ef89b91e1b1b63ff7f23a63d1a1a63bcd5c8f4b7f20b31f72f2b629ea77f37867d5d8af97c3cf5d3f88ceac6f08fdb629e97c81963bd7a24e67aa2670cfb4a7d345ecfb131f6e7b6628effb631ce9364c58cbfd8df343edb5b63ac8f1dc5d4df37c67e38fb9ff9274331e56f90b99e305b8af93c45cb18ef4f943c1ccfc767633cdff821e67a815dcff3cf1931eb676d0c7fd8d99fc45b977f5207dbf86b9235fe96608dbfa047d6f87d256bfc6dc9da3f607e1a7fe388cceb276f648e87fe08acf9eaad2346faddde18efeba17ceadfa38998ef8bc81b63be7a24b33f7f168d5d79e79d98e7bf5bc688df9a62fefedcd618fb4d2f64f6e74e598cfcbe96c6286f2ae6f9eb2763ece73c80355f7d2cc45c4ff81073fd62628cfc3764f6efe024e6fc7b6f8cf31ec6fc3dc1c818fe11f5977ffe1e88393e1e8de1ef5c8b999ff4e1f346b3d818eb69a198e7eb32c678feeb56ccf3a137c6988f7d31c64774658cf5fcb998ef5b888cf1bcc89d98f6e3688cf731b4c56c4f670f639b9f5a7932fbc3e089ccf66ca2fd62edbf74bec41c2f5d32ebfbab29e6fa458f2c7ffa8dacfcd1bf628d97f79931e28b90cc78f06e23e6f3032531cacf1ec53cdfd53246f9d44febf3f58531def7341223ff69418cfa7c7f16f3f90e95cff175f18c713ea74fe6f98acfc818cf3b96c53ccfba30c67986ac98f1beea8be3b12279381e5f60df62c5f3d58d31ce1b7c8921cf2e67ecca3b64c45c2f6f19e379da3b31e3cdad18f5f35515f37d151531e4fb9a92e9bf7f5d89f9fea59931f62b42317f3ff7cdd8a5af7c317fbf2912f3793031fd85d3c518e7194a6294bf0a8c51be319f777e3576e9ddae98e537c47cff49510cfd9fd83f654f2e2b639ccf96bc3a7f513276e9d3b518f24eed7ecaabfaa0bd296f8d5dfa742186bc93d818f6c698fe50cd18e94d31ed71ddd8d5b7affaa1bd0933c658cf7d16f33ce4d8d88d9777a7dfe45afe682f24d35e545760d98bc5c418fef21d99fda3d21673bdad27a6bd1889b97e5d36c6f34c0f64b67756f971fcfb0531fb77c918fe774ce6782fe7c5eccf4fc638cf5611733fea24e67c762fe6ef51dd19e33c4b00d6787ed889f9fc406c8cfa298af97edcaa98fa0dc47c5ea46eecca3b8ec97a1e222be67cd735863d1b89a95f474cfd4e62ee1f5c93f5bcf054ccf3504563ac4f86623edfd13276e9cf2f623e8f7127e6fb936ec48c974ec6f0a79ec47cdefecdd8c9db503ac7efa1648ce7ab0f62ca7f6d8cfdcabc98bf97f06e0c7f5aedc7f1bb0a8df13ce7ad98eb7d53638c5fb507c76f3434467b1b73fc3e1ae37968f5278e5fbf6f0c7f12fd77a2f9fef102d6facdf42ca6bf3823eb7c4487ccfa6d6e8c5dfaa146e6f8a88fc5b83ebb3046f9bc5ffdbf933376f5392e8891dfdb9398e7d1afc4b40f5963acc7b13cf5f7eca731f6178a62fa4f8198f6a727e6f3b19e31cebff5c9ecbfd5584cfd4331df072479587fed9331fa679dace73d42633ccf7623e67af39d31e68f9998e7192bc638dffc2ae67e53c1d8a5c7be98fd2f67ece48f1ec55c1f9d1aa37fdaf5fc3dcf8d31fcad43c64b3efe7fea3b1364bc4c988932b1fb4c32d3e43b48fe3ecbcc93f4c50fd7cfedfac0ee5ff2efcbcc2a33cfac93efeffbc09bcc36f9a4d7ed7e2877915e97794fbef749793377ff47e690fc3bcc7c668e995372cf39f9f78f72b8efcc57e6922927df95448e7d921e6676eebab2932b95fdce7d5793cf7da696a6bbfbd6943ffdfb83bb4e72ec7efaf692bcd3fc1e93fa307d7ffa4ef378729fbafb8e584eaa2fe40c71dd9fd63fca4df5803c8d44bf59f29d96739f69fe54dfdfe507bfd1e3f7f34fe56ba1be5dfe3fddf7a3fe890c903bcc3cbb4fcbe9e565daeeba4ef2b1f6d07d6939bfa89f9ffbc93fdf3f67497da4ed1167baae3dc2dfb6573a46322f995ea69f7cfe73df03f7794dfefd9619269f41f241fa88e93f5fdf77f7f43263fe3dfdcedaf5df9ff4efb94cdefdbdf09bfb919e25233d9f293a19ae32d7c96794f08f798df8b9617ea5cc6de6d5cba4699e97c9279f9e93eb353348fe0d7d24e78bc93fb0cfcb4f69df9f41224772bfe77b01af533e3fea9fd49317e2fb3732feaa1efeac1d7efc649deeae1c2ff0a25fd4bff442f97f9cffc0da7364727ddf37fe45f93f7f523d63777dfe77aef9aecf5f7fff6bfd73a4f6b4f6f84df9e918f12699d17ffc3375df85e473493e59fe3dfbc3bfffcae7d7d7ce32256f6eff2e249f71f219b90ffe36b6eb16c927e1c43e8cddb59049f26593efacb74cfebd4affedadbd0dcb9cb38c6df2b7f483b293bf79bb9fe4824edbbfa497ff3b3afef6b3fde1f3abf47fb42db64e1fd58ff7bbe5fef5bc7fef3efd7bfc27d7173233eb1fffb83effbecfafda63e4e6118dffffd427fbc3bf0bdefbbf31ef016d40decd2505fe6dec3eb061237e8f5dd97bf7197b7bef23b9eff0635edea793338bef64147cba79067fcf7b6bf749afbd72e93befe89dbc4fefec1d7fa39ff4d5e7d7f571e5f27949e678cd71bf773f3ef95ffced8fcbf8a34fe1877fa732fc71d97fa57df3bfb9f6e77bd51ebfa767faefe57fb0fffdb9fc7fd81e9c477ecf86fc7b3eb281a98dde7a5f7f600fff395b76e1f7dcd9a1647ef00e9c4bc666c3666efec07c90daad06d3679c473487387993113077328fdcf7c46c5cc1e690b99b67ca6efed9fc9d8dffb697bfd2756bf6fc83fffe57f4ffe7dae3db662ffee53cbfe7b8d16ff8fb6fe33ff914bc4af271f5efeaf73fdb1fffc1f6f81f9b47642f0adedd3f6dff7ee7e355131b5f457ce162869fe690242df579dd77d2024767f752bbf5ca98e2eff34ce311e7977af7a96f9dcc3ba1f357178c45d21828b1375ecdcd2d3fdb5dc55f3fdbd8efcf15e7ac3bb3e97f5c1fcaeffbfb9fa9ff9fe726378f780f3fc8fb8fe5fbabf6fdb93cc55063fb0cfeeef3db79e4efebebcfcafe77cc23d9440eb5c74fe5ff8fcc23b22fce267b77bfb4b7bfb663bfb26b8a21befff6e83d7975af91c41023171f4c3927e033f29aa9bd4f3ef83ea7763fb372f2689e28fcf049e7a1563237a5dfcf5edbeb785def25f9f4bc7e323f25adea0d92bfcf92bf2f92eb5fcd16fe6c3bffd8c787bd5afe8efebfbaff9fb7f53fcf65bf9573fe2fe58d0fea606671c7b7ccb3bfcbef57f308da436df6f7f1d7bf6f0efdbd79e4efdbc3ca77f388c6ce7fea3bb54f3fce233f8fd51fe386d10ff789658b0b991fe708b776e2a56b22c3cc9537f2c65ed6cb7979afe015bd2befdabb493e575e29f9dcfa4930e6fb7e90b9f2c3e4da61727fc47b938f1ff9b17d265edf9ffa337fee2ffca5bff2d7fec6dffa3bffdddffb1ffec1fff48ffec93ffb5ffe25f97fd9aff8777e35b967429f3b9533cdf39e6b3be31ff4f9f1e3fee6d77ea9ffcff5f0af7effc13c92ccad7393fb9fcd5ff3c38f6b913faebdfd52f71fdab290c9fb0fae8df5f9e3fef1efaea79fdbe3d7f3c87f7ecd20f5fbb136b474e333fdb7fbf676fe631a53d00f756b476e0c17143b308f92ff94c614a9fdf6eb7ec32bfa4dbfe53ffb6dbfe377fd17bfe7f7fd81ffeabff9437f947cc6c9bfb37ececffb05f7db95d7fe8d5ff26f834ce0057e10f8eb2074ef2c9a04d36016cc8345b00c56c13ad804db6017bc07fbe02338049fc1313805677f187c0597a01c5482bba01adc07b5e021f93c064f413d6804cda0153c076d674b4bde25e804dde025e826b2b69d0ebfb65ff3c486cf7e595f05d549d063fc93c6482e3e4ad9fd4d6b79a5bf50ffbf2d776aeb7259d71edf735bc1c9af3ce77fa15d110f16d28f6b1fb41bf249dbf162f15b89b15cfa777c2ed6b6a3241ef9a379a1606b718a2dd3fb276e4db1f09764fc2bf5f3dd1ebf99bfdd3cf29f9c43e06fc3bfcfa6fe7b32564b892d5fa7b141fa1df4bd9d5b931a0403ac1d25df57ba2ff1fd6f93cf551a0704afc15b300c46c138c806b9201f14826270155c07374129b80d33a117fa611086e9d392e1249c86b3701e2ec265b80ad7e126dc86bbf03ddc871f091fc2cff0189ec273f8e5e7c24b580e2be15d580defc35a92cf43f8183e85f5b01136c35692cf73925f3bf9ee84ddf025ec85fd7010be866fe130e151380eb3612ecc8785b0e8de93711396c2db281379911f055112cbfc6e4c304a6cb87ce21f6c63a27ffaefdb28ca60ffa1e4d5828e57cbf4bd4b14676e13db9cd449c2b9243d49fb4bb6f4b7e57ecfcb2f9421fd7729adf7a43dd6d66ebffdfebdfc0b5ec6e6f8beb78826c9c80892bf8d5c1bd31748d709bd653008fa98c392be7072f73b1f239afe8eac5927d7b71caaa79c9761de837fdb5c9bb6c72fe6bdff9179447e266cce87b32fcbc4a65c308f60cf41d77b27ffd131e69a49344b7acb3c5a44cb6815ada34db48d76d17bb48f3ea243f4191da353748ebea24b548e2ad15d548deea35af4103d464f513d28478da819b5a2e7a81d75a26ef412f5a27e923e885ea3b768188dc26e344e381be5a27cf25d48b8988eaef4a9ab701add249f52749b7cc77126f9788943364ed29311135d47b53888d39723e6e2f42181493c8d67f13c5ec4cb7815afe34de621895f165c4ffb95ed4a6df8dcec96a52573885b6f8bb7c93c7449f3f09ee35dfc1eefe38ff890cc9f8de0d56b079d64b424736b327afe9a9dfcfef7946d82f6d825f67f445b9dd8e46090fcade4ea7ef6f7b2fd7a1e090671ba527eebe693527c4cbcdeae774858715ac15ba5ed1ccd5cbbcf5dbb97113b629ec934fec4c66f3997a4ff9e51bef93f30d7fd953a9a67163fe4677abb79e4cffcbd7ff53bcb3d04d8aab9db87c57a503e3e25769036223ea7fb0e3687a436289fee757b5efc155fe2725c89efe26a7c1fd7fc5cfce00fe2c7f829aec78db819b7e2e7b81d77a261dc8d5fe25edc8f07f16bfc160fe3513c8eb3712ecec785b818a7cfdbddc6377129be0dbbe9b1988937f127c1249c4493f4ec681cdf4cd24f263dc8339946b79359184fe6934c3a42260bf79d8e9c78b24ce796a8e6e6acf429ff5572ed3a7a9c6c26dbc96ef23ed92776d24b7a77f8439cf2f76b35b2e1df763de1a033f9981c269f93e3e4148c26e7c95792e365529eece2f2a432b99b5427f793dae4c1cd2163daf03facffdf7e687fb106f896d96546dc772f310df342fe4ff31d5b3ba56d7c993c4e9e26f54963d28c8f93d6e479d20eba6e9e48e7c1816be7db4927f5b0927b4ea90f31e926a36499ca3149d7d57e6f1ef9decf1938b9d792937de45fee9f3fb4c78f6719fe47e711ef843d87f43b099f67b037de2bedc0dcec177ce2793a97d0b6a5eb1edb34cd3b4c7ac1383a4efa93c1e475f236194e4693f1243bc94df293c2a438b98a7293ebc9cda434b99d66a6ded49f065e769a74e9693c9d4ca7c9c8994e67e134f6d25e3d9d273dfc6a329f2e925112c7c95c315d26a3221d29f3309eaea2da6491cc13c98870bc0ee3744e49fe7695fc6d9eb0fb7b3a72a29b64d495a2abe926ca4db7d35d78ed3fa536339139b191ceb6febeddfad9ff655afc357d9feea71fd3c3f4737a9c9ea6e7e9d7f4322d27f3cacc7d5aaeae66c18073c03f328f680d47723df35b6b852517f3cc79ddf6cff34fe690acb771f794a695ccd3f46e5a9dde279f9a9b030fd3871ff6aa7406c2e2a9a44ffcfd3cf2dbf5d09f63933963d3ad8b47fe4a3cf657e791dd0f73fe6fe791ffe41ce26c28f6aadd9cf0367d9c3e6506d3bab79f3692ef266d91376d4d9b49cbbfd28695b037317d4efcf9743cdf24ff6e4f3bd36e104d5fa6bd697f3a98be4edfa6c3e9683a9e66a7b9693eae4d0bd3e274e05d4fafbc4e72fdf5f4665a9adece32332feecdfc59100d6761d84c3f61308b268bc4fe7bb378969e6e4de696f4cce8641ed566d3e493c432d1cd2c1949c99c12612e494745728f1b1d5132d7c4c9e8982d66cb49fafcf94deccf56b3f56c33dbce52dbb89ebd9bbffd67f1c84ffe711a83cdf6b38fd96196f892b3e3ec343bcfbe669759d95bcc2a2e0a4e3f99f4ccc0d467bcf387f5ff4bdb9cd671ba0e354c6207b7ffe3ce2aa5f5df4fedbec58cf93f5b5b4abca663dac6a94c491eb7d3a744cebb5975763fabcd1e668fb3a7597dd69835670f7e3c6b79fdd973125b7666ed59e22da631699affacfb87f348fe7b5ef3dc5e7832475fdc19ab1ce29e7fad7ffed01eff7fc523a94d4dd762121b327b99f566fdd960f63a7b9b0d935677e7aa129f7a361bcdc66e7e81ad99730d6b36cba67673969be5678559717635bb9e55a7ddd9cdac34bb4d0df1dc9f07f3a443cfe379322dccd33d8d85d749629ac4d79dcfe78bf972be0a3fe6ebf9269eceb7493cb399efe6eff3fdfc239d2726f1fce0e6826454242364e146479c7ebb11948e8a79324f6492f9a3947a59d1d5fc331d59613c5ba4232b9d63d29115c6f3e3fc143ccccff3aff925f1bba7f3d4df5e9b4ffef77b1ddff1c86f6d57e2b524f7a7f67136afccefe6d5f9fdbc96f43c3f896dc6f0f99d0f5ff85edff94bf3c8cffb33d9d4eb49e680e7f8387ff016691bcc1fa795f9d3bc3e6fa4f313d611ff8a9f90c1d984a4bde6cd648e4b4688d79db7e6cff3f6bc33ef2635fe32efcdfbf3c1fc75fe1616e7c3f9c86b7b87d4134bfc05c85ff95d59b36ece9c3b3fa3e0f46db39f2ce88ffc3be690bf8f0f7fbbaef5ab75e651e6b7fee09faf5dfdfdd8fcad6d1cccc7f3ec3c37cf87d7f3c2bc98f4ddabf9f5fc665e8a2ff3db697d91044c0b3ff3b408dc9ac84d66b70817d1225e4c16536f9f74f6a4c72ce68bc562e95f16abc5da2b4c0f8bcd621b3716bbc5fb62bff898be2c0ed1447bdfc9f72ef15d03efd5cb2f3e17898fb6384d868bf3e26b7159941795c5dda29ac42f01e20cce11737ed29191f4fc244e99c3fb4a6390d902f14afa77179378c9dc937a67494526a327b7b85fd4160f93f36c8fb596f89cb460ee776d79dee691fe2feabf94d8e44ea6376d24231e6b7b6e7fdfc510b82e89db9c8f3ff8d3f6f8f9ef05b6c95bfcb5785c3c2dea8bc6fc71d15cb416cff165d15e4c179dcc9bb3d35799dfdbaf706b5899c1a2eb2d162fb3eaa2b7e82f06fe79f1ba780b568be162b4182fb28bdc221fe5e26051089fc3eea2184f1757d16671bdb8599416b7d3e7593bb1689954ffdfc4233fcf2723ac7b7af7cba4132ffd65b00c67d965b4785cc6cbc91fccd3fff83edefc57fdd7cd23b2651a4317fa7d4bef4c7f74ccfd0dc407df7baa5ae32ed9f9a60befdf72af239d3fa6e9795bafb79c2e678be57cea7533afcbf972b15c2e57cbf572b3dc2e77cbf7e57ef9b1e82c0fcb4f9495fab7cbe3f2b43c2fbfbc56e2e377d2329797456f595e569677cbeaf27e595b3e2c1f974fcb7ab4593696a90d4bcbdd701d0d7a71bddff9f107b76fbe58b696cfcbf6b2b3ec2e5f96bdf48749276e54a471c7f71c92f6fe345e413c82390523268943bacb7e38459cb2282411fc743958be2edf96c379c5d9269c3bfea335a1c2efec8f7caf01ce28ff9cf3c685f5bce2bec09c76750a5bcb3d9513edfff7d9b5894b736b8436075d66f9e568395e6697b9657e59c8ec3335c438c93d17ed5da5652d8b49ac71862fc0f96792ce67de615e5e5e2daf9737cbd2f276955979e1e3caf75f43cf1f466f613d5d335c05512dba5985ab6815a62be7abd8cfad267edf7f5f4dfd797c5ccdbcb62b2febce615f7866dbcda18c89dc9a682243fabd5acd578bd572b59a7657ebd566b55ded56efec73dbc4e3dbb0ed57bc9eb27a13ebb7a8d739d32ef06dd8c7d37e3247d93fc44d33ce237d8c45e77b8e3257934ee68aeb10e9f9d60b6de2deed6deb7c925b0371bea03b139bfa8be9b5eedfb97435907f1f611d63b55f7dac0eabcfd571750a26abf3ea6b75595eafca61695549fe7db7aa6606a9bfbdba4f7ce380f7d4bcfdea61f5b87af2faabfaaab16aae5aabe7f974b25bb527afabceaabb7a59f516e7557f3558bdaede56c3c973e23164bc6a807356a93fdd71f10c6c6131b18b897d4ed7825623af3b7b588d57d9552ecaa66b59495c314fe30ace23364ae252ea51618424692e2e8157164e9211924d3cb6eb640ea9ce77abfcaab02afacfee1915d8a3fc1fee4d8f7ed89bf85ebb497dee4ff3bfd333cae92a7929b5a389cfefce1aafaebcb34bbf726b5b2e1648eb1f7b4e2ece18bb361ab875af740f1c6b5569fc779b795da5cf631f5737abd262bbba9db6dd733235b7fe98b46b347171c9659d49f34ccb4af2bf4fda7618a4fb1f97b5e7f5d7fe3a5887eb681d47c3b09dd6593a1ac2b95bff737595d81d7eaf93786f3d4d57ced7b3f57cbd582fd7abf57abd596f93d8e421f9dc79fbf5ce5bacdffd5912af74d7fbf5873f4d466198f62fe8eb62da974c7e7d48aefb5c1fd7a759757d4eaefd4aacef7d123ba57b6c2eeef58ee9596cefe4f661ae92fbf73fcca5e893d9242df95b6a3126e989a212e7b091f7eeeadd9d23f363cd273f9cd7d23c52a00f3d4aa43cb9358b743d7de5d6b277ee4c54ba4e9572d3edd9628d7b9eae6f24df2bc5206859d8a3f5617d5997fde1bab2be5b57c3ccfa3edaac6be16efdb07e5c3fadeb8b977563dd5cb7d6cfebf6bae3f5bd9e375b77d72fb3cdbab7eeaf07d3fefa75fdb6ccae87896fdb5a8fd6e375769d5be7d78575717db5be5edfac4bebdb4d66e36dfc4db0cc27b59ed8a7789b29cc5edc1c72e2d9dc915b9f4fe4fbffb87bb3366591a56bf8c770cea56559eaa18288080a8a967ac63c28f328bffecbc80487baebeeee7777f5eefd3d075cd6e0809019112b62c50a64b7c6da32348243686a7d73003ec12699df31c12708677077df41d9ed0e697f07944f5b5a688576e8846ee885fe75105ec22b2db4dfffcf6b0b90e7bfb4cf7bedaf88e8ae7e01fd2e67f82ec88f927a12b691681538ad2f715bbb889e8f735cd8163fd59ba2d656c281701abc260cc2308cc2384cf42de58629f9dc3023f947f4990ab573d930b74a84ebe03d218f06afdd844558fabbb00aebf01636e1349c99c7903194fbf5f29f7d6e7ba0203964c379c8858b900f97a110ae423194c275b809e55071ec701bee42d5afc37d78083fc363780acf61cf3f58b103fd1c90c322710d9c031c6ad877594ff22f2d874e019e37e4fa30078170b61d1d6a4b01f6a95d0e0fe75031672fbed7413ccc0f207e24b2b7c8674e5bbe01b947c887bef0b5089f2a0d0bd847f61a79427c56f43bce37215b82f6e11ce7a886d4947e0bdfee7bf28d823a07798fe14bdc0b798f39750b076668c9261fbe87c3f0231c85e37012d15a5f2f232ad2223d322233b2223b72cc508bfc4be4469e2d3a66e49b6174719ae81a055168ab5114c5411d2551aaf5a32ccaa3222aa3caec4775748b9a681acd2226628335e4e8a33946b9c47ec45d6c4d78bf11e748f441577c255a447cb4d46f8668d8c8f63928ba6af1c7c39760bce291c31c4642b442b6d132cf8618899114ada34d24470b6743f991d2d61d3accd1ebfa52bec1055fe3df47fd82f4ad9c9efcc198f08cf17b0e706fe49e56b1ad43ffb315ccae247c06920322f78170b2200f66d013d3a2e8681bed22155dd37d7470a7700d6899a290df65c1fec23542cff98c8ed1c9c8a373d48bfa9412bd39b2c64683e83d1a461fd1281a1bbccfa2ebe542f5d5f05ce7d9f77696e4e14ba2494cc7947984ec398a5071163db40c25d6d0eeda9b47fda61d63dde0030b3d1a86189b261f5bb11d3b8118bb9aab398e8c708faa39b117fbe8b8447220c7d73888c3388ae33889d338a3ad20d52cf03d90a3736377837c8ce2ac5f3973c011a7fbface3471acb247f1128d7d34e4c8b6718e7d50dd72a261ddd47181fd0889df499d1572491b478bcbb842675369725cc737b46b26503725b55dd2eb87f1c100b8491a8ff62c7a2df2c4b027d123dad3e83dc076e1e7a3bd1a37f1349ec58c798d546de4e4316b24f13ce6d055591882e518bc41b9a67132fb311f2f63215ec5a2cbc652bc8e37b11c2bce2ddec6bb588df71a4b29f121fe0cfae8f7637c8acf9613f7e0ca5a5adc8fdffcf77810bfc7c3f8231ec5632b6af152d4d668705c8bbebdd1e649dc7872a9123aa1122dd113c3828a628b4fee77fd81e621caa2ae4662da703b94cb24b1123b71a28fc44dbcc46f6bc8e193ff707eeb4bbec323bd174e828ded207e2ee0316701b92064b9b09dd7584746d7788f7e6f6b2670edeffea38bb9010f5eac0a3fa25d945c12040e92c0a992d03d438d5e5bbcf4c46c92288993c4721264852ea324d312334cf2a4484a834faaa40ed71736b9250db22a0a8eacecae9ef4e443fc67fc86eb4c9657d8e8800a2eba76adaf463b05ea550adc37d82dc07148a638d7e8988b649630099bcc132e59247cb24c8464e5de12319192353a970d3ae44449b68083925da29a74b24f0ec9a723535b974d8e2e0b3c6ddc4b347e60bb16d335adaf801c59c7b3b3e9f88513ed602cb66af95ab876e98814b2ab2e979c9273d24bfac95bc027032f8ecec97b324c3e8275324ac6ba994c523ace520ace22d0607f437e9d52528d4a531dc597318a5729974b0d974dcdd472d6949adafe25387bebd449ddcb8731d1fba9972c523fbda4d73448c33432fb696c2889013e214d92619aa2c865efce352bcdd2dc9a99615a68fdb44cabb47666c132bda54d3a4d672913f329abdf2c279da79c5ea3c78576b4e4944f97a990ae523195d2b52358f0cdcb748363db3295d17706fe2ff225a9926ee334dda5aac9a77bb43f7440ea5d3cdded8e6e87d8866b5f21afe5a587f4333da6a7f49cf6d0e7f4d3376f0cfd89c4d6d37f9c1b7cc623afbee4ed09a3bc9108c9dda403740ddf69211da61f41908ed2f1b5974e325a77332ad3342b3901f7b8f59b8443c5d1a467b2c38bbb0e9f657a6638fbccb485ccd2b5cc46f73d45d80fee9f1f509993b9061f9b869579991f1eb24b5a98c7ec9a0559082b1afd1c65719618c245051f1bada0aa0ac7ebeee8ae5f8bdf3c9c2d6fff6e4e5aee826320f003dcba2c453fdbe610ed2003b80fb0832e3b33ccb22ccfd0e75f76da31d96465566987ac36796010c1f3215b021979c3d78ed92d6bb26936cb988c8d2ca38c3eb279c6810f74e40ce11e5f813c1cf818a8d3e88a8bfc4ec6a3359ce0ff2b997631706f7ee7cf5984c55657acb3d2e60020eeccb36526642b03adb8abe59ac05fb290f7cb44740692e584ef06aff50c3ebb7971b2ced6e8ac36991c6c3225db66bb4ccdf6a6941db24f2dcb8ed9293b67bdac7f99666fd9c073b2f76c982cb28f6ce4c4f6211b67936ca5bd69fd9c46df766d69396d3939a5b3b966f28696eb0857e460f34d37377233b7723b777237f7723fbfe4d73c407e6e95877994c77992a77996e7ded116033d2ff232afd07bd1869289e631aff35b2ae58de96a4be43b429217caa7d8eff55afc34ce67519433396b1ebdbccb67913bfb6a13b1ad04dbe7c53d934fd27c9e73e83b2c723e5f5e132a46982cfecb39f90e8f7cf5251d3fa9aba92bb990af723197f275bec965433024f4bd1493cfb739f2adb91a3bf99eda0687fc80ec66c7353e61bfcea3efbcb9f762227b093102f23f0a3ad4fcd365f3637e021c904ef273decb9679ffba4806288afa3094fc2d1fe4ef9a9a0fcd3047bf27d37c948f4d2e9f14b461a2950eabf98de4021ff8ed97c373dd977a537b5dd17ddfa0d75de1b1a09c2bf01fc8f3e0fae29ce1d950e0efb063aebaa118be21161af14bc08dc0381157700da5d00d01ed9e6361a0f773cd7e8122b6c2cafcc22e9ceb67226851e11aef8517d78154f8f9b9b8049be89c9d733bcde07fc5b5089c2da584459b5b23fe3cbc602d23ccbf8d29eeda146111157191a04f4c01c142f5acb50f66cbbc40676d6c5cb3c8ee8f624e7971911745382ecaa2d2d4a2463b68a31df41bdaef0b74d6b77c5334289a5a187c312d660513d6e8ccd9625e70c5a2e08b6521186ab12ac4424af2625d6c0ab9508aadc75369b12b54eb54ec938fe2507c16e8bd8a53712e7a45df99176ffea51814ef86560c8b0fcd45f6d0376d972d46c1ba18eb8d6b40aec5e48a49499794553a1b7a1fbe61fe29177154536a38678739a8a55e1aa5595a971dd4d1c196e13bd9d64a1eb92d147f2b975d6903962a518458baa557fae525285a6d905ecb1f3a3ff986effa33bee291474f1cd87b9c8fd24c8405e6e5b50c8ab80ccb0845a50ae490cc11b2dd23db2a634b2b13932fd3320ba625c20f65611fcbd266114e819acb7b595d742a45b13c8acb35377d77b9b2a685f25636978db3f39b400e96e5b498eb5584ac8af666d4e5ac644ab69c979c390cd964e74fcb45c997cb52285766cfa6033b1fe18aab635b91807d05f6b3249fd5d699bee09147cde9c927b78fb07b601d95225e5f0ef95f29e15c998ddeefd9a73fb2f28635727c17c2bc51b9ee2c19610601a32831e1fa203fc3c1ae8944ed006bd41f6a2a649ecb4d29978a1940b48670155f6ed1df76c5a9548b416e96fbe77e2084d38a7b7d24a2c7e5c116cbcff2886251c31f00a38f30f9c8be2f4f5d850d9fe9d3a3e1946782be906d3d92bd8c7eef11ce2cda695ceb19fbc6ca72f429c4b5e8cea2e796fdf2ad1c94efe5b0fcc8eb72548ecb49cc557445555aa55786f15e999555d9a55239e9d1102bd7505ca3f220a22ae5cb32b735845f4cbef2f50bb5c5755752171950fbea62d499843e57b6b4ea5a05c1a40aab88f20127215c95b6361bd761aab84aaab4caaa1c7234c4d695275c73c70c46f01d70c50bf46331ad8a7097c455595555ad2ba1013517c89fb4d8e17cd76679c4b97f8647c83937f79f4f087fe49452ddec895169fd2b8adb81655935109d985c3545361406d08fcd7e30d38ed5cce023744d2ac672a2ac62abb915b7b872e49815572d2abe5aa68e3ed2fa9590ecaa95197891c95f114aae90af4536d8a92403e13ae89331b46a0d9d00e87f9ba0a8e40ae1856a5bed2a3531008380cfb0ef58e38593e07fe747daff3f67d45f0e608656fbd75cd893efa6ec2f7f6fff463dfe47f063e7ffd1753a90ac0bf828b0e2856688d104dddb37d891f877589f22f24d22f24d42f5a9a168ce3c5647f49d4fd5d9faac7a559fda134c8df1481fed97358a49e7d55b35a8deaba1b18738cfbea0386f534af7b8d2bfe72c1e7502882b315716f76ce0bd6b60fe2cd85e38ebc474e0bd901faa3eaa51b5f2d46a8cce64624e6a145d0596191653adaf9db5634dd55a88ee388a851573a11dfc21dafb28fa8148afd603a6463b17af60dbd26ab3b66abb766ab7f66abfbe54372a455145494da922ddd0c374101deb6b1da03b3a41cf0deba88eeba44eebacceeb22c8ea1276545737a9abbaae6f7553879504dfcbf5ca936b828d238c78b4628ec87323f45a4feb59cda414c4af388722b7793cd05b3950be2bb96c68f897e4e4c8614ea5eeccddfc52ebfe8247082f0a672e39b2531c29762f4e64d46c8c22087437f1f54ca6e87bcfb115ea5753e2eb0c13d960aee6ea45cdd74bed88ce91bfd26618d7b51068995a8cc38f7a553215c29585657850a7305c43ace78662235c558bb504f78bf84a7382ef1fb2e16950af8b65ead79ba244f703ed18f477c910a133a0f3adf755fbedce78d4471e8ff6e3117c03d53ea2f554cbddff3b5ff4f4fc97cf00ae36c6855daed1ba9f0fda21b5d2c600542901e70e59f696a30dcfc7d97da3dd5d1db702769307b9b69aaeb7496a086961f0f5ce146bb5ded7077b0d7ba4fea44f9e501febd355adcf75afeed76f955a0fc0f3619ed2d3956863c97b7cde1d6d4ea38b4b5ff84ee8d3dfeb61fd518fea713db9d137eaa6dd90b93227650cfbd83c427d02e2cd9b09758afb5e17a209f2416362c3cdf1cdbaa1bb7a736eeecdbbf99673bbe8f1ed7a0b6ee12d825cc52da656b784aaf59d26dfd208ed44dbbf65e8fd8eb7fc56dcca5b75ab29e576bb359444cfef36fe4c7956739b46e16d766350f03beea22c6c01ac1bb29d4572636ff31b97f76f0b6a47ec0bda916ecb796de8b333bbf1ba7e5bde38637013c251368cceb755c6dfc45fb4a57ec52351cb61257d8612f24b5b47be49b7f56d6338f91823d8611aa16f2cdf94627cdb22cbc111ee714c3b576437258bb9ed6eea6daf5f82258ab3d9dbc1b16f9fa91f4a805bb08fefc34ab0b14f041b8a563bcec2de8edd7d6b6d6f00f1fded743bdf7ab7bee1840c7afe99d86a0bb8cf17e3e97e7f8b3fbe1c687de8b6959864ad743943bcaedaf7b1e86aff58378f35d5f9a9dbdbf37a7aca39b6ffc3fd3de3bbbf014e377efe6d606b6d5e0de39bdb80dc531249776bd99cdcded13144d7f7e336ba8d11f6aa0cfe36d1fa0ddd5045047ba4d128aed11ba331cdb0b1bcb8b1b543e398c706d87d543eba63117485485cfef011f0ed1fb6e2be9b9e724106f63135ad1d1baff1ad65730938ed68ac6d2db013b3f50b63c8f8b5b6057d2bccc94536c0a651c433b44dcc871ada7a7345f65433f74da0cf9bb089b4ac899ba4491d097ada9bacc99ba22993aca97ce41410fe114d14af6662736b9a66dacc9aaa61dc4daad1139a83bc3870a1c0fed37baad7b0cdbce1021467bb3e7c2e3a07b4bb9b45c337cb46685629157d52aa3ba352e09cd2db966f8a79538dd848cdbad93472a368c051e29b2dba8e3bdf6ad4a7fe91dfe19131c541ef0cae7b9c352b7d6ff6cd21d965a2356e3e6f3877646c2ca7395a7bffd49c9a73be35f786d5f40cafe9bb5ead9893e6ad19586fcd7bd26b86b1d07c9429bac612c986d81782a76085032313560ce91a83d5d58c1ef880d86eafc07d310ad48b9ab1e31b6d5f4d75c809379a7af221def3fdff03dfa1dbafbf7f89aa9a0959edc83a3e3defb10b1ebeebe9f5ed2ec1533e47f7f7f3c07fc0417025ac2782186e03bc6e35ec43ee119c399cd2f918bd5e9c52536d8aa0c0d44ccb298a6fa6f6d469565397e4b530e36430f5a88fa93fbdb8b7e9751a4c4343c491c608f2d5049be0bd6a7636a5b50dfad7f8b28bc6da476a1a355773126bda51eb19f414f90e642bb45a41bb0f7947d81dc4777431a66bdede5c739a002620680f6c80e14ed36936cd114a3dea3cd461a7c5b49c56d37a7af377d326bc421c4f5b613a9d4e6753c65c4fd9e9dcd2a61c3a165a7fca4f97b7657020dc597ad5fa10cc9d453ec19b0acd65ba4277c3361c175028b235b7e1549c4ad335f21b9be986f4b7a0e7423d01708c830f529b76ad662a4f157465b79633dda147d51d4ef77f098f34ed017d877b6aabc9d3c3f433ab918d37507c8daeaf73d50ed3e3f4942ca7e7696fda9fbee108b08bcd35845394e960fa5e54d361bd997e4c47b8a7d202dce015088fa16bdc71966f03623b496ddcb0b214dbea21be17a47f46711d6215c1d7e3ceb331390f627f3b1c405effe77ee4b19a5f7089ffbcca91df7a43ab746c88b0237eadd57fc121deafbee8c9422b24826ad722743638f811eeebe3f9a46f68389dcce81935d30a29ac2ec3e070755df622cdf4489e1933136a2ca43ea2abc88eed6716a5ceec9993f50c76866256a8a142af1ece6f41bf046d5bddaec1fd1670d5f4e7bd4df0c9e391e0965a9979f03c13a1f46832f3d1df34c889805d03846f229b6d9e482480bc23c23dc48f10e48c6c028a98e08ece2eb3ebed6316a4e7f25363117e6a6661f4119d2e9c319c45b3789650b4afb8ec75e9b2b3547383cf5936cbcd7eaecd8af09c0c67e5ac0a6e60af757556538d55b57568a869bc3bd2ec366b72ca1031fbdd2b25c3450838f7171e0f3e47dfddfb29483d1bf757d063dc87f186b0c8a13ecca6cd6a364bcb193363834370c3bd0e6f7f561f217c5eca875a72f4eed7ba309bd734d8fc720d36efb2d3fac578c6cd1633be282dc0467d633d5b969cc921b030018c119be631ffd0fa33c1c4780e61490e1fc037a3c1ff9338dea2dc0b8e4028926935ecd90a2c12c404b582112fbafe314df24436c4f20e603adcabd9ad58b0cdd4579cf03b5ff2145774f9adaf111abadf9d1f79f88ce775d4ae2fca7ee098675cf3127de1d76a2d3e76804f07b948723de0bb90cf34bbffa3758522d77026cea450bf1898a77da2f71a7a0b743f10dea468ec47da3e3f970d96b3f50c6181343470a7aaf9d41f81eb0210d75dc999747bb78b4bbf72639faf1078d06aea0fd05979d38cc4b4717f2627f94c996d67bb993adbcf0eb0136c0dbd4f974924d9e731ec4a7388f00a3ffb9c1db5c0655b8ee806dbdd9c3a7479246a373be9d7d9b9d2673d4705d65b7c9df5eb53359fbd25d7f200f502c2e7a16fc0416b7101f8850bf43fcc06e8fbbf1b0a7c5e9169c7d970f641e55057c1b8c3beeb94603e41db774ef8600dd101d615f43795dae90aba9ee7b6aeffe77cadd36c145ef355c4cfc6d5cc3c829a04ae1ba088a172c39bb59c4df24f86662883af5c40d6c8c70f19ad10199d31d01d47889c31198bb1cd23836e10e3929c8eeb90b81bdb54ca1fc0eaeee2f616f729d38c6080c4045f4156ec3469f396d80e8385449ff161288c17b7999be798e1ebe33778e40f7d0cc96be1f3a2be721cbef99c679ff49cf77aca9b59237f50a3fb981559c9f8a091c35c982b13405ddffcc096de31df907546d1381332515a32f1f5c824f412f387a15fd66b79ce5dff480fed1764c7a625933299e538a1396172ec3b0cb035b053a02e92184c911eaa6d3033846006f915438403f90011f62bc96b11fc71e7caa22bce94e017f03eb6628da98025cdd4cc2d1c320d336566d6bb76601874c63d1241c0de7ee45a001f58385e64d8a9e932983f46b79c4e2e82feb53eb2e915ae49abc944538b29e4fad16344f5c33ebd0f0ae00f3073376ef59f0003ac09b70cfc67cb92e6184eb3980503751c11459a3cb364042bc15110e9c786d78ddade6fdc774efa62303ec1ba1f1d478d4a9915d63779239cd52f35f7d3173c825ee32d19919198758aaebdb106ff1a3060df194f3b963eb36164cd4d878c125880134caeb8d56766cbec18645d1884c89903f3c91c99538d6c3e73cec78035989e6b927a4a7b2f4c6b8c7c08c9e9f8e49e9a3da6ff72cf70fc0f11cfbda671b7bb17d5e4a2c9c3c7bff88aaf59db97c727bedb4b16981c45e69ab58c7ed63b7c7b7f4efb394fe7e24336b75d1ffef33a839d862b0c3837178acc5ba95c46cc206399f7f08319321f5981b3171cf85ca88b30a362cc8c994910514ad8a77c96662956837bd6aea7966f87fd888bf3f1327a96ce1aac6939ac059d3196761b9a1cf0692c03edc92b6beb39ebb02eeb5ddf589f91d80b7b35433600de8c76cc4443841c08bc8e0d21176558571dadfcb321428e1a3c1ed44dd808bf9fc3c66c12aed9748a6ca3763204d780fa0ace5b436d156b92b4b6ce31c7f8f3336add72ae4ef7de10afad7138585f452e5cc867c1fb251b4d65d1f95a33b4ab4ec8fe57c0d86fb5df635a68fb1436f73e01c2e5813e97b7dc740ed75da8b1c55d93defd0bc7ef9ee7b59804fa30802bed815f02dfcd96448f8b1e5c13b6626b0fed904a02de9921348e21405d593bb337b6217c57768a8248b8d34b9631de58969db31cbb60797689ee83c09aec0a678a1d52bb267581472d9bfc1d2c105969e8ffe87e8402f159f87ab7af238fe47518b7dcfffe78bfc7dffff8f1fe3c177d265a0f90c72c745c0d75708e6d04e7c1622b4bea68f7f378fa1e6407403d03e73a3f882e81897c450d99873760ab987d165d3b766df69151be62bed68eddb072f819abacc26ecd305db23b569df6d93d7b8895cb1b955b657ec0da35b8078afd6c7b563acedbbd7f843d6a1c7b62cf75c9f67c2b1ab2fd621070ec1b3b60df8b253b347aec073b62c7b6ca4eb47a4ecfa9b9765dcff5b9914a73736e9962bd2a2ae3ad8eacadd19bdb7367eedefa73cf9accfdf9657e35f479808eb05806aea1cea379ccf4e7c93c9d67f3bcd6e745b19c97e67c5ecdeb7985fe1f4eb3f96d7e99add06b6ff07a74046c346ff4c17c4a6bf3d9aca6eb39c39e238e8ee7ec7c3ee7e68b394f2de8f5c5982f99f15c08dcf96a2ecea5f97abe99cbb3fe5c713ee6dbf9eecab8bbb97aa1e67bda9e1fe69ff0bd6986f6690af9150466905dbfd0de9c991fe7a7f979de9b7fba273a86bfb360f3ffd3478dd25c05bd6f7ffe361fa0737f9f0fe71fe8f7d17cec2aec199ddb845e723447711a3be074ceb0867309810d8bb30d9d73ac23e772defce8f3a935b7ae6a62993746e37cee92e4f13b77e5022e0c58cee1222e46af49d06bd2f985cbe0bab58fe83a72395774bf37a36602f705ee07573e9effcf3c3613ae0a392ee30a2ebd9db91a7faecee5705ed6a496b82270b91b577305534d33fcf7a0bdfff87cd1776ad07b4cd3607ee3661c83d648ceb1dc9ce3a61fe1d860b805c733e3696f36e496acca09ce915b79334eac4bb414b7b7c079e7a4eb1bb7e636a9a46d38b9bc700ab77578caa2636ec7a9e83e35e8fea0fbcfed69edb10ef0233a081e6935120197805689cf1d667ab0e43ed1f53f722733bcd5dcd9931c9d23da4636f045f53dc4dc98bbaf72fdc22b22ee8ded7303ee1d450789a595b18d3008b65716b101906b3139c023e0111907f913ccf9348fdc90fbe046dc3814c2253769b37963f23aec83902f5ad0d97941d1938546faec4c17638b4bdb6701bcd6c6d116fa656a089093825c5cc89afd85b13067e542afd385b5b0178ec7229c202f1e7d975f754b7af4043d1eda9ee9eeef7fc58ffcee20b9b098e09685b7f0eb63dbb3a9b51c6a89da70dee2b2407ed9da2f82456839c89758866cf68351aecf75dc8be32e22ffd208999f8996b388b1ed3ce60af860747d12b0c3c83e7799fa31897cbbeb688eb18e187ec4518949d02c57b43f8fffa947a8e0591ae9cf21bd9e100dc17a68cfcf3107b7135e1f67a893ddffde3ecf5016a9e178793e5a64fe0070515a2cf2405e1497e1a2bc6617c75d5dd6d04bb2a816b52dba03dfa1f68b1ba55617b65e34e85a4d17b305e3e8c0c56a670a60fd1d882b3a1d4c7cafb4effaf75b5d14dcaf80fb41b0ee1295661aa5eafe822dc666881ee70bce652f3695769a7910afa1e7d1c091d26c7bbd58506ad42f8d385df0357bdb1a477f00b92f73f4c871e01aae3cbfc10eb14657c376101eb731431ab3d50c40f76e97b933eeac37c875e3daf06eb1b445ffa23994aa99f7fe67dcc382753c747a9f0b0b41fb44a87f0499656b5c72e80aadd0ba13f56a21a11db35e6cf2033a5f19624e8421fa4f3ddba4eefe86f952d04b78809e78aabcf709fe8707ce7ff5713da65928d460b15dec1c01eafbc866819ebd41d1a01352958bdd42b5cee87aefb92b3ad7833f88f9d25b7c425f8a236966e42d8e95be38195625911d04b99ab68f037a331c60a9741c07f2d8e10912f59083c4f270ed6b7a1e60bcd9fefd9f7a845c13d45702fb713edd7d86f398b61883bce6f9203b19d7cfd0ba49f7861239d74f5ba414cda4e8c599f2173d5028227d208ee66ed0f5f4b3c5f51c1e8a31d48916fdc5db02cf9d69d70cd6fcc2dc06ee9e6bec636cd93ce905bcf6b363ddbe56539dc4fbe86e526b2b5dbc175e3271e40583794efe535f42a7c50b7d721ed6791ae33dea5fddc570f1e1c535dde6289e7835b8a63a6975ac745cd3c67cae8eff65bee18e9da71c06c9b958d8a658dad55a8c6a7b315e4c783aae28bfedb7f3705f5e4d5d753938f014af41ee0db3da4c93072635302f2c8ad4cc2b9fd7a92d6f20db8d35e4a147e04907a39d9342f257f719557fe768757bb1df38f3266ff136eff0aec75136c2230ec148e8fa215c7491788ff7f94bb6e3af7c60f27cc847d51cf9eb0038c07c7ce1f9844ff92cc7be017aea319b9c706f2fe604f3a89eb84c5d6dfbae5c317e45d860ebe797ef72533fffd8ee14cbc5681bffbdab34a3efc2e738e3631a6dddc37e79f4f2abc19cd15a71bcb892f9822f2905e7327bee99e045be02ce755b63da2c6e7ccddf700e908b35741d9b4b83fdc7a9f5235d9f0de92d7af88c4e43ffe51e12de2fd6462ae9d37508be44dff3536ec7cf52e52a8586cb3a6b9e011e24e46f70ffd6892ab16d3cc32c28acbb8a7b12813b0cfde2e8a4587ece73c0c962ce8f5c05ce57219371f72db82a057977d2478e19d4c03ef0da2bd8e5d6bd7ce4daa49a652234ce2f78de68f86585bc29ee337b871c92ae82ff4b4ebc8090abd7f27a26e8aa7bfccae8f2eb9a8d223c5ee4a5aa4657f91df91292777ad5fe38b9495b0b7fb3aa7656c8dfd5931d503470b97c9f5f2fa6fc86972905f992069f7700b51a646d544a31d71e35337985df166ffc8e575997df9b36f86a4acd4d332c13fec09c1d1fd8e08c07954ee00043ce8ad48e71ddeace836a7f6feb0b8f7c63773f20ea9dad88d6cb173ed54f3e9ae4fc1022ef13f63bbec774b74b603d3413e2375e7d6077deb6c5a0282c13f94f7fea8a9aa3599444b41ee1dab66baf847e7e74ef36b4aab9fcd18b2d1d572f94a8e24fd4c774035d66ae0c3c09a2f788f5004e440f8026bac3cd771a5f6d3f3bc4f36d8f3455f1677ac9f7f8beb3c05333c91c8e4ee3dbb9fb911eee7b83d7e21ee030837a03e86f68fc82e1df920f7ee0789676f7251e64155d737e697b0468609910df023c1a525fb965f8ef2f7e04e7f827d0c786190311c9912d926b3fb2728f7fe787d43be0247ac27f5c3ef81130500c8b1ff3939b9d8f08af0998dce4ee201fa3e8d3256d83fa410fd7c99ffb063b0d11d2533e683562fe9e7e53847be70beeac8bb9b5a4969a259ae152a77cf784f35b9d1ea21b1a4b230f8343a03972f4ce1745349bf0a55546d0e7612ecd2241f1bae9f8013042701d03f8686db5cf831c511a927ad6734de2e1c7ad96d3dcf5c680d542f8f0c9d7fc0307958f20562874cb595aa5bcb48167d19e07611da1f3e7f3878ffb95b78177f369e92cdd787591bafe9856d76b8a7385611bdbe09997d476e92d412dd03684e5c50c9dadb3585ea94e5b06c73e78ad13fd85e7f923dfcc1d6bfbd9dfeef5dea3ada0b87e870f83269adda7968f8ab54f5a9bdb69f461edd8b6f7aed3ae3d3992bbd6dc65b00c9711dcb98e63097e64190357f55105ea389cb70c74ae302feb898f03887d9968476c7f80d7e3c26bc166e25e0e11a1567e992e3357a2f7cbfc7a2e18f388a22a1a7ade96c5b2243e0c344f902df2109a27eaa35c39e4df97555d507aab2109dfe969762d9e87d8fb4d8dfc3fd024d70f75b6accd309297b765d334cba93348861460a85dabd592bad2c559ce968cf5994e3265c92ee74b0e3d2e169325bf5c2e0563611e0dbbe5ae769d091ef090c8ea729f7bca7fad4f588f7a46a7ed023592e5ea1ff521e871292626ba57c2525aae196db9998e3bf6cb9d5361e1fa88f7f01dafef83beefc5d098d3525e2afea4d8a2f84160e6cb2deebf2fe96e6ec93b9957ac99b1b744eb02b8ca4b75b99f968b08eb4f9edb99302a59a70f4d7bec8f8668fd437579ff1b3ff27b1bd8f564bdf65a3feb0d3e748b5e66d952f9f2106f969f866628503bc7b6c0ec5807cfbbe4a996dade59e87bc67ca02bfa96c7e56979d6fa067ebeebdded20e85e5da182691e176b47a67694b2ec193c2058e70a8c44623fefbc1d1f7c104190e97ed95fbe69fde5206852a59d7f38686bab832fdfefef1f5e232edf59d33c2e8785b7fc588e96e3e544a00504c551c4d7d9be8fca7003411374ed28a0afd6bcf1fc5c3004e8a5343f4153463b16fa73af46e7638d2e32f59efece811203ba3e98e183b90ab4ddf19bdaca1cc93d113cf2acd4f0d307e04ec33328c14cac602a58da01b8ca8ffa78db3ff2c25079c6338447666cb483600b8ee06a7dee9dcd048fcc1da03b3db56efd9d0113071bedcd3c0abe7011ae18473f7486bfea663ef0c7abbec0abde6f978379e847bcdd7b2b54bcaf7e9d31f45d0ea7d5eeebf4c71d91a28580e18510578cac34823c95103d756775b8e1a5664bf219d8a7a0ab27c44222a45ed2e541307f0cef10b8d3086f88c6da14842c3908b950082566be78c0a600dd5e63e35ef02eb16d3a9a04cc4545ffb70d679e987da1d28ee9841ad107f07d4473891e113db1fbf13ccfef3f7c041d32ad116ae1668642e3b2c214f993caec4fb7d73761368b7dc55e098cc01a9ae5401f39d4d9eb77e01cb898c5d3d5bf8bece9badd7bfbbaebf7aa35d9b2c33daf00be5b1759bdec069225e909f3affcba9f7d34ac32369cc410386121f01a56a7031e195af70f16890778e45b6eaf77e7e8426ed3c32a4fa1b0b40782501fac08b4e0eefa01db6e9e32323e11bad62b762c882e779fb3f53c53ec9937f7e03ffc916efccb6cbaa79a41b7f75e6deaebecf353ab0578be3fbf9b5984edb22069fd18d74780a56d5bc2faabbde8721846cbfb825c8d81d974c02712362125c88282fbcc311b12987e6405003ec1b97ec97284adb0633e4ddefc803e67882402660ab9f70f58658e0fb9a0faddd2bc9c3fd4a2a026557d16f68557d6a08d017927ac73e8fd32d7f5effb11d75b0987782a7ce6c2f2201c8593b0e73401f946ff2cf4f83290b291b531559ccd9d405dc71cb926e0a62e43fa0beff5c9072766f7f7ce72801f7e589b674e6cdb797def2785eb7b3b3f47653fffe804425f781306c2bb79840eb1ca6d59b12d97d8c2751461f84ddfd1b3bf241876e40f04747f8591301626ee00787b5877fed1af6f639c3ca6d478baa28b08f7f7136edcabe6d9f3faedfcc6ebfc91d7fac85d4be31bbff0dc97ddf18cd4d6beb6fbf33e0b90e482486d01b403a754b9a256da4a5f192b13f85e08c18f566dcea5b55ddff8908e5b0c3f8796c9e7d4ca5e392dcfc826391bb8bbb03b3a5e91b159b9ec2a2bd3b8eb4737ac15c21fc6e696411fe1ca07351aede8a33b15555a9f19af2eab6b335b05f5de4da96615028f17ebfc15bff8ccbfa99d0f1af6c54e731d0172faab68aaafe2e8b44aac7d3089d855aa8f78de58dfacc0cec736fe9e8605fc57a80bb55803ecb2562bae552bb81fe2de674ffabddbdebaa7dc15f85ae0b9619cd75edfae3e627b6d7f05f623088f3c7a7dfe8903b42cf13424e0eb619fae937ef37bffd1b31ff9b56bcbbbbdd501e6039b89b9cad07dcdc3e1aa5895be807560865ffcc41be4b61c71165ee7ad36dcb3fef1579ff33c7f64fba7f347ced4b3eff855afe3f5ffaf7e85d44a3a5da24e9f1162c486ea4d6fab6a555b6b435cddc08fd88ffee35f39c2f79f89263b891a568d4d749c02b4e247e6e4e660659923e4bf01e583d63ba8dae478820e7e7f607f2be6d9f04216bd7eaa57abd98a094db631de17e565b862b9fe9475e9d59c7fbf8598478cf3249067bffb90e867fc08e6c20147d9a60277eb2d57dc6a7171fcc38ae72e97b1509ac704fa34d06a5f2da1e7f08eba119ec01d41bfe4793a1fdcf6f1dcb9bcb86fb4c51d242225c7437b12fb67c2c526fc27a5c523ffdc817020f4c1f32bdb5a09fc04d4fb5e7b123b3cf2f021d6f8e5f51eec10a2f16f4eb4b3a6ae56d6193a02eb034c67f8b23ebb99572d076ba1bdcc8effea475e75fc7f8f47beea406d5becfffcf7f39763f0f2fc7b8dfa49bb7688fbeadee9fd4acce895c45d56eb3ab4a8d5e6de73f8d21ff0128f6ac051edd40270975741ae16f6333ada0dee4a2e4a5e8b498f2207391de8a5809c16bc1fe94381bc0dda21ca6abbda314d76d0ae2b95f2811bb0da6bc2eab0fab4dcd531baae4ed467379ff1ee3f7ec55fffe9e309cf0ae168d24995069fabf3aab7ea476366a801f716451058c5814251a44de278e8c3867a51243c7cc41d47786d2fe0dd7740071c5c0712a19ab8dfb0cd11b63d83b89fa2ebd7f33b9f0d7ea49648e6f88f7a09ffce239e25a9a0fbe7d8a6e32f45d7fadaff01e784f35abfc323786d10dd0443b69cd59bc7547ddf8ba5d5e0620373e865fd92fb36d6d53003fd50fdcf34f51ff7f8791ecc573ff23ccbdc7ed9475d1eabd3d17ecc237a7ede8bb620dea3033cd3b069e72e297cb97ab7d5d570f561f65723d28ff0da07f0ec43b042d9dd66425d04ed18adc8621a45564aa1d75661afc68b77974de6ab8948bba64810fc2499624ea8256ac4e7c4e851d445a3fa10cde62c5abea52b58afb1126dd1115dd1ab58d1172fcd46ec748abd2fdfff27f04884af43806ddac5aac4400c6752e95a8e18615b6e41e4c378c42792de4b5cc7f1ba3eec76ce09f7920bbcf702e20a2caebb13ae2d46b7b813b7b5422d2e203ea4c37b98530dd98b7b9dfdcf6be5ffd923447bd0e1007d805d1dec19afc0b9433f7b1b257ea9b1138b07df0bb47a101ef1c538bdb9ac9810ac81e71274331e5bbf4df871045f5ad557bff0cdf1e7f3477a2f7be949abf6373ee4ab2f79b6b9646fc2d943ce9fcc3a44be64f12ea6534bcc801f944c0d0b8ece93bee64220dfdff6cc8d882f801abb98070cb0a2c5422cab21330ed6da15b44796bbf97a696907604ee24ea033f12984e3554a692042bf8a532696b31c8bb5b369355f3fc45b50cffa7e2436e2549c890c9ef1f1f51afc7d1fd23ee2da134b5d40b34564afb33a3543ff5d9c430ebfed42bb3333304e38137d123c61cebbf7cd3dea1da0928376086484458e6488b5b3b8107971290a368ddfefa96f031839310a76eb85281adb87ce803998e7c034252c90e77e90d696bfe083df689cfcc923d122b134e8bf2713f69ebf2b796fc0230f7e591763dcb531711d052c00ba661233056d50719dbaa085f3c5df434c73686744126ee1b09d4df53adff119673ef4317fef47fe9abdfc9dbec7ef6ceed3f3759952c58d5ea5b1a5d532ce97b7d36e7e9797ff5227c6357aec2b5074102e45593b888a7012b7f94ddcddaea2aa73e21e452d1f70f5ed6e7e21a0fa2144228c633842df0caf6f81a07b78528141e640118dfc467466640ec68ff88d5ffd08e96f81da2e701242d05489d12e99b7196dd0f2821e7f9b74984daac610bd0cadfe438b2bc8e40288c7bb595b4e753027712f5b39a6f8994ec29b78144fd74ff12cf6421bbe3fa92842dfa0395c249a7aab6786d88f57e29b057d25b897d0fc30f962210e504027a411447b64873a57e27fa0ce24be8bc390133fc4913816274435e2b73da7bf3d7ef3bc6e075eaaabd9bb1af998646a40e9c31c054c9111553af8dd70cde3f222d1fe0e6a4af444a224edceb5fa89fbf6bb7930ffa5f9ec141d68cb9d7e339c349a61958764da696574bbe40fe25a9ced84aa605b1b46bb2b64795ecb245d322453b2245b722457f20ca1c013dc10a257718d01d7f88db5214abe74a974a794ae52203af3fd9c27fd85241ec5b3aff6cf5a893ffbfd5b5f02b3a1407b7f4a959a2d855224c5a0fb84b50acd52c2fa31734301fd45299152295b4cd1ef1699cb08ff47d70145518c6728cec59c2c0e5a5f020dafa95448a52048953595ea455edc48f485eb22607f5de9268852a3a1d8bd3e4ad3a269d53cd0759266fc7bc6d8a7ac3014dbc41903af21bcb909dc1b89991da02601751ae46b9c079e79c6937f13b7a09d29b186b2c890f56cfbcd6f8352627ada11345dec56bb31d94873ef04b92a7a683512c7c834e45827dfd63dfe5f1fbfea2f3ffdffbf345757f62f8e0d9958b32f2dda0c2fe6717d930fffd606dd992b28fe86bc3ababbbcb45c1c25613934afc1991ff2ef6cca1ccaa3b49244e86103a502587592549febd5eda065d9d6df4a6b69434f9087bed1ddcc95c76c8ae8e9f71ff523981f14408f239efde883f6462423d029e39c93025c0149b21c4991b6120f9a97e154da05b5a49a41dcebea1c903535275037016e34f20147693f2d5054ebe97be9902f419b51fad45de9289d0c0173816ddc912bd49b8b03585264a4f37407bd8a04db184bf6902952af1c1a225cd716278a2d470eebe82e52d29382f1d0e53ff1217f76c0b9483ef26db8afa8d54f80684ca9dff943f34970a67692fade8d6861ea7b2d95dea441a63b3a257d67fbff83e3455fe0173ff24ffa901ece174dfc436cd734e438a4f7fb4c73acad01fee14ff4991e1a1ca42ea027a6799686d2473df3118a974669a94566288d132db1a4c99a3644ac7e83eef89a5a6bc13239146f6b9debad0d3c1ba94f95a6d3ce951d3fe69b7773cb7ffc3a201be5ca6bb3baadadb5bd76f2bedfacddb5171b6be0ef3af1225c4b7c99ad2febeb3a98b2e6d67284557392ea75c82f452914894a1fd1b1250cbf155a4145bee4d6916621bb3a81d927c84ff93073c3f7d3721df3bce1826e19608e75b24eed35faaee63ad3fafc82e01f63b3ce6b3b76d685191a2ecca977db9a7eabea40724e9041bf63a17b6ffc3de7f45cdffa8f1ebd7569725900d560d8d5ad763c7a5fe89f7742146925dab1f2d755b6a754ac41b3359d1445ceeb7a7d5b37ebe9b7fa65ff89afffa37988ffb41f417654f8d4de2c60a67beb19d150c23d04548733fed88f24a6f1546fcd47aba5c9ad9935bb9e9bfd58d30e8b30f1b2de9a5bad71b54a582fb06eaf27182c02c7c8d6ec60862bd14f27fdf0ad1f19dc6b3bddb97e5367fddb077400edd7bca6ae97442ddc825ef523f4001a0ac384a7b5e05fd62b3bbdba56097d9dbabd5eaef3b558cd032988d6d27abddec426c22907b4926dc7f7724b337a69b62633bff6616195ddac2a382e52b65d2b507701f55773b2de3a636a073cedcb9bf569f0698cfdb292c6285ae3bd98614081fa86eb1644c1cdbeeb4f4136b99b4f8fe70bd35fea177fff706c7fbd831ecafa1df7130db126bc0dbe63add6eaeadd7d077fd9cda472e68bc17a1f52897b5d3bfa8fcd67ff77f1488fdeaf0fb5578bd0f730bf02a311b4305ed48eff0c8f743930ec47ae4635ad83f5e7fa68acadf1fab43eaf7ba93f134c1eb84e90ff00bef0baef585e7ffd46c9d88672944cf42e604e910db98e6e5ee098cc6dfdc7f0c841b3627f3d3016386a0196a116400fe67a5ea68bf57b3cb5d7a0d982ce6f72b135ebca696e355f0fd71feb115a0d637f1bafd613ed60d8fc01be9b39b0b48564868be386de501bcdea6d74f4b351dd3666fa4ea91b2bf636f622cc44f03db87fc3d9381bc8500c35db0fae878d476600c0cc978def65e6116cf7e64274a9f075a6a0a68ffb2f485596c6f342beb95f7f178f90cfdb5c899a3af82cdce7833051f306ad4b68d71fd03d635b3d1a98b3a66f82907226c127581477f37f008fc08c8fb3231bc85f04f62ddb84a0c308ca384fdccfbf9213f19f70890b9a19016348383e06ad8c2168a82f0ea0a50eaafa9b683ddfc49ba49d237bc69a49b8f6dffa113c1f11625988e7ef7ea4e3fcfeb41f1d534a1c183c89eb8133e0f837c73c96c34498d958efdea3a690cfdfa49b0cfc81b6dce48ec16fcd70536ccad4e4879b0aead5d662536f6ee13918078bd0df349be96686fec618f486d50e95bf9917e562bbe1a4a1281b5675b81ab5825638a51d378b0df4c5788d1aee37cb5b064ae5d0253dbfa09d12f98304f7a5a0d5f9a8c1e03c1b28a3773a671d53e8077d08c63797fd46d8ac3622569f05ee008a2fcccfdac9057a42d5b7186b5e9179c03625ebd6465aee37eb763efbcfadd37f138f54f45e63cb3c36818fb4d940950cb3e3ef3ee22fe21192af6fd5d1808785735813dc4f827ccb46c61e7a02ac14661c48330b7396dbb980642e21cc88c598e34293fcf9b99dbbdad98eef34deffee630fbeff46d13ef1f9761c5c27bb4a7b1f2642408dbfc639fee166bbd96d54ac47bfd79ce8b89138891a6ff68bf7cdc167b563246d3ed7c1e668ab4ba6543727e388573468fce3de7fd02e43d845c4bab9d47d8e8a631c357573a6f7a6cb339b9e41275398c505f9b4f90ddb6e0f3221d1cabed72ea02b0de6d0c30e01ad47fb077cc6778f26e71adac19f49f34833c3529dafe799c96dfaac929b8e0cbdb1a44704cf74c4f36e376feb25bfd55c8c2d7f32f7f8efe191761e88b8d5fa218a7b378336e3eb77b9ad3ff7238413fce837e87e7ee67d759ae8b5b97997469b61a7bdf5742e4fb5587ad5fecdfdc3bacfcf7c7f87ee6d3e36234370aea42f06b43f36e3cd24809953583705f3121c7a20d3de12f77c82e6d3869285938c0271e4fb36de2954645d36a213a53a9a6c961f96235b5829d06a2bae9af5acc37c8f4eb14e80c28f589ae80dc8b6ec003bddb00a2d6038abc386cfd7f7c97f7bdfd5beffded1e970420e2b9fc86e205f8ec1a7ece547ff22235fc8f8f2452fe52b601032cf19b014ae656da86d365c0eab378fc731c2cfe521ff553c02792d777671b24b38d1ce5c06dd9bb701e1b23e76c89ff89247d4f5a2710edc51ebce023487862d0772e8abda9ce00e9cb7eaddedf9bdd7903db51a193f9113f9b3ef3fa587f6cc3b302c64bf6dda700d013466af9f299dc2f354cd82998430abd05734d75d538a1c896b39f63772320bed14e6a653be75925339bb0e608e9f9c8b8345dfd22ca2e74bf00285fb648ca588e770dc7593a1b3cd1cd43c3220f2a2e7b2725185e6c9c25a8ed164ed3f6aeccf35f0e79cd5d7daf9173cf1ffee3bf0fb92f3964bb9926bfd44f9ee5cbe99f622921b791abecb3399a17cdca789ef15e5a3e84a05bd82f81c4e963d8443483f7af153b9c77fb33e4234530093e4b61972ac6d0536f11f9dded25fc323c66b1f45e74f082b03aa8b4e3535149995e7d790bac81cd64524ba17bff000eebaf1fff07787cf9517289e76a977dd5acfa197d01064de0cad533c9297c82ee68e2c0bd9525ec962d1af7ac8df1acb9c52825896e4b50ebddb17ec8bced2a730b9340e0b3a0394ef97f2a63a697d0ef42da1c7d1c7a897c37591b62fa3cd19c2842445af655956e42dfa9c9dac9a3cf4f2802ab9c47eb9de5fd546fd2ff7e1878e76ce0b74def5e5bd7cd03ee44ff9a8a3d52a9fe4b3dc93fbf21bff4138bb61417494e581fcceee91fbe1f03cc7a6e56afd94bfff37f1888cf6fc989e04b7f5581eca1f861bad300f14c5cbb85feeafda209f445cb592c06c100ff78e50ddbc3c9c95746253ebcb2389a37b31f48294a0634c7fc3e1658f4f7ee41ffefe9777ea42b1142d8fe589c4afcccd52a1154ad1143daec56d3657d0a5c818c5649646cd8ccc50f617f3f49d52f2839b0537a267bc001d5a43b11a0914591dc957145b71a2a1e24a233d57bc6bd934e550f1610624cc0d01df0a9c0313cf0d41be96360498fba75c946b36550273d0e10c257ce08c363a7b66087dcbc5fdbb8fede79984ab5c8b665f89ae93708f75f6876eaac4e816f34aea7bc0c7024d9854733925a369056a395ae9670b3c93be68f95aff7fc7237896abc6430e82caf9b899193cc2250aceb58fbf56a5fec8973c735e9f700975351cdcb308fc23432c43a5345dcc8d8a5a2cf46bfffd899ab579f5ff021eb9254a85351fd5fc7a61255ea9d71a68312a37eeaa1da1f3cbfc348f356df6619e64ba3043a5a1d445a42b948c736258831673596bb09b584ba5d5c9776484fad5eb5ab6c56d7852a658fbb2ed2b21b887f4fce15cd1519979b1324391d707b2e190dd002ec2e4c93ffcd203f8cddf7ef880ec4595e7ab36f788356a6c496116d7c25590cfa464651e2bf12890a7673134c375ac70ee3be5630c4734b57ee63efdbbf591319909085a8ac8fe2daa81c1370eba53cf737bff8a0dea6cdab39a3eb249580bdd732f218bc2fa631994a0050ffd676a3b2be46bdcf9d58ffc13b9ac673c027a90672a5590815888dad18bccb0b10d5e3b2b4bdbc63ef13ec1a07e37797da10869abf1011a94a68bcff5edf27e1db6f3dff79484a0884cfa73289d9f2e64975556b36b683d5faf6e3625f0b06cc37688ba28649e097b120e217a4c83fece67b458efaff0eafef2e3ebfb9ba3e9a85a52aa5537f9d403ed9d8be9f5fd80ebbbaccda6a97b2beb85aa888aa4acada3f16e8b9ae5ca44ab077323fe0fe011dc83079cda2bd8416fa96cf8a5222b8a6b82fec99fd66c9f718847e2ec7b4eacd5ecc273993eb4e3f5733344ab718ff32139ccabc2fa4bdd793c7a5fcead1ff9b5a7f21f39604e8ab25576856d1e816b0b732f0097183af852c85c004f09e6af589aa22a7b669c07d41a9f1be867429dde468f57d094c4d826c01a021b9cd7213a6036b5530e1a9e5bf8c43c27bd7e683be19c9706f345ac313fa915c2f8443be8d18778ef01b45b3cf367f8e4a70e93533e175bddc57a94a09b4966d3a3ef674bf544392aa74b3f37aea17286b9f2300f062626d127ec777e3f27ecffd9dfffab7824c7b9a537e89f08df28cd95624fe9297d2f3394d06af1c82f3a50775bd3dab0d7397c24e3698d615606d45bcc9e975e3f2915661b221be33b9abd46bb6447777341bef4befc381ef9268ebd3f8eedb5f2a60c6628a2021b0efd2cc09489268641664a5963e0e84294c4affc8121d7567651dea7e5ac72532ad54c2a85da80375286ca073d7119970d73cd5df4d0aa9a63bd6045b3e5ab32d28e3857f89c9ba2dadfd1f5e4c7588b442333a93056a12d4a19bfe0913657f865e2b3f78a53bee6babad7fe95dcd7a3abf8eea37c43cc92a0893ea9267cc33a27133223cc3797ba32b9ceb6307e727f8519965bc0b7a00d4a35e05f2117f87f80afd5f52e76bd62a085777664a9f6e2fc2df2f51b9ebbc7911a745737e97601b933d03fb0d570ee0a77ebe66350d4c6fc210ef2335eae1db7ba23b7bea3d35922bee3dbbefc7b7de427ec4ff4d4ab69b7f68de8599ec8bc2dbedc1a57f0216f044b614df58d217e67c32da27471cc29339cceb7a6a203272b0ffcc60c9743cb61d545b0b5ac7ef27971e22a2eabdbd6de3a5b57db6907e0c19527e25f31cec3190dc81dde32c06da01871d76af460debba55913f0e504bf00b717aa854ff5950e07defdd2a30ffd3173aacb4d7efd7bf71ee4ffedac2c8c25bb47f2bcf5221830bcaeb773bf3a2d699b92b69ef1d1ea637dbd8f3f7dfcbb78e4fcb457b71483ae04ed8869baf5b7976b59bdbb0630e74c6e7b85ee9a87eeabad937c7d7972411f44293243d80690eb379c55be0da1eeac9d4dbe920c479f0761ecda6b645b86389ffee835dbffd27b3678aa8ffc04de803accb37e535f079d785ccfa724d044f62fb9ad1d71c4f3ace3dedb46f67dee7ddbd70ff58e119e43ef8126cc36de26b7bdc36cd37a63acc89c2fd7b016ca689b6df36d7151d6e2aad80289b13424aca7755f9964c21b9e63889533c8b4e94e3f007c883934cfdb0a45bcd8a6132d5ec837b6b9c2ceb73fd74ba82f3e847af88abbc6e2f7b3962d323f9dbc2fce4dfaf79ca622f2757c5dd36fdb9ae87d9a2ea0f2ed6dfe8e735dff78eef15fc723cf750887ce708ecb75b4a571e1bdba39cf649890d9e10cb7bdbbadde16f12b94211a2b2540b6389c5a37b6096f577974bd88dbc2dd36a610be17c34ca094b64fc37dfadcdfd89e1ff423a7271d00f23d71fd1759822b9c8ba3c5a5906fe6b9623f2693610d4af023edccc117bc45a625834d8f26e631ab0cbac8b7d3c2f407cdc281b97730c7e5a89d881292b9b41c65eac599640e03fb6a10fbfcd02b039b1e5a8db29d7996ce987df303b8c3a41a8b2255819bb7e7f07c1e2ff5a7a728ec2b4efcc5577c538bbfeb163cd7f2f121323df2d969140c82c9f25ddfdfe2a907fdff28dacab16dc7735bfef1f549e2817f118fbcf60d530c9e5b6a6a566a6c9965c33aa56c08f53b5cbd52ea9447effc53d83103ed28f3fe4ccb02b90cb6ac5f6ee75b0ee18e18c5ea4ebc12f6ebf7ed62cbbb12b0dceefdcb7f785e773cf213dfafd364eafc12fe5d578163946a9a2be4915609088b988909eadf6093891f11e60fedc4474d9bcc30866c762921cca2803a2bcee8e2be703205bc9d1909aacf4e4d6f97dae75630b6f918f26384b74b7a36c9fb19ca76b51503833f6ad095001afc26ae2729d3f15642d1194dceabc37d6daecdefa2b59759c9dd0a7fc6287fa684ea913ea1ee7dc86b80d98a27678c2cad5e98e1760dbc6ccccfa26915f4dda9c69bfe50fde37f1b8f3cfb118449ec2dd13e829e0a88d3737bc56f375b1926b54026d8bafb10d22f629e0c9e916eab8c879980ba82e707b65c2c987b02b17a249b6135c7bd13f039afb6e0db3aec8ffa91878eec803cb6b599863e0707fd9af0664870d3333f0dba973a0dfd2f6c1b3c2710eb549a8fd741c7aef9f6d046c1bb8bac7467ab6cb7db5d281578ae4ba738ddc6fb28f2897b11c5538ebc55b7fb66eb0fb6071ccd01a797931644959ae00e524f79f4eb40c5f60b3ffbdec7f38c53befa8c571c6253dd67184f5343bbf7777cf363fa71596d3f91df15f1b58339955885dd2a9ef292ffecf1efe291c17d6fbe613ff249353360ad53dbe3351404e8959066da11c7cc23f7f2d5236f4fc5767bc63ee20dfac1975bc88f113e16f4a13beb6d6fdbdfbe6df17c2264bfb777bb009ffdabf6fb0fe391bbe65ff73dfb246fefae5d3690b7ef81e59a985735b23597ac46acde0378c4bc23e847fc0ef800f7e16fbad9e88e4faaa4a09ee49aa0b847b428c97470e03f6f87b5a78f2edb90257e046bcbc0fbeaa4e69e0fb34bb1df1cb383f5b9fd30f906d9f0edc8ecc72697414f8beb02eec0ab96b61e2ae21ee10e775c86ce7fb4b3755f785ddfccceed725914e9ab7fe4db1e3eab569a6b753014bfb71dfb0ad6ca2c71dd43be63ca9fd1eeffdfc72383bbd6aab39d50c0a1bae099e6f28ed6822270cc1d658a0103771bcf7fbf6ba1e059ac613ac13d840d8e4dc9ecc34827da4a17fae4e83b6da7ef8ca670346477e2177dfbef34faec3b5febe7fd25d13b1e500e25596532de999663f206d126d4c8e408e24b006fcc2fd083f76d9c0f338549443476fc48c07a241e4c7e9e2606e9426a357ee17dcc93d65f84d55b207bb165107b3d4d0812ef72569673e9079123e79f3b4bf777763ab91dcaa379dc3958d1a19d616c1ebb19601d9ee9f0c9c3b7774aaa5df6b6f3334f95c8975d42e68c10d5d9a7be53bf7b5f4b6bde762eb545f7b84785e8fe35d30dd6b6c49ad19873f7dff023ff2e1ee962f40e8fc0cf7d7a6855445b3e96765ec6ef7c7dd46a8adf7580f1951616e2b2771548bf39ce9b0fda3e74bcf7290ee63f15d76b9d1ab817e4579dc56fcec7747e108f7476a8c35d273cfbd09f96bb0b42d5933226b91eb0ed9dee15d64db43b3cf25437685717eed7c0fddda0f30b73d571cecfc30a75c8b663dd5f8ad86ed7056d2d3ddf5d77017018d08ea441371f7006d4d9d1e7e2dcd62edc45bb3846d73ad0f3de2ed9a5ba2d99cd3c67f38dcfd6d66562b0e178310d66c87f8dba7e91a7ba54e747ee7f6fef13aea77cf125aff511ace34f30c8133f8ff0ec3873e133ab9852f0bc1bac2780a3e9942633427e5e5fe07f138f3c38fe0e757bd285c435936d4f9777597ef02f8b89c13ff85bed1c444a1bc71505dd354bec47065867c4a7768e0e3aba7876474ea99701d1ccc01ce3ae46716a7ba03b3f02d8a1d7fa917fc687d8ad1fd950dbd0e74e86b3cbaf465b17e8a214623f47df6824bed8e0a77992f7e7e095f9f0238f95abc4dcae007cb72b41e384a8a142a48a50bf0788dcd8048c94857bd95fb061bdab164d3cf22497d566bbbaacbde3ee167bf9671e08e2aed17a96964cb18f1ade73644fb92cd7061c71355c82fe0957c234be9c6bf73a72bec437612dca094c6e83ddefe586625089b79be6e750dfcd9efcfe63eecd7fc3879035fabf8047b02fd94ee8de8baddf319c33923665b563626fc7c2ac2662a3b0fa9a6708f54cb3a81cd9fd2dcc6ac4bab96887d86bcd6c75c1df29df8181375b32a7285230370ccf29a274648f3a3de2c1438ff8ee477e329e6d0fb43bfd80dacd779ca1d8f66ed1ce7dc4fd1c843943547a081ef9861ff5cc9bbadbf0afb6fb51e780bf275343894e3b7ecd6b5124123c03115df56988c8cfc0ac2b50381576cb59a0cf77c22a4751d6aa4974b7cea1d71fae21cc8ed14ccdd5ddeb81616012c69769076dbd0470d55dfbdd211dbfa046048a7f58ab9efa5a478169182e0af6f01c4707b4f1f10cb2bd21ee4453541acdaaa29de4c33d2133d1c86c82ff060ef9dfc1230fad6e0fe191673d76f4b3c6235cb2de6de809b5ddc9d50a56164426c85e39e64492e4776a879f7b059e27cc5ea4cf8eee6878ef5fae1edfdb29bbad30dbedb61475305dd0f3c5792f784d73c742affe6cf68f7ccfd6f639da4e5d15968333da9d6df5491f7f57732078a4d336feaeeef0ec5f7e995ff5b47a61475c0df39dfdb8e6fe455e25b3acb6b5c4e411da37143cf79ce4c02628f212e33ee1065728420bacd8d6f2a7993135e696a9bbfdf49d634163c63599de2f3ac31aa0783c1399328faba9d6df1dd82457cc3ed6197ef17dc65dc9fc0638e9e20f6e8ea541bf4b31df7d2aeeee886204852f77276ab73c609de8e77a48efbfc3a7bb7fd6bf8b477aad1f39213cd2e59a5a1d565c3182d91f038ad6d8dd79d783ae2098ee059948d7bc7e6e8eb304f7609478aec99c523416f4dfe9b75d7ff7e69ea6fbdd60f7bed9cec252b715c8ade35afbb8e5865258436bff5cc3f8513cf23aa7e58d3ed9eba9aaf561aeebd37c15d2c38f7345ad4e16ae8ffcaec7efe9f72f8c42e80b69675ab5bbcfb06032f32aafe3eae65ff8b9c1db9769b41bbaa48eb2b1c6ed0e01f43e01ad14a8e3a315ce1bb7dd87b322f942746f0aaaa677c16d360977f2b4dcee46bbb1218296f283ff053e10bdd1c8d276134350e9c40e26fe3959a8c88475ba261ddfcbbaeba29967d7d4ce89ae6a7a55e5aaae1a4c924c2e4ee4522a6821eb07d574045dc175a5673ca03e7126fe6fe391e7b90f9717bf82e70ee139eb84a7b34f3edd4a3ce02c3051b839a916efe319b8a1cc51227aee46b7553b9bec76d09b916e304f1450de262c361fa9185f550778bf5837fcd58f90d914f63f561f39111fe968aa1bb5baed449392d87f9cdb69f5c220da30f4afd536fbcbe3ebdfbbf7211af2f79a36c239fe00566d35533dd5af78f562f2ccf966355732cfa46aae06e4b6cc8fab717bbf1a5e01b38911d2efa957155d4f3c0f92cc1604fdfc262cd430ef85bda5602d7016e54b0f68199b7d8631683592dfb3bd1af2a51aaf566698c8a05c6d3c666bb5e70e9a926a72a9b3839aaad9e643cd3127c20f0b3c2b1de1521a9889134a6a7b56bb7bd56b67a4fd37fcc8bfadaf75c71e78af76f8a4b3eba42ad8d832e00db5504b2fc62a691e5144d66f4e118be01ba80bdda714e8d28a2ab572dfe949f8d6e4d02f8eb1874ca58ea2d6f15459a837ebe6b0aaa9a25817eb698c9ff0c74fe391e7595ff86f9a55abd112adc209e8d43ef980bb2dc675f693f48e355dbee5d23e739ebf706c9fa3318af48920bf6b2094cdab53799bd6debcde190a689fe0ff9ba48e02b320ad11d878fcb39815ea4c655416dbea41cbcd067fdea7279aed72c9e765a9cf510465bf72afb16f5a79b13adff9c927a5ea32c5b9a9cbaa9ccf686752856c6bf5ad1e9a39d4ceda4e2e624fc9d485cf23dc5861bf0575903714e15de60c3d493550baa03b4ec65beba3f75ff1c1ff613cd2f98ef8cb8c53bc87511c5a91f9f0f459e5d5a5c1c3ec5517a1776483b84c4c0414b7fa3ea52b0aaf0ae1bb2108ae36ef7a0ca94087c99c36e9cfa3275717b40a57b4ba52c578aa4ad097d8e6b73a9d949fc523aff3583c6a178f0a848a7107997f67d6b4ab1ae7b89cb67f847bf515f6ab0ff96e3ee02fcf733ddcad867c4ac9858abaa6d4ab1b8f162be4a76c84edba7acc156a31a48a073b26ee6bfdeb8e529c0f6a0fbd1af89e8c71bf0ac9098ed1aadfa872dc27d3e13aae30ee1ded59ce7aadc9d416ebb75c318ec95545dd9a6161749ced7befa8139bea4e55f300f99bfd65a6a5b87e34a51c85e04631ddd0c89f608ed6e665bd7c9d75f3cfaed17f138f747681d8dc06e72c9eead2948467d60da958572956575c493dacd7eaa7393094ac067b68389b55c6462c7f8ccef629130d21d9a8c7e4442928961d62adc54eaf175477ce2017a22c2e9fea2966d4b3da53fbe879fb7bdcf9158f3ccf2ffc2e4efdab78e49e8bd1acf56145a373c7358da7d54de686201b0bd34ecd1397dc75d87fed017c4cf7bcd71d9e725d541765c18a076e02d979ea9b3a20bdf0ea3bb2241e61a5907e7fd0cbc273887de80cd6fa08428013192e7a6ddef08c711be40331678a32d40f7584fc88f9ac4503d1afc1ab6357054c08d780aa31c72a5d2cd4093fd2409bd8bacf0480d75d0c6581de7e4f696e2ea86769095a31045bd280812a7ab8d7f6ba2d69423b33e4ed7e5d7f32f7f8bf8f474ead1fb9fcd6cf38f42337aeae7a7b631aeccd666b38e6d85080055f1898c9a7e48aa6aedd8b437ad270ccea76b5101cbf8ec1365a65a8ef689821f5628f9ef148afb51fdfcde8fa7fb55f8f19c411b576e4da368f4ee07abf4447185774fd23246744f48feffc82e1a33e6dfc467fec17fe14991712184a992631b2ef6a756119cb20b5781225e523c04168e7f2b771d803b51e7def6ef7d62fb3c93c7c2d4fd0a9564fd880ccbb87395bd887ec55ebc2f131e9d5c1cf8b70aef1a42b17696fb3c14cde3bc0b0bf7751011ee1f6ee86a676e8356d7f3e4de6aae3d9ea54b0f0f7de651a4b54d76784d7c17dc6f17fc38ffcfb78e479af0e7eddab8f581e3f0ed1caf63d7eef5773978e6aed986c885a8145635da86373dc5faabe23bb0b2a9d59504544662ae87c1368c0523ef082891623f62fe9fd1cd0e7b8ca131e79cc65dd7f33a3ebcf7d49f79a964b40c5ee667f35eacb1eb3302e5f7d40abfd8e5677337a6101b63e84fc8f70a0b7d76e57fcae3ffcb9f60db57bf37845087ab1a885105915db592d89425db46a160887ecf601d36c74ef847c07f217fa7e1f52ec179f88af13d5a0eb47df969a6ab8b70c7272d0d156d3d77e71b5d7f4a1d3d9c73e7c88702247abf65a65f6d13ede2725e70feee745a24d659ff26caac1e75c87f483070118a8d96731c37fee73982d42b0ca93dfff6faccfff0d3cd2f911ef4f9f4fe6a2929e669fda2e4a9e12d97db12ff795817c09a875eeeb50de9aff1f7bdfb1dd28d3b57b31cc5948c8b63c54465948020133441195500e577f6a570014dc76b743bf7f9f6f500b45a8b8f37eb6765e9a977258627e0f5ad3b048306049de1ad64f7c8225c2f5905bffc8156ff9631e728dad22d98a6f2b4f259697c1a2e113bf01cff18398d8d32053fb51e0f14b04ab9dec7c885e7f3f7f3cf1c183ddcc8fa579aedd8edbda65bcd9971cb7ddc49a3b68ed45a7a595b4f26230c36c417c9d0ea83d50abbc3d366137e86a55d069a05e3ce028970ad36874c2eb426b7e1549dc02e82321e8825a4dab6b8dbeb8aed839c8c286ca6e24b714ec7b795b57dbf181f0f9eb1a9a2bb1a8295ab3d15aec61ed48ae3ab56b15bf05c7ffad3dfa5ff08ff0b37a2be7735acd3014456ab125314f8223446517f005fd41dfd55ae352185ff248999e6dc369d839d440cbe319f29b195d031eb4f0bbf87eaf0809752c05ec29962ec3f363fd49f4115ed3fb9627fc8e2dc5baba4f5e2cce634fd7da60d7d23a801a0a369e34470f722c69ad74ad4bebab83ad895f6974bcd2a67923f8fa0b1ec279138b97a238287e54680f3a43ad1795ecf1f684fbd047b9a8aa0dcaf5bda4a9c2d8f6f0bc76fdae8d883d6bfd80d78305a40ed68fa0d46c40cdfbc027d1f6aa528b43e5007629e120c4f87735cc438a490c83b6b10575b1dee5060a4143aa13dc619209809e62db519c02a9a99eae3b8db98b0682369c9a61077857794db0fca9ad52f8ffca3fc269ee5bfa4892b36c2bcc67c2e4e2a9caf0ddfbca61e6ef506ba48db00470b6735834b68369fc02f555459a0f48fc2c1013cc30c5e7833af11faf1239973c4bdd25b82896f0eb5aeceff394d446c7ee23ecfcb86b42d405b76571bf06d13320771f6bec4e87605b09dcd695fa14d033964c344d4716abaef6eb0ca60c460c48358a7eb05cbf150cd1c5b0730ea6222b4bd937ea8029426ad106843e1709e65710a80ff8786affbb8cce8d39e609396f367762697122754ccc843ff338ec0ba3f9fde55e887693c38b36b18dde90d60a867c18b044efd1b90eb5bc6e79300a9607cdd04ccdd224a147781cd5eb625667fd27f8c87f5d1fe17e775a179e4a4b807d41f803c1ca90a763b059452aa653f6621a954af6a16f1bfb0d523607ac0916e0ff8457e421ea5e2c10fcdc3ac1f12b8aa9fc4b75108de48f8cc56bbf4696a7fdcad6f5685ca90d06ecfeeaf834dda10641ea76d2ccd79407407d1488d7a2fe0a1e8795466fe0ef552da7e54fcefb58edc4b24cf3cf89de03d5444f987f0daac7822657d41dda085ac1762b6d88c7c2f3b2988e493c6d4ed8f81dede90a6f808e9bdbb6ea782dc6276f7b7002c76f6f91116fb567a19bac599ef856205697c7c4150197c676e7baf6522d96f48608f5a968659f85e774ca0d617c5f9f59b82839e0595a517b8d6c5d7457809f45faf0d332ce7f531f916ebe3709863a7f0fb4e9c268db4ca4b53cfac26eb7e80d965ab5e5a8ad6866305f2cafd37dc17c07d3b2ee4417bc916e27b67f8fe93998e6333e92e503a6705f67fe77f1b7182e8a28bbf1a8b47c9d698cc6277913807a40b04ae0fd753e7b9a0b98d3a78eeacf0f12482aefe121d3bae657f151be17287ac547b9fd517776f338d411e61f2361acbb8185f586107c13244f12e620146e6d47216041d271403efe34d4f1eeae4021c692eefb36897958cd0a6cae289e724872cfc1af027e8ec1e9550fdaf585ad87ab223220a7f28825473d1a74a80d32e521a49eb12c4eb1f4d780d35253f4190a00b115ee9789dbfefe3dfa5fd647b2fa007cce7cad84d6f15c42b0a32f38eea270a9b485f1e6499fef8430dee5406f2178284426b63d7db17fd197c3c8912b5d7d35a8e8f106f9836dc3764116b73d4cfbea58a6e6f5d88724a6f8312ff928fe16e78d437a9dd785f16515c6584a79f532f9dc2775f77252316f21a7a61ca1346f3ff187043ea99a5d47dcfef5111ce490c51687e4ffa43a8fbed637ddb1be6d2fb6fa0ead0ba7315a628a51a7f53c98fe56b4eb37eb332292138b91c6af37ab89be833c186faeefb70ad80749ec75ba1e32bb42ccae49f953dc779e5635418d84cb7ad4b475a851a51ff4a37ecae0618d93b9d36a1541d7cf33a45fc4bc5ea2be75e2f3ff282fffff431f79ac0f0499ef7d4eeb6115b1dcabe965bda257175ddf267924f059a01ca2d9a2a9d72ec330d6eb7aa3dac3745919964eab407035bd3978294f859dd8003a8965ea6582e7640aa9bde59e37bc3f3e2bc18002391ad3c899afb79042d12c88f61a2671b32141a0eb1c3a4eea69cbe6f6b1b85ec243d0fbfa489a374e7c21758244379d3b5a7f206d57da623d4080a1a294167a9be4dbd371537b5ff4e6dcf3f16bfb9ca31cd648e9bec421e87e44bfe33a8b45ed4ff83305741412fb551c998146d74f18e99dca45afe9dd7d80d7a74fe67d41fceb54df00de8ef5436130dbe93db105b64c266dcf990cf1337ce4bfae8fbcfdfb94d68c48cc6f95e91c0bccf1c7417f230d2b7a7f6ee903af171474b555ee3b3b0f2d4ea25b740c7da88f76c5056402cd1c176a3c0553bdd6aa361b420130ff84035ed503b1a1c1fd8bf8fd22892bfb7d0c478be838443e077c28dbd7c7c782eb134c2c16b7c5f2cc299a85a56b04bb9dd8a43c312015273c07acc59043f89e1e925c531ce414a391c416a3d76317ec5a8e7b69ac517ba7ebd110d3f16c8ee64414123ded560fe375e507fa6451b273eda36ee826d62798cf22f1ab705d4462798339513be123a15bc46eb659ac7549cf5dca8d068d8710c1f65825d6e33a7bae16a8584f9aea795d0e2e83a65e1026b46e0c0ac4dfb331fe9bfa4856eee7b967d21bdf333a4ff24862c869c7f2aaa53f950fd57e34d29f9d82fe726a3b358802395e500e593497cee9bb36d05a4ccbb12262e7d68daa33021caee239162512eb456b5950bd27e523b290f5a9bcdfd27cf639d19b467ab1daa215e9481dc430e51bfe1c7ffe8a77f185c6067be1dc01cbf049050d9ef9c6c30ceeeebb8ddbb602c4f990837513f40ca811905f32cf358ca0cafc13291f891ff2912c2e22e605e5d7fd4a393564b4f411e505690c35b18f79c967a6a08ba6fe3a112702d33d8289dd9d90daf41a7d16d65b2876d682e06a7ac2022f0b7ed67a3e962753ffe85fa62af86f84d856a6831fe223ff6d7d647c6363e29ff336b6ddacff81c9a994169ae2ebb6a15627ce0479dd45d75e0d4aa841a3f67a078a6b9845b301ff418c6cfd301e17c2b3309eb8e2eb50a47147a2e9a9cb6d868fc899f6ab71657dc15427d12846a3edeef4d5cbc4833c3d909aa80f1df789a0512369783c89a4b24e0ec90445d46159b81449ee63f5cf93fa85bcde7d694df5925291443592137488913153e3b021117f43ca4786643dd2f8283e0e6e6394087f158358182fd6135fdd4c02afcaf801192fc52216a19e14dc47079ba2df8d04bd1014dc83ed831d4da8839f4b2ce06b0cb8f0e2a839a7b110334f508378aa564d41ec8fcbcb4d68cb6831093b8c474d35b067fec0fefcafeb23597cdeebff5ce59908dcff40306119edc7b488e088abf380e4b3edc745d73f3f517b11d0eac0a7b85d595c2a54407ab89a440b4b18e3cb4c1d0a2ac965b8aed5ce79c34779086f21a9e187f912e0c5f794ad5129d8c64954f45d916428b9e10ebd9e103226b3306e1f97e7e5b353b32d7c6ac0bf2170bde283f50739924f52c71e2cc16019a0b1be30def9d4360efdc91cd3f2e8b61ecb6491c9217fcc4738afc07c71a74c9658a791139e11dcf090004b9981d08358afc96a50099ef0332fcc8616329f97426a87ecc066b673bba7a08a7725e66993d83d0aaa164ed6f5a1dd9c525c949fcb43fc6feb2357b6f21b1e72ddb80d65446c52c4fe055a1d790fd172e27a32d9400e03d590d15310d0d392d88f425a3ba9d646cac5532693eda97c294f76c75c50059bd7644f7c29d7b6ad8ff2c8b4ff1ae17731c16c196bc2723139d8b97ed151b71d645cf24e6bbdb1731d6372ec0c27a7edd4b556d5e5e9b0b10d64429c16e721b7b9890fe3b528e608e49183cf9e4a5df6490d68140cd481f79c56f4d49bc711ab59226579e5f0355903f3663c1c67977e8e750bafd72894737187f1c98598e6779834ee4a2c1ce3f51cea4ed96e6788962dd4cef96d6243d3080e32d5fb446160bb9bc2e43c2e6edbdda39e3f1d44824be6372717cdf2bb62c153a71ae842ff5fe58f70faf4285eebad38294aefb8eccc3e67f1bd03ee9367715aa4767750550347a1d594494ebc8ff5003b13474b2cac0e527680cd3e1b21c5365dffb019f42725c05ed19aac8ebb27723de87d3ee2b3bceb2c9607e175ee11eafb0596306c3c350cbd32294f2a93aadec127a3b21aa0aef03c05fe05f91b6a69daa8eade2a6af5492e9f9fea2feff112d0f0299244b343627fc34a82040779258a8e1a935ad011b43b8c183cbe49fd866f5cf9aac87b9fd89f80fe0f087d0f921a93168bb966bc1762b6a2d63ad8e353a22f66834903e5268abb11e5e988e4f0503f0a89991046a568e52265d2ec5a93d6a40dff25a70cfc6303d069889fe9ebea54bdbf47ffcbfac8addc7f850fccf8479656537b499dfd87e235c6e0ef10d49e7eea637dc4075acaf07149ddbf144384f2930be0e882643283da51aebd6938a7ce50180783c4277fad2bdd8fe39ae7a5588dd49753a57e1cf74864f58d8dbb33829a7e8a309eb7ec606b0baaed4f3a642c049724e84f8dad1e993d7b548c4512e78408b6631a97f5f00a982734b6b6d95923a8c253911695d23a16797cd8613d28950ec298d463c9113f12e7919a8d44e126a6e0dac6c56d5545e23319111fbbc5f80a8955007f078dfd055e31afaf62d768b5bccea45b6e3895490f19ab95a82df3ecfff837501f7750f4d7a383a36c4fb5de1a72446dda37ea73c17a4b2dc3c31ec542bcbdbffeafea23f49c527bfa2c79fff1dc805ffd8ee661fb602399757b613774544283058ee7e45cdb86c0de83f908e00bb3f8298275b83f4ffa905747741cc07c67b8ef49be839960ad50daf9d806977e766b9b4bf5ae80c4cb16333c95d2f78b6f07d549695a051e07111c3c868bc70abbacfefa356ff123883e2158fb225007d0bb82d025e39e3b489b0c2aeda64e6275af75ad90f421facdb9b76ec665ddf09fa2a04e54b4d4aa5b6332b473d1d30424e215d3573ca8e1d8ea78ba3d715a8db5d39a8c0726de95301ff03dc16661facb8add8fdc1f6a5c41562fad09f98bf8badfd93bd9c6630e6ed731e523dfdfb82f3d64571e3f95ffecbd87271ad32b38bad46fd31a809cd602af20988719cc72a28fcc18a24e4469317a09d0b632d16c2fc107a1f633d07926949692f86199f19571665ceff5f19666a52d247a15cba1c47cb08ebcc9695ac13c0e4b5cee4b261658c8ea27995c45929b3177f61ba83142aa6fbb4104995dc10cb0ac1c63ffa43c633ea5033e4c269e81e975781ce1a7d7f62676ba535d1cd65db49ce893c9c4682ee3ee748429ce1efa303187e35e30b19009e8aca87e9c4ca4490effaf296a586f7965f1db4f5b7b023160507f5dc4f3b22171c025613f91212289c41ab3e743dc008b09a8323d95efabfbf9fe65c3ff0d93d88b747f523e426dfae6b75dbd0c0d0ee31df98c37ff0bee3f27fa4a7152983cd9b9f9147618c50d863c6fc0cd85dd023c03b15a4d8e377906dc2982cb1ea2574052db3bf658bdf85366db0a19ad02f999c73779497f8b8c06173fd4bfdb96d0aa728a654bbe037bd0ba88f52989f2388804a4b58759bffbf47338dd840746649ca11320039383ba3753743851f0fd048ff9925f4ac706d4a6653919c5741d78ffaad617ad73918d8fc43b4c8a2bcbf5a3c278a49d0f0dce7b824aa33c793544a78b5ed750050253b372417f0e4acbc57cd9888ef5606808868df5c25ec727b9a2704fc8be56882db344b071a85f863e6f49d686f3f994e7673ffbc8fe243c11afc783f5fa093ec27cd779c0b91204630a67959c57f94bf8485e2889f9e920e81f1668d9c2b414b09cf65bacf922c852f2e84ea38da011819455df631a3bc0bbcb63df094ec7700cb4556cd7ef0b11d862081d2966fb9ff20d42b38c8caff9f7e815c8de70bdd0b9a0be6f2c83bf4ec263f3b8a37d82fe4364395c1dc4c744c6e5d2069f392dc3353cc33702a0cd066040e2713add0045552382f82abf43e2a0ebe4590ba65fdcacc7e7d600f77fccd682de4b5b088dc88048c6d6c69aa2a90a050d8338a86e4d072aa6aaeb1250267cfe835e3fde0891313716c652ab453d6305fe9649cb88d527e2b3c7f2015e13d0570a44ef845860acf788af7e531c0deac69af1f711e00513cce01427389fd96bbf6e57eb91596781f21171295ec465f9f45d57a16cd7f1eb19963943b1242af87a1103f81e3efffcfd7b48a888e5a8d80c6b2d63e3be9ecd6e7553eb56cfe6e5d5d89e06caaeb4557670bdbc2abbda6cf25cdf1b3b633f792e6d5b4f67e36ce2f7879e691c7bb5453ff68d53b53475a6ba581607c6395085f2f0153f2bc2fdde93712cc5157e6d8b0e7e1f90f7bfdfef36be06c605ee639cc58150364a623b6cdaedea603c72c6caae2ff746ced4289f0667d39942ab769c696f74798571f9a14bae67d3a838cf4615b79a513f1bc6d67d353646e3a85e2c43b117e2b46a607a7c5177b89f67a162346bb9bbf5f8d4fc6b537189e7bf84e703ae6c5dfb0aea19adce93d18e24a323148cae88c44658367aeed8e8a39a31c073aeee9b9bb2161b43dd76e7c6c8181bdaf942ee1b8a5343174b35dd98188661469a61cd3b6255ac18929113a76245acfacf0dbc1e46de16c5397e2eef4fb2afecc6c7f757bc23eb51c2eb51baff9ec85aecec7c5723e714ece74073c742e3f6bb4fdf1fcbacf3ba21b740171950c9a422391d9a71447debc02f681c2da9945677c698dfc894a740b613fe3cd7d1b607a3b031aa8b6d6e7e5c3d41cd93489daac4463f2658c289bc4bf84835e52fbf3317777c644af264a0fe9616d48ca7e80919fb8d5be4bc90d46591086a1c4187a0fc91d62fdc6f6ddd78365e4ab3cb08f205d7581fc1745a191dc6afa182fbfd8279484e7c1437f0703dfe747db3b417f80a58e1edd5611be591d1b8ec87425ed860c54a9c380dadb2757d6d8272db8eeb373a467199335e97727030f142ee66d037acbb0c493ee265d26a08ea2614d6453bb0aba6ed0fcde9568943c0c4c1bc8461b25cf3e847bce397fd97d87548317bb2ffe57c246373f99ee665e43bcc43ee7cb89fbfbf3555e38de9b8826b1f2f4e9aaf11b11ab6dc86853f077d05c9e780e82df8f4e02bde7dc4afe09bc87463bc13679a6d548ae7fa3450fbc2d01fac26247f2f2231ae5979378be5f2ebf1dfdb50a0d9ecbfdcdf5014fa8b89e91d36501f12aaa45eeb1f1c6988ea57745cbda1e96f0bf341138fed325174b788143330c392c6e2a3cca4eed72aa38ff01cffec7a7c768db90da90ffe8fe55e505b15473123943b16cd594d227a918a7a68b9a821a594473973aecccd055ebba2b93457fbaaaa330c8285b06acec1df6537cdd850fcc2ac622e3cad550d63736d6ecc6d65a00e49ecd923fbd6a379ff75dfafd7e3917fe436d6f3abafdca643fde1619ab72e5edbb5fff43a16a2a0bb1d3b12d6044b199c59e65fe73c24b1fce29d75b6086da6df23822d68731f3cc93797cc9d531ecd268766653b6bd6471b61ac625d25b17b64db7bfdbbb7eb831f1ef2576242cb9c0c06882e8cbba7f30c698cc7bdd0dc42379bb1cbe2be4e05a8bdeb74961d731f6319df9bed8ae6016bec8de6c8ae0a1b82b14f6d4360fb7912799ec7f57ac49f9fffccd8c8180856d746d899c745099fd893ebb7907db111c45707fd295a8ee6fa74571d967bd1481807a5866062c151999825ac63507b9b6996cd8a59ed8ffdae7da90fe60db376515d7fbd4146b8def6b4a359ef0c83fa4616a90f6b78d31ffefe23eb93f28c98db19b3e3f90fc46b7d017e92b08b0fa5319ebddd350e3bb509dde4f241547af16c222945eca1f54152bf36c52244c64e85bc0bdb404bb331747dc025d4129affa7f390d6d5e2f141c1f55884f1ac8e5a586af469fe08f58f507f07ede3b10498ed4e682ab1b8761c1f8fbb4e2ac315772f9ea7283b24a86291208d87894f44121ef96edef78fbcdf6efdf3e433f021cd836dd36c3a4acb325b11c48a99a43e952a8c04753531db7382cb295c74dbecac43fba526da0ae17580d10c68e60bb32b9a612bf2cd9ee2a2e5ae0e58f64ee7384146e084b1269be0d30aa88753b89803a1f9897549e3b5aee6e987e2b5f29973197ec867fa3bd7a2edea27538daae8f53201ac7686117815ef94a9e98a4fc6e535392190476e93dc408e8dc8b0de81ff101e642d2a95cafaa2063d77b109fa899c9bc5f97daf9f8f62cfde880fb2d146d87b48816aa1a47f535e8724c5dfc2a7a47eaa994373847224f2dd823a23b4aa9bfa12b7cb2ec44751bbdc1bcfe75834a97fe44fe7ff36ce8bce0df1c197dda03e3ea0e5d634c7c146d4a603c05f16c610cb4d304ff07fdd93520acba1bc3304d1ef884f428d488775e6bb077d2f6f6abde2fae9729abd2283c42004900f641ba66eaf829adf9dd70f47c1d9bab5ca83fe7cc4f79e5d8f9b79fa71bc5f3fc99f7eec8ffe930634449b068ee2f4c0ee9ee0cc321e91a901c5aa9039e8a8a5bc85d528e419b5117fef319e4268b41ae7f08a4c1a07df16780cd72dbee1fbe3bf6e21e6a919ac1681e6db4bc265e998c62e706d381d9079e566b0e769ce22ca0122a9699a560c91373364948a247a536dba8be3c226b8ec0477fd2a1ee07ecec307f9ec7fbec694a7f0bc12363f41f5b8322533a73c9d9b44a7537de89f4cbe2739f0eed1cccf44e1321db87bee6387ba88806b4031edb526d4061bb42aab69c951594dac27b0d85f2cdf890453360be693f91c580cef86f6e9a37804e97a84f7ebf523f15a577c84d41ff93a1e22d1fc6bdb335f2607a4ec3729b608cdcd835858ea4be7f9ded04e03f8cd4d4dd86cadd84c7d3f8810ac587855042cb40dfc019177ef72247f8b8730ba456ad5dfce03f8f7a363ce2c6e4f9e1364b05478ff68ddf60099af16de04a705a921d50fa0f6fbab653b4a7b6e4de7f5040be0513faef9fa57ad73966667e3a031cfa84e2d6734b390e5964b5ec7f200cf1feb5e225459724f5837e37c8fe3acc9cc3712531d4a387aaab00baada5c6f2dca9e087a27a688b96d68e75673cb0f4a806310f4495cf31deeca87d6e7bfc347bca4fec857f1119a170d397f2fe6da51a9ed278b0eca30123358bac04752dcaadbba5099da1950c539ef74fc3996ffc177dd3cd7b136cc6953c068ff9ff3915bf9d7649f17a76a8c355dac673c25f9ea290f21f10180177c76c3a515d018e1930a15d53c77f5ea9c2cb82fc44b9ba476e4aff848b61ecc6779c8db9f17dd832e0772a93cbb7865b4d4032bf2517c2631c4a476cc6824f4049de1ff5f0017056a0840bc318b9f0ba71ac4500be3d5405943ade2a86acd26136bae55774aac12ecb080e4a5f271ddd626f8081ff977f511b0a75bc2c65a58cb6d27b16185090275b6462c93e74f832bcc914c4d7186c9ce790ec9eb23b56cc565d551763b4cff58ed5ee663ff58fdf0c7fa404ab7b2f4be208841390efb6dceeb32c810781c01ab8e8024279c69d60a2a5b5b31e86187de02eb4fd6dada001f21f16616f1e1ff828f30befe953c24c502e0311480077cb1b6e2c86f8a5a75ba8827aab5b3f680296c1dace3185927eb6c5dac521007fd6edf2a5f287ecb7e992751347592cb78045d4d5f941b5645dd9f0f655918af0dabbaeb9e8b0d79aafa6d883f7ec0473eba3e26b3b9fe3d3e425f878f632b3fc747a61ae48fc707ab86163c7784e777d37ae3a94d88fa15ce262a428e1eaddb41eb13d24a6820f7677f4fa3cf1d778fa598c62bb16bad32b822fe27facde5dfec3d081db3eac22a9ad8e3a5eb84691e09c77f677cce77004d2244d04f2f56ac06e8521ee41ce62e6d82814563cbb27987f7bcc4177e81f7fb1b63f9b5dc2f91186a88a5f601a1563980ff0468bead805e62295613b03845d36a59ed4177a352ec15c24b006b4d165f016f4ba45829da56098391e137209f51341797de76d1b23a8497787fa48ff0f5881ee10bff887fe4868fdcd9a0e54fde1f6ae811fa31f31b4ba8cbcb6abb862c4337cce661505b5569cb7def148b84d7ef23a7e325a9322326753bfab6b1ce1f1b80fd486282b97f57fad0f81ff1906b3ec2ef03b58189dfdd76b7258a2a9de853cc0647fb0b35aaf00004f4dadea2d7a66b752b12d4a9c2ff6954f58ac8f2290b19bcdcdbfe92f78c8f7c6e7daffd11fc7edc0746b0b7488d12826943f4107c52b0447520fa862e6a9642ec58f9cdc0ea05155e1b86e4a500b6641474a1d60cc36e2ee2359878a0f5c3ff9fbacd83d31f0a2f565f88ee62b3ac0ff69fdbf8b27e3bf6f97fc03ff2f946b19ab06c6b0d46fb8ee1a8e18eecf4b0b44675a8539eea23dc3fa2ec782c708a4be5dde82f697e06d411b7546bf8a535c3e51bf937f593ac484d95d11041bd956bbcdfeb1a56ccffe363dea1375eac111ec76be03bad522d3404960fce302c57628ae39bcd7ff1bf441ff9e81ec83e279dcb50947725a88705362de6d309852e99a328b4acb18e16dd7a8efe96e58f0496e697131ec6f371b2b6c6dfad1ff3dfce67ffe495c43a59043b508d3b467127001a35ad1d6be95c9e4ffc232ef58f707d84dbbab21824d779e4c057f6eb951da94493ac2739871fb199dcfa0faee577ce47f2599a07d9621bdb9a2c8bc013f9e978bbfe08f84666238bf80d02a2d9037625d69b4067da91fc4cc0ed6d5826c3b4029c196e931b8af18facfb23fc0246af49866e84fb89e7d63d0b3ae073d1fc4cdb8d46bd796bdbd48eae655d2a5e4330302fc1bc43970575260b9be920339fbfc245f8983ef55fce67ff5c5b313a0039eed1453bee512392c1777e963df7da0fc21084d0d9e4b569b9ad886bedfcf73c7711decfb4e0d0c909aa7bbc19cb676af565f3a7398de57e17bc0314c3519c21ca41f4e23b188dbe13d8862559b9d52be82fe869bb1f3a80cf42fc2d50af762068f3a5950f4a09b6628a67f2185febe71ac92135cef8443401331eb09a859ed09f07417555d83e59b2eb4fcfae5f9d5b05821119631dc48a07d653b5bfd389df3e13b777358f7fbe1ef77ce4277848f6acbe455bfff46a729f2c96e377eec17ad6dafe12d0a7a18ef8797b25cfdff2912863d3cad641cfd06a246d0fd64bdfa810bb4926b77efc41cc8e473c33ab8f0c33bc84dc4f8822fd3c9b8d1c15f20adfc3468138e09358db2d5b4e073ca0e80519914e6ad4939868b5ea0fce5dab3808062b82a32f676c3fc32ff48f7c74fcd77a1a9dcf1ea93523063d41b55efbd2b822895b4d1262c5f14f1ddc909deb9eec80c45e032efd042dd78df55379c378626a4bbbe655bf2be3fcbd7cf6efd547b85d85e03b2df7a5bd64bbbebf74dc704773f26ef511c8678728797e2238cf48af19dde4c55177f9b5ae53aca74b6227bacde3fedd26dfc46b65e387adea69bf4639544c6b0afea2f990c74ee2bbe6543f193ecf8e6c3e227518b78dea79284dd1727eb69b22c757e4f8c4efe1fd7ef7be20f6b7491bf303f0afab235b72247c222457f2249fc6660364bde44b584723183263752885da042952341b6c3ce20b7abcd7386ff9bdf578c447fe8feb23a224a67c490efa912acd56f6365a1602b4acb2cacf6fea23a9cdeb210689807f279f2cb503d854d331d8f933fa83f62179f73d7d64423ea7f71c9398d9281051eed421080fefd71f817c7d1fbc9c247f5fddeea5b9f24ceeaf8dfdc9595a48cb6a17e5a49514635abde7797b8c177e3e5eeb77d65fba6fb83f23a28f08426487d23aae3bea4994b04ae67440c74258167005a4acf33d57daf6c5e6f362796a383ed21c655f5ceb780c79a65b3dd67bfea78f646806abd1de17464155bd48bb46db691d8377f4113809d36c5cd7adbc8f8ce5299a417d26c8c7e098b5098dfaf318602effa67c84f126df1ef4a5bde75e45c4ff025f0b501f76c5dd4b6ce39dd453dc296025822f429ed5a4035a969691bc47ed8a5d1574e1487c3bbcffc18fe8236f6170d236c712e019e2b87a6de9b8de1dc353c7b5a1162fd6afd4c0078bb667873bdb388ce68d755b3af56ab108b1ce8bf25ab59e052d890f33eff4bbdff18ffccbfa488ee4f0d17c085a43ef35c0dafb6a229dbb2be62f79531f6131b5496c2d8bfd4deaa3a3fab6b3b200b716e47862cf4feb61a57ac457e92384f609d17ce7fa9ed76e5ec56b3dbc927111346d4c6b8d8b215da412c4024cc7f89444adaa6d386091f091b218082ae683fb4407a0cfbbfcd0badff3113ede22d68f6c3b90ca52656220856023cf582d9680c900533f829ac1d3b3a3686ba90a9e6288c6d99fa5da2a60354d681e89763f9f1fe8e7bfaf8fd096f57b838f415387cd50aa435ec5aff591c4f6c5a20601eb1050500173049968696f85b158049f2ecbe3cbda4e3eaf8f5cfb0e08f661d331f1eed87d04ef97e083396e8c1ca5931f5abd813fc03c0fea15ae7c7b798e1145739d56a406c1223eb1dc498b3d6bfb037ce47a2facd8fa04b42619e42d4aca3177d687cf8eea7904cb86d4f9a231d840ad880586d8f0f0096aeda734fb6c6f6369ec3298cfba4195d63161fb80e36ff1b8e7df5d8f7b3ef27f5d1fc9d0271243c5f80944c02d05a90979eb6feb23895d2bad2515062160bb1f4be4b356b3bf6a506c741697ca69e3ad2ef4a7fac82dcd1bdb6edc915a330d7ceaefe1fd128c46c0d66acd0fbbb2d40eea98875eb044b5174df7b02715b0b19e124d5fa225d4b067f585599f084ee377eb2337fe1091d45e2798bfc162238cb70d7f30aaad6ca983f59002f5479df38b0a3e251027e79078b9a42631f00f56398244764add5eadbf8923f740aac61593980e6e7fd4aed6eaff677dc413b33535787d5bac97ec8b505ffc57fe9124e6374ce2a1a00e14727cc07fb2cded64e9b0fa4bbc96ac250449fbf3fe5efb474c21e14d04fff77058393dca237ec94798f5fad851ed38020c76829bdbc17d0d8eb975b9b1869d64eb2b1b7f5724f14efe8feb2357e306ffc654f5edf8101fa55e6f3128ccc7e64ac2a71cc92e9e77c80975181e3e791df29a2a14678ca079708ae6cfa7c818d5e7557528682810a89d2cab8f7c948ffcdbfa08af4b42eab0cf9f12da8ce5fa7aced96d4feff84742763a927828826fe52f5d548fd1e8280d8093d37b529fbec87180b53b5bca9fe823d2cdef8a24876fdceb2163e9beeb1f81fc1675bf39b9dd1389ea83d8d7fda02eece7f5c9795f02440ba75529f437f356c6bfc3e5eef10fea237c9c58ff68484a5552a5617537ba0c14db00f177ed80c714a2fc594e285e1bfcda3e983cb7876211a46b466483572c9de5ba457d3cf4814f666aabc8193ef23f7d44caf0111e0344e4fa6d73d446c67bfa489233c2eba35b8e8ad5015f1a1db6ed36c144817bae8412c3a8e7314f9fe9f3adfc9bea3710b3142887f3f818711ef82b3e12207feeb907691f90ba90b41e23cc45d4306c1d34db96238d01db85e46a5cf3ac9ff58f907502dfb87b50b7dbc9a8eb885009c37526cf9b95e303c6318d32e5fc9de82190496d53fce64c2c047b0f36af7664e72647499b0724ded94b629e7f878ffcdbfa482a4f67f32200cf7c3c0d241d2abffd3a5e8bd9b4d8097102a7e5349cd3caee4e572bf740f13c80465d76c23123e78e699d910f8dfb3df9f73ac60878e078613735ca037f19af45682c3ef1cab1067c848c9dc4d36eed66d511301fd1ecdcfa15ac0e84cea6cfcbf2f5ef5e773e2ef22c61234d7ab2bab7f56595a057b89b051d872b04335ea188561b5a237a4a2e7352b53ba10ef03b86b1f9825e912c193b6fe697dd4c7d95df89abfbf7f5919456a4762d598884d1d091cc77f491eb18da0e9a38ca76307b3ece84b16f0bd99a883ee623d45e92faa93f8e5f7e3f2759ff48d6be35277913bb993f9d23e37d7d04f8a26b5bf23e2076aba3b014e2738cefa1b63a688979a25ff29498c6c512db5c363636f8b27cf677f9077f0ee0fbfb83c6ab232eabbb97cbdc83f04b6b6fc37a78f6aac56a036770c4a8851e9f9029d81aa99dee2c43f50cc6537cfcdbbc535b99a53dc3adf1afc6f97bebf1888ffc5fd747b2f9002c8f0cef14c85118db7dbc4b24466f33fa48821b9f8df18dc02b15c6aaa088d2845440aee39d7680fc7282b94e6bc3d3ba7ff0ec31f1117fde3fc2e38de4840f022616d61f26e7e919d0906e6391794be2b53a9dfa60b3ca51bb15d6d6f7b302eee7585f0cb761bcdf853ad4a467f5d4d3da9372663d7e62fd135b93ed369ffbeaba8fea47fdec42cd94da0c34f1433745dfa063245868799a3d06bc9ebe67bf1320c68054f2f3e13f585e50164dcc4b9dccbcff8eaffddfd647b2bc04e8704920b96bf360ba3a6c889d3d93ab0ed88dd50e41302d82bc4b6befc28a1c0347b93ccf7ca801fb90fe3ca2b75fe11fa1f749ed72f01efc3b3e5aba53a89f48ebad03af031c2d6f4671c4f07b1fa24f2469d1df2aa4d621e16d0ce7de17764d3d684a398811c8c41467fbf135f9ec1fdf07445fc4fadd585adb06c49781d67dbcdcc6cfa5793c473df511119c7f6a874cb16cf0ffe1a48045b8373ccfd635c0f14a7c241fb53d92ba637778674466f827f4916bf93ac1801576b65bb9d806e47d53bb08a33d60632708a60e44a1385e24e56105d6259473ce8b81ed339a9ecd55fb6cffde937f25669383ef207e0bea6e8c56f261c970b6a6a9be742cb9583af14490c32f12e687da60b339637d0374241dff7708bc643a26363893e681b33e68896ec0fbf515f85aef5d535ace6c6a8218a9a3dac2253cc0cde20ba419650c9b46e0717414ab99e5f7739920cdfb213ea245657b6eb7ed2a7d168903b3584de6b7628fd31ccd1417e5c656f98fe823d7bcc4e7f2e86a22c93191b452dc131adb7b3659fd114c8f1795cac1732ff3b9b3d1d0725d4c68ee77cf49aa8f58577c847c8fa52675e92ca556e4a84027d3bc165acb0ade877bc73f06b63edf9178325a4f90d7e538115e7461b55252fc965b5c949fd047521e4fe9b52ca851d47b2e2d19be00d30f337c82e81d503d228b029ed82033ba18f70fe1efd5a56be7b692a0c2f8af6c5beff310daafd91d3e41f08fe823fcde59b997c8dd52415980c60ebe683adb1c9b11701a39dd6a87581a134aabf616e5a42745c5b2fb7dbefd67c7fd2b7d244bcb24126ff644ec6796303ece94093269056db21ba8871378c8133e21aad2468af41c6f2295e48b3c91d83589e94d58a7811a2322c7f84d62a31facc777af3b7d2ef35d0817c189c315ded1047311af0dd8193d86f742eaa73074a48a7485ea94da20134bbee3b2982ea2c13b6de925027b16f0e4ac5deb57bc5d62fde27867d97e8f45ed1fd447b86d4b16a278eb28c76ed6dece69d151a379ed64963bfe1ceaa63b7e5c1f6f96ce959de9cfed56efb56cfe489a8bc2fd3b24c70350d7e6bb4e03e5c9ee493c693086c0777cdc7f75244d2abeedae5040fe43f1f979bf69ed453affc544cff97a7cad8fee013abe9510db4d6138f22488812015228ecfa9be48f52ee01b903792d4850c533e42f495691677003c8f1477c0f7aef8c8efe26b65f92c5d9be23fa58fc8895d9cd885963be975596031bddcdece6c41a701ab26fa9260cbabbb53e5d5ae66f2daa41b9fed77e923a92f387d1ec57ad934a43e660d4e6bf54a24ab6c5c1944f775a6e7bdb7b0833ecd6581382d7a1f62c3a27573b544e7a14dfb717de49ae7335e29a8d2c06c201330fe034470334946db1a793ec98c83fa309ded096ac32478676e6aadcfc66a9fb7e04781caa94a636b462ab337666d85b77ac86dbfaee31e12be0b717aff8c3e729b13087ef6f14075fde3255be79c790941fec5f22e541c5ba3b3dbde3a6a4ec8d9b9a9d0e7755cafe27ebe674eb2fa48d63f42ea30127c10cb6e2a879c93438e82f5279e93081ec357f4ec843977ad747242d49c137cc290611aae12599cf2ab740db2afb3ebf153fe91745e0361073e128881809d4ff197d725c21b7d778a29165ebba8ea28b649ac2b2ac14913a9fec2e2b692f53c98e809780a928785d241c8621c7f540ee03999b7f2c3bfa28fa4be544a33a85d285aac73deb6933921bc462dc38d27b510318dcaf9919c0b769dde19eab7b25cef2c4dff2ccffb883e92ea53795e5b96bcc7fd693e97eb4e036aa4e0fee3b140e51e67e0a887cd7cd2038baf4578ce85f8d02516f3cc7410c045c93c4f13b3f5477e4a1f91c4ab7960f6b6cd2ad8ea9b06a9e80afe11c21791868cdd732e3ca897d3c93b1f5adb5cd4583a95dccc36402f838c64f091c01c2451a860c900ebaf671b4397d8f7ee7dfb591ef2d67ae8a290600d6778c93fa38f6469c78cd455b782ea746e1b409b127b3a956bfd53612f202908d133601c2a7abb949bef269887c889ffe07b7908a5ef541fb9c583bac3a10aaa81880ca73777b0bc1d9aaf4ecbced9fa69b43cce03a12fdcc6eddedaad7eede7f949ff48c29f09eed7408876b930f697c013730ba4b9bed4474bed3ca9eca4a04a72d707244a73dc1b542fb9a5ebeff10102ea009589180e338f9df0372bd76f1fada1727818bb70dd176ae7e37863f03a809a59558bd43fb9890bf8a7f4112eeb921c12afd7772bb1d3a6742acd5727396efed940f5dc0ad50307d363e95ccdc55e0f0580e974937ff0207ee71bf4917b9a9be6278ee24e67d328b9fea6d141b9f5f445933571e735ebb90d44f04dc734de39fd7df29cdb79bea5a13fa58ff0f173fcb09860116f82de617e2a21a55fb48df373242d8ddc363ef9836829447e8763358ac4c7b110ac5d0be576b93de137aa1380ef9d56ca20b99a3e324ea361a82a342791e4fb643117b3e3a7f8c13afe4c0bcac05b853aa9bb05f52907f75837ff9c3e02f60cc0ffc5f26eee903b625a738f9785b975eed43ee7ceb9cb78e47bd5f305f9d32436eb2ddaf3f573721d1f748fed91e0d36f54370e0ab37c2e8e437538f3d5218925037ff28a8d393b07bfbf1e3fc547b8ff8ab6fed699d55696fe126f4a918e84b13022bea928ebe722317298b66baf3363333a147225c04af16cac7f402cb04d7df1b972fb3cc4648fe993d49ef7e67c0026817014bc5c85d52b29da0a60d8072ac1f7baf1a7fc63fa08a7ff80dba8da5b4774ba1c7b916abb6077df8061be0ae8fcb9da255e74b74a50f56d51c3b323d2e8f16f18f77bfa48f673fe7cce174ca077c2c64650a71cefa031ee27d8de8ac24194585ee130f3fbb778f4ad4de76fe823f0fc1c5d23c0c9aae766fe6a12548d9ced063dcc1701635e26747e2f925acc80cb88e97c4ed4fc5e14aea4c1663b878c5e88705c2344ea5842fd32476db7832a99179edb93f5ed5f8d1fe2f0c4d154130d6301b5e50591d48eb4267541102e57f514ff257d24eb632739e74b6777e80d1d35883218f0e01391b0c0e2e4ea585b5ce61aa131070c912e96ebbba4a6eb6d3cd39f61fe7da43dce677f84ff4b6b39d1fabb7dc8e1034469868beb135cf5eb9a8a6fcbe16fadc7f7f291ebbc47163f0d3638884983532f0c720aa3ffab441f4c7542900ba02689e7db4155192ecd5cd3f12fc5b9437cf381a3ee1d641c874b9b6153666317565763a557c8640e21067a3a40d3a8eb5794833fc57a4f84cf488a3b96fcfe9fd047f8fdb86d1bd31f1bf5835c0bd0d9180f11a87d1d7cb7b3113296657c42dad16c1212f9136b87c4bf9de735fa92fb7ea53cfe963e2265e8dd98bd4ee76b94e4d6913a1e50731db00a99ffbcc8f0e1adccff86495c564a43ffa63e92ed03e80a47c6eb8b986f00bd2f0a62ae436c8a75d6ef27c24358aecb4aa5f54be07dd00baaad4aaebb5f23e3b02638296245dff6b603d75ce648ee089b0fc0b1c9cc41c6a6e51ec9bd087ebddf8fdc5c2fd70f0ab901d661c2ab3a586cddfe117d84c7b4723e620ad1aa60e7d6253fa2f6776ad382ca03a79a6dacfb3bbfa535fca14c6bee8912c3e93059bd8bdfc5f8fbb339e1fa88ff40a7b8a57f21f17ba4d8ef3ef3a97b045f3dbd278d75a5afafe2bf7eb91edfc947a42b3ec27904d11bc97864e2db294fb56088f9058d2d83df66ec4e09963cc4a3c9f1a151885f14032d5127a7c6addc30378adb245e2d169603ce0beed72e995b52b784c6b2f59d67b4aca27351c8635d644bf26b6e6c8cff843ec2f908a7c1f833dbcf8d1d83d8b26c6affa048029b783d3dcd5167331aabed31a991fe94c439c98c0e65f59b8fe4b07d561fc9f29107f679f2ff1ca931cb7f47fde8f7bc8ef3a27b3ef277f5916c7ef988f61feb199467138c809c26529c2da8035ce4b8f1ec3ffc2a133e0316e14dd00daabb56346b4ba5d2c226f98751326f746c5a369fe86e1d0097c511b59c9e9b9cd63923388c9fb7b6f694c9abe1fdcfff33fa48d63e84e9d46eb1d49102158a0f26e47b830fd7b59b1196b0cc455718e62c8237fe995aeb9f6df7f547de9ab38f7dfee8bbff863ef2b85fd79f953f7c2fa0f14477710f801f130d499dde88c90109de4046af58311e7c112566c7c2ba085eff3ed489f7cefd23d4fb0d4af81e9704a32bd3ef7f421fb9a19d801faf09cea13370310f3974793c694edaef4fe3792f5245adcaf3f1a42feec79fe8235fcd537fd58fbfa58ffcea8a1bf2993fe42d1e9ce181787d0fe4eacc9c9191cbd98b5c1e6abf8bb929d7ddae7f0fb9a4c43626e8605926759891d75bcfe7664eee15375bafed37858d3025eb71175bf1cfe823595bce4c9487935ca16cd30a37145b03e5734fd35dfcc264d57222f7fe2d3ef266fef45f588fbf350769fb081fe173457414b04186a15f9b95436199db9549fd9205a9307a3d4e562f136c8350af17b708eb2ee3a6140ab9e7fe93ddcabd10dd04f399404de622b32eff843e721daf9587d8d7a9bed9b93dd7869ab3b40e0952ec7caeb86b092afc36f79af871dfcf47ff8afebdc553df8a1ffabef97fbc1e7f8b87b06bc247dee2c1999c50ae8b093551eb54ce9dc5292ffaada99ae872e9ff595e08bc9f8ef16bb0a15d367650ddaff242def68c0dd6491667f195f8db8be296e87cf0ff61fadc7f421f49719424e69b8d8793580d84fc94d51f111d3576367ed90b3bcc0e547ed0b79f6d6fe239fd85f5f8eb7c446cffc6ef434ef761cd67fb7117744b5a6397fae46fc64ae2a8217f0605e517df6e17e68363b5b4c83bad50180b3bf195e0c5e0ff0995441fb9e5233f4533be4b1fb9c150124ee293dfcca361df518f5df40ab821c3853d8e2eb64bec1f580f017d84d460fd8afc908f8cfb2d9efa3f7de49a8ffc8a075fc75bd589afa587db147800c43e63f96140af573c135fdd13f58b6ce4bc9bf7ec5cde77957c20a8a41e4091f89a004b672dca577e2a729f7f461fc9bef751900f072ff9c8e94532444d0f17f9596916cd76136ed710a7ffd34732ebf1d7f9c83bfac875ff68ae25593fc39e02866691f9528aee9eadeb35be097c2f432c567eae079528efa32596ba35d1f2a19af88ac566acec86f0afea23927825af8a6301e517f96554a0b59db0b4d552c5ed589a78bde980c9ab75a8bf27523ef213e37e8ba7fe4f1fb9e623bfe2c169fff32cc640c327a49efe9ec661257e113eafa486b070c152b61a96f32bc53feca7e614eabb6f885f5d26be27b85fca5387e973ff017d24f5e326713a8d553e6e1f517d07b1a1a1e3c792539beff2ebb4ee14967fff361ff99f3e9269bfa58ffcde38a534d71362b2c02702f1c5a46e7d366f472635869358eb749efe097d449a3f919c9121f7cf06d563538b91444e887b2a389dea6287661ea317f83f552343b77e62dc6ff1d4ffe923d77ce4573cf82dbcb3ece7d7df5fc72a108c66db05ccca1bac4a7ae57988d97c24f99fd047a41b2c254bd066ddfc46f708ce2fd4a3ca0d9f979a7298aa24d694fc4fdd313ee2ff4f1f11fe037ce437fcecbf3bceab9c4e21ad1d63de7c270991886ed623e5233f4533be491f813c3cc24758ce403008aafb97fc561b3bbe13389d4a65631d7319cc5ef85f9ddab7123ef2dde37e8ba7fe4f1fb9e6231fe5c11f1de735364a5a0fd9baffbd30657cc4bafedf3fa18f2c6ff4918b3070e3dddea9ed44a7634f7687fc2ea862f97325c42e64ec04583bf3ff3a1ff99f3e92699fd047ae72cfafda639cb43446fcfa7fb01ec29b7ce4a768c677c66b59694381989fd7abfbfcdef595c63cd7dafa832d44bd4990b727026e8a26d613ffc8cf8cfb2d9efa3f7de49a8fbcc5136ef7cb23bde3d178d358f0340e8b3f67987c47df833e62de3fe71fd04752da90e2a21c85d030f287c5387f5cbee44fb10af97b4286e730bb96f43f7de4ff943ef2d17e3e8e7f4ee280d97b9a8793e27e65f1b532fffb17f491842f319a02f537f05513f2f973fed218e74bfeeb5026d8b79737ed5a3f4d3b7f5a1f798b160f7f431f796b9e1edb941ef2f8876d9c598f4736aa8fdab2defa1de70d3c363cc5f3cc8e2bc58dbff9ff8ff0117e5e299651561ff96afc117abf25a93f82f9c458ca97f3957cb551093bba9caf2df75395d8346475472a15737ca59fa0dbb77233f0b1efc4d07fbb1f743d4c9623ff317dc4cfb45fe9008f5bb60e318fadbbb231e1f5e0fef3b7f48acfd4307e340fb7afb3ebf1f3f85ad49ec0f157c32b9af45534fce65eee49cc4f07e29350135f3b55af7d32267e589faa0dc9eb410e5ad52438ebd7f2e8775e6fc74a5b98e8443fc543a49bf518b3f5784ffeff55b3def99f2cbec747f281caeb846570cd6eefffe8391f6dbfde9ff7eb91693fa48fa47c24142f0fe8eb17d36a2126f9de34275a225827940ec904fbc4237c84d22c9fd4e9f8391a7e3ddeefc288b9a7e38f6833c43c0576fd837dffc8fd6faf1f6bb82fe292c54c3de2236fdfff16dbf2adf6d1becc1edc2fd547beb371ba4069c325433bd3bcedaf7806cf1fa1781a9a38142e538de06f50fb46917c4e9f6933ecdbaf7afec7fac7691360b7431efd85f4f3279e9f6d2693cb095db6eb1ff84f5e949379cadfbc7fffbf3c07bf4a303493f7599e6137d8da980f9ff5b167bc7d7d7f6d603d86783d86f779453fc6472806229ccbe8863e7d3d1fe1b488f31022f7428d756141f29d57c289f011f21dc341f9de764fd7a8bfffa7f491ec3ca7f149b43dd20f6f9b7cd756cce7b07a976e4ba4a6d692d91497fc7de633a85db948d6427ea71fd683f6b8ef69ffde9f23ba1e9707f7a27ce4573682afb8ca62ca4786552bc114e432e7573c272bbf9a097ed3138b0386185f8d60f031fa553e913ee493ff7ee7f8effba7114c90a131bd8a0ffacc75fccef7e93c6b09861869f9fadd7adcb634dee96d1b5cf6b7fcf743f1de3f71cb43987d89ac87f98bf578b44fb8bfdc14efe7f851ffdfba4a045b8daf8776751f6ed72a635a52c634eddbae98932eb16e1888911818174cc323dc42b1fd35f787fbe0c6de0b157169378472be413e5f62fe5912eb6239af8841adde08f019c5fdc837f1ff9658530c4401f7e59bc79fed1f3c17ef8836ee179e0bfcfccb679f0fff87f97ceb3ef85991b8166336efb1d8c6cf0ff095ac87a8885311b146be4f7e37157ba4f9f83b3ff90d629fc3f7118c0b7e0ff7c72dfb9c645dc4a9b085f742b9afd1fe0a5b7a9faa49fa875fe75bf8bd8bd7c91185db7e90fb07f479ac5f117d3eb9cff5efda99e7b6afe7fdcdfd73b31ed97d09ff4ff8c8773656cf95e82143c126677528ded657fad3767f9f5cf219add9a493384fa0514fe2045fa13ec933c593bda2a13fd828dd223cf52be6417b380fbc9131e2f1f271f2f520b1d24a89c41d4cd89a641bfb1cf2fc48aedfa3f7e9ef9f32cfc9f64583385b524f8bd17e786d7b42c43ea3ff7f26f7a3b5638677f7cd5e7fddccbbffbf3fbfd2cd7adcec871fd447680b983ef2b3fe658ac9047635c065c42ddf66b96b7fc7cf4d1bcf57f8ea3ed07a88728a2322c4a4663dad590eef8fd44782758259adfac0e771af5370fc5d22e333fc615e7791e2f79e389600f9ed8ad445e1723eadf7118a69be798aed2ec3ef31bfa7be970bc164a4cfa37da6f79ab3c6c7e067740dfe0c6a174bf19a3976fc47e7379b3f92693fa28f709990d2ecf8dbf4117ebf3bdb382060028e2bc95bd626ae1005a6b099d721db9f61ccfe843e724fdfc32fd347b27a42f619f8fd322fecc312cbf7067c749320e81cf00e9c89b978f760ceb84d88df270f35ef670512bff0c4e82ee5cb45c8c9110ee435a9e58b9f738b332933db626a83c2cf104412f340d64c3860699cd8b4481e21d45439e2d725725fa8c37b209fc5640cfcfffbc45e16f35ac2cc2e96ceaff6a1f94df7677ca797fd1c1f91aeceea4fd36ba85bbe82bc6704759f76826a5735f3b2c977f25da57a87a3f1530d685ef42d7efe55621b92d99c639a0c7e21c05e67b6218831003b928fe5eeebdf4b499f78ecd22c638f9ab3df917c72527f71c19e49ff47b1f72d429522e69722cf6158f184cf08c7734c4e288d89c03c41047ba39fc18ca73c875d134c4d93f08915b3abf98cdfc0fb99282518fa9cef7dd17a103ef2dd34f4dae6417d99d9cfbfeafe6f359afb3c52abd1cc5cf883d5601c6bea2a1ee255ccf732f4f2bbc77f6fff09bfec39591b93997cae11ec5cd353817f046577253898427860e773576201f351a09d6ff139763f12ff6602dd263adc13e0ed923a5163767f9954d5d9807e11f46c77de12c6912a8c176b8243b3d17d71e46d883ef1446a585589df2a8fe79ed81601b3a4f60235dba15f049514783be0e36be535d65b3cdbc59f6ffc8ed72375a68a3cff03f051c01f063c86d46261ef3336b38faecf2d5fff793ffb5bf9235f1daff5b8d17ab383a05a9ae6fb8781ebdbf238dc3814d552f879be96d2adefcc1f019a5c64fe21a0f93d4183da82c2d01f28077fa03d939ddd2f439cc1bdcf81c65451ba4ee47f42a38b04a7be2f8c822adc03ea69cdba04f710f2c4b5dd24a8c6dba3d219ce4ee3c3a23f9f98fe7c725c4e1cfcec1ea9f3e291da2923419dd7481d15a233f8767e405046699e79405eefc457f8ddac8bfb7a094b8dd16e01fdc7cfd2d86fe87e2a126cc680e8313cde2bf58f7c7c7fdeae47f2df1fca1fc99eebef8fd7baa7d99a80f784bd8d2a950aca39bdbc9ac73b05d3bd5122df7eeff81fb534ced4fce4fd6ffe9fc419e858e2d181b60b634ccfc7929a1f356bf9f1d03d343ac361c57ab55dbf37ae82dd0930907913a6f8f4e8995c3d9361eae39dbbb1cda3d71945b6badb6ff543e3ac4dce7b6d30ef29bab41ae4b555751f579a613c50f2faf4d45f9dfb4eebb019945a1ae6de95b8bd9ef4dcd2586d35472b2b3ae527ea36a8af2641bd75995ba5a95ae89e26e75c3cdb1ecff8b35dde681879d37a3e3470bfadbce48f7a9e35693ecffc4643186f1b82ba36bddeccc37d2c10dd83e92384df5defbbf7d7275d8f9bb5fa413e42cfa57f95aff0557ce43d9b8c9ccfada47c14db9e7b7e723adb95dec1f4b481bfa731c23f35feeb16629efa1dfa08e8041752d703eac5ee4afb5561bc6977cfea76e574fcc051679a6dd85a3e7f3ecc06a367d0cf0856885acf2598211ac311497ddb94fe8f877e6e9e97d1325fb00dd4705aeb81b6e82aebcbfae828b6e5fa3b11e5b627545f56a0b2a7d34179473d89c8e80df34fdd7369624b8e32f15c5f2d3b8a53cf3fef7aa6b82fe65fa6b57c942f22e358b6f595b88d96bdfcab23b97eae19a0c0418a3646caf4ec280db1f47cb196e77543162b17c9392f64613ab09bc0a7887526d58d3ebebf6ed7e36a9d3e943fc2fdab5f41534da1f288f67d01cfb88e191d52bb3ca18b58063faefaaf4e6f8d169ee322bc4ab22d061b526f84e526de8e97cbabd9f6153c8ddf1fe45e8ac3a1fd525ee6beea6c9e351fe398daffb17e01f27f046325be08ac6f44c24aeeb5b74250a8acab3b7bec5c8607bca37d5a47d0733ccff16dcb51764779da1ced3535b8949a23e7d01c5d4aabe7dcb45591660b3ba86e0a54af001d23345579e7c9ceb18514a787958417f4eaf9e815aa4103fa387a71fcfd86d44a7f452fe809ea17e3cf425a3f9da2ca220bd5a12625d457a7cde99c6ac89091e31fbb91dc8e1c1f2b1fae3b75fc5307bdee378abef0d6c8f3e700dd5cc4cff1f1772ad21c75db414a472b3daf2cd96d0ad124de1c9cf2aa7c943d6103f341f598a42ee23defbd97376eebc164f3d96f65d16c5defac7c9a7e9fc6ee5899989d22b36d739ec1e85aa6ae50d0d792fb5ee713143334959f7d7a7f6287279826f4391db8129b8c943c6f85f901b7ab139ab755647fb79b3d47e6317f29efcb9806f91e02543ac76d394b4d0ec45762e7b9cf470c327dbeee239f0f29f98fcfed3cd01f4cbf13db3df80b660556af89de9b60ce82c4e2db7633b4e4b01e4e816e5fd873c3cc98a15f17a8614e6573ac0300ad8c092e2df1f3802e013a861c4d8abbc232528ca3b393b6cdad1287ebdaba2ecfec1ca6d9e2ba6febfb29a6e712aaf31ac3d0f02eaeefa7c8d837918126b899f835fe1de60198e6db7abfdd189ebcf9bebadbc9f25c5e4cb6d54d13df7313c37d3c179f3417ef5d17e613ee8bd895d52ebeba666a1a939a94b7d7f9f46cc209f317747db2f783f750cf32fd1cfe87ea709d4f497d4b63273aad4bde36d683308e9e9cd3ca9d9d6cb51f970ef25218e2b54b6a66b1bab932f511111bdb2259d7d43ff2988fc809bdd4ee68e71d3d25d876cc66228ed8556376067206792d3b567b28fd2fe52379c0c84b1a7926b197a7e71b9e4b7609d49510a97ccdeae57903669b9778fd55627339800d1f9e3d71e515eae54d390ee3852baf97036d305c38eab104330d18f2fdd56e1fd4831ed61ad39c85bbba796fb66b1a948e5522f55fb98ec36cf6b88f03db0d62a0f3761077826abbe30f1ab2bc91b7f26eab3a85e3210a5be5381cd98ada6bcbfb5debe0ac5f574f4ab4158fb5bcb9685ed6fbf9a23b35a2705ec374fde45554dfdac9db716165a1a57c6878f2d1360e9bd171ddec9686bbdef3f48cea40c79d3ed0f16c6d61a80b09ef1d17e839924e5d07d1faf59e803f17e077f0b9d372045b6f885d657f6a94e4d3a2525a627e417eebd1fa9282e7a6f7fdd32b9c12273c0dc83539c1bf7b1fcca74438654e1fd5b727a7654fd072ee8d66f259be2c26b60bba4b80e76e6d825d0f743588e583daf6ac2e31e5d961929b9862a9a47ce43ed7eb6ddb00b55d333b35b78fc395c8c1ac0eaab06035e7ae65705fdc5ee5b4515c2c6ec7a7d70bc3c1ea131bc600eaae0696d0c3f235d4952d62da3b20f436e03589927e503cf1fef124975a553bb7779d4eb7ebb466235477455239d4de619a746af4633306ba2cccb97ff8a1eccafd06d6ddf8c34cff891f9bf59bfb81e13fd1726f377713d4558c756b3b5b2b95cbd23c8cf7e548420b90df4f2b3b87e5efdca621976b2db7e134ec5c577594a86a1b3b1529589ac03412193196fbe58aa31c36276b591c3cef4f8ee2faa4fa696e8d65f593e8dae7279473dab651c67a02de25be5ba47557f889b86d40db6157d566f834456ce7b3069f631a6d2ccab621576c6336723aae434f08e121c9eee6fffd448b40fa3a6ac01be05e595ef7d1fff33e80f4e716d1ebba84a5bc3c9e8f2ed6bb4c8495ff69f5b4cabf46d2eeb044520ff3ee3ee5c7ac5e09958982aa2164eb60b25800c2476e6396eee5fc5bb92dfddc24d887cc4eceef417802a9972a74494c148bb711f64249ae667308001b8bd5404debd9be08d1465e6ce55a77b92efaa3d9935cdf3841bdd108aa935050a3a53fd814ecc0efd96e43c2322720540e40ef00f9d37617f6b078aaca8d4dc3e9c49856e20f552c23e39de2398147b8b6222bc20678d0a07eb9f533f3bc81fbf8d4ebf1b3d7980ee5f0b8489e3cd4f303dc2edb55157fb0b0d7fa20aabccacd4525aabafe768f0c38ad5883ad2319cbd4b2dc22fd1389dceecec6a4de16ad058c8056af11dbe5aff01b0705c8899c0e6e21dead2a8c07d3fed76309768767b7b7f87702192f9684e084042ea5f5b4a6306d641e444a7b815fd416f85e61c263e0f7c813e13ba8418c4f5b07fa4aeee993e770da1dc2ee3ce7f10efd2c2fc1e3b9bc523e02f3403fff0d1e05f52e23ce0be9bc8124e84df17b1ff426b788f98ced78280715c7e5b6dc91bb728fca434426e232c2e54a5e6075de091fb9a5ebf74dba8aff9f5fc5efc8ccf7594ce46a8fc8d16057b1589dba22b9d2f3da6379d437d8de98ef34e9d9750f72ff7894b7fda33cb08d460e8f4a8d9f26c38e793ee4e63b6fdd528cd9f37479cc6f476b7dabc5ed714f1e0ea2997f9c355fec55bbe26aeaa9abc8234c8b7378669e306dc1b486ec0e1774927e551e035e38f0102c97fae2bdcd29d537aee7e191fd8cd77e0d7c5be8cf03596b75965aaf379a48fea61c384ec79fa3fad2c527a048a41fa071f563c9b5370bbaba0733080f265ded2062d291c0e83ade9db21e844e3f16f18e342e81d369ac515d9e805c7ede9e65229f3fc1ee3d5e48ed6018ef2b919c42b8774a736f6934f42be5239c97105afc047c17f7d7056d1c346e7a3af895d26f72423ecb4742ca47ae7992f77bf788d8e91758fd642c2b1c75cf5ea3b943aac622a042e8153d3bea668f96f95d1ef4423d8919a33ce351bc5690f847ee73c3241e170aafe74f0fe92acd1183bc0c380122d402025bc2622d8c83ae1d6c0a78b77bf63cd22feb4533323a43d988f4682e9bfe201ad2264d84b1eddb41d915d48d8ce5f62e5822a3d9e6509137d170295b918c34646863644455a7851b9638ec5cb83ab8ce652c4c5fa62fcb812ced7a726e7ff0cc6304dfd9bad290f3e6080bfd2b3c7bde793b9c7be2c1a4bb06d344e570c67d061e5865b6744bbc9643b36dc8e682eb1fa71b3c27fc5fbf236c56137fd0aa18c572278cb1a66c38116896a9fc8f5ea81c7f960f3dd8195e2817405f38cb9486e32b3e31f4f76719de7bf6aa15ccf02e0fa1ae23ee3f3e194ee79c87131520321e52ef113dc14920bb01f409cc2bc33dbe0f3e6da5f547f59144da12fd19d05ece3328f63ea1cd02bb3f97dea2ac0ef137f511ce1be93588d83ad3f9861a664f5083c6b6b0045b959fca65f9797126fab348e49fd47698fad933364ec647a42b5eb1baa193b7f23ab77145c466be035f68531feffc81fce20f94289cb4b6d573abda1b9ffafb72658965428bcac90bd75176f9d2f3b20872b55c742e7271fab2569426d865167d7b355d58cfd3557527bf769583e7741dbfba845542af67079049f1aa16b09422396a9c43468049219a603979009f23033edf3b2887306dc534c327920b60c70b9c2383b5b1a5f6ebb206f5bc135fb4959143b3e37ecc4356496c299d0755186e9b0d63ef1f06d3722cb1d380980d660e2b05348eb5d0f1b9a4521003043b035615687cb8872bd71fb87e809ec0928abff7033cfe70cf258b7487111a0cf70ca1b21d3e815802f3222c9961698956defe953ef290b63fd113017d3f6fc9fc855c12e2349ef195e26fd2fcafd647a80521e527841f018f83b985d7a05fd986e11484825d98123b225ec35941e860396295d1bd7de1fc48a648fcec599b70d64f3014537bd798fb1ca88f539ae88b8d24d7e393bd2a380554704fdef274d8623a6f5cf2207b3baabf045a4a3936ec1864d5167827779099b6b881944b3eff241fc15e1fc6abae53d13705afe0836d06aff634004b23e6982057027dc0eb32c33b0decef1696bfe13dc89ff87bacadb9e43b44a40f87d312b23b4192c1f73cf69cea3a57087a5867688f83baed635e46721c6c379145b3ba47d6d6c6f806e840c033836e50ef0cb7b3c358af290df013cc9d6607e4613f82534276a840b4c9a720a2340f788447d0ba0b7c77c3dc10e9864884a9c421721b12fc1fc6e7711b14a3f9a067c1fd027c7c024c32c8ce06393c24a72fccea1f8ff59166fb863663bec6ee4f6c5789c61fa6f7e1fd02de82c7f957f511bebefc9404084ec7394ff82d3925784fa895e24a3aec0575e2420e11d61f63634de4819467e489cdf5813f8bf091d4f7c16d4cd4260f7e5615da3c1034e5303b0bcff6343e8dbcd6766b15a2b3ba2cdab9fdda366209d3702c11611a0a34de9f4f31cdf7c0decd46cdce37d08acb2b9563a92c4b1bfc9ef10003ecf3a93d9fd1083603dcce9edacbf93d6e6924ff8f77fd5e60d283539a146668316d14e6954b45b45e49ec9146b4ff5dc6276232ff0fcf45a0be67988f31c42b95a6ca7e3b7314e8373eed2ab1d7733f4142d3b23ce1da26741ad0fedfdafdd3eb233f8177e52f603a4bc86926ecda3562cfced2d837f511c7bd93ff93f94ca4aa30194b763c7042844ff2914feb23292fe3fe96ec7df03cf9836a6181a5fa4818909a8921b7c3c2ba92f5a6f1c9ab7c9de8c4a98c40ae704682186cc6b6bbdc91b81ed5ef79bd6dc31fac27274dbd4ccebb5c7fba1aec76dd526159eea0e5be64e76c0b73f2c0b5b194f3ba2ecd9df696d272624378b9a301219f6507952336d361429b984d82cac0995345393ee501090de3b483d39aecbd38ade3cfa77238dc33b111c1ff7cc705cf993b75dc53cdd60bab423c538de274be97c695386cc0d84dd09348bd3c12c31aa9604bf3074b67d1517d7fb444f3c9f2d42b34da2e9cee5412896edad58e6327988d11bd0c57888f37f3ffab6b98d2563eafe915f833b1e5d88c6fb8896d873c1724afcb9ccedfdbfa483a9fce1bf3c95e474963cf81138279c96778087bde67f491ec7c5cfd9ff40f7f2e14d62bb7ef605d773c94abc6bc777050af10f4adc2a6b0ed8bd602ebcf95a0ba38cfdc799dd627e18ddbb566fe6235f367c1cc1ff7c77174a95e1aaf7b7f2b1576b9165a821d7ff78c4f85e9b41665a7b377c01208f23e9c0e7cb48a4e86a6656968b6517a091e1ee0aa284b0313ba91da24ae572a43cbb2f267c227e07bb83fdf25e4b32b5e85180da6fd839d51d8635e05b4db38bbc4429c6b97b096dde8f50b877e6df6b2f797d6f6793e695796fa59dfced6adc9500be7fa71afbc84f14eb08d3dc2bcb217c9e12ecb13d395a6cf83f1705e91f208ca63090df7a9bfe1b63da2a5e91c65bfa3cf813e807491f161cf818f004f794c93aff4912c2fc8f23ffafae9f1e79fe11d99f6497d24bbffb2bc968c9bf054f41423c9d87bbbc3c92bcc0753a4409c59b98096856363beeb1dadf9f8ac7b466336deee83fc6ed12d9c826a7c9cf95b25a80a433823f3c3f2e47bd2cbf4657f1855edf140b17507eb088103367c6a1bc7a7c1653a80ebf9e0d304791faf3f3fbbd7a722bc692ed54960366a67d04dd625a6574cb9fd9ef30cc2bd53da754fc3286d4b7cc2647533df319e1331793c62cff5186d89e84eade393017e8036a6bfe08f589720c6084b7c58dbc72706fc184604deb88e6d542ab6313dbbfef44c74acce097c159ee7b6b76bd4ecec5e52d93f634312186d866bc49e1f71bd8ccf47abc6b460361e2effa7361a4621c25bdb4d665e927141fcd3355582f94de693edaa3bffc8f99af75ead673adfb7b6acabefffb27f84f1e6f4ca780b9f7f3ce73102cb11329cc1dcc9f96b447830023f13f157295863c829a3c2b9302b5cf6457c128a2af2bdf9a139d2443823288769a21a2388d1247edbfaf9c9516763c73d5e1cff58a23617bc93ec700f9e2c2ac782d512ae819fa129199e91364eb3d02bdc07cbe0aff8be99b3ce79c4ad7d22c33b6eeec767e65efee47db9d23f485c4f96d6a3e271eef4a9dc8ee9af4f251af40a14002802f70b9c9f6077bb36c4ae626ad1c17a938ac7adfa736a33e3f145f7b49f3f1f766896e6798cd6319ff02bff7f627bbabe267a40c22733d4827fee513dede13c5ceb0b6feb23cc5a9a95096e758fd0bbf9fe9a6ffe79fbbc7fe4ad383126ab105907bcae78bc4fa97f271df7a9e0a89b18198552806658afde33ee40f563382364957c90dbc0fac8ffc9ede24043ce5b4c2b67f86ef8c4105fb00bf62168a9d5f10d9a9f440950add415cb6dea95ca9cf53b3d223b03597d86495391e3666850fa5ec8d05c6aebb0b99c4d6d1c74e7413fce96e316cabb17f03d107b5078e882cdc87da1fde0fe01b8029520d21af8ea8964e0844083a99d8cdb78eeedf4ac1f191e91d5a3e05aa8b82f092578bb3de2cd6172bdd95137bc48e0fd794b1f69d5525e71adefa4a795ffff46ee4ffbfde73c84dde793f15a0ffa91ee0dba8e6e91fb4df83c0411dd1f845a415c01ea169ceea14bd69ae9d53056382364d7ab0ec227012293b12411109bbde30ee7e959836b10b1781d81d01c9fae42966e5dd39d2bf93aa2bb13ec5a49cc67422baf6942a23fb0d8d2eca949e57c6edbb9b5d3dfea388c96735e454e49613f072984f397446a497c18d9bef9099d7da17390ee5eeaffe0b6a6ab79b896fedcf4cabfe776addbf9bb6f9cf73c1adff5b8bd07bac507fc23199e91b59dddfe3e2befffb62ffcadf6e978adccda3db41f524f00f13be1d758ee09f973980c60fb740e3a856a2c6299e17a9e23382359c906fcb507137cbc984f902809f0e17a22e12f9c265139cf2676feab78a08ccd292b8f73f999ccc6e525195596268659b996fb4853db441a63caaed998d32bda7c2bc7826d07f314ceabd80ec2fa889ad2f05b9a7b6dcbc1f4c649ecf0dc6f70a527dc3ef796d6dfea17d407ee45ccc6776bef7fef9a9ddf69f6fb0ccf0a6f9fcfef9fd54740a26cb6d335b8b9ff039e7e25e727fad307fbfdf0ea7c501f79f3ffd736b82bbd8efe9fca09c9fcd769dc424a7db80c505a17c2d56b90a16c74fe081fc9cc023f7fb7b4ef23ed2d1ec2cf23e51dfde5151db891161edc47f8d3e767696b761cd097d653626df815ef7b6f4cbffcfc767cd7dfc3f3fb724abf7ffdac3f698fd6f5fa7beaafe2fdfcd5383ed2bfb77eff816b04fa4866d7fed17d3fd32f12cb50e727f59ae7133e42ef267edb95f11c90e3035febded3b46f7efed595ee88422dd15b7ef8f974dcc0a35d11eb23e28f8d3b13db4bf535e2d79fb556f77ad4cfcf47a1f6b79ecfe603bcaeb3e10acf4978dd0fb778cb47beb351ab2ba35b7fa12534a30e748bcabde83573727eb4c1f34137fbfdf8a4cf376edbf9bbeb91ee8b743dfedebeb85e0f62b562b63eca47bebd17228b454afc23577e951f9b0df02390678710114efd143f7f4248d439b5f145d46ff303edca4a4b6924899f93883e721f13f0014bc2573562a1794dfd4677fdfe81f9a1b184a72ef363257632c4ec5a8fe284bef29acc84caecf1fef73eefed7ef0f70e3a9b105706f91c7fab1f10730027153c9c3f356efedea5fe1f9fe78ffc9df548afc85276d01fba1e3fbd3fd2f5286dd3f5a0b62ff89ec85a1eb1f9bbdf7545cc370291daa75a7d07be6cf23d6fdffcfcf4ca7d02f83d450ba8a7feff1fbe7ab033ea1bd2971f1a77ba1e6c674a8e7aaa9d7a576bf1d3f3c0d683f0758951b0bfb21e8eef0c0aa40f10af909d0b7246486e1cf88ebfe74a7622c40243d667a73ba0f91fec7bb8aadffbfcd437ce9f872463b3079ff980d2ae1f7c3e9d0f89c43a93b93806df3efeec3c135e4e693641475097adfbf9b9b97efbfc2099ae07b258ccf8c379fbc6fd89d703d6a1d0b85b0f1515e08c9cad56ed6c0d57df75755f5bb5daac5ba8bbb5e5b255506adb53ef6c35dbdffddcdbeb7603d7cab1beaf2d0bcd6e5c7787c7f6cb4ff7039e57df9daddaa2eed60f8546e5f8fdcf3d75cf56b790cec3a95bda36dbb5355d8f9f5e87db2bac47fd4cd703e685f6f7e79e5f9b9dbab5f5ff9b73797208223e5cb361f2cee54ab5d65c009db7fe89</data>
17 </pixmap>
18 <signal>signalTz(const QString &amp;, const QString &amp;)</signal>
19 </customwidget>
20</customwidgets>
21</CW>
diff --git a/core/settings/citytime/zonemap.h b/core/settings/citytime/zonemap.h
new file mode 100644
index 0000000..c9c2035
--- a/dev/null
+++ b/core/settings/citytime/zonemap.h
@@ -0,0 +1,157 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20
21#ifndef ZONEMAP_H
22#define ZONEMAP_H
23
24#include "stylusnormalizer.h"
25
26#include <qlist.h>
27#include <qscrollview.h>
28#include <qstring.h>
29
30extern const int iCITYOFFSET;
31
32class QImage;
33class QComboBox;
34class QLabel;
35class QTimer;
36class QToolButton;
37
38
39
40class ZoneField
41{
42public:
43 ZoneField( const QString & );
44 void showStructure( void ) const;
45 inline int x( void ) const { return _x; };
46 inline int y( void ) const { return _y; };
47
48 inline QString city( void ) const { return strCity; };
49 inline QString country( void ) const { return strCountry; };
50 inline QString code( void ) const { return strCountryCode; };
51private:
52 int _x;
53 int _y;
54 QString strCountryCode;
55 QString strCountry;
56 QString strCity;
57};
58
59class ZoneMap : public QScrollView
60{
61 Q_OBJECT
62public:
63 ZoneMap( QWidget *parent = 0, const char *name = 0 );
64 ~ZoneMap();
65 void showZones( void ) const;
66 // convert between the pixels on the image and the coordinates in the
67 // database
68 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;
70
71public slots:
72 void slotZoom( bool setZoom );
73 void slotIllum( bool setIllum );
74 void slotUpdate( void );
75 void slotRedraw( void );
76 void slotFindCity( const QPoint &pos ); // Find the closest city
77 void changeClock( bool );
78
79signals:
80 void signalTz( const QString &newCountry, const QString &newCity );
81
82protected:
83 virtual void viewportMouseMoveEvent( QMouseEvent *event );
84 virtual void viewportMousePressEvent( QMouseEvent *event );
85 virtual void viewportMouseReleaseEvent( QMouseEvent *event );
86 virtual void keyPressEvent( QKeyEvent * );
87 virtual void resizeEvent( QResizeEvent *);
88 virtual void drawContents( QPainter *p, int cx, int cy, int cw, int ch );
89
90private:
91 ZoneField *findCityNear( ZoneField *city, int key );
92 void showCity( ZoneField *city );
93 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
95 void readZones( void ); // Read in the zone information from the file
96 void zoom( void ); // Zoom the map...
97 void makeMap( int width, int height );
98 QPixmap* pixCurr; // image to be drawn on the screen
99 QLabel* lblCity; // the "tool-tip" that shows up when you pick a city...
100 QToolButton *cmdZoom; // our zoom option...
101 QTimer*tHide; // the timer to hide the "tool tip"
102 ZoneField *pLast; // the last known good city that was found...
103 ZoneField *pRepaint; // save the location to maximize the repaint...
104 QList<ZoneField> zones; // a linked list to hold all this information
105 StylusNormalizer norm;
106
107 //the True width and height of the map...
108 int wImg;
109 int hImg;
110 // the pixel points that correspond to (0, 0);
111 int ox;
112 int oy;
113
114 // the drawable area of the map...
115 int drawableW;
116 int drawableH;
117
118 bool bZoom; // a flag to indicate zoom is active
119 bool bIllum; // flag to indicat that illumination is active
120 bool ampm;
121
122 ZoneField *cursor;
123};
124
125inline bool ZoneMap::zoneToWin( int zoneX, int zoneY,
126 int &winX, int &winY ) const
127{
128 winY = oy - ( ( hImg * zoneY ) / 648000 ); // 180 degrees in secs
129 winX = ox + ( ( wImg * zoneX ) / 1296000 ); // 360 degrees in secs
130 // whoa, some things aren't in the best spots..
131 if ( winX > wImg ) {
132 winX = wImg - iCITYOFFSET;
133 } else if ( winX <= 0 ) {
134 winX = iCITYOFFSET;
135 }
136
137 if ( winY >= hImg ) {
138 winY = hImg - iCITYOFFSET;
139 } else if ( winY <= 0 ) {
140 winY = iCITYOFFSET;
141 }
142 // perhaps in the future there will be some real error checking
143 // for now just return true...
144 return true;
145}
146
147inline bool ZoneMap::winToZone( int winX, int winY,
148 int &zoneX, int &zoneY ) const
149{
150 zoneY = ( 648000 * ( oy - winY ) ) / hImg;
151 zoneX = ( 1296000 * ( winX - ox ) ) / wImg;
152 // perhaps in the future there will be some real error checking
153 // for now just return true...
154 return true;
155}
156
157#endif
diff --git a/core/settings/light-and-power/.cvsignore b/core/settings/light-and-power/.cvsignore
new file mode 100644
index 0000000..e6ba7a1
--- a/dev/null
+++ b/core/settings/light-and-power/.cvsignore
@@ -0,0 +1,4 @@
1moc_*
2Makefile
3lightsettingsbase.h
4lightsettingsbase.cpp
diff --git a/core/settings/light-and-power/Makefile.in b/core/settings/light-and-power/Makefile.in
new file mode 100644
index 0000000..8236ed0
--- a/dev/null
+++ b/core/settings/light-and-power/Makefile.in
@@ -0,0 +1,135 @@
1#############################################################################
2
3####### Compiler, tools and options
4
5 CXX =$(SYSCONF_CXX) $(QT_CXX_MT)
6 CXXFLAGS=$(SYSCONF_CXXFLAGS_QT) $(SYSCONF_CXXFLAGS)
7 CC =$(SYSCONF_CC) $(QT_C_MT)
8 CFLAGS =$(SYSCONF_CFLAGS)
9 INCPATH =-I$(QPEDIR)/include
10 LFLAGS =$(SYSCONF_LFLAGS_QT) $(SYSCONF_RPATH_QT) $(SYSCONF_LFLAGS) $(QT_LFLAGS_MT)
11 LIBS =$(SUBLIBS) -lqpe $(SYSCONF_LIBS_QT) $(SYSCONF_LIBS) $(SYSCONF_LIBS_QTAPP)
12 MOC =$(SYSCONF_MOC)
13 UIC =$(SYSCONF_UIC)
14
15####### Target
16
17DESTDIR = ../../bin/
18VER_MAJ = 1
19VER_MIN = 0
20VER_PATCH = 0
21 TARGET= light-and-power
22TARGET1 = lib$(TARGET).so.$(VER_MAJ)
23
24####### Files
25
26 HEADERS =settings.h
27 SOURCES =light.cpp \
28 main.cpp
29 OBJECTS =light.o \
30 main.o \
31 lightsettingsbase.o
32INTERFACES = lightsettingsbase.ui
33UICDECLS = lightsettingsbase.h
34UICIMPLS = lightsettingsbase.cpp
35 SRCMOC =moc_settings.cpp \
36 moc_lightsettingsbase.cpp
37 OBJMOC =moc_settings.o \
38 moc_lightsettingsbase.o
39
40
41####### Implicit rules
42
43.SUFFIXES: .cpp .cxx .cc .C .c
44
45.cpp.o:
46 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
47
48.cxx.o:
49 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
50
51.cc.o:
52 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
53
54.C.o:
55 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
56
57.c.o:
58 $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
59
60####### Build rules
61
62
63all: $(DESTDIR)$(TARGET)
64
65$(DESTDIR)$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(SUBLIBS)
66 $(SYSCONF_LINK) $(LFLAGS) -o $(DESTDIR)$(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
67
68moc: $(SRCMOC)
69
70tmake:
71 tmake light-and-power.pro
72
73clean:
74 -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS)
75 -rm -f *~ core
76 -rm -f allmoc.cpp
77
78####### Extension Modules
79
80listpromodules:
81 @echo
82
83listallmodules:
84 @echo
85
86listaddonpromodules:
87 @echo
88
89listaddonentmodules:
90 @echo
91
92
93REQUIRES=
94
95####### Sub-libraries
96
97
98###### Combined headers
99
100
101
102####### Compile
103
104light.o: light.cpp \
105 settings.h \
106 lightsettingsbase.h
107
108main.o: main.cpp \
109 settings.h \
110 lightsettingsbase.h
111
112lightsettingsbase.h: lightsettingsbase.ui
113 $(UIC) lightsettingsbase.ui -o $(INTERFACE_DECL_PATH)/lightsettingsbase.h
114
115lightsettingsbase.cpp: lightsettingsbase.ui
116 $(UIC) lightsettingsbase.ui -i lightsettingsbase.h -o lightsettingsbase.cpp
117
118lightsettingsbase.o: lightsettingsbase.cpp \
119 lightsettingsbase.h \
120 lightsettingsbase.ui
121
122moc_settings.o: moc_settings.cpp \
123 settings.h \
124 lightsettingsbase.h
125
126moc_lightsettingsbase.o: moc_lightsettingsbase.cpp \
127 lightsettingsbase.h
128
129moc_settings.cpp: settings.h
130 $(MOC) settings.h -o moc_settings.cpp
131
132moc_lightsettingsbase.cpp: lightsettingsbase.h
133 $(MOC) lightsettingsbase.h -o moc_lightsettingsbase.cpp
134
135
diff --git a/core/settings/light-and-power/light-and-power.pro b/core/settings/light-and-power/light-and-power.pro
new file mode 100644
index 0000000..87bb111
--- a/dev/null
+++ b/core/settings/light-and-power/light-and-power.pro
@@ -0,0 +1,12 @@
1 TEMPLATE= app
2 CONFIG += qt warn_on release
3 DESTDIR = ../../bin
4 HEADERS = settings.h
5 SOURCES = light.cpp main.cpp
6 INTERFACES= lightsettingsbase.ui
7INCLUDEPATH += $(QPEDIR)/include
8 DEPENDPATH+= ../$(QPEDIR)/include
9LIBS += -lqpe
10 TARGET = light-and-power
11
12TRANSLATIONS = ../../i18n/de/light-and-power.ts
diff --git a/core/settings/light-and-power/light-off.xpm b/core/settings/light-and-power/light-off.xpm
new file mode 100644
index 0000000..26624c7
--- a/dev/null
+++ b/core/settings/light-and-power/light-off.xpm
@@ -0,0 +1,23 @@
1/* XPM */
2static char * light_off_xpm[] = {
3"16 16 4 1",
4 " c None",
5 ".c #000000000000",
6 "Xc #6B6B6C6C6C6C",
7 "oc #FFFF6C6C0000",
8" ",
9" ",
10" ... ",
11" . . ",
12" . X. ",
13" . X. ",
14" . XXX. ",
15" . X XX. ",
16" . XX. ",
17" . XXX. ",
18" . X. ",
19" . X.. ",
20" .ooo.. ",
21" .ooo.. ",
22" .o.. ",
23" .. "};
diff --git a/core/settings/light-and-power/light-on.xpm b/core/settings/light-and-power/light-on.xpm
new file mode 100644
index 0000000..3f8e174
--- a/dev/null
+++ b/core/settings/light-and-power/light-on.xpm
@@ -0,0 +1,24 @@
1/* XPM */
2static char * light_on_xpm[] = {
3"16 16 5 1",
4 " c None",
5 ".c #FFFFFFFF0000",
6 "Xc #000000000000",
7 "oc #FFFFFFFFFFFF",
8 "Oc #FFFF6C6C0000",
9" . . ",
10" . . . ",
11" . XXX . ",
12" XoooX . ",
13" Xoooo.X ",
14" .. Xoooooo.X ",
15" Xoooo...X ..",
16" Xooo.o..X ",
17" .. Xooo..X ",
18" Xoo...X ",
19" . Xoo.X . ",
20" . Xoo.XX . ",
21" XOOOXX ",
22" XOOOXX ",
23" XOXX ",
24" XX "};
diff --git a/core/settings/light-and-power/light.cpp b/core/settings/light-and-power/light.cpp
new file mode 100644
index 0000000..24e1fab
--- a/dev/null
+++ b/core/settings/light-and-power/light.cpp
@@ -0,0 +1,133 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20#include "settings.h"
21
22#include <qpe/global.h>
23#include <qpe/fontmanager.h>
24#include <qpe/config.h>
25#include <qpe/applnk.h>
26#include <qpe/qpeapplication.h>
27#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
28#include <qpe/qcopenvelope_qws.h>
29#endif
30
31#include <qlabel.h>
32#include <qcheckbox.h>
33#include <qradiobutton.h>
34#include <qtabwidget.h>
35#include <qslider.h>
36#include <qfile.h>
37#include <qtextstream.h>
38#include <qdatastream.h>
39#include <qmessagebox.h>
40#include <qcombobox.h>
41#include <qspinbox.h>
42#include <qlistbox.h>
43#include <qdir.h>
44#if QT_VERSION >= 300
45#include <qstylefactory.h>
46#endif
47
48extern int qpe_sysBrightnessSteps();
49
50LightSettings::LightSettings( QWidget* parent, const char* name, WFlags fl )
51 : LightSettingsBase( parent, name, TRUE, fl )
52{
53 // Not supported
54 auto_brightness->hide();
55
56 Config config( "qpe" );
57
58 config.setGroup( "Screensaver" );
59
60 int interval;
61 interval = config.readNumEntry( "Interval_Dim", 30 );
62 interval_dim->setValue( interval );
63 interval = config.readNumEntry( "Interval_LightOff", 20 );
64 interval_lightoff->setValue( interval );
65 interval = config.readNumEntry( "Interval", 60 );
66 if ( interval > 3600 ) interval /= 1000; // compatibility (was millisecs)
67 interval_suspend->setValue( interval );
68
69 screensaver_dim->setChecked( config.readNumEntry("Dim",1) != 0 );
70 screensaver_lightoff->setChecked( config.readNumEntry("LightOff",1) != 0 );
71 int maxbright = qpe_sysBrightnessSteps();
72 initbright = config.readNumEntry("Brightness",255);
73 brightness->setMaxValue( maxbright );
74 brightness->setTickInterval( QMAX(1,maxbright/16) );
75 brightness->setLineStep( QMAX(1,maxbright/16) );
76 brightness->setPageStep( QMAX(1,maxbright/16) );
77 brightness->setValue( (maxbright*255 - initbright*maxbright)/255 );
78
79 connect(brightness, SIGNAL(valueChanged(int)), this, SLOT(applyBrightness()));
80}
81
82LightSettings::~LightSettings()
83{
84}
85
86static void set_fl(int bright)
87{
88 QCopEnvelope e("QPE/System", "setBacklight(int)" );
89 e << bright;
90}
91
92void LightSettings::reject()
93{
94 set_fl(initbright);
95
96 QDialog::reject();
97}
98
99void LightSettings::accept()
100{
101 if ( qApp->focusWidget() )
102 qApp->focusWidget()->clearFocus();
103
104 applyBrightness();
105
106 int i_dim = (screensaver_dim->isChecked() ? interval_dim->value() : 0);
107 int i_lightoff = (screensaver_lightoff->isChecked() ? interval_lightoff->value() : 0);
108 int i_suspend = interval_suspend->value();
109 QCopEnvelope e("QPE/System", "setScreenSaverIntervals(int,int,int)" );
110 e << i_dim << i_lightoff << i_suspend;
111
112 Config config( "qpe" );
113 config.setGroup( "Screensaver" );
114 config.writeEntry( "Dim", (int)screensaver_dim->isChecked() );
115 config.writeEntry( "LightOff", (int)screensaver_lightoff->isChecked() );
116 config.writeEntry( "Interval_Dim", interval_dim->value() );
117 config.writeEntry( "Interval_LightOff", interval_lightoff->value() );
118 config.writeEntry( "Interval", interval_suspend->value() );
119 config.writeEntry( "Brightness",
120 (brightness->maxValue()-brightness->value())*255/brightness->maxValue() );
121 config.write();
122
123 QDialog::accept();
124}
125
126void LightSettings::applyBrightness()
127{
128 int bright = (brightness->maxValue()-brightness->value())*255
129 / brightness->maxValue();
130 set_fl(bright);
131}
132
133
diff --git a/core/settings/light-and-power/lightsettingsbase.ui b/core/settings/light-and-power/lightsettingsbase.ui
new file mode 100644
index 0000000..47775f7
--- a/dev/null
+++ b/core/settings/light-and-power/lightsettingsbase.ui
@@ -0,0 +1,471 @@
1<!DOCTYPE UI><UI>
2<class>LightSettingsBase</class>
3<widget>
4 <class>QDialog</class>
5 <property stdset="1">
6 <name>name</name>
7 <cstring>LightSettingsBase</cstring>
8 </property>
9 <property stdset="1">
10 <name>geometry</name>
11 <rect>
12 <x>0</x>
13 <y>0</y>
14 <width>256</width>
15 <height>316</height>
16 </rect>
17 </property>
18 <property stdset="1">
19 <name>caption</name>
20 <string>Light Settings</string>
21 </property>
22 <property>
23 <name>layoutMargin</name>
24 </property>
25 <vbox>
26 <property stdset="1">
27 <name>margin</name>
28 <number>7</number>
29 </property>
30 <property stdset="1">
31 <name>spacing</name>
32 <number>6</number>
33 </property>
34 <widget>
35 <class>QCheckBox</class>
36 <property stdset="1">
37 <name>name</name>
38 <cstring>auto_brightness</cstring>
39 </property>
40 <property stdset="1">
41 <name>text</name>
42 <string>Adjust to environment</string>
43 </property>
44 <property>
45 <name>whatsThis</name>
46 <string>By sensing the ambient light where you are using your device, the screen light can be adjusted automatically. The brightness setting still affects the average brightness.</string>
47 </property>
48 </widget>
49 <widget>
50 <class>QGroupBox</class>
51 <property stdset="1">
52 <name>name</name>
53 <cstring>GroupBox3</cstring>
54 </property>
55 <property stdset="1">
56 <name>title</name>
57 <string>Power saving</string>
58 </property>
59 <property>
60 <name>layoutMargin</name>
61 </property>
62 <property>
63 <name>layoutSpacing</name>
64 </property>
65 <grid>
66 <property stdset="1">
67 <name>margin</name>
68 <number>6</number>
69 </property>
70 <property stdset="1">
71 <name>spacing</name>
72 <number>3</number>
73 </property>
74 <widget row="1" column="1" >
75 <class>QSpinBox</class>
76 <property stdset="1">
77 <name>name</name>
78 <cstring>interval_lightoff</cstring>
79 </property>
80 <property stdset="1">
81 <name>suffix</name>
82 <string> seconds</string>
83 </property>
84 <property stdset="1">
85 <name>buttonSymbols</name>
86 <enum>PlusMinus</enum>
87 </property>
88 <property stdset="1">
89 <name>maxValue</name>
90 <number>3600</number>
91 </property>
92 <property stdset="1">
93 <name>minValue</name>
94 <number>10</number>
95 </property>
96 <property stdset="1">
97 <name>lineStep</name>
98 <number>15</number>
99 </property>
100 </widget>
101 <widget row="2" column="1" >
102 <class>QSpinBox</class>
103 <property stdset="1">
104 <name>name</name>
105 <cstring>interval_suspend</cstring>
106 </property>
107 <property stdset="1">
108 <name>suffix</name>
109 <string> seconds</string>
110 </property>
111 <property stdset="1">
112 <name>buttonSymbols</name>
113 <enum>PlusMinus</enum>
114 </property>
115 <property stdset="1">
116 <name>maxValue</name>
117 <number>3600</number>
118 </property>
119 <property stdset="1">
120 <name>minValue</name>
121 <number>10</number>
122 </property>
123 <property stdset="1">
124 <name>lineStep</name>
125 <number>15</number>
126 </property>
127 </widget>
128 <widget row="1" column="0" >
129 <class>QCheckBox</class>
130 <property stdset="1">
131 <name>name</name>
132 <cstring>screensaver_lightoff</cstring>
133 </property>
134 <property stdset="1">
135 <name>sizePolicy</name>
136 <sizepolicy>
137 <hsizetype>1</hsizetype>
138 <vsizetype>0</vsizetype>
139 </sizepolicy>
140 </property>
141 <property stdset="1">
142 <name>text</name>
143 <string>Light off after</string>
144 </property>
145 <property stdset="1">
146 <name>checked</name>
147 <bool>true</bool>
148 </property>
149 </widget>
150 <widget row="0" column="0" >
151 <class>QCheckBox</class>
152 <property stdset="1">
153 <name>name</name>
154 <cstring>screensaver_dim</cstring>
155 </property>
156 <property stdset="1">
157 <name>sizePolicy</name>
158 <sizepolicy>
159 <hsizetype>1</hsizetype>
160 <vsizetype>0</vsizetype>
161 </sizepolicy>
162 </property>
163 <property stdset="1">
164 <name>text</name>
165 <string>Dim light after</string>
166 </property>
167 <property stdset="1">
168 <name>checked</name>
169 <bool>true</bool>
170 </property>
171 </widget>
172 <widget row="0" column="1" >
173 <class>QSpinBox</class>
174 <property stdset="1">
175 <name>name</name>
176 <cstring>interval_dim</cstring>
177 </property>
178 <property stdset="1">
179 <name>suffix</name>
180 <string> seconds</string>
181 </property>
182 <property stdset="1">
183 <name>buttonSymbols</name>
184 <enum>PlusMinus</enum>
185 </property>
186 <property stdset="1">
187 <name>maxValue</name>
188 <number>3600</number>
189 </property>
190 <property stdset="1">
191 <name>minValue</name>
192 <number>10</number>
193 </property>
194 <property stdset="1">
195 <name>lineStep</name>
196 <number>15</number>
197 </property>
198 </widget>
199 <widget row="2" column="0" >
200 <class>QLabel</class>
201 <property stdset="1">
202 <name>name</name>
203 <cstring>TextLabel1_2</cstring>
204 </property>
205 <property stdset="1">
206 <name>text</name>
207 <string>Suspend after</string>
208 </property>
209 </widget>
210 </grid>
211 </widget>
212 <widget>
213 <class>QLayoutWidget</class>
214 <property stdset="1">
215 <name>name</name>
216 <cstring>Layout18</cstring>
217 </property>
218 <property>
219 <name>layoutMargin</name>
220 </property>
221 <hbox>
222 <property stdset="1">
223 <name>margin</name>
224 <number>0</number>
225 </property>
226 <property stdset="1">
227 <name>spacing</name>
228 <number>6</number>
229 </property>
230 <widget>
231 <class>QSlider</class>
232 <property stdset="1">
233 <name>name</name>
234 <cstring>brightness</cstring>
235 </property>
236 <property stdset="1">
237 <name>maxValue</name>
238 <number>255</number>
239 </property>
240 <property stdset="1">
241 <name>lineStep</name>
242 <number>16</number>
243 </property>
244 <property stdset="1">
245 <name>pageStep</name>
246 <number>16</number>
247 </property>
248 <property stdset="1">
249 <name>orientation</name>
250 <enum>Vertical</enum>
251 </property>
252 <property stdset="1">
253 <name>tickmarks</name>
254 <enum>Right</enum>
255 </property>
256 <property stdset="1">
257 <name>tickInterval</name>
258 <number>32</number>
259 </property>
260 </widget>
261 <widget>
262 <class>QLayoutWidget</class>
263 <property stdset="1">
264 <name>name</name>
265 <cstring>Layout16</cstring>
266 </property>
267 <property>
268 <name>layoutSpacing</name>
269 </property>
270 <vbox>
271 <property stdset="1">
272 <name>margin</name>
273 <number>0</number>
274 </property>
275 <property stdset="1">
276 <name>spacing</name>
277 <number>0</number>
278 </property>
279 <widget>
280 <class>QLayoutWidget</class>
281 <property stdset="1">
282 <name>name</name>
283 <cstring>Layout10</cstring>
284 </property>
285 <hbox>
286 <property stdset="1">
287 <name>margin</name>
288 <number>0</number>
289 </property>
290 <property stdset="1">
291 <name>spacing</name>
292 <number>6</number>
293 </property>
294 <widget>
295 <class>QLabel</class>
296 <property stdset="1">
297 <name>name</name>
298 <cstring>PixmapLabel1</cstring>
299 </property>
300 <property stdset="1">
301 <name>pixmap</name>
302 <pixmap>image0</pixmap>
303 </property>
304 <property stdset="1">
305 <name>scaledContents</name>
306 <bool>false</bool>
307 </property>
308 </widget>
309 <widget>
310 <class>QLabel</class>
311 <property stdset="1">
312 <name>name</name>
313 <cstring>TextLabel1</cstring>
314 </property>
315 <property stdset="1">
316 <name>text</name>
317 <string>Bright</string>
318 </property>
319 </widget>
320 <spacer>
321 <property>
322 <name>name</name>
323 <cstring>Spacer3</cstring>
324 </property>
325 <property stdset="1">
326 <name>orientation</name>
327 <enum>Horizontal</enum>
328 </property>
329 <property stdset="1">
330 <name>sizeType</name>
331 <enum>Expanding</enum>
332 </property>
333 <property>
334 <name>sizeHint</name>
335 <size>
336 <width>20</width>
337 <height>20</height>
338 </size>
339 </property>
340 </spacer>
341 </hbox>
342 </widget>
343 <widget>
344 <class>QLabel</class>
345 <property stdset="1">
346 <name>name</name>
347 <cstring>TextLabel3</cstring>
348 </property>
349 <property stdset="1">
350 <name>sizePolicy</name>
351 <sizepolicy>
352 <hsizetype>5</hsizetype>
353 <vsizetype>7</vsizetype>
354 </sizepolicy>
355 </property>
356 <property stdset="1">
357 <name>text</name>
358 <string>&lt;blockquote&gt;The brighter the screen light, the more battery power is used.&lt;/blockquote&gt;</string>
359 </property>
360 </widget>
361 <widget>
362 <class>QLayoutWidget</class>
363 <property stdset="1">
364 <name>name</name>
365 <cstring>Layout9</cstring>
366 </property>
367 <hbox>
368 <property stdset="1">
369 <name>margin</name>
370 <number>0</number>
371 </property>
372 <property stdset="1">
373 <name>spacing</name>
374 <number>6</number>
375 </property>
376 <widget>
377 <class>QLabel</class>
378 <property stdset="1">
379 <name>name</name>
380 <cstring>PixmapLabel2</cstring>
381 </property>
382 <property stdset="1">
383 <name>pixmap</name>
384 <pixmap>image1</pixmap>
385 </property>
386 <property stdset="1">
387 <name>scaledContents</name>
388 <bool>false</bool>
389 </property>
390 </widget>
391 <widget>
392 <class>QLabel</class>
393 <property stdset="1">
394 <name>name</name>
395 <cstring>TextLabel2</cstring>
396 </property>
397 <property stdset="1">
398 <name>text</name>
399 <string>Off</string>
400 </property>
401 <property stdset="1">
402 <name>alignment</name>
403 <set>AlignVCenter|AlignLeft</set>
404 </property>
405 <property>
406 <name>vAlign</name>
407 </property>
408 </widget>
409 <spacer>
410 <property>
411 <name>name</name>
412 <cstring>Spacer2</cstring>
413 </property>
414 <property stdset="1">
415 <name>orientation</name>
416 <enum>Horizontal</enum>
417 </property>
418 <property stdset="1">
419 <name>sizeType</name>
420 <enum>Expanding</enum>
421 </property>
422 <property>
423 <name>sizeHint</name>
424 <size>
425 <width>20</width>
426 <height>20</height>
427 </size>
428 </property>
429 </spacer>
430 </hbox>
431 </widget>
432 </vbox>
433 </widget>
434 </hbox>
435 </widget>
436 </vbox>
437</widget>
438<images>
439 <image>
440 <name>image0</name>
441 <data format="XPM.GZ" length="439">789c6d8ec10ac2300c86ef7b8ad0ff36a4730777111f41f1288887b4b3e8610a3a0f22bebb6dd3d54d0ca5cdffe54f9aaaa4dd764d6555dc7beecf96ec896f54b68fae7bee0fab57a1ea86fc5950ad6685d2646973bd1c43ce3ec73c46903648e79a5624443a27d20cd2b9382704747e124382f11a7c5e30b364b957b331866331b3800c38f70282121c7c628367c098c1e0eb03121ccd4b46fcb0f80b26bb4833987f76b6d6f274de5fe6a1a031d30969f55e161fe4715f7b</data>
442 </image>
443 <image>
444 <name>image1</name>
445 <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103711c4354b344b314b04719340dcb434b31488ac1e1a2020a6acac8c2ea60cc54862606ea232b218541b5810452c3111432c510f550c22886a1e482c115d0c2c88e6168818babaa4a42462c48082cae8e68102011a06b5d65c0041d3518e</data>
446 </image>
447</images>
448<connections>
449 <connection>
450 <sender>screensaver_dim</sender>
451 <signal>toggled(bool)</signal>
452 <receiver>interval_dim</receiver>
453 <slot>setEnabled(bool)</slot>
454 </connection>
455 <connection>
456 <sender>screensaver_lightoff</sender>
457 <signal>toggled(bool)</signal>
458 <receiver>interval_lightoff</receiver>
459 <slot>setEnabled(bool)</slot>
460 </connection>
461</connections>
462<tabstops>
463 <tabstop>auto_brightness</tabstop>
464 <tabstop>screensaver_dim</tabstop>
465 <tabstop>interval_dim</tabstop>
466 <tabstop>screensaver_lightoff</tabstop>
467 <tabstop>interval_lightoff</tabstop>
468 <tabstop>interval_suspend</tabstop>
469 <tabstop>brightness</tabstop>
470</tabstops>
471</UI>
diff --git a/core/settings/light-and-power/main.cpp b/core/settings/light-and-power/main.cpp
new file mode 100644
index 0000000..051fdec
--- a/dev/null
+++ b/core/settings/light-and-power/main.cpp
@@ -0,0 +1,38 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20
21#include "settings.h"
22
23#include <qpe/qpeapplication.h>
24#include <qpe/qcopenvelope_qws.h>
25#include <qpe/global.h>
26
27
28int main(int argc, char** argv)
29{
30 QPEApplication a(argc,argv);
31
32 LightSettings dlg;
33
34 a.showMainWidget(&dlg);
35
36 return a.exec();
37}
38
diff --git a/core/settings/light-and-power/qpe-light-and-power.control b/core/settings/light-and-power/qpe-light-and-power.control
new file mode 100644
index 0000000..0ed9d84
--- a/dev/null
+++ b/core/settings/light-and-power/qpe-light-and-power.control
@@ -0,0 +1,9 @@
1Files: bin/light-and-power apps/Settings/Light.desktop
2Priority: optional
3Section: qpe/settings
4Maintainer: Warwick Allison <warwick@trolltech.com>
5Architecture: arm
6Version: $QPE_VERSION-3
7Depends: qpe-base ($QPE_VERSION)
8Description: Light and Power settings dialog
9 For the Qtopia environment.
diff --git a/core/settings/light-and-power/settings.h b/core/settings/light-and-power/settings.h
new file mode 100644
index 0000000..cec08e3
--- a/dev/null
+++ b/core/settings/light-and-power/settings.h
@@ -0,0 +1,50 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20#ifndef SETTINGS_H
21#define SETTINGS_H
22
23
24#include <qstrlist.h>
25#include <qasciidict.h>
26#include "lightsettingsbase.h"
27
28
29class LightSettings : public LightSettingsBase
30{
31 Q_OBJECT
32
33public:
34 LightSettings( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
35 ~LightSettings();
36
37protected:
38 void accept();
39 void reject();
40
41private slots:
42 void applyBrightness();
43
44private:
45 int initbright;
46};
47
48
49#endif // SETTINGS_H
50
diff --git a/core/settings/security/.cvsignore b/core/settings/security/.cvsignore
new file mode 100644
index 0000000..11eef0d
--- a/dev/null
+++ b/core/settings/security/.cvsignore
@@ -0,0 +1,5 @@
1Makefile
2moc_*
3*.moc
4securitybase.cpp
5securitybase.h
diff --git a/core/settings/security/Makefile.in b/core/settings/security/Makefile.in
new file mode 100644
index 0000000..803edc5
--- a/dev/null
+++ b/core/settings/security/Makefile.in
@@ -0,0 +1,135 @@
1#############################################################################
2
3####### Compiler, tools and options
4
5 CXX =$(SYSCONF_CXX) $(QT_CXX_MT)
6 CXXFLAGS=$(SYSCONF_CXXFLAGS_QT) $(SYSCONF_CXXFLAGS)
7 CC =$(SYSCONF_CC) $(QT_C_MT)
8 CFLAGS =$(SYSCONF_CFLAGS)
9 INCPATH =-I$(QPEDIR)/include
10 LFLAGS =$(SYSCONF_LFLAGS_QT) $(SYSCONF_RPATH_QT) $(SYSCONF_LFLAGS) $(QT_LFLAGS_MT)
11 LIBS =$(SUBLIBS) -lqpe $(SYSCONF_LIBS_QT) $(SYSCONF_LIBS) $(SYSCONF_LIBS_QTAPP)
12 MOC =$(SYSCONF_MOC)
13 UIC =$(SYSCONF_UIC)
14
15####### Target
16
17DESTDIR = ../../bin/
18VER_MAJ = 1
19VER_MIN = 0
20VER_PATCH = 0
21 TARGET= security
22TARGET1 = lib$(TARGET).so.$(VER_MAJ)
23
24####### Files
25
26 HEADERS =security.h
27 SOURCES =security.cpp \
28 main.cpp
29 OBJECTS =security.o \
30 main.o \
31 securitybase.o
32INTERFACES = securitybase.ui
33UICDECLS = securitybase.h
34UICIMPLS = securitybase.cpp
35 SRCMOC =moc_security.cpp \
36 moc_securitybase.cpp
37 OBJMOC =moc_security.o \
38 moc_securitybase.o
39
40
41####### Implicit rules
42
43.SUFFIXES: .cpp .cxx .cc .C .c
44
45.cpp.o:
46 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
47
48.cxx.o:
49 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
50
51.cc.o:
52 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
53
54.C.o:
55 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
56
57.c.o:
58 $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
59
60####### Build rules
61
62
63all: $(DESTDIR)$(TARGET)
64
65$(DESTDIR)$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(SUBLIBS)
66 $(SYSCONF_LINK) $(LFLAGS) -o $(DESTDIR)$(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
67
68moc: $(SRCMOC)
69
70tmake:
71 tmake security.pro
72
73clean:
74 -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS)
75 -rm -f *~ core
76 -rm -f allmoc.cpp
77
78####### Extension Modules
79
80listpromodules:
81 @echo
82
83listallmodules:
84 @echo
85
86listaddonpromodules:
87 @echo
88
89listaddonentmodules:
90 @echo
91
92
93REQUIRES=
94
95####### Sub-libraries
96
97
98###### Combined headers
99
100
101
102####### Compile
103
104security.o: security.cpp \
105 security.h \
106 securitybase.h
107
108main.o: main.cpp \
109 security.h \
110 securitybase.h
111
112securitybase.h: securitybase.ui
113 $(UIC) securitybase.ui -o $(INTERFACE_DECL_PATH)/securitybase.h
114
115securitybase.cpp: securitybase.ui
116 $(UIC) securitybase.ui -i securitybase.h -o securitybase.cpp
117
118securitybase.o: securitybase.cpp \
119 securitybase.h \
120 securitybase.ui
121
122moc_security.o: moc_security.cpp \
123 security.h \
124 securitybase.h
125
126moc_securitybase.o: moc_securitybase.cpp \
127 securitybase.h
128
129moc_security.cpp: security.h
130 $(MOC) security.h -o moc_security.cpp
131
132moc_securitybase.cpp: securitybase.h
133 $(MOC) securitybase.h -o moc_securitybase.cpp
134
135
diff --git a/core/settings/security/main.cpp b/core/settings/security/main.cpp
new file mode 100644
index 0000000..c15bb31
--- a/dev/null
+++ b/core/settings/security/main.cpp
@@ -0,0 +1,38 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20
21#include <qpe/qpeapplication.h>
22#include <qpe/qcopenvelope_qws.h>
23#include <qpe/global.h>
24
25#include "security.h"
26
27
28int main(int argc, char** argv)
29{
30 QPEApplication a(argc,argv);
31
32 Security dlg;
33
34 a.showMainWidget(&dlg);
35
36 return a.exec();
37}
38
diff --git a/core/settings/security/qpe-security.control b/core/settings/security/qpe-security.control
new file mode 100644
index 0000000..78a5a86
--- a/dev/null
+++ b/core/settings/security/qpe-security.control
@@ -0,0 +1,9 @@
1Files: bin/security apps/Settings/Security.desktop
2Priority: optional
3Section: qpe/settings
4Maintainer: Warwick Allison <warwick@trolltech.com>
5Architecture: arm
6Version: $QPE_VERSION-3
7Depends: qpe-base ($QPE_VERSION)
8Description: Security settings dialog
9 For the Qtopia environment.
diff --git a/core/settings/security/security.cpp b/core/settings/security/security.cpp
new file mode 100644
index 0000000..f4116b0
--- a/dev/null
+++ b/core/settings/security/security.cpp
@@ -0,0 +1,234 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20#include "security.h"
21
22#include <qpe/config.h>
23#include <qpe/password.h>
24#include <qpe/qpedialog.h>
25
26#include <qcheckbox.h>
27#include <qpushbutton.h>
28#include <qcombobox.h>
29#include <qmessagebox.h>
30
31Security::Security( QWidget* parent, const char* name, WFlags fl )
32 : SecurityBase( parent, name, TRUE, fl )
33{
34 valid=FALSE;
35 Config cfg("Security");
36 cfg.setGroup("Passcode");
37 passcode = cfg.readEntry("passcode");
38 passcode_poweron->setChecked(cfg.readBoolEntry("passcode_poweron",FALSE));
39 cfg.setGroup("Sync");
40 int auth_peer = cfg.readNumEntry("auth_peer",0xc0a80100);
41 int auth_peer_bits = cfg.readNumEntry("auth_peer_bits",24);
42 selectNet(auth_peer,auth_peer_bits);
43 connect(syncnet, SIGNAL(textChanged(const QString&)),
44 this, SLOT(setSyncNet(const QString&)));
45
46 /*
47 cfg.setGroup("Remote");
48 if ( telnetAvailable() )
49 telnet->setChecked(cfg.readEntry("allow_telnet"));
50 else
51 telnet->hide();
52
53 if ( sshAvailable() )
54 ssh->setChecked(cfg.readEntry("allow_ssh"));
55 else
56 ssh->hide();
57 */
58
59 connect(changepasscode,SIGNAL(clicked()), this, SLOT(changePassCode()));
60 connect(clearpasscode,SIGNAL(clicked()), this, SLOT(clearPassCode()));
61 updateGUI();
62
63 dl = new QPEDialogListener(this);
64}
65
66Security::~Security()
67{
68}
69
70
71void Security::updateGUI()
72{
73 bool empty = passcode.isEmpty();
74
75 changepasscode->setText( empty ? tr("Set passcode" )
76 : tr("Change passcode" ) );
77 passcode_poweron->setEnabled( !empty );
78 clearpasscode->setEnabled( !empty );
79}
80
81
82void Security::show()
83{
84 valid=FALSE;
85 setEnabled(FALSE);
86 SecurityBase::show();
87 if ( passcode.isEmpty() ) {
88 // could insist...
89 //changePassCode();
90 //if ( passcode.isEmpty() )
91 //reject();
92 } else {
93 QString pc = enterPassCode(tr("Enter passcode"));
94 if ( pc != passcode ) {
95 QMessageBox::critical(this, tr("Passcode incorrect"),
96 tr("The passcode entered is incorrect.\nAccess denied"));
97 reject();
98 return;
99 }
100 }
101 setEnabled(TRUE);
102 valid=TRUE;
103}
104
105void Security::accept()
106{
107 applySecurity();
108 QDialog::accept();
109}
110
111void Security::done(int r)
112{
113 QDialog::done(r);
114 close();
115}
116
117void Security::selectNet(int auth_peer,int auth_peer_bits)
118{
119 QString sn;
120 if ( auth_peer_bits == 0 && auth_peer == 0 ) {
121 sn = tr("Any");
122 } else if ( auth_peer_bits == 32 && auth_peer == 0 ) {
123 sn = tr("None");
124 } else {
125 sn =
126 QString::number((auth_peer>>24)&0xff) + "."
127 + QString::number((auth_peer>>16)&0xff) + "."
128 + QString::number((auth_peer>>8)&0xff) + "."
129 + QString::number((auth_peer>>0)&0xff) + "/"
130 + QString::number(auth_peer_bits);
131 }
132 for (int i=0; i<syncnet->count(); i++) {
133 if ( syncnet->text(i).left(sn.length()) == sn ) {
134 syncnet->setCurrentItem(i);
135 return;
136 }
137 }
138 qDebug("No match for \"%s\"",sn.latin1());
139}
140
141void Security::parseNet(const QString& sn,int& auth_peer,int& auth_peer_bits)
142{
143 auth_peer=0;
144 if ( sn == tr("Any") ) {
145 auth_peer = 0;
146 auth_peer_bits = 0;
147 } else if ( sn == tr("None") ) {
148 auth_peer = 0;
149 auth_peer_bits = 32;
150 } else {
151 int x=0;
152 for (int i=0; i<4; i++) {
153 int nx = sn.find(QChar(i==3 ? '/' : '.'),x);
154 auth_peer = (auth_peer<<8)|sn.mid(x,nx-x).toInt();
155 x = nx+1;
156 }
157 uint n = (uint)sn.find(' ',x)-x;
158 auth_peer_bits = sn.mid(x,n).toInt();
159 }
160}
161
162void Security::setSyncNet(const QString& sn)
163{
164 int auth_peer,auth_peer_bits;
165 parseNet(sn,auth_peer,auth_peer_bits);
166 selectNet(auth_peer,auth_peer_bits);
167}
168
169void Security::applySecurity()
170{
171 if ( valid ) {
172 Config cfg("Security");
173 cfg.setGroup("Passcode");
174 cfg.writeEntry("passcode",passcode);
175 cfg.writeEntry("passcode_poweron",passcode_poweron->isChecked());
176 cfg.setGroup("Sync");
177 int auth_peer=0;
178 int auth_peer_bits;
179 QString sn = syncnet->currentText();
180 parseNet(sn,auth_peer,auth_peer_bits);
181 cfg.writeEntry("auth_peer",auth_peer);
182 cfg.writeEntry("auth_peer_bits",auth_peer_bits);
183 /*
184 cfg.setGroup("Remote");
185 if ( telnetAvailable() )
186 cfg.writeEntry("allow_telnet",telnet->isChecked());
187 if ( sshAvailable() )
188 cfg.writeEntry("allow_ssh",ssh->isChecked());
189 // ### write ssh/telnet sys config files
190 */
191 }
192}
193
194void Security::changePassCode()
195{
196 QString new1;
197 QString new2;
198
199 do {
200 new1 = enterPassCode("Enter new passcode");
201 if ( new1.isNull() )
202 return;
203 new2 = enterPassCode("Re-enter new passcode");
204 if ( new2.isNull() )
205 return;
206 } while (new1 != new2);
207
208 passcode = new1;
209 updateGUI();
210}
211
212void Security::clearPassCode()
213{
214 passcode = QString::null;
215 updateGUI();
216}
217
218
219QString Security::enterPassCode(const QString& prompt)
220{
221 return Password::getPassword(prompt);
222}
223
224bool Security::telnetAvailable() const
225{
226 // ### not implemented
227 return FALSE;
228}
229
230bool Security::sshAvailable() const
231{
232 // ### not implemented
233 return FALSE;
234}
diff --git a/core/settings/security/security.h b/core/settings/security/security.h
new file mode 100644
index 0000000..efc83a2
--- a/dev/null
+++ b/core/settings/security/security.h
@@ -0,0 +1,64 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20#ifndef SECURITY_H
21#define SECURITY_H
22
23#include "securitybase.h"
24
25class QPEDialogListener;
26
27class Security : public SecurityBase
28{
29 Q_OBJECT
30
31public:
32 Security( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
33 ~Security();
34
35 void show();
36
37protected:
38 void accept();
39 void applySecurity();
40 void done(int);
41
42private slots:
43 void changePassCode();
44 void clearPassCode();
45 void setSyncNet(const QString&);
46
47private:
48 bool telnetAvailable() const;
49 bool sshAvailable() const;
50 void updateGUI();
51
52 static void parseNet(const QString& sn,int& auth_peer,int& auth_peer_bits);
53 void selectNet(int auth_peer,int auth_peer_bits);
54
55 QString enterPassCode(const QString&);
56 QString passcode;
57 bool valid;
58
59 QPEDialogListener *dl;
60};
61
62
63#endif // SECURITY_H
64
diff --git a/core/settings/security/security.pro b/core/settings/security/security.pro
new file mode 100644
index 0000000..282127e
--- a/dev/null
+++ b/core/settings/security/security.pro
@@ -0,0 +1,12 @@
1 TEMPLATE= app
2 CONFIG += qt warn_on release
3 DESTDIR = ../../bin
4 HEADERS = security.h
5 SOURCES = security.cpp main.cpp
6 INTERFACES= securitybase.ui
7INCLUDEPATH += $(QPEDIR)/include
8 DEPENDPATH+= ../$(QPEDIR)/include
9LIBS += -lqpe
10 TARGET = security
11
12TRANSLATIONS = ../../i18n/de/security.ts
diff --git a/core/settings/security/securitybase.ui b/core/settings/security/securitybase.ui
new file mode 100644
index 0000000..2f3189d
--- a/dev/null
+++ b/core/settings/security/securitybase.ui
@@ -0,0 +1,200 @@
1<!DOCTYPE UI><UI>
2<class>SecurityBase</class>
3<widget>
4 <class>QDialog</class>
5 <property stdset="1">
6 <name>name</name>
7 <cstring>SecurityBase</cstring>
8 </property>
9 <property stdset="1">
10 <name>geometry</name>
11 <rect>
12 <x>0</x>
13 <y>0</y>
14 <width>281</width>
15 <height>328</height>
16 </rect>
17 </property>
18 <property stdset="1">
19 <name>caption</name>
20 <string>Security Settings</string>
21 </property>
22 <property>
23 <name>layoutMargin</name>
24 </property>
25 <grid>
26 <property stdset="1">
27 <name>margin</name>
28 <number>11</number>
29 </property>
30 <property stdset="1">
31 <name>spacing</name>
32 <number>6</number>
33 </property>
34 <widget row="0" column="0" >
35 <class>QLayoutWidget</class>
36 <property stdset="1">
37 <name>name</name>
38 <cstring>Layout1</cstring>
39 </property>
40 <property>
41 <name>layoutSpacing</name>
42 </property>
43 <hbox>
44 <property stdset="1">
45 <name>margin</name>
46 <number>0</number>
47 </property>
48 <property stdset="1">
49 <name>spacing</name>
50 <number>-1</number>
51 </property>
52 <widget>
53 <class>QPushButton</class>
54 <property stdset="1">
55 <name>name</name>
56 <cstring>changepasscode</cstring>
57 </property>
58 <property stdset="1">
59 <name>text</name>
60 <string>Change passcode</string>
61 </property>
62 </widget>
63 <widget>
64 <class>QPushButton</class>
65 <property stdset="1">
66 <name>name</name>
67 <cstring>clearpasscode</cstring>
68 </property>
69 <property stdset="1">
70 <name>text</name>
71 <string>Clear passcode</string>
72 </property>
73 </widget>
74 </hbox>
75 </widget>
76 <widget row="1" column="0" >
77 <class>QCheckBox</class>
78 <property stdset="1">
79 <name>name</name>
80 <cstring>passcode_poweron</cstring>
81 </property>
82 <property stdset="1">
83 <name>text</name>
84 <string>Require pass code at power-on</string>
85 </property>
86 </widget>
87 <widget row="3" column="0" >
88 <class>QTabWidget</class>
89 <property stdset="1">
90 <name>name</name>
91 <cstring>TabWidget2</cstring>
92 </property>
93 <widget>
94 <class>QWidget</class>
95 <property stdset="1">
96 <name>name</name>
97 <cstring>tab</cstring>
98 </property>
99 <attribute>
100 <name>title</name>
101 <string>Sync</string>
102 </attribute>
103 <vbox>
104 <property stdset="1">
105 <name>margin</name>
106 <number>11</number>
107 </property>
108 <property stdset="1">
109 <name>spacing</name>
110 <number>6</number>
111 </property>
112 <widget>
113 <class>QLabel</class>
114 <property stdset="1">
115 <name>name</name>
116 <cstring>TextLabel1_2</cstring>
117 </property>
118 <property stdset="1">
119 <name>text</name>
120 <string>Accept sync from network:</string>
121 </property>
122 </widget>
123 <widget>
124 <class>QComboBox</class>
125 <item>
126 <property>
127 <name>text</name>
128 <string>192.168.1.0/24 (default)</string>
129 </property>
130 </item>
131 <item>
132 <property>
133 <name>text</name>
134 <string>192.168.0.0/16</string>
135 </property>
136 </item>
137 <item>
138 <property>
139 <name>text</name>
140 <string>172.16.0.0/12</string>
141 </property>
142 </item>
143 <item>
144 <property>
145 <name>text</name>
146 <string>10.0.0.0/8</string>
147 </property>
148 </item>
149 <item>
150 <property>
151 <name>text</name>
152 <string>Any</string>
153 </property>
154 </item>
155 <item>
156 <property>
157 <name>text</name>
158 <string>None</string>
159 </property>
160 </item>
161 <property stdset="1">
162 <name>name</name>
163 <cstring>syncnet</cstring>
164 </property>
165 <property stdset="1">
166 <name>editable</name>
167 <bool>true</bool>
168 </property>
169 </widget>
170 </vbox>
171 </widget>
172 </widget>
173 <widget row="2" column="0" >
174 <class>QLabel</class>
175 <property stdset="1">
176 <name>name</name>
177 <cstring>TextLabel1</cstring>
178 </property>
179 <property stdset="1">
180 <name>sizePolicy</name>
181 <sizepolicy>
182 <hsizetype>5</hsizetype>
183 <vsizetype>7</vsizetype>
184 </sizepolicy>
185 </property>
186 <property stdset="1">
187 <name>text</name>
188 <string>&lt;P&gt;Pass code protection provides a minimal level of protection from casual access to this device.</string>
189 </property>
190 <property stdset="1">
191 <name>alignment</name>
192 <set>AlignTop|AlignLeft</set>
193 </property>
194 <property>
195 <name>vAlign</name>
196 </property>
197 </widget>
198 </grid>
199</widget>
200</UI>